Действия 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 }}

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

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


1
51
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

Решено

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

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

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

Skip output 'lastNotificationMessage' since it may contain secret.

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


Интересные вопросы для изучения