ひとつのactions variableに複数の環境変数の定義を詰め込みたい
結論
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_USER
やAPP_PASS
といった環境変数を利用できる。
添付の画像のようなことをやりたい
モチベーション
開発環境のアプリのend-to-end (E2E)テストの際の認証情報は、コードに書くのは違う気がするが、複数あってGitHubのGUIから繰り返し設定するのが面倒。
何かのAPIキーとは異なり、シークレットとして扱うほどではないため、variableにひとまとめに登録してしまいたい。
経緯とか解説とか
まずGitHub Actionsの機能として、GITHUB_ENV
(が指し示すファイル)にKEY=VALUE
の書式で書き込むと、後続のstepで環境変数が利用できるというものがある。
これを応用して、複数の環境変数を一度に設定するアイデア。
echo "{environment_variable_name}={value}" >> "$GITHUB_ENV"
愚直にやるなら次のようになるだろうが、\n
を手書きするのはいやなので、変換なりで何とかしたい
echo "KEY_1=value_1\nKEY_2=value_2" >> "$GITHUB_ENV"
そこでシェルスクリプトのheredocを使う
cat << EOF >> "$GITHUB_ENV"
KEY_1=value_1
KEY_2=value_2
EOF
ここにGitHub Actionsのコンテキストを持ち込む。E2E_AUTH
に誤った書式が紛れ込むとワークフローが壊れるが、varsコンテキストは自分たち管理なので、リスクは少ないだろう。
cat << EOF >> "$GITHUB_ENV"
-KEY_1=value_1
-KEY_2=value_2
+${{ vars.E2E_AUTH }}
EOF
ちなみにGitHub Actionsにおいて、式 ${{ ... }}
の展開はrunで定義したスクリプトの評価前なので、KEY_1=value_1
などをベタで書いてあったのと(ほぼ)同じ状態を作れている
(ほぼ)と断ったのは、ちょっとした罠があったから。
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