[GitHub]ActionsのContextを効率よく確認しつつjqとset-envを用いて再定義してみた
はじめに
Actionsのワークフローでrun
やenv
に渡すパラメータにContextを使いたい時に、出力確認方法が実際に動かすしかなく、色々と不便に思うことがあります。
公式ドキュメントを読んでみても正直分かり辛いことが多かったため、質疑応答フォーラムを検索したり、地道にDump等を繰り返して、わかってきたことを備忘録としてまとめました。
Contextの呼び出し
github、env、job、steps、runnerの5つがあり、
- commit内容を取りたいときにはgithubからデータを引く
- workflowのステータスを取りたいときにはstepsからデータを引く
等の使い分けが必要です。データ構成の詳細は公式ドキュメントにまとまっていますが、実際の出力については自身で試す必要があります。
Context and expression syntax for GitHub Actions - GitHub ヘルプ
Contextの確認
手っ取り早く確認したい時は、ContextをダンプさせるだけのWorkflowを作成し、必要に応じてKeyの組み合わせを確認するという手があります。
name: context_dump on: push: branches: - context_dump jobs: dump: runs-on: ubuntu-latest steps: - name: dump context run: echo '${{ toJSON(github) }}'
気をつけるべき点として、このケースではPushイベント時の発火としていますが、WebhookのPushEvent Payloadとは構成が異なります。
Contextの加工
「run
で実行するコマンドの引数用にコミットハッシュ先頭7文字を渡したい」
といった場合には、toJson()
を通し、ホストランナーにインストールされているjq
を用いてArray/String Sliceにて削る、などの対応が必要になります。Contextにて利用可能な関数はformat()
とjoin()
等の結合が主で、スライスが出来ません。
$(echo '${{ toJSON(github) }}' | jq -r ".sha[0:7]")
使いまわしたい場合は、set-env
にて指定する方法もあります。
Workflow commands for GitHub Actions - GitHub Help
- name: define hash run: echo ::set-env name=SHORTHASH::$(echo '${{ toJSON(github) }}' | jq -r ".sha[0:7]") - name: Test run: echo $SHORTHASH
Branch名がref/heads/****
となっているために使いにくいと感じる場合には、以下のようにheads/
以前を削除した形で再定義も可能です。
- name: define branchname run: echo ::set-env name=SHORTBRANCH::$(eco '${{ toJSON(github) }}' | jq -r ".ref[11:]") - name: Test run: echo $SHORTBRANCH
あとがき
最初、ContextはWebhookのPayload構成と同一だと思いこんでおり、Dumpしてみて初めて異なることに気が付きました。
Contextもset-env
を知るまでは長いvalueをそのまま使ったりしていましたが、ドキュメントを読んで理解してしまうことでWorkflow内で完結できることが増えて色々楽になると思います。
ただ、ドキュメントを探しあてるのが一番大変かもしれません。困った時は比較的事例が多いと思われるStackOverFlowで検索してみることもおすすめします。