仅针对特定分支的 gitlab 触发管道

Posted

技术标签:

【中文标题】仅针对特定分支的 gitlab 触发管道【英文标题】:gitlab trigger pipeline for specific branches only 【发布时间】:2020-02-23 19:10:15 【问题描述】:

我已经为我的项目配置了 gitlab ci/cd 管道。所以我使用了基础模板,它有两个阶段,构建和打包。构建阶段构建项目并创建 jar 文件和打包阶段创建映像并将其存储在容器注册表中。并且 .gitlab-ci.yml 文件已经创建。下面是文件

image: docker:latest
services:
  - docker:dind

stages:
  - build
  - package

build:
  image: gradle:5.6.1-jdk11
  stage: build
  script:
    - gradle clean build -x test
  artifacts:
    paths:
      - build/libs/*.jar

package:
  stage: package
  script:
    - docker build -t registry.gitlab.com/my-project/sample .
    - docker login -u $CI_DOCKER_USERNAME -p $CI_DOCKER_PASSWORD registry.gitlab.com
    - docker push rregistry.gitlab.com/my-project/sample

当我们想要添加新功能时,我们显然会创建新分支,并且由于该文件也存在于新分支中,因此会触发构建。但我不想触发所有分支的构建。我只想触发开发和掌握。无论如何我们可以在项目级别做到这一点,而不是在每个阶段添加only

【问题讨论】:

【参考方案1】:

限制何时创建作业的唯一方法是在 .gitlab-ci.yml 文件中使用 only/except

为了不用写那么多文字,你可以使用extends,有时也可以使用 yaml 锚。更多信息在这里:

https://docs.gitlab.com/ee/ci/yaml/#extends

这里:

https://docs.gitlab.com/ee/ci/yaml/#anchors

extends 的用法示例:

image: docker:latest
services:
  - docker:dind

.only-master-and-develop:
  only:
   - master
   - development

stages:
  - build
  - package

build:
  extends: .only-master-and-develop
  image: gradle:5.6.1-jdk11
  stage: build
  script:
    - gradle clean build -x test
  artifacts:
    paths:
      - build/libs/*.jar

package:
  extends: .only-master-and-develop
  stage: package
  script:
    - docker build -t registry.gitlab.com/my-project/sample .
    - docker login -u $CI_DOCKER_USERNAME -p $CI_DOCKER_PASSWORD registry.gitlab.com
    - docker push rregistry.gitlab.com/my-project/sample

(我没有测试过这个文件,如果有问题请告诉我。)

【讨论】:

这个脚本实际上不起作用......所以我只需要在两个阶段都添加。它在我当地的 gitlan-runner 中工作,我把它作为答案。但是,当构建从提交中被触发时,它会因为无效的 yaml 而失败,我什至在 gitlab.com 上检查了 lint,它也说同样的话。 感谢您告诉我!我现在自己试了一下,由于缺少冒号,我得到了一个 yaml 错误。我在我给出的代码示例中修复了它。加了冒号后还能用吗? @MrBerta 对我来说很好 - 谢谢!【参考方案2】:

您应该使用 via $CI_COMMIT_BRANCH == "" 指定目标分支。

rules:
    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"'
      something regarding the project..

    - if: '$CI_PIPELINE_SOURCE == "web" && $CI_COMMIT_BRANCH == "development"'
      something regarding the project..

我希望上面的例子可以帮助到任何人!

here 也是这类问题的文档。

【讨论】:

以上是关于仅针对特定分支的 gitlab 触发管道的主要内容,如果未能解决你的问题,请参考以下文章

Gitlab-ci:如果 MR 存在则触发 merge_request 分离管道,如果不存在则触发源分支管道。这两条管道不应同时运行

Gitlab双管道触发问题

触发 Gitlab CI/CD 管道以部署存储库的特定部分

如何在 gitlab 中触发特定作业

将更改推送到特定分支时不会触发多分支管道

当特定文件夹中的文件发生更改时触发多分支管道