簡體   English   中英

GitHub Actions 的工作流中是否可以有動態策略矩陣?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM