首页 > 解决方案 > GitLab CI/CD 仅当在正确的分支上并且它有更改时才运行步骤

问题描述

我希望构建过程中的一个步骤仅在master分支上运行,如果那里对src文件夹进行了更改。

因此,我的.gitlab-ci.yml文件包含:

build:php:
    stage: build
    image: alpine
    interruptible: true
    needs: [ "test:php" ]
    script:
        - do stuff // abreviated for simplicity
    rules:
        -   if: $LANGUAGE_RELEASE
            when: never
        -   if: '$CI_COMMIT_REF_SLUG == "master"' # run for production test branch
        -   changes:
                - src/*

但是,这里的问题是,当我更改任何内容时,它也会在dev分支上运行。

问题:是否只运行此步骤,同时满足两个条件(分支和更改)?

标签: gitlab-ci

解决方案


使用rules关键字时,可以使用rules:if子句$CI_COMMIT_BRANCH,带有变量。

因此,如下所示指定master为运行作业的唯一分支:

build:php:
    stage: build
    # ...
    rules:
       - if: '$CI_COMMIT_BRANCH == "master"'
    # ...

(规则按顺序应用)

可用的常见 if 子句的文档参考在这里


现在要结合一个ifchanges规则,你需要使用

build:php:
    stage: build
    # ...
    rules:
       - if: '$CI_COMMIT_BRANCH == "master"'
         changes:
           - file1 # single file
           - folder/**/* # folder including all files and subfolders
    # ...

您可以在此处阅读有关规则中使用的更改的更多信息,并此处阅读完整的更改规范。

初始设置有两个问题:

  1. 被视为新规则的变化(因为它们-前面有一个)
  2. src/*只考虑src文件夹,而不是子文件夹,因为你需要src/**/*

也可以使用only关键字来指定master运行作业的唯一分支。尽管很简单,但不再鼓励这样做,并且不能与rules( only/ exceptreference ) 一起使用。

例子:

build:php:
    stage: build
    # ...
    only:
       - master
    # ...

推荐阅读