White Box技術部

WEB開発のあれこれ(と何か)

GitHub Actionとactの話(secretsとoutputs)

前回actの記事を書いたのですが、また知見を得たので残します。

seri.hatenablog.com

今回のactのバージョンは以下になります。

  • act version 0.2.57(前回は0.2.55)

書いていること

  • inputs.XXXXでもinputsが取れる
  • Github Token利用の手順とシークレットの使い方
  • job間でoutputの値を連携する方法
  • workflow_callでoutputsの値が渡らない

前回記事への訂正

再利用ワークフローのinput値参照方法について

また通常はinputs.XXXXでとれるinputsの値が、actを利用した場合はgithub.event.inputs.XXXXと書かないと取れませんでした

前回はこのように書いたのですが、今のバージョンではinputs.XXXXで値が取得できることが確認できました。 もちろんgithub.event.inputs.XXXXでも同じ値が取れました。

GITHUB_TOKENとシークレットの使い方

こちらも前回の最後に

actでGITHUB_TOKENを利用したワークフローを試す場合は、自身のGitHub個人トークンを発行し、.secretsファイルから読み込ませるとできるはずです。

というように書きましたが、実際には以下の手順になりました。

  1. 前提としてGitHub CLIは入れておく
  2. actの拡張機能を追加する(https://github.com/nektos/gh-act
    1. Issueでの説明:https://github.com/nektos/act/issues/1343#issuecomment-1646578864
  3. コマンドに-sオプションを追加する
    1. act -s GITHUB_TOKEN="$(gh auth token)" -W .github/workflows/sample.yml

シークレット値をまとめて読み込む

シークレット値は、env形式で値を記述したxxxx.secretsファイルを作成し、--secret-fileオプションで渡すと利用可能になります

例:act --secret-file act.secrets -s GITHUB_TOKEN="$(gh auth token)" -W .github/workflows/sample.yml

job間でoutputの値を連携する方法

actではなくGitHub Actionの話なのですが、ジョブ間でOutputの値を利用するためにはjobs.<job_id>.outputsを定義する必要があります。

それを踏まえて以下のように書いたとします。

  • sample.yml
name: sample
on:
  workflow_call:
jobs:
  sample-job:
    runs-on: ubuntu-latest
    outputs:
      title: ${{ steps.step1.outputs.title }}
      description: ${{ steps.step2.outputs.description }}
    steps:
      - id: step1
        run: echo "title=hello" >> "$GITHUB_OUTPUT"
      - id: step2
        run: echo "description=world" >> "$GITHUB_OUTPUT"
  test-echo:
    runs-on: ubuntu-latest
    needs: sample-job
    steps:
      - name: hoge1
        run: echo "${{ needs.sample-job.outputs.title }}"
      - name: hoge2
        run: echo "${{ needs.sample-job.outputs.description }}"
  test-call:
    needs: sample-job
    uses: ./.github/workflows/reuse.yml
    with:
      title: ${{ needs.sample-job.outputs.title }}
      description: ${{ needs.sample-job.outputs.description }}

個人的にはこれでなんの問題もなく動くと思ったのですが、実際にact workflow_call -W .github/workflows/sample.ymlを叩いて動かしてみると、test-echoではoutputsの値が取れますが、test-callではoutputsの値が取れませんでした。

というかtest-call.with.<input>title: "hogehoge"とベタ書きしても、reuseのワークフローには値が渡っていませんでした。

一応解決した方法

上記のsample.ymlにおいて、workflow_dispatchを追加し、act workflow_dispatch -W .github/workflows/sample.ymlとして実行すると、reuse.ymlにoutputsの値を渡すことができました。

name: sample
on:
  workflow_call:
  workflow_dispatch: # ←これを追加

・・・もうそれはどうなんだって感じはしますが、やりたかったワークフローの動作テストは一応できるので、 もし再利用ワークフローから再利用ワークフローを呼ぶテストがうまくいかないときがあれば、思い出してみてください。