求助:CircleCI构建取消后执行任务/步骤的可行替代方案
解决方案:CircleCI构建取消后清理GCP临时资源
针对你遇到的构建取消导致GCP资源残留的问题,分享几个经过验证的实用方案:
方案1:给GCP资源添加自动过期机制
这是最省心的方案,直接在创建GCP计算实例及配套资源时配置自动销毁规则:
- 创建实例时,通过
gcloud命令设置--delete-on-termination(确保实例关机时自动删除),同时给实例添加定时销毁的启动脚本:gcloud compute instances create temp-instance \ --zone us-central1-a \ --delete-on-termination \ --metadata shutdown-script="#!/bin/bash # 设置2小时后自动销毁实例 sleep 7200 gcloud compute instances delete temp-instance --zone us-central1-a --quiet" - 也可以用GCP Cloud Scheduler配合Cloud Functions,定时扫描带有
circleci-build-id=$CIRCLE_BUILD_ID标签的资源,查询对应CircleCI构建状态,若构建已取消/终止则自动删除关联资源。
方案2:独立的清理工作流
在CircleCI配置中新增专门的清理任务,支持手动或定时触发:
- 编写接收构建ID参数的清理任务,定位并删除该构建关联的所有GCP资源:
jobs: cleanup-gcp-resources: docker: - image: google/cloud-sdk:latest parameters: build-id: type: string steps: - run: name: Clean up GCP resources for canceled build command: | # 删除关联实例 gcloud compute instances delete --zone us-central1-a "ci-instance-<< parameters.build-id >>" --quiet # 删除关联VPC和防火墙 gcloud compute networks delete "ci-vpc-<< parameters.build-id >>" --quiet gcloud compute firewall-rules delete "ci-firewall-<< parameters.build-id >>" --quiet - 可以通过CircleCI UI手动触发该任务并传入被取消构建的ID;也用Cloud Scheduler定时调用CircleCI API,批量清理超时未处理的残留资源。
方案3:任务内信号捕获(单任务场景适用)
如果资源在单个任务内创建,且担心任务中途被取消,可在脚本中用trap捕获CircleCI发送的SIGTERM信号,执行即时清理:
#!/bin/bash # 定义清理逻辑 cleanup_resources() { echo "Build canceled, cleaning up GCP resources..." gcloud compute instances delete temp-instance --zone us-central1-a --quiet exit 0 } # 绑定SIGTERM信号触发清理 trap cleanup_resources SIGTERM # 创建GCP资源的核心逻辑 gcloud compute instances create temp-instance --zone us-central1-a # 执行任务后续操作 # ...
注意:该方案仅适用于单个任务未完成时被取消的场景,若创建资源的任务已完成、后续销毁任务未运行时构建被取消,此方法无效。
内容的提问来源于stack exchange,提问作者codeing_monkey
相关产品推荐
相关产品推荐

