0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

github actionsで、inputで与えられたstringをparseして、arrayとして扱う

Last updated at Posted at 2024-01-24

やりたいこと

  • github actionsで、手動でE2E自動テストをトリガーしたい
    • このとき、実行するテストシナリオを指定したい
      • 明確に影響範囲が分かっているときなど、全件実行しなくていよいケースをカバーしたい
      • テストを実行するジョブを、matrixを使って簡潔に書きたい
      • inputの型は number/string/boolean/environmentしかサポートされていないため、そのままでは代入できない

そのため、 fromJSON() を使ってstringをarrayに変換する必要がありました

やったこと

要件を分解するとこうです

  1. 入力をstringで受け取る
  2. fromJSON() でparseできる形に変換する (この時点ではまだstring)
  3. fromJSON() を使い、arrayに変換する
  4. 変換したものを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_OUTPUTkey=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 }})
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?