仅针对特定分支的 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 分离管道,如果不存在则触发源分支管道。这两条管道不应同时运行