当我设置
$i -lt 3
时,它会循环两次并创建两个条目。 GitHub PowerShell 工作流程能够通过两个作业生成矩阵,这很好。
但是当我设置
$i -lt 2
时,我希望它能够通过单个作业生成矩阵,但事实并非如此。
name: Generate Matrix
on:
workflow_dispatch:
push:
branches:
- main
jobs:
generate-matrix:
runs-on: ubuntu-latest
outputs:
DISMATRIX: ${{ steps.matrix.outputs.DISMATRIX }}
steps:
- name: Set up Git repository
uses: actions/checkout@v2
- name: Generate Matrix
id: matrix
shell: pwsh
run: |
$dismatrix = @()
$counter = 1
# Single Loop
for ($i = 1; $i -lt 2; $i++) {
$statcustomenvName = "StatCustomEnvName$counter"
$customenvName = "CustomEnvName$counter"
# Increment the counter
$counter++
# Add unique values to the $dismatrix array
$dismatrix += @{
"DISPLAYLIST" = $statcustomenvName
"CUSTOMENVNAME" = $customenvName
}
}
# Output the matrix as JSON
echo "DISMATRIX=$($dismatrix | ConvertTo-Json -Compress -Depth 100)" >> "$env:GITHUB_OUTPUT"
Trigger_Service:
name: "${{ matrix.DISPLAYLIST }}"
needs: [generate-matrix]
environment:
name: ${{ matrix.CUSTOMENVNAME }}
runs-on:
group: ARE-Shared
strategy:
matrix:
include: ${{fromJSON(needs.generate-matrix.outputs.DISMATRIX)}}
fail-fast: false
steps:
- name: Split Matrix name for use
id: instancedetails
run: |
Write-Host "[email protected] ${{ matrix.customenvName }}"
我已经使用
for
循环来创建这个最小的测试用例,但是,我的实际案例从数据库获取条目,该条目可以是一个或多个。
JSON 变量
DISMATRIX
与 $i -lt 3
正常工作时的输出:
Run echo "[{"CUSTOMENVNAME":"CustomEnvName1","DISPLAYLIST":"StatCustomEnvName1"},{"CUSTOMENVNAME":"CustomEnvName2","DISPLAYLIST":"StatCustomEnvName2"}]"
[{
CUSTOMENVNAME:CustomEnvName1,DISPLAYLIST:StatCustomEnvName1},{CUSTOMENVNAME:CustomEnvName2,DISPLAYLIST:StatCustomEnvName2}]
当 JSON 变量
DISMATRIX
不与 $i -lt 2
一起使用时的输出:
Run echo "{"CUSTOMENVNAME":"CustomEnvName1","DISPLAYLIST":"StatCustomEnvName1"}"
{CUSTOMENVNAME:CustomEnvName1,DISPLAYLIST:StatCustomEnvName1}
我在为这两种情况创建所需的 JSON 时遇到困难。
因此,我需要一个通用的解决方案来创建 JSON 策略矩阵,该矩阵将有助于根据任何动态条件填充一个或多个作业。可以推荐一下吗?
试试这个
if ($i -eq 2) {
echo "DISMATRIX=$( @($dismatrix) | ConvertTo-Json -Compress -Depth 100)" >> "$env:GITHUB_OUTPUT"
}
else {
echo "DISMATRIX=$($dismatrix | ConvertTo-Json -Compress -Depth 100)" >> "$env:GITHUB_OUTPUT"
}