Действия GitHub не могут передать переменную в следующее задание

У меня есть следующие действия GitHub, я хочу передать lastNotificationMessage из задания развертывания в следующее задание (подробности см. на скриншотах):

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Get last notification
        if: always()
        id: notification
        timeout-minutes: 1
        run: |
          LAST_NOTIFICATION=$(app get-last-notification)
          echo "$LAST_NOTIFICATION"
          echo "CUSTOM_LAST_NOTIFICATION=$LAST_NOTIFICATION" >> $GITHUB_ENV

    outputs:
      lastNotificationMessage: ${{ env.CUSTOM_LAST_NOTIFICATION }}
      # otherVariable: other value
      # otherVariable: other value
      # otherVariable: other value
      # otherVariable: other value
      # otherVariable: other value
      # otherVariable: other value


  notification:
    runs-on: ubuntu-latest
    needs: deploy
    if: always()

    steps:
      - name: Notification
        timeout-minutes: 1
        run: |
          app send-notification \
            --last-message "$LAST_NOTIFICATION_MESSAGE"
        env:
          LAST_NOTIFICATION_MESSAGE: ${{ needs.deploy.outputs.lastNotificationMessage }}

Когда я повторяю его при первом задании, он уже имеет значение (оно находится в формате с кодировкой base64url, чтобы убедиться, что оно не содержит каких-либо опасных символов).

Но при следующем задании, когда я проверяю его в результатах задания, оно всегда пусто. Я вижу, что другие переменные также имеют правильное значение.

В чем здесь проблема и как ее исправить?

Ниже приведен скриншот:

развернуть задание:

задание по уведомлению:

Другой метод, предложенный @Shayki, который я пробовал, но безуспешно:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy
        id: deployToCloud
        timeout-minutes: 1
        run: |
          echo "deploymentId=$DEPLOYMENT_ID" >> $GITHUB_OUTPUT

      - name: Get last notification
        if: always()
        id: lastNotification
        timeout-minutes: 1
        run: |
          LAST_NOTIFICATION=$(app get-last-notification)
          echo "$LAST_NOTIFICATION"
          echo "lastNotificationMessage=$LAST_NOTIFICATION" >> $GITHUB_OUTPUT

    outputs:
      deploymentId: ${{ steps.deployToCloud.outputs.deploymentId }}
      lastNotificationMessage: ${{ steps.lastNotification.outputs.lastNotificationMessage }}

  notification:
    runs-on: ubuntu-latest
    needs: deploy
    if: always()

    steps:
      - name: Notification
        timeout-minutes: 1
        run: |
          app send-notification \
            --last-message "$LAST_NOTIFICATION_MESSAGE"
        env:
          DEPLOYMENT_ID: ${{ needs.deploy.outputs.deploymentId }}
          LAST_NOTIFICATION_MESSAGE: ${{ needs.deploy.outputs.lastNotificationMessage }}

шаг развертывания:

следующий шаг:

@jonrsharpe Я попробовал метод по твоей ссылке, но он тоже не работает. Метод, который я использовал в этом вопросе, работает для других шагов и переменных. Я не уверен, почему. Единственное отличие — это настройка Get last notification, которая всегда выполняется независимо от результата других шагов.

Horizon 09.07.2024 09:48

@Horizon, можешь поделиться с $GITHUB_OUTPUT своей попыткой?

Shayki Abramczyk 09.07.2024 10:04

@ShaykiAbramczyk, пожалуйста, проверьте мой обновленный вопрос, который включает $GITHUB_OUTPUT. Я использую тот же метод для DEPLOYMENT_ID и LAST_NOTIFICATION_MESSAGE, но на следующем шаге только первая переменная имеет значение.

Horizon 09.07.2024 10:33

Я думаю, проблема в том, что строка многострочная, посмотрите, как ее решить: trstringer.com/github-actions-multiline-strings

Shayki Abramczyk 09.07.2024 12:05

Привет @ShaykiAbramczyk, данные закодированы на основе 64url, это означает, что не будет никаких опасных символов, включая новую строку, как я уже упоминал в вопросе.

Horizon 09.07.2024 12:42

привет @jonrsharpe, я нашел причину, пожалуйста, проверьте мой ответ. Спасибо.

Horizon 10.07.2024 09:47

