У меня есть следующие действия 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, можешь поделиться с $GITHUB_OUTPUT
своей попыткой?
@ShaykiAbramczyk, пожалуйста, проверьте мой обновленный вопрос, который включает $GITHUB_OUTPUT
. Я использую тот же метод для DEPLOYMENT_ID
и LAST_NOTIFICATION_MESSAGE
, но на следующем шаге только первая переменная имеет значение.
Я думаю, проблема в том, что строка многострочная, посмотрите, как ее решить: trstringer.com/github-actions-multiline-strings
Привет @ShaykiAbramczyk, данные закодированы на основе 64url, это означает, что не будет никаких опасных символов, включая новую строку, как я уже упоминал в вопросе.
привет @jonrsharpe, я нашел причину, пожалуйста, проверьте мой ответ. Спасибо.
привет @Shayki, я нашел причину, пожалуйста, проверьте мой ответ. Спасибо.
@Horizon, классный улов!
Логика вашего рабочего процесса выглядит правильно. Я попробовал запустить его с некоторым упрощением и смог увидеть значение обоих заданий, напечатанное в журналах 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
Пожалуйста, поделитесь тем, что вы получите, если запустите рабочий процесс из моего ответа.
Я нашел причину, пожалуйста, проверьте мой ответ. Спасибо
Это что-то, что вы могли бы поместить в секрет репо? Откуда GitHub узнает, что это секрет?
в секрете я поставил: ENV_NAME=test
(вообще не очень секретно, так как вся моя команда это знает, но я поставил туда, чтобы позже мы могли изменить значение, не изменяя конвейер). lastNotificationMessage
не содержит значение test
напрямую, но это URL-адрес base64, который при декодировании содержит строку test
.
Я нашел причину:
Значение, хранящееся в переменной, содержит base64url, закодированный одним секретным ключом. Я думал, что github не будет достаточно умен, чтобы это обнаружить, но он это обнаружил.
GitHub не позволяет передавать переменную, содержащую секретное значение, из одного задания в другое. Это уже указано в резюме, но я пропустил это:
Skip output 'lastNotificationMessage' since it may contain secret.
Поскольку я не могу передать переменную следующим заданиям, я вывожу ее на консоль только для проверки, мой окончательный код не будет содержать этих отголосков.