我是GitHub Actions的新手,他在玩各种选项来为CI / CD管道制定好的方法。
最初,我将所有CI步骤都放在一项工作中,并执行以下操作:
其中某些步骤无需按顺序进行;例如我们可以在构建的同时运行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
}
我有几个问题:
await jobN
规则;即查看另一项工作的状态?Yes
时相关):是否有任何方法可以使一个作业的失败立即影响同一工作流程中的其他作业?即,如果我的棉绒作业检测到问题,那么我可以立即将其称为失败,因此希望作业1中的故障立即停止作业2和3消耗额外的时间,因为它们不再增加价值。答案 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"
相关文档: