【问题标题】:gitlab trigger pipeline for specific branches only仅针对特定分支的 gitlab 触发管道
【发布时间】: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

【问题讨论】:

    标签: continuous-integration gitlab gitlab-ci pipeline


    【解决方案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 也是这类问题的文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2022-01-16
      • 2022-06-16
      • 1970-01-01
      • 2021-11-14
      相关资源
      最近更新 更多