gitlab-ci - 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
分支上运行。
问题:是否只运行此步骤,同时满足两个条件(分支和更改)?
解决方案
使用rules
关键字时,可以使用rules:if
子句$CI_COMMIT_BRANCH
,带有变量。
因此,如下所示指定master
为运行作业的唯一分支:
build:php:
stage: build
# ...
rules:
- if: '$CI_COMMIT_BRANCH == "master"'
# ...
(规则按顺序应用)
可用的常见 if 子句的文档参考在这里。
现在要结合一个if
和changes
规则,你需要使用
build:php:
stage: build
# ...
rules:
- if: '$CI_COMMIT_BRANCH == "master"'
changes:
- file1 # single file
- folder/**/* # folder including all files and subfolders
# ...
您可以在此处阅读有关规则中使用的更改的更多信息,并在此处阅读完整的更改规范。
初始设置有两个问题:
- 被视为新规则的变化(因为它们
-
前面有一个) src/*
只考虑src
文件夹,而不是子文件夹,因为你需要src/**/*
也可以使用only
关键字来指定master
运行作业的唯一分支。尽管很简单,但不再鼓励这样做,并且不能与rules
( only
/ except
reference ) 一起使用。
例子:
build:php:
stage: build
# ...
only:
- master
# ...
推荐阅读
- java - 解析来自 lambda 的响应
- php - 实时通知的最佳方法
- qt - Qt GLWidget如何绘制文本
- javascript - 如何使图像淡出但在滚动时保持原位?
- sql - 替换 SQL 列中不需要的字符串值部分
- r - 如何存储闪亮的 R 设置并从文件中加载它们
- python - 扩展数据框中数据的分辨率
- c++ - dll文件卸载后如何删除
- javascript - 如何强制 dijit/form/TextBox 立即更新绑定到它的变量 - 绑定无法按预期工作
- hadoop - NoClassDefFoundError org/apache/hadoop/yarn/server/timelineservice/collector/TimelineCollectorManager