我目前正在 gitlab 上开发 CI/CD 管道。我有 5 个不同的阶段:
我想要做的是触发清理作业来清理应用程序的已部署开发实例。
我使用 gitlab 尝试了几种不同的选项
rules
,我尝试使用以下方式获取合并事件:
cleanup:graphql_ci:
before_script: *graphql_before_script
stage: cleanup
script:
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_STATE == "merged"'
但是我发现 $CI_MERGE_REQUEST_STATE 变量不是 gitlab 变量。 当单击合并按钮或类似的操作时,有什么方法可以触发合并请求的作业吗?
当单击合并按钮或类似的操作时,有什么方法可以触发合并请求的作业吗?
确实没有一个伟大的方法可以做到这一点。请记住,当您将一个分支合并到另一个分支时,这基本上只是目标分支上的正常 git 推送操作。
从技术上讲,可以使用
git
来推断提交是否是合并提交,但 GitLab 不会在您可以在 rules:
定义中使用的任何预定义环境变量中公开此信息。
您可以尝试执行此操作的一种方法是使用通过合并提交消息标识合并提交的规则。 默认情况下合并提交消息将具有以
See merge request %project_path&!%mr_iid%
结尾每条 git 消息的模板,因此,提交通常如下所示:
The commit message title, (usually the MR title)
This is the mr description
See merge request mygroup/mysubgroup/myproject!123
因此,您可以使用它来编写一条规则,在合并 MR 时进行的提交上检查此默认消息:
myjob:
rules:
- if: $CI_COMMIT_MESSAGE =~ /(.*)See merge request [\w\/\-\_]+!\d+$/
但是,这里需要注意的是,合并的提交消息可以被覆盖,因此这只是尽力而为。
另一种方法是不使用
rules:
,而是将此要求作为工作本身的一部分来处理。如果确定当前且只是 exit 0
,则可以让该作业实际上成为无操作 - 否则,如果它是合并提交,则允许作业脚本继续。
例如,应用这个方法(我不对它的正确性/完整性做出任何断言),你可以这样做:
.on_merge_commit:
before_script:
- |
is_merge_commit=$(git rev-parse --verify "$CI_COMMIT_SHA"^2 2> /dev/null)
if [[ -z "$is_merge_commit" ]]; then
echo "not a merge commit, exiting" > /dev/stderr
exit 0
fi
myjob:
extends: .on_merge_commit
script:
- echo "this message will only appear on merge commits"
我想要做的是触发清理作业来清理应用程序的已部署开发实例。
但是,在您的情况下,还有另一种选择。使用 GitLab 的环境功能时,您可以定义一个作业,以便在环境“停止”时运行,以清理它。 GitLab 还支持在合并或关闭合并请求时停止环境。这是 GitLab review apps 方法的一部分。通过这种方式,您可以确保在合并或关闭 MR 时清理您的环境。
使用文档中的示例:
deploy_review:
stage: deploy
script:
- echo "Deploy a review app"
environment:
name: review/$CI_COMMIT_REF_SLUG
on_stop: stop_review
rules:
- if: $CI_MERGE_REQUEST_ID
stop_review:
stage: deploy
script:
- echo "Remove review app"
environment:
name: review/$CI_COMMIT_REF_SLUG
action: stop
rules:
- if: $CI_MERGE_REQUEST_ID
when: manual