我们可以在runs-on:上添加if else条件来选择工作流运行器吗?

问题描述 投票:0回答:1

下面的作业

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:
      ...
      ...

请推荐。

github github-actions
1个回答
0
投票

您不能在此类条件下使用 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 列表。

注意:可以在此处找到与此配置关联的工作流程运行(工作流程文件

© www.soinside.com 2019 - 2024. All rights reserved.