GitHub-actions OR操作符for needs子句



有人知道是否可以在needs语句中使用OR操作符?假设我们期望作业a或作业b成功运行作业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"

这是可能的。不幸的是,我有一些情况下,它并不总是像预期的那样工作。但是我们的想法是这样做的:

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

默认情况下,当使用needs时,跳过依赖项列表中的任何作业都将触发跳过当前作业。如果你想强制作业运行,你必须使用always()函数,它将告诉你的作业始终运行。不幸的是,这意味着如果作业失败或跳过之前的所有作业,它将运行事件。如果至少有一个作业成功,contains(needs.*.result, 'success')将为true。因此,如果跳过所有作业,它将为false。如果任何作业失败,!(contains(needs.*.result, 'failure'))为false

我在这里有一个更详细的演示。

可以组合job .输出,工作灵活;job_id>.steps[*]。如果,和jobs..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}}

基本上,在每个作业中,只有当其他步骤成功时,最后一步才会设置输出。

然后您可以通过任何作业访问这些输出并做任何您想做的事情。

如果使用"if: ${{always()"不管"需要"与否

needs中不可能有一个真正的OR条件,但是有很多方法可以解决这个限制。我的解决方法是让每个作业都运行,但要检查每个步骤是否应该运行。

on:
pull_request:
branches:
- "main"
workflow_dispatch:
jobs:
job-a:
runs-on: ubuntu-latest
steps:
- if: ${{ github.event_name == 'pull_request' }}
run: echo "Triggered by a pull request"
job-b:
runs-on: ubuntu-latest
steps:
- if: ${{ github.event_name == 'workflow_dispatch' }}
run: echo "Triggered by workflow dispatch"
job-c:
needs: [job-a, job-b]
runs-on: ubuntu-latest
steps:
- run: echo "Do some stuff"
job-d:
needs: [job-c]
runs-on: ubuntu-latest
steps:
- run: echo "This runs too"

最新更新