Open3

GitHub Actions のジョブ内での環境変数設定(Environment Files)

hankei6kmhankei6km

GitHub Action のステップから環境変数を変更する方法。

以前は set-output を使う方法だったのだが、これは deprecated になる(set-state も同様にdeprecdate なのだがこの scrap ではそちらは触れない)。

https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/

今後は Environment File (ファイル名は $GITHUB_ENV に設定されている)へ NAME=VAUE のような文字列を書き込む(追加する)ことで設定するようになる( .env 的なファイルへ組み立てるイメージ)。

なお、環境変数と書いているが、もう少し具体的に書くと環境変数が直接更新されるのではなく、env コンテキストが更新される。この辺の変数の扱いについては下記を参照(本筋とは関係ないが、vars コンテキストも使えるようになったもよう)。

https://docs.github.com/ja/actions/learn-github-actions/variables

hankei6kmhankei6km

設定するためのコマンドの文法

https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#environment-files

基本は前述の通り。

1つうれしいのは複数行の内容を設定する場合にヒアドキュメント的なものが使えること(的なものなので実際は結構違う)。

具体的には以下のような文字列をファイルへ書き込む。このとき 複数回 に分割して書き込んでもよい。

{name}<<{delimiter}
{value}
{delimiter}

Example

steps:
  - name: Set the value in bash
    id: step_one
    run: |
      echo 'JSON_RESPONSE<<EOF' >> $GITHUB_ENV
      curl https://example.com >> $GITHUB_ENV
      echo 'EOF' >> $GITHUB_ENV

上記例の場合だと

  1. 最初の echo で環境変数名とデリミターの指定を $GITHUB_ENV が指すファイルへ書き込む
  2. curl を実行し結果を $GITHUB_ENV が指すファイルへ書き込む
  3. 最後の echo でデリミターを $GITHUB_ENV が指すファイル書き込む、これで環境変数が設定されることになる
hankei6kmhankei6km

試してみる

テスト用のリポジトリを作った。

https://github.com/hankei6km/test-gha-env-var-by-file

わかったこと。

  • ($GITHUB_ENV が指している)ファイルの内容で env コンテキストが更新されるのはステップが切り替わるとき
    • よって、同一ステップ内では環境変数は変更されない
    • ファイルの内容は更新後(ステップ切り替え後)は空になる
  • ワークフローで設定した環境変数も上書きできる
  • 複数行の値の指定は set-output のときよりもやりやすくなった
    • 正しくないデリミターの使い方はエラーになる
  • $GITHUB_ENV は上書きできない
    • まぁできたらヤバイよね
    • 上書きしてもエラーにはならない、無視されるだけ