有人知道是否可以在needs语句中使用 OR 运算符?假设我们期望成功的 job-a 或 job-b 运行 job-c,即
name: My workflow
on:
workflow_dispatch:
jobs:
job-a:
runs-on: ubuntu-latest
steps:
- name: do something
run: echo "something"
job-b:
runs-on: ubuntu-latest
steps:
- name: do something
run: echo "something"
job-c:
runs-on: ubuntu-latest
needs:
- job-a OR job-b
steps:
- name: do something
run: echo "something"
Run Code Online (Sandbox Code Playgroud)
ITC*_*hap 30
是的,这是可能的。不幸的是,在某些情况下,它并不总是按预期工作。但我们的想法是做如下事情:
jobs:
job-a:
name: Job A
runs-on: ubuntu-latest
steps:
- run: true
job-b:
name: Job B
runs-on: ubuntu-latest
if: false
steps:
- run: true
job-ab:
name: Job AB
runs-on: ubuntu-latest
needs: [ job-a, job-b ]
if: |
always()
&& contains(needs.*.result, 'success')
&& !contains(needs.*.result, 'failure')
steps:
- run: true
Run Code Online (Sandbox Code Playgroud)
默认情况下,使用 时needs,依赖项列表中跳过的任何作业都会触发当前作业的跳过。如果你想强制作业运行,你必须使用always()告诉你的作业始终运行的函数。不幸的是,这意味着如果作业失败或跳过所有先前的作业,它将运行事件。contains(needs.*.result, 'success')如果至少一项工作成功,则为真。所以如果你的所有工作都被跳过,那将是错误的。!(contains(needs.*.result, 'failure'))如果任何作业失败则为 false
我这里有更详细的demo 。
您可以组合jobs.<job_id>.outputs、jobs.<job_id>.steps[*].if和jobs.<job_id>.needs:
jobs:
job1:
runs-on: ubuntu-latest
outputs:
output1: ${{ steps.step1.outputs.test }}
steps:
- id: step0
run: echo "something"
- id: step1
if: success()
run: echo "::set-output name=test::success"
job2:
runs-on: ubuntu-latest
outputs:
output2: ${{ steps.step1.outputs.test }}
steps:
- id: step0
run: echo "something"
- id: step1
if: success()
run: echo "::set-output name=test::success"
job3:
runs-on: ubuntu-latest
needs: [job1, job2]
if: needs.job1.outputs.output1 == 'success' && needs.job2.outputs.output2 == 'success'
steps:
- run: echo ${{needs.job1.outputs.output1}} ${{needs.job2.outputs.output2}}
Run Code Online (Sandbox Code Playgroud)
基本上,在每个作业中,只有当其他步骤成功时,您的最后一步才会设置输出。
然后您可以通过任何作业访问这些输出并执行您想要的任何操作。
| 归档时间: |
|
| 查看次数: |
11003 次 |
| 最近记录: |