åç½®ã
GitHub Actionsã§ã¯workflowã®yamlãã¡ã¤ã«ã«ä¸è¨ã®ããã« jobs.<job-id>.strategy.matrix
ãæ¸ããã¨ã§matrix buildãä½ããã¨ãã§ãã¾ãã *1
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ã®å¤ã¨ãã¦å©ç¨ãããµã³ãã«
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ãåçã«çæããæ¹æ³ã¯ä¸è¨ã§ç´¹ä»ããã¦ããã®ã§åèã«ãªãã¾ãã
docs.github.com
è¦ã¯å¥ã®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 }}