在 GitHub Actions 中创建作业之间的依赖关系

Joh*_*van 4 github github-actions

我是 GitHub Actions 的新手,使用各种选项来制定 CI/CD 管道的好方法。

最初,我将所有 CI 步骤放在一项工作中,执行以下操作:

  • 来自 repo 的结帐代码
  • 皮棉
  • 扫描漏洞源
  • 建造
  • 测试
  • 创造形象
  • 扫描图像以查找漏洞
  • 推送到 AWS ECR

不过,其中一些步骤不需要按顺序完成;例如,我们可以在构建的同时运行 linting 和源代码漏洞扫描;节省时间(如果我们假设这些步骤将会通过)。

即基本上我希望我的管道做这样的事情:

job1 = {
 - checkout code from repo #required per job, since each job runs on a different runner
 - lint
}
job2 = {
 - checkout code from repo
 - scan source for vulnerabilities
}
job3 = {
 - checkout code from repo
 - lint
 - scan source for vulnerabilities
 - build
 - test
 - create image
 - scan image for vulnerabilities
 - await job1 & job2
 - push to AWS ECR
}
Run Code Online (Sandbox Code Playgroud)

我有一些问题:

  1. 是否可以await jobN在作业中设置一些规则;即从另一份工作中查看一份工作的状态?
  2. (仅当 1 的答案为 时才相关Yes):有没有办法让一项工作的失败立即影响同一工作流程中的其他工作?即如果我的 linting 工作检测到问题,那么我可以立即称其为失败,因此希望 job1 中的失败立即停止工作 2 和 3 消耗额外时间,因为它们不再增加价值。

Dan*_*nyB 9

理想情况下,您的一些作业应该封装在它们自己的工作流中,例如:

  • 通过任何方式测试源的工作流程。
  • (构建和-)部署的工作流。

然后,让这些工作流相互依赖,或者使用不同的触发器来触发。

不幸的是,至少就目前而言,工作流依赖性不是现有功能(参考)。

尽管我觉得将您提到的所有作业包含在单个工作流中会创建一个冗长且难以维护的文件,但我相信您仍然可以通过使用 GitHub 操作语法提供的一些条件来实现您的目标。

可能的选项:

使用后者,示例语法可能如下所示:

jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]
Run Code Online (Sandbox Code Playgroud)

这是一个准备用于测试上述方法的工作流。在此示例中,作业 2 将仅在作业 1 完成后运行,而作业 3 将不会运行,因为它依赖于失败的作业。

name: Experiment
on: [push]

jobs:
  job1:
    name: Job 1
    runs-on: ubuntu-latest

    steps:
    - name: Sleep and Run
      run: |
        echo "Sleeping for 10"
        sleep 10

  job2:
    name: Job 2
    needs: job1
    runs-on: ubuntu-latest

    steps:
    - name: Dependant is Running
      run: |
        echo "Completed job 2, but triggering failure"
        exit 1

  job3:
    name: Job 3
    needs: job2
    runs-on: ubuntu-latest

    steps:
    - name: Will never run
      run: |
        echo "If you can read this, the experiment failed"
Run Code Online (Sandbox Code Playgroud)

相关文档:

  • 例如,如果您仍希望在“job2”不成功或被跳过的情况下运行“job3”,则可以在“job3”上使用“if: ${{always() }}”。https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idneeds 它仍然会强制“job2”尝试首先运行 (3认同)