GitLab CI/CD仅在正确分支且有更改时运行步骤

5

我希望在构建过程中只有当 src 文件夹发生更改时,才仅对 master 分支执行一步操作。

因此,我的 .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 分支上运行。

问题:有没有一种方法使此步骤仅在同时满足条件(分支和更改)时运行?

2个回答

7
使用rules关键字时,可以使用带变量$CI_COMMIT_BRANCHrules:if条款。因此,可以像下面这样指定只运行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/except 参考)。

示例:

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

1
这里有一个问题:onlyrules是不兼容的,据我所知,GitLab正在鼓励转向使用rules - wawa
你说得完全正确,我没有阅读整个代码片段,只给出了“快速”解决方案,非常抱歉。我会更新答案 :) - nunohpinheiro
1
这对于分支本身有效,但是如果我尝试将其与更改规则结合使用,例如: rules: - if: '$CI_COMMIT_REF_SLUG == "master"' changes: - api/config/* - api/src/* - api/tests/* - api/migrations/* - api/composer.lock - api/symfony.lock它不起作用。 - wawa

0

无法在master分支上运行rules:changes

Gitlab文档说:

您应该仅在分支管道或合并请求管道中使用rules: changes。您可以将rules: changes与其他管道类型一起使用,但是当没有Git push事件时,rules: changes始终计算为true。标记管道、计划管道、手动管道等都没有与之关联的Git push事件。

这意味着如果与branchesmerge_requests不同的类型,则changes始终为true


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