我有一个 gitlab 管道,其中有两个阶段,一个是构建,另一个是部署。构建阶段在提交时运行。我想要一种在合并请求合并到 master 时运行部署作业的方法。我尝试了几件事但没有运气。有人可以帮忙吗?
stages:
- build
- deploy
dotnet:
script: "echo This builds!"
stage: build
production:
script: "echo This deploys!"
stage: deploy
only:
refs:
- master
尝试使用
gitlab-ci.yml
“规则”功能来检查合并请求事件。
您当前的
gitlab-ci.yml
将在每次提交、合并请求、计划和手动触发管道时运行您的“dotnet”作业。
https://docs.gitlab.com/ee/ci/yaml/#workflowrules
dotnet:
script: "echo This builds!"
stage: build
rules:
- if: '$CI_COMMIT_REF_NAME != "master" && $CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "merge_request_event"'
production:
script: "echo This deploys!"
stage: deploy
rules:
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_REF_NAME == "master"'
如果您希望作业仅在合并合并请求后运行,那么您可以根据提交消息触发作业,如下所示。
rules:
- if: '$CI_COMMIT_MESSAGE =~ /See merge request/'
基本上,所有合并请求都带有“查看合并请求”提交消息,因此您可以依赖该消息来触发您的作业。
CI_MERGE_REQUEST_APPROVED 变量似乎是为检查批准状态而设计的,而不是为了触发管道。 (问题,https://gitlab.com/gitlab-org/gitlab/-/issues/375908)
当您使用合并请求预定义变量时,gitlab 在创建合并请求时创建管道,而不是在批准合并请求时创建管道。
相反,使用带有正则表达式的 CI_COMMIT_BRANCH 预定义变量,并使用分支访问权限限制主分支上的提交。
stages:
- build
- deploy
dotnet:
stage: build
rules:
- if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"
script: "echo This builds!"
production:
stage: deploy
rules:
- if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"
script: "echo This deploys!"
编辑错误示例的答案。(编辑于2023年1月26日)
假设我们有 rc 和 master 分支。 我们可以将 master 分支配置为受保护,并且仅用于合并请求。
在这种情况下,我们可以像下面这样定义 gitlab-ci 文件。
stages:
- build
- deploy
dotnet:
stage: build
rules:
- if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "rc"
script: "echo This builds!"
production:
stage: deploy
rules:
- if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"
script: "echo This deploys!"
感谢您的通知@Kappacake
您可以在合并后使用 Gitlab ci 预定义变量 $CI_MERGE_REQUEST_APPROVED 运行管道,这将在合并后返回 true,并可从 gitlab v14.1 获取。
如果要在主分支创建合并请求时运行管道,可以将 $CI_MERGE_REQUEST_TARGET_BRANCH_NAME 与 $CI_MERGE_REQUEST_APPROVED 一起使用。
您可以在您的工作中添加这样的规则。
rules:
- if: $CI_MERGE_REQUEST_APPROVED && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"