仅在特定分支上运行GitLab CI Pipeline

55

我正试图实现 GitLab CI Pipelines 来构建和部署 Angular 应用程序。在我们的项目中,我们有两个常规分支:master(仅供生产使用)和 develop。对于开发,我们从 develop 分支创建 feature/some-feature 分支。当开发完成后,我们从 feature/some-feature 创建合并请求到 develop。当合并请求被批准并合并到 develop 分支时,我希望运行一个 Pipeline 来构建应用程序并将构建部署到某个环境。

我在 .gitlab-ci.yml 中使用以下设置:

image: node:7.5-configured

stages:
    - build
    - deploy

build_job:
    stage: build
    only:
        - develop
    script:
        - /bin/bash <some script here>

...
问题在于每次我推送到任何feature/some-feature分支时,都会执行Pipeline。我的设置有什么问题? 我该如何强制Pipeline仅在直接推送到develop分支时执行? 解决方案 这是我的错误 - 我在develop分支和feature/some-feature分支中有两个不同的.gitlab-ci.yml文件。

我也在这方面苦苦挣扎。我的舞台总是在运行。下面的解决方案没有帮助。 - geoidesic
你需要在 only: 下使用 ref: 部分。 - Don
4个回答

23

这是我的错误 - 我在develop分支和feature/some-feature分支中有两个不同的.gitlab-ci.yml文件,这就是为什么管道会对所有分支执行。


22

虽然这个讨论已经进行了很久,但我想提出一个意见,这是我大部分时间都在使用的。

rules:
    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"'
      when: on_success
      changes:
        - folder/some_folder/**/* 
    - if: '$CI_PIPELINE_SOURCE == "web" && $CI_COMMIT_BRANCH == "development"'
      when: manual
      changes:
        - folder/some_other_folder/**/* 

这个结构解决了我的各种问题,我希望它也能帮助到您!

祝好。


9
如果您能解释为什么这是更好的选择,可能会帮助读者理解。感谢您的建议。 - Shapeshifter
首先,我并不是说这是最好的方法,每个人可以使用不同的方法。我只是说这种方法对我帮助很大,而且我试过的其他方法没有看到那么多的错误和漏洞。不管怎样,这里是详细文档的链接。 - Onur Gürdoğan

5
你也可以在全局级别定义规则,而不是在作业级别。以下是示例:
image: python:3.8

stages:
 - test

workflow:
  rules:
    - if: $CI_COMMIT_BRANCH == "development" || ($CI_PIPELINE_SOURCE == 'merge_request_event' && ( $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "development" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" ))

unit_test:
  stage: test
  services:
    - postgres:13.4
  before_script:
    - export PYTHONPATH=$PWD
   script:
    - export AWS_DEFAULT_REGION=us-west-2
    - python -c "import sys;print(sys.path)"


-7
你应该在需要运行 CI 的分支中添加 .gitlab-ci.yml 文件。

1
但是我需要将它添加到.gitignore中,对吗?否则当我合并时,它会覆盖主分支中的.gitlab-ci.yml。 - LostPhysx
2
这并不能解决问题。.gitlab-ci-yml文件最终会出现在其他分支上,因为他们从开发分支创建新的分支并合并到开发分支。我不确定.gitignore的注释,但那个文件并不是真正用于此目的。 - user3389196

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接