[英]Is it possible to have a dynamic strategy matrix in a workflow in GitHub Actions?
我想在工作流中動態指定一個策略矩陣。 所以,而不是:
strategy:
matrix:
foo: [bar, baz]
我想首先調用一些腳本,該腳本將計算並返回一個數組,例如[bar, baz]
給我,然后我想將其用作策略矩陣。
這可能嗎?
可用的 GitHub 操作工作流功能無法實現,但可以通過一些 hacky 解決方案來提供所有必需的矩陣參數值組合。 您可以在以前的工作流作業之一中將所有組合生成為 JSON 片段並將其公開為作業outputs
,然后在下一個作業中將其與矩陣include
關鍵字一起使用,以使用fromJson()
提供所有矩陣參數及其值的組合function 如官方公告所示。 為了更好地解釋這個概念,讓我們看一下示例 static 矩陣作業:
jobs:
matrix-job:
runs-on: ubuntu-latest
strategy:
matrix:
includes:
- foo: foo-1
bar: bar-1
- foo: foo-1
bar: bar-2
- foo: foo-2
bar: bar-1
steps:
- run: |
echo foo=${{ matrix.foo }}
echo bar=${{ matrix.bar }}
工作流結果是:
在此工作流程中,所有矩陣參數值組合都是靜態提供的。 我們可以將其轉換為動態提供,如下所示:
jobs:
setup-matrix:
runs-on: ubuntu-latest
steps:
- name: Setup matrix combinations
id: setup-matrix-combinations
run: |
MATRIX_PARAMS_COMBINATIONS='
{"foo": "foo-1", "bar": "bar-1"},
{"foo": "foo-1", "bar": "bar-2"},
{"foo": "foo-2", "bar": "bar-1"},
'
echo ::set-output name=matrix-combinations::{\"include\":[$MATRIX_PARAMS_COMBINATIONS]}
outputs:
matrix-combinations: ${{ steps.setup-matrix-combinations.outputs.matrix-combinations }}
matrix-job:
runs-on: ubuntu-latest
needs: setup-matrix
strategy:
matrix: ${{ fromJson(needs.setup-matrix.outputs.matrix-combinations) }}
steps:
- run: |
echo foo=${{ matrix.foo }}
echo bar=${{ matrix.bar }}
結果:
這兩個工作流對於matirx-job
有相同的結果,但最后一個提供了一個動態生成的矩陣輸入。 這是您可以動態生成矩陣構建的唯一方法,您必須使用matrix.include
自己提供所有組合。 不可能(在撰寫本文時)為給定的矩陣參數(如您的問題)動態提供可用值的數組,但您至少有動態矩陣作業。
是的,您可以使用從您的步驟所依賴的先前步驟的 output 攝取的矩陣(“需要”):
jobs:
set:
runs-on: ubuntu-20.04
outputs:
matrix: ${{steps.list_dirs.outputs.matrix}}
steps:
- uses: actions/checkout@v2
- id: list_dirs
run: echo "::set-output name=matrix::$(ls|jq -cnR '[inputs | select(length>0)]')"
get:
runs-on: ubuntu-20.04
needs: set
strategy:
matrix:
subdir: ${{fromJson(needs.set.outputs.matrix)}}
我有如上所示的類似結構,但我通過執行從 Yaml 輸入文件讀取的 Python 代碼生成該結構。 但是,不知何故,我無法讓它工作。 由於我使用的是 Python 腳本,因此我需要將結構(如下)寫入環境變量,然后才能將其分配給設置輸出。 然后我注意到(經過大量試驗后)我需要將每一組都放在一個新行中,但這似乎不起作用。 任何幫助將不勝感激。
MATRIX_PARAMS_COMBINATIONS='
{"foo": "foo-1", "bar": "bar-1"},
{"foo": "foo-1", "bar": "bar-2"},
{"foo": "foo-2", "bar": "bar-1"},
'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.