Open11

ひとつのactions variableに複数の環境変数の定義を詰め込みたい

ピン留めされたアイテム
kazuma1989kazuma1989

結論

jobs:
  run_e2e:
    steps:
      - name: E2E対象のアプリの認証情報を設定
        run: |
          cat << EOF | sed 's/\r//' >> "$GITHUB_ENV"
          ${{ vars.E2E_AUTH }}
          EOF

E2E_AUTHには次のような値を設定しておく

APP_USER=kazuma
APP_PASS=passw0rd

APP_USER_2=taro
APP_PASS_2=passw0rd

これで、後続のstepではAPP_USERAPP_PASSといった環境変数を利用できる。

kazuma1989kazuma1989

添付の画像のようなことをやりたい

E2E_AUTHという変数にAPP_USERなど複数の変数定義を持たせている様子

kazuma1989kazuma1989

モチベーション

開発環境のアプリのend-to-end (E2E)テストの際の認証情報は、コードに書くのは違う気がするが、複数あってGitHubのGUIから繰り返し設定するのが面倒。
何かのAPIキーとは異なり、シークレットとして扱うほどではないため、variableにひとまとめに登録してしまいたい。

kazuma1989kazuma1989

経緯とか解説とか

まずGitHub Actionsの機能として、GITHUB_ENV(が指し示すファイル)にKEY=VALUEの書式で書き込むと、後続のstepで環境変数が利用できるというものがある。

これを応用して、複数の環境変数を一度に設定するアイデア。

echo "{environment_variable_name}={value}" >> "$GITHUB_ENV"

https://docs.github.com/ja/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable

kazuma1989kazuma1989

愚直にやるなら次のようになるだろうが、\nを手書きするのはいやなので、変換なりで何とかしたい

echo "KEY_1=value_1\nKEY_2=value_2" >> "$GITHUB_ENV"
kazuma1989kazuma1989

そこでシェルスクリプトのheredocを使う

cat << EOF >> "$GITHUB_ENV"
KEY_1=value_1
KEY_2=value_2
EOF
kazuma1989kazuma1989

ここにGitHub Actionsのコンテキストを持ち込む。E2E_AUTHに誤った書式が紛れ込むとワークフローが壊れるが、varsコンテキストは自分たち管理なので、リスクは少ないだろう。

 cat << EOF >> "$GITHUB_ENV"
-KEY_1=value_1
-KEY_2=value_2
+${{ vars.E2E_AUTH }}
 EOF
kazuma1989kazuma1989

ちなみにGitHub Actionsにおいて、式 ${{ ... }} の展開はrunで定義したスクリプトの評価なので、KEY_1=value_1などをベタで書いてあったのと(ほぼ)同じ状態を作れている

(ほぼ)と断ったのは、ちょっとした罠があったから。

Hidden comment
Hidden comment
kazuma1989kazuma1989

Variablesの仕様なのか、値の改行文字がCRLFであった。
そのため、E2E_AUTHに以下のような設定があるとき、KEY_1の値がvalue_1\rになってしまう。

KEY_1=value_1
KEY_2=value_2

なのでsedでCRを削除して、GITHUB_ENVに書き込むとうまくいった:

-cat << EOF >> "$GITHUB_ENV"
+cat << EOF | sed 's/\r//' >> "$GITHUB_ENV"
 ${{ vars.E2E_AUTH }}
 EOF