スポンサーリンク

GitHub ActionsでGITHUB_OUTPUTがnullになる・別ジョブに渡せない原因と対処法

GitHub Actionsを使っていて、ジョブ間で値を受け渡したいときに GITHUB_OUTPUT を使うことがあります。しかし、いざ使ってみると別のジョブでその値が使えないことがあります。本記事ではその原因と確認方法、対処法について解説します。

GITHUB_OUTPUTとは?

GITHUB_OUTPUT は、GitHub Actionsでステップ間やジョブ間で値を渡すための仕組みの1つです。シェルスクリプトやコマンドの中から出力を定義し、それを後続のステップや別ジョブで参照できるようにします。

GitHub Actions のワークフロー コマンド - GitHub Docs
ワークフロー内あるいはアクションのコード内でシェルコマンドを実行する際には、ワークフローコマンドを利用できます。

たとえば以下のように、あるステップで出力を設定できます。

- name: Set output
  id: sample-step
  run: echo "IMAGE=my-image:latest" >> $GITHUB_OUTPUT

この出力は、ジョブの outputs セクションを通して他のジョブで使うことができます。

取得する時は ${{ needs.<ジョブID>.outputs.<出力名> }} で取得できます。(異なるジョブ間の場合)

- name: Get output
  env:
   IMAGE: ${{ steps.sample-step.outputs.IMAGE }}
  run: echo "my image is $IMAGE"

GITHUB_OUTPUTはどういう場面で使うのか?

主に以下のような場面で使用されます:

  • ビルドしたDockerイメージのタグを後続ジョブに渡す
  • APIレスポンスの値を一時的に保存して次のジョブで使う
  • 条件によって後続の処理を分岐させるためのフラグを渡す

つまり、値の受け渡しを明示的に制御したいときに非常に便利です。

特に異なるジョブ間で値を受け渡す手段として非常に便利です。

補足:同じジョブの異なるステップで値の受け渡しをする

GITHUB_OUTPUT はジョブ間で値をやり取りするための仕組みですが、同じジョブ内のステップ間で値を渡したい場合にも使うことができます。

また同じジョブ内の異なるステップ間で値を受け渡す方法は他にもあります。

それは GITHUB_ENV を使う方法です。

こちらは同じジョブ内の異なるステップ間で値を受け渡す時に使うことができます。ですが、異なるジョブへの値の受け渡しはできません。

使い方は GITHUB_OUTPUT と似ていて、下記の通りです。

jobs:
  example:
    runs-on: ubuntu-latest
    steps:
      - name: Set variable
        run: echo "GREETING=Hello" >> $GITHUB_ENV

      - name: Use variable
        run: echo "$GREETING"

名前の通り環境変数なので、参照パスの指定などは不要で、通常の環境変数へのアクセスと同じ方法で値にアクセスすることができます。


GITHUB_OUTPUTが他のジョブで使えなかった時の確認方法

GITHUB_OUTPUT が期待通りに動作せず、他のジョブで値が使えない場合、まずはログを確認しましょう。

1. 参照パスが正しいか確認する

GITHUB_OUTPUT に限らずあらゆる場面であるあるのミスだと思います。

ジョブ間での情報の受け渡しは公式ドキュメントにもあるように下記の参照パスになります。

${{ needs.<ジョブID>.outputs.<出力名> }}
ジョブ間で情報を渡す - GitHub Docs
あるジョブから別のジョブに情報を渡す出力を定義できます。

まずは参照が正しいか確認します。

正しかった場合は次の観点で確認してください。

2. 対象ジョブのログを確認

自分はこの観点での確認をするのが遅く問題解決にとても時間を費やしてしまいました。

GitHub Actionsの実行画面で値をセットしているジョブを開き、一番最後の「Complete job」というステップのログを探してください。

以下のようなWarningが出ていた場合、アウトプットは作成されていません。

Warning: Skip output 'HOGE' since it may contain secret.
Cleaning up orphan processes

これは、GitHubがその値をシークレットとみなして無効化したことを意味しています。

3. なぜ「シークレット」として扱われたのか?

GitHub Actionsは、出力に環境変数やシークレットの値が含まれていると、それを保護するために出力をスキップする設計になっています。

シークレットと判断される詳細なルールは見つかりませんでしたが、おそらく Github の Secret Scanning と同じ様なアルゴリズムが動いているのではないかと推測しています。

シークレット スキャンについて - GitHub Docs
誤ってコミットされたシークレットの不正使用を防ぐために、GitHub を使って既知の種類のシークレットについてリポジトリをスキャンできます。

対応方法

対処法1: シークレットの含まれる出力を避ける

可能であれば、シークレットをそのまま出力に含めないように設計するに越したことはないとおもいます。

シークレット情報が固定的なものであれば Github Secret に登録する方法があります。

またシークレット情報を含めずプレフィックスや識別子だけにとどめるなど、出力する情報量を制限するなどの工夫ができるかもしれません。

対処法2: シークレットストアを利用する

どうしても出力にシークレットを含める必要がある場合は、シークレットストアを使うと可能になるそうです。

自分はこの方法は試してないので、ここでは公式のリンクだけ置いておきます。

GitHub Actions のワークフロー コマンド - GitHub Docs
ワークフロー内あるいはアクションのコード内でシェルコマンドを実行する際には、ワークフローコマンドを利用できます。

まとめ

GitHub Actionsで GITHUB_OUTPUT が別ジョブで使えない場合、値を出力しているジョブの最後のログを見ることは自分は盲点で、問題解決にとても時間を費やしてしまいました。

同じ様にハマっている人の参考になると幸いです。

Git
スポンサーリンク
ibukishをフォローする
スポンサーリンク
ibukish Lab+

コメント

タイトルとURLをコピーしました