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

时间:2020-07-29 07:39:21

标签: github github-actions

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

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

  • 回购中的结帐代码
  • 皮棉
  • 扫描漏洞源
  • 构建
  • 测试
  • 创建图片
  • 扫描图像中的漏洞
  • 推送到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
}

我有几个问题:

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

1 个答案:

答案 0 :(得分:4)

理想情况下,您的某些作业应封装在自己的工作流程中,例如:

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

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

不幸的是,至少暂时而言,工作流依赖项不是现有功能(reference)。

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

可能的选项:

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

jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]

这是准备用于上述方法测试的工作流程。在此示例中,作业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"

相关文档: