在一个项目中,我使用这些工作运行两个阶段:
build
compile & test
generate sonar report
deploy
deploy to staging environment
[manual] deploy to production
[manual] deploy
阶段的作业取决于compile & test
作业的输出。但是,在generate sonar report
阶段开始任何工作之前,deploy
工作不需要完成。然而,GitLab坚持认为build
阶段的所有工作都已完成,然后才能在deploy
阶段开展任何工作。
有没有办法告诉GitLab generate sonar report
作业不应该阻止后续的管道阶段?我已经在这项工作上尝试allow_failure: true
,但这似乎没有达到预期的效果。这项工作需要很长时间才能完成,我真的不想在部署之前一直等待它。
答案 0 :(得分:0)
除非我弄错了,否则目前无法做到这一点,并且有一个open feature proposal和another one similar来添加您的建议。
答案 1 :(得分:0)
我们也遇到类似的情况,尽管我们确实使用allow_failure: true
,但是当Sonar作业仅需要很长时间才能运行时(不管失败还是成功),这都没有帮助。
由于您不希望您的deploy
阶段实际上受generate sonar report
工作的结果影响,所以我建议将generate sonar report
工作移至deploy
阶段,因此您的管道将变为:
通过这种方式,generate sonar report
作业不会延迟您的deploy
阶段作业
在{em>之后 generate sonar report
运行build & test
的另一个好处是,您可以将build & test
作业的覆盖率报告保存为Gitlab作业工件,然后使{ {1}}工作将它们作为依赖项使用,因此Sonar也可以监视您的覆盖范围
最后,我们发现将generate sonar report
分离为build & test
,然后再分离为build
很有用,因此我们可以将test
失败与build
失败分开-并且我们然后可以同时在同一test
阶段中并行运行多个测试作业,等等。请注意,您需要将工件从test
作业传递到build
作业通过Gitlab作业工件和依赖项(如果您选择这样做)
答案 2 :(得分:0)
在我看来,这取决于您的阶段语义。您应该尝试确定您的管道中最重要的是什么:明确阶段还是完成工作。
GitLab 有许多方便的功能,例如 needs
keyword,您可以使用它来指定依赖关系图上的直接边。
stages:
- build
- deploy
build:package:
stage: build
script:
- echo "compile and test"
- mkdir -p target && echo "hello" > target/file.txt
artifacts:
paths:
- ./**/target
build:report:
stage: build
script:
- echo "consume the target artifacts"
- echo "waiting for 120 seconds to continue"
- sleep 120
- mkdir -p target/reports && echo "reporting" > target/reports/report.txt
artifacts:
paths:
- ./**/target/reports
deploy:
stage: deploy
needs: ["build:package"]
script:
- echo "deploy your package on remote site"
- cat target/file.txt