GitHub Actionsを使っていて、ジョブ間で値を受け渡したいときに GITHUB_OUTPUT
を使うことがあります。しかし、いざ使ってみると別のジョブでその値が使えないことがあります。本記事ではその原因と確認方法、対処法について解説します。
GITHUB_OUTPUTとは?
GITHUB_OUTPUT
は、GitHub Actionsでステップ間やジョブ間で値を渡すための仕組みの1つです。シェルスクリプトやコマンドの中から出力を定義し、それを後続のステップや別ジョブで参照できるようにします。

たとえば以下のように、あるステップで出力を設定できます。
- 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.<出力名> }}

まずは参照が正しいか確認します。
正しかった場合は次の観点で確認してください。
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 と同じ様なアルゴリズムが動いているのではないかと推測しています。

対応方法
対処法1: シークレットの含まれる出力を避ける
可能であれば、シークレットをそのまま出力に含めないように設計するに越したことはないとおもいます。
シークレット情報が固定的なものであれば Github Secret に登録する方法があります。
またシークレット情報を含めずプレフィックスや識別子だけにとどめるなど、出力する情報量を制限するなどの工夫ができるかもしれません。
対処法2: シークレットストアを利用する
どうしても出力にシークレットを含める必要がある場合は、シークレットストアを使うと可能になるそうです。
自分はこの方法は試してないので、ここでは公式のリンクだけ置いておきます。

まとめ
GitHub Actionsで GITHUB_OUTPUT
が別ジョブで使えない場合、値を出力しているジョブの最後のログを見ることは自分は盲点で、問題解決にとても時間を費やしてしまいました。
同じ様にハマっている人の参考になると幸いです。
コメント