下面的作业
Deployment
运行策略矩阵,而作业名称set-environment-matrix
构造策略矩阵变量ENV-MATRIX
。
我的要求是选择一个不同的跑步者
group
,称为Dot-Shared
或runs-on: "Windows-latest"
(如果作业名称包含Approvers
),否则应该是runs-on: "${{ needs.set-global-runner.outputs.runner_name }}"
set-environment-matrix:
name: Set Environment Matrix for ${{ inputs.customWorkflow }}
needs: set-global-runner
runs-on: "${{ needs.set-global-runner.outputs.runner_name }}"
outputs:
env-matrix: ${{ steps.set-matrix.outputs.ENV-MATRIX }}
steps:
- name: prereq
id: set-matrix
run: |
...
...
$envList = New-Object System.Collections.ArrayList
foreach($envName in $QueryResult.EnvironmentName){
$skipApproval = $QueryResult | Where-Object { $_.EnvironmentName -eq $envName } | Select-Object -ExpandProperty skipApproval
Write-Host "skipApproval value for $envName is $skipApproval"
$srepo="$sreponame/environments/$envName"
$envuri ="$apiUrl"+"$srepo"
try {
$respEnv = Invoke-WebRequest -Uri $envuri -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -ContentType "application/vnd.github+json" -UseBasicParsing
echo "respEnv: $respEnv"
$sEnvs=$respEnv.Content | convertfrom-json
} catch {
Write-host "$envName not found"
exit 1
}
$envList.Add($envName)
}
$EnvNamesJSONVariable.Add("ENVNAME",$envList)
echo "ENV-MATRIX=$($EnvNamesJSONVariable | ConvertTo-JSON -Compress -Depth 100)" >> "$env:GITHUB_OUTPUT"
Deployment:
name: ${{ matrix.envName }}
needs: [set-environment-matrix, set-global-runner]
environment:
name: ${{ matrix.envName }}
url: "${{ steps.prereq.outputs.appurl }}"
#runs-on: "${{ needs.set-global-runner.outputs.runner_name }}"
runs-on:
if: contains(matrix.envName, 'Approvers')
value: Dot-Shared
else: ${{ needs.set-global-runner.outputs.runner_name }}
strategy:
matrix: ${{fromJSON(needs.set-environment-matrix.outputs.ENV-MATRIX)}}
steps:
- name: Track & Record Approvers List
run: |
...
...
你能推荐一下吗?
************ 更新************
来自用户 @GuiFalourd 的帖子建议我尝试了以下方法,但没有帮助,并且矩阵中没有填充任何工作
$runnerList = New-Object System.Collections.ArrayList
$envObjects = New-Object System.Collections.ArrayList
foreach($envName in $QueryResult.EnvironmentName){
$runnerToAdd = $null
if ($envName -like "*approvers*") {
$runnerToAdd = "windows-latest"
} else {
$runnerToAdd = "${{ needs.set-global-runner.outputs.runner_name }}"
}
$runnerList.Add($runnerToAdd)
$envObject = @{
"ENVNAME" = $envName
"RUNNERNAME" = $runnerName
}
$envObjects.Add($envObject)
}
$EnvNamesJSONVariable = @{
"ENVOBJECTS" = $envObjects
}
echo "ENV-MATRIX=$($EnvNamesJSONVariable | ConvertTo-JSON -Compress -Depth 100)" >> "$env:GITHUB_OUTPUT"
Deployment:
name: ${{ matrix.envName }}
needs: [set-environment-matrix, set-global-runner]
environment:
name: ${{ matrix.envObjects.envName }}
url: "${{ steps.prereq.outputs.appurl }}"
#runs-on: "${{ needs.set-global-runner.outputs.runner_name }}"
runs-on: "${{ matrix.envObjects.runnerName }}"
strategy:
matrix: ${{fromJSON(needs.set-environment-matrix.outputs.ENV-MATRIX)}}
#matrix: ${{fromJSON(needs.set-environment-matrix.outputs.DISMATRIX)}}
steps:
...
...
请推荐。
您不能在此类条件下使用 jobs.jobId.run 字段。
但是,一个选项可能是已将预期的跑步者保存在
set-environment-matrix
作业中,并在输出中添加此值,使用 矩阵策略中的
objects
。
这样,您将在第一个作业输出中获得一个
matrix.object
列表,其中包含要在部署作业配置中使用的 matrix.object.envName
和 matrix.object.envRunner
。
以下是在这种情况下如何使用矩阵的示例:
on:
workflow_dispatch:
jobs:
test:
runs-on: ${{ matrix.object.envRunner }}
strategy:
matrix:
object: [{"envName":"dev", "envRunner":"ubuntu-latest"}, {"envName":"stg", "envRunner":"windows-latest"}, {"envName":"prd", "envRunner":"macos-latest"}]
fail-fast: true
steps:
- run: |
echo ${{ matrix.object.envName }}
在您的情况下,您必须保证第一个作业的输出将生成您希望在第二个作业的矩阵策略中操作的 JSON 列表。
注意:可以在此处找到与此配置关联的工作流程运行(工作流程文件
)