你有
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..."