GitHub-actions OR 运算符用于需求子句

Jes*_*dal 23 github-actions

有人知道是否可以在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 。


sol*_*tex 1

您可以组合jobs.<job_id>.outputsjobs.<job_id>.steps[*].ifjobs.<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)

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

然后您可以通过任何作业访问这些输出并执行您想要的任何操作。

  • `needs.job1.outputs.output1 == 'success' &amp;&amp; needs.job2.outputs.output2 == 'success'` 也许 `&amp;&amp;` 应该替换为 `||`? (2认同)