привет @Shayki, я нашел причину, пожалуйста, проверьте мой ответ. Спасибо.

Horizon 10.07.2024 09:48

@Horizon, классный улов!

Shayki Abramczyk 10.07.2024 10:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Логика вашего рабочего процесса выглядит правильно. Я попробовал запустить его с некоторым упрощением и смог увидеть значение обоих заданий, напечатанное в журналах GitHub.

name: output

on:
  workflow_dispatch

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Get last notification
        if: always()
        id: notification
        timeout-minutes: 1
        run: |
          LAST_NOTIFICATION=1234567890
          echo "$LAST_NOTIFICATION"
          echo "CUSTOM_LAST_NOTIFICATION=$LAST_NOTIFICATION" >> $GITHUB_ENV
    outputs:
      lastNotificationMessage: ${{ env.CUSTOM_LAST_NOTIFICATION }}

  notification:
    runs-on: ubuntu-latest
    needs: deploy
    if: always()
    steps:
      - name: Notification
        timeout-minutes: 1
        run: |
          echo "$LAST_NOTIFICATION_MESSAGE"
        env:
          LAST_NOTIFICATION_MESSAGE: ${{ needs.deploy.outputs.lastNotificationMessage }}

развернуть выходные данные задания:

Run LAST_NOTIFICATION=1234567890
  LAST_NOTIFICATION=1234567890
  echo "$LAST_NOTIFICATION"
  echo "CUSTOM_LAST_NOTIFICATION=$LAST_NOTIFICATION" >> $GITHUB_ENV
  shell: /usr/bin/bash -e {0}
1234567890

вывод задания уведомления:

Run echo "$LAST_NOTIFICATION_MESSAGE"
  echo "$LAST_NOTIFICATION_MESSAGE"
  shell: /usr/bin/bash -e {0}
  env:
    LAST_NOTIFICATION_MESSAGE: 1234567890
1234567890

Пожалуйста, поделитесь тем, что вы получите, если запустите рабочий процесс из моего ответа.

Delta George 09.07.2024 23:39

Я нашел причину, пожалуйста, проверьте мой ответ. Спасибо

Horizon 10.07.2024 09:47

Это что-то, что вы могли бы поместить в секрет репо? Откуда GitHub узнает, что это секрет?

Delta George 10.07.2024 20:41

в секрете я поставил: ENV_NAME=test (вообще не очень секретно, так как вся моя команда это знает, но я поставил туда, чтобы позже мы могли изменить значение, не изменяя конвейер). lastNotificationMessage не содержит значение test напрямую, но это URL-адрес base64, который при декодировании содержит строку test.

Horizon 11.07.2024 12:24
Ответ принят как подходящий

Я нашел причину:

Значение, хранящееся в переменной, содержит base64url, закодированный одним секретным ключом. Я думал, что github не будет достаточно умен, чтобы это обнаружить, но он это обнаружил.

GitHub не позволяет передавать переменную, содержащую секретное значение, из одного задания в другое. Это уже указано в резюме, но я пропустил это:

Skip output 'lastNotificationMessage' since it may contain secret.

Поскольку я не могу передать переменную следующим заданиям, я вывожу ее на консоль только для проверки, мой окончательный код не будет содержать этих отголосков.

Другие вопросы по теме

Ошибка google-github-actions/get-gke-credentials: требуются разрешения "container.clusters.get"
Как протестировать приложение Kivy на GitHub Actions MacOS Runner?
Невозможно найти версию dotnet при развертывании приложения функции гибкого потребления с помощью действий GitHub
Невозможно выполнять команды git удаленно из скрипта
AWS: отмена регистрации нездоровых IP-адресов из зарегистрированных целей (целевая группа) с помощью рабочего процесса действий GitHub не работает
Как пометить и пометить изображение с помощью CLI docker Compose в файле рабочих процессов GitHubPublish.yaml?
Ошибка при оценке «стратегии» для задания – Действия GitHub
Использование учетных данных AWS от поставщика OIDC внутри контейнера Docker
При сборке приложения не удалось создать папку артефакта: «frontend/dist/». Убедитесь, что это свойство настроено правильно в файле рабочего процесса
Использование переменных окружения действий github для запуска различных базовых URL-адресов в функции и промежуточной стадии для теста Snowflake Cypress

Похожие вопросы