Gitlab CI/CD 更改规则、需求和无效 yaml

问题描述 投票:0回答:1

我的 .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但我无法弄清楚。

为什么无效?

我想要实现的是:

  • 如果 docker/some-dir 下发生某些变化,则运行
    job1
    (这包括任何具有推送操作的 CI_PIPELINE_SOURCE)
  • 或者如果管道因任何其他原因在没有推送事件的情况下启动(例如手动启动或计划等),则也运行
    job1
  • 否则不要跑
    job1
  • 最后,运行
    job2
    (即使
    job1
    没有运行)
gitlab gitlab-ci-runner
1个回答
0
投票

虽然当时我不知道这是根本原因,但在我的评论中,我建议在 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

© www.soinside.com 2019 - 2024. All rights reserved.