åç½®ã
GitHub Actionsã§ã¯workflowã®yamlãã¡ã¤ã«ã«ä¸è¨ã®ããã« jobs.<job-id>.strategy.matrix
ãæ¸ããã¨ã§matrix buildãä½ããã¨ãã§ãã¾ãã *1
# .github/workflows/build.yml jobs: test: name: test (Ruby ${{ matrix.ruby }}, Go ${{ matrix.go }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: ruby: - "3.3" - "3.4" go: - "1.23"
ãããããã®matrixã®çµã¿åãããå¥ã®workflowã§ã使ããããªã£ãæã«ãæ®éã«ããã¨å ¨ãåããã®ãå¥ãã¡ã¤ã«ã«ã³ããããå¿ è¦ãåºã¦ãã¾ãã
ãã®ã¨ã³ããªã§ã¯è¤æ°ã®workflowã§å©ç¨ããmatrixãå ±éåããå°ãã¿ãç´¹ä»ãã¾ã
tl;dr;
é©å½ãªjsonãã¡ã¤ã«ããèªã¿è¾¼ãã å¤ãmatrixã®å¤ã¨ãã¦å©ç¨ãããµã³ãã«
# .github/workflows/build.yml jobs: generate-matrix: runs-on: ubuntu-latest outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - uses: actions/checkout@v4 - id: set-matrix run: echo "matrix=$(cat matrix.json | jq -c)" >> $GITHUB_OUTPUT working-directory: .github/workflows/ test: name: test (Go ${{ matrix.go }}, Ruby ${{ matrix.ruby }}) needs: - generate-matrix runs-on: ubuntu-latest strategy: fail-fast: false matrix: ${{ fromJSON(needs.generate-matrix.outputs.matrix) }}
.github/workflows/matrix.json
ã®ä¸èº«ã¯ä¸è¨ã®ãããªå½¢å¼ãæ³å®ã
{ "go": [ "1.23" ], "ruby": [ "3.3", "3.4" ] }
解説
åçã«matrixãçæãã
GitHub Actionsã§matrixãåçã«çæããæ¹æ³ã¯ä¸è¨ã§ç´¹ä»ããã¦ããã®ã§åèã«ãªãã¾ãã
è¦ã¯å¥ã®jobã§çæããmatrixï¼jsonæååï¼ãoutputsçµç±ã§å¾ç¶ã®jobã«å¼ãåãã¨ããæ¹æ³ã§ãã
.github/workflows/matrix.json
ã®å¤ãworkflowã®matrixã¨ãã¦å¼ãåãæºåããã¦ãã®ãä¸è¨ã§ãã
generate-matrix: runs-on: ubuntu-latest outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - uses: actions/checkout@v4 - id: set-matrix run: echo "matrix=$(cat matrix.json | jq -c)" >> $GITHUB_OUTPUT working-directory: .github/workflows/
jsonãã¡ã¤ã«ã®ç½®ãå ´æã¯ã©ãã§ãããã§ãããèªåã¯CIé¢ä¿ã®ã¹ã¯ãªããã .github/workflows/
ã«ç½®ããã¨ãå¤ãã§ãã
ããã§ã®ãã¤ã³ã㯠jq -c
ãã¦ãã¨ããã
matrixã®å¤ï¼jsonæååï¼ã¯ç°å¢å¤æ°çµç±ã§æ¸¡ãå¿
è¦ããããã§ãããjsonæååãè¤æ°è¡ã ã¨ç°å¢å¤æ°ã«ãã®ã¾ã¾ã»ããããã¨ç°å¢å¤æ°ã«ã¯1è¡ç®ããã»ãããããªããããã¨ãã£ã¦è¤æ°è¡æååãé å¼µã£ã¦ç°å¢å¤æ°ã¨ãã¦ã»ããããã®ãå²ã¨é¢åãªã®ã§ jq -c
ã§1è¡jsonã«ãªãããã«ãã¦ã¾ãã
$ cat matrix.json { "go": [ "1.23" ], "ruby": [ "3.3", "3.4" ] } $ cat matrix.json | jq -c {"go":["1.23"],"ruby":["3.3","3.4"]}
å ã®jsonãã¡ã¤ã«ãæåãã1è¡ã«ãã¦ãã¦ããããã©ãªãã¸ããªã«ã³ãããããå ´åã¯diffã®è¦ãããããè¤æ°è¡ã®æ¹ãå¬ãããã§ããããããï¼å¥½ã¿ã®åé¡ï¼
èªåã§ã¹ã¯ãªãããæ¸ãã°jsonãã¡ã¤ã«ä»¥å¤ãmatrixã®ã½ã¼ã¹ã«ãããã¨ãã§ãããã©ãããä¸çªã·ã³ãã«ã ã¨æãã¾ãã
working-directory
ãåã£ã¦
- id: set-matrix run: echo "matrix=$(cat .github/workflows/matrix.json | jq -c)" >> $GITHUB_OUTPUT
ã§ãããã§ãããããããã¨workflowãã¡ã¤ã«å
㧠defaults.run.working-directory
ãæ¸ãã¦ãå ´å *2 ã«ããã ãã¡ãã£ã¨å¤ããå¿
è¦ãåºã¦ããï¼å®å
¨ã«ã³ããã§ããªãï¼ã®ã§ã³ããããªãã£éè¦ã§set-matrixå´ã§ working-directory
ãæ¸ãæ¹æ³ã«è½ã¡çãã¾ãããã
JSONæååããmatrixãçæãã
generate-matrix jobã®outputsããJSONæååãåãåºãã¦fromJSONã§ãªãã¸ã§ã¯ãã«å¤æãã¦ã»ãã
test: needs: - generate-matrix strategy: fail-fast: false matrix: ${{ fromJSON(needs.generate-matrix.outputs.matrix) }}
ä¸è¨ã¯ãã£ãã®ä¾ã§ããã¨
test: strategy: fail-fast: false matrix: ruby: - "3.3" - "3.4" go: - "1.23"
ã¨åãã«ãªãã¾ãã
ã¡ãªã¿ã«matrix.jsonã®ä¸ã®åä¸ã®keyã ããmatrixã®å¤ã¨ãã¦å©ç¨ãããï¼å ¨é¨ã®keyãmatrixã«å©ç¨ããããªãï¼æã¯å¿ è¦ãªkeyã ãåãåºãã°ããã§ãã
ä¾ï¼*3
test: strategy: fail-fast: false matrix: ruby: ${{ fromJSON(needs.generate-matrix.outputs.matrix).ruby }}
*1:https://github.com/sue445/funnel_http/blob/111b406e33618384fa71e824e4d92869b317171f/.github/workflows/build.yml#L17-L30
*2:å ·ä½çã«ã¯ https://github.com/ruby-go-gem/go-gem-wrapper/blob/ae7f410e2de86881bf83984134963f8a950dd45b/.github/workflows/patch_for_go_gem.yml#L18-L34 ãèªåã®å ´åã¯mono repoã®æã«workflowå ¨ä½ã§defaults.run.working-directoryãè¨å®ãããã¨ãå¤ãã§ã
*3:https://github.com/ruby-go-gem/go-gem-wrapper/blob/ae7f410e2de86881bf83984134963f8a950dd45b/.github/workflows/build.yml#L215