代码之家  ›  专栏  ›  技术社区  ›  Ashar

如何在需要的工作中为不同的工作设置多个条件?

  •  0
  • Ashar  · 技术社区  · 2 年前

    我有一个可重复使用的工作流,有三个作业:作业1、作业2和作业3。

    我希望满足的条件是:

    1. 作业3需要始终在作业2成功完成后运行,因此我提到 needs: [job1,job2] 在job3中。
    2. 如果跳过作业2,则应运行作业3
    3. job3应该始终依赖于/需要job1来运行。

    以下是我的工作流程:

    on:
    
      workflow_call:
    
        inputs:
    
            enable_scan:
              required: false
              type: boolean
              default: true 
    
            runner_name:
              required: false
              type: string
              default: 'myselfhostedrunner' 
    
    jobs:
    
     
    
      job1:
    
        runs-on: '${{ inputs.runner_name }}'
        outputs:
          myrunner: '${{ inputs.runner_name }}'
    
        steps:
    
          - name: Runner details
            run: |
              echo "Job1 called"
    
      job2:
    
      if: inputs.enable_scan
    
        runs-on: '${{ inputs.runner_name }}'
    
        steps:
    
          - name: Runner details
            run: |
              echo "Job2 called"
    
      job3:
    
        runs-on: '${{ needs.job1.outputs.myrunner }}'
    
        needs: [job1, job2]
        if: ${{ ! success() && ! cancelled() }}
    
        steps:
    
          - name: Checkout folderX
            uses: actions/checkout@v4
    

    如何在job3中满足job1和job2的两个不同要求?

    1 回复  |  直到 2 年前
        1
  •  1
  •   VonC    2 年前

    你有

     job1 --[always]--> job3
     job2 --[success]--> job3
    

    根据您提供的配置和您想要满足的条件,您可以考虑:

    • 调整 if 语句,以检查作业2是否已跳过或成功。
    • 使用GitHub Actions的条件 如果 语法来创建允许job3在所需条件下运行的逻辑。
    • 通过保持 needs: [job1, job2] 在job3定义中。
    • 使用 outputs 从…起 job2 以发出信号 job3 是否应该运行。

    例如:

    on:
      workflow_call:
        inputs:
          enable_scan:
            required: false
            type: boolean
            default: true 
          runner_name:
            required: false
            type: string
            default: 'myselfhostedrunner' 
    
    jobs:
      job1:
        runs-on: '${{ inputs.runner_name }}'
        outputs:
          myrunner: '${{ inputs.runner_name }}'
        steps:
          - name: Runner details
            run: |
              echo "Job1 called"
    
      job2:
        if: inputs.enable_scan
        runs-on: '${{ inputs.runner_name }}'
        outputs:
          status: ${{ steps.check-status.outputs.status }}  # Set an output to signal the status of this job to job3
        steps:
          - name: Runner details
            run: |
              echo "Job2 called"
          - id: check-status
            run: echo "status=completed" >> $GITHUB_OUTPUT  # Update to use GITHUB_OUTPUT environment file
    
      job3:
        runs-on: '${{ needs.job1.outputs.myrunner }}'
        needs: [job1, job2]
        if: ${{ fromJson(needs.job2.outputs.status).status == 'completed' || needs.job2.result == 'SKIPPED' }}  # Check the status output from job2
        steps:
          - name: Checkout folderX
            uses: actions/checkout@v4
    

    现在,如果job2被跳过或成功,job3将执行,并且它将始终依赖于job1。

     job1 --[always]--> job3
     job2 --[success or skipped]--> job3
    

    一种可能的替代方案是使用工件,在 作业2 job3 :

    on:
      workflow_call:
        inputs:
          enable_scan:
            required: false
            type: boolean
            default: true 
          runner_name:
            required: false
            type: string
            default: 'myselfhostedrunner' 
    
    jobs:
      job1:
        runs-on: '${{ inputs.runner_name }}'
        steps:
          - name: Runner details
            run: |
              echo "Job1 called"
    
      job2:
        if: inputs.enable_scan
        runs-on: '${{ inputs.runner_name }}'
        steps:
          - name: Runner details
            run: |
              echo "Job2 called"
          - name: Set status
            id: set-status
            run: echo "completed" > status.txt
          - name: Upload status
            uses: actions/upload-artifact@v2
            with:
              name: status
              path: status.txt
    
      job3:
        runs-on: '${{ needs.job1.outputs.myrunner }}'
        needs: [job1, job2]
        steps:
          - name: Download status
            uses: actions/download-artifact@v2
            with:
              name: status
          - name: Check status
            id: check-status
            run: |
              if [[ -f status.txt ]]; then
                STATUS=$(cat status.txt)
              else
                STATUS="SKIPPED"
              fi
              echo "::set-output name=status::$STATUS"
          - name: Conditional step
            if: ${{ steps.check-status.outputs.status == 'completed' || needs.job2.result == 'SKIPPED' }}
            run: |
              echo "Job3 running..."