やりたいこと
- github actionsで、手動でE2E自動テストをトリガーしたい
- このとき、実行するテストシナリオを指定したい
- 明確に影響範囲が分かっているときなど、全件実行しなくていよいケースをカバーしたい
- テストを実行するジョブを、matrixを使って簡潔に書きたい
- inputの型は number/string/boolean/environmentしかサポートされていないため、そのままでは代入できない
- このとき、実行するテストシナリオを指定したい
そのため、 fromJSON()
を使ってstringをarrayに変換する必要がありました
やったこと
要件を分解するとこうです
- 入力をstringで受け取る
-
fromJSON()
でparseできる形に変換する (この時点ではまだstring) -
fromJSON()
を使い、arrayに変換する - 変換したものをmatrixへ代入する
fromJSON()
でparseできる形に変換する
これを実現する手法はいくつか考えられますが、今回は筆者が慣れているpythonを使うことにしました
令和にshを勉強したくなかったためです
ちなみにruns-on: ubuntu-latest
は2024/01/24現在でubuntu22.04らしく、python3が最初からインストールされています
大変ありがたい
ない場合は uses: actions/setup-python@v5
で簡単に導入できます
もちろんrubyなどでも同様に実現できると思うので、都度読み替えてください
shではjqあたりと格闘すればできる気がしますが「これpythonのほうが早いな」と思って調べるのを辞めました
hoge fuga poyo
を ["hoge", "fuga", "poyo"]
に変換する
pythonはstringをlistに変換する split()
という大変ありがたい組み込み関数が用意されているので、それを使います
>>>'hoge fuga poyo'.split()
["hoge", "fuga", "poyo"]
もうほとんど達成できてますね 神
ちなみに split()
は初期状態では半角スペースをセパレータとしています
ただコレだけでは駄目で、ジョブからジョブへ値をパスするには環境変数 $GITHUB_OUTPUT
を経由する必要があります
pythonの print()
はそのまんま標準出力をしてくれるので、そのストリームをぶちこめばOKです
jobs:
parse-scenario-str-to-array:
runs-on: ubuntu-latest
steps:
- name: parse scenario
id: parse-scenario
run: |
python -c "print('scenario-str=' + str('${{ github.event.inputs.choice-scenario-names }}'.split()))" >> $GITHUB_OUTPUT
outputs:
scenario-str: ${{ steps.parse-scenario.outputs.scenario-str }}
改行したかったんですがインデントのエラーを吐いちゃうのでとりあえずコレでいきます
薄目で見てください
$GITHUB_OUTPUT
に key=value
という値を保存しておけば、別のstepやjobからもkeyを頼りにアクセスすることができるようになります
めでたい
fromJSON()
を使い、arrayに変換する
github actionsは、arrayを与えることで「似てるけどちょっと違う条件のジョブ」をたくさん実行できる機能があります
詳しくは公式ドキュメントを見ましょう
静的に書く場合こんなかんじです
jobs:
e2e-autotest:
strategy:
matrix: ["page-a", "page-b", "page-c"] # ここを動的に差し替えたい
steps:
(略)
で、公式ドキュメントを見ると fromJSON()
なる関数を使えばstringからarrayやdictionaryに変換できるらしいのでやっていきます
jobs:
parse-scenario-str-to-array:
(略)
e2e-autotest:
runs-on: ubuntu-latest
needs: parse-scenario-str-to-array
strategy:
matrix:
scenario-names: ${{ fromJSON(needs.parse-scenario-str-to-array.outputs.scenario-str) }}
steps:
- name: E2E自動テスト実行 ${{ matrix.all-scenario-names }}
run: |
echo "${{ matrix.all-scenario-names }}"
job parse-scenario-str-to-array
に対して needs
経由で触れていますが、多分絶対path?でも触れられると思います(試していません)
一応ハマりどころとしては fromJSON()
自体を式として評価する必要があることに注意です
:o: ${{ fromJSON(some.variable) }}
:x: fromJSON(${{ some.variable }})