如何在GitLab-CI.yaml中定义删除环境时触发的任务?
解决方案
由于GitLab CE 15.2.2尚未支持on_delete环境钩子,以下是几种可行的实现方式:
方案1:手动触发专用清理作业
创建一个与目标环境绑定的手动CI作业,用于执行删除环境时的清理脚本。用户在GitLab界面删除环境前,先手动运行该作业完成资源清理,再删除环境。
# 关联到review环境的手动清理作业 delete_review_app: when: manual environment: name: review/$CI_COMMIT_REF_SLUG extends: .delete stage: cleanup script: # 这里替换为你需要的删除脚本,比如删除整个命名空间 - kubectl delete namespace $NAMESPACE --ignore-not-found=true
方案2:通过Webhook触发自动清理流水线
利用GitLab的环境事件Webhook,在环境被删除时自动触发流水线执行清理脚本:
- 配置CI作业:创建一个仅允许触发器触发的作业,用于执行清理逻辑:
delete_environment: stage: cleanup script: # 从触发器变量中获取要清理的环境名称 - ENV_SLUG=$TRIGGER_ENV_SLUG - kubectl delete namespace review-$ENV_SLUG --ignore-not-found=true only: - triggers # 限制仅通过触发器触发
- 配置Webhook:在项目的「设置」→「Webhooks」中,添加一个新Webhook:
- URL:填写GitLab流水线触发API,格式为
https://你的GitLab地址/api/v4/projects/[项目ID]/trigger/pipeline - 触发事件:勾选「Environment events」
- 令牌:使用项目的触发器令牌(在「设置」→「CI/CD」→「流水线触发器」中生成)
- 请求参数:添加自定义变量
TRIGGER_ENV_SLUG=$CI_ENVIRONMENT_SLUG(Webhook payload中会包含环境信息,可通过解析payload获取更精准的环境标识)
- URL:填写GitLab流水线触发API,格式为
当你在GitLab界面删除环境时,Webhook会自动触发该流水线,执行清理脚本。
方案3:关联分支删除触发清理
如果你的review环境与代码分支一一绑定,可利用分支删除事件触发清理作业,间接实现环境删除时的脚本执行:
delete_review_on_branch_delete: extends: .delete stage: cleanup script: - kubectl delete namespace review-$CI_COMMIT_REF_SLUG --ignore-not-found=true only: - branches except: - main # 排除主分支等不需要自动清理的分支 environment: name: review/$CI_COMMIT_REF_SLUG action: delete
当对应分支被删除时,该作业会自动(或手动,可调整when参数)触发,完成环境资源的清理。
内容的提问来源于stack exchange,提问作者Den nis
相关产品推荐
相关产品推荐

