仅当在正确的分支上且发生更改时,GitLab CI/CD 才运行步骤

waw*_*awa 5 gitlab-ci

我希望构建过程中的一个步骤仅在分支上运行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/*
Run Code Online (Sandbox Code Playgroud)

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

问题:是否有一种方法可以仅运行此步骤,同时满足两个条件(分支和更改)?

N P*_*iro 7

当使用rules关键字时,rules:if子句可以与变量一起使用$CI_COMMIT_BRANCH

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

build:php:
    stage: build
    # ...
    rules:
       - if: '$CI_COMMIT_BRANCH == "master"'
    # ...
Run Code Online (Sandbox Code Playgroud)

(规则按顺序应用)

可用的常见 if 子句的文档参考位于此处


现在要结合ifandchanges规则,您需要使用

build:php:
    stage: build
    # ...
    rules:
       - if: '$CI_COMMIT_BRANCH == "master"'
         changes:
           - file1 # single file
           - folder/**/* # folder including all files and subfolders
    # ...
Run Code Online (Sandbox Code Playgroud)

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

初始设置存在两个问题:

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

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

例子:

build:php:
    stage: build
    # ...
    only:
       - master
    # ...
Run Code Online (Sandbox Code Playgroud)