如何在GitLab流水线作业中彻底删除已停止的GitLab环境
GitLab MR临时环境自动删除实现方案
获取environment_id的可行方法
- 直接使用CI预定义变量(首选)
只要你部署临时页面的Job中配置了environment字段绑定对应MR环境,GitLab CI会自动注入$CI_ENVIRONMENT_ID预定义变量,值就是当前环境对应的数字ID。你可以在部署阶段把这个值写入文本文件作为流水线制品传递给后续清理Job,不需要额外调用接口查询。
注意这个变量仅在绑定了对应环境的Job中生效,如果你的清理逻辑是独立Job、和部署Job没有直接关联,用下面的查询方法更方便。 - 按固定环境名调用接口查询ID
你为每个MR创建的临时环境肯定有固定命名规则,比如常用的命名格式为review/mr-${CI_MERGE_REQUEST_IID},直接调用环境列表接口按名称做精确匹配,就能拿到对应的环境ID,全程不需要打开GUI操作。
查询逻辑可以直接在CI脚本里写,用到的CI_API_V4_URL、CI_PROJECT_ID、CI_MERGE_REQUEST_IID都是GitLab CI原生预定义变量,不需要手动赋值,只需要提前在项目CI/CD变量中配置一个有API操作权限的访问令牌即可,示例查询代码:# 替换为你实际使用的MR环境命名规则 ENV_NAME="review/mr-${CI_MERGE_REQUEST_IID}" ENV_ID=$(curl --silent --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" \ "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/environments?name=${ENV_NAME}" \ | jq -r '.[0].id')
流水线清理步骤配置示例
你可以直接在流水线中新增一个专属清理Job,设置为MR合并/关闭时触发,Job会先自动停止环境,再执行删除逻辑,完全不需要手动操作,示例配置:
cleanup_review_env: stage: cleanup script: - ENV_NAME="review/mr-${CI_MERGE_REQUEST_IID}" # 查询对应环境ID - ENV_ID=$(curl -s -H "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/environments?name=${ENV_NAME}" | jq -r '.[0].id') # 判空后调用删除接口,避免环境不存在时报错 - if [ -n "$ENV_ID" ] && [ "$ENV_ID" != "null" ]; then curl -s --request DELETE -H "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/environments/${ENV_ID}"; fi rules: # 触发条件:MR合并或关闭时运行 - if: $CI_MERGE_REQUEST_IID && ($CI_MERGE_REQUEST_EVENT_TYPE == "merged" || $CI_MERGE_REQUEST_EVENT_TYPE == "closed") environment: # 替换为你实际的MR环境名称 name: review/mr-$CI_MERGE_REQUEST_IID action: stop
注意:配置里的
action: stop会先触发GitLab原生的环境停止逻辑,等环境状态变为已停止后再执行后续删除脚本,刚好符合删除接口对环境状态的要求,不会出现状态冲突删除失败的问题。
内容的提问来源于stack exchange,提问作者DemiA
相关产品推荐
相关产品推荐

