我的 .gitlab-ci.yml 文件中有两个作业,与此类似:
job1:
stage: build
script:
- cd docker/some-dir
- make build
- make run
rules:
- changes:
- "docker/some-dir/**/*"
when: always
- when: never
job2:
stage: build
needs:
- job1
script:
- cd docker/some-dir2
- make build
- make run
job1
正在建设和推动docker_image_1
job2
正在建设和推动docker_image_2
docker_image_2
基于 docker_image_1
例如Dockerfile 以 FROM: docker_image_1
docker_image_1
仅当 docker/some-dir 下发生更改时rules
中删除 job1
部分,那么就不会出现错误,但是当然,它会为所有推送事件重建 docker_image_1
,我想避免这种情况。GitLab pipline 给我“yaml 错误”,没有任何详细的错误消息。我已经检查了参考文献https://docs.gitlab.com/ee/ci/yaml/index.html#rules但我无法弄清楚。
为什么无效?
我想要实现的是:
job1
(这包括任何具有推送操作的 CI_PIPELINE_SOURCE)job1
job1
job2
(即使 job1
没有运行)虽然当时我不知道这是根本原因,但在我的评论中,我建议在 job2 中使用needs:可选属性。从评论中您确认这确实解决了问题,因此将其添加为完整性的答案。
needs 关键字要求 job2 运行之前 job1 必须先运行。在您的情况下,Job2 没有规则并且将始终运行,但是 job1 有某些规则,这意味着它不会在所有情况下运行。在 job1 尚未运行的管道中,job2 将尝试运行,但应该会收到类似于
'job1' job needs 'job2' job, but it was not added to the pipeline
的错误。有时这在 UI 中并不明显。
使用可选属性允许您定义 job2 应该等到 job1 完成,但是如果没有 job1 那么 job2 无论如何都可以运行。 gitlab 文档中的示例是
build-job:
stage: build
test-job1:
stage: test
test-job2:
stage: test
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
deploy-job:
stage: deploy
needs:
- job: test-job2
optional: true
- job: test-job1
environment: production
review-job:
stage: deploy
needs:
- job: test-job2
optional: true
environment: review
有关更多详细信息,您可以阅读https://docs.gitlab.com/ee/ci/yaml/#needsoptional