GitLab CI:特定阶段完成后为流水线添加自定义标签/徽章
当然可以实现!给GitLab流水线添加专属自定义徽章的方案
完全能做到你想要的效果——当特定阶段成功完成后,给目标流水线添加自定义徽章,并且保证同一时间只有一个流水线拥有这个徽章。下面我给你拆解具体的实现步骤:
核心思路
利用GitLab的API实现两个关键操作:
- 当目标阶段(比如部署阶段)成功后,给当前流水线添加指定标签/徽章
- 同时移除所有其他流水线的同类型徽章,确保唯一性
具体实现步骤
1. 准备API访问权限
首先需要生成一个具备api权限的访问令牌:
- 可以在GitLab个人设置里创建个人访问令牌(PAT),或者在项目设置里创建项目级访问令牌
- 把令牌存储到项目的CI/CD变量中(比如命名为
GITLAB_API_TOKEN),避免明文泄露
2. 配置CI/CD脚本
在你的.gitlab-ci.yml文件中,添加一个专门处理徽章的job,依赖于你要触发的目标阶段(比如部署成功的job):
add_last_deploy_badge: stage: deploy # 和你的部署阶段保持一致 needs: ["your_deployment_job"] # 替换成实际的部署job名称 script: - | # 先安装jq工具(如果runner镜像没有预装的话) apt-get update && apt-get install -y jq # 1. 获取所有带有"last deploy"徽章的流水线ID PIPELINE_IDS=$(curl --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" \ "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/pipelines?per_page=100" \ | jq -r '.[] | select(.labels[]? == "last deploy") | .id') # 2. 批量移除这些流水线的"last deploy"徽章 for ID in $PIPELINE_IDS; do curl --request DELETE --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" \ "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/pipelines/${ID}/labels/last%20deploy" done # 3. 给当前成功的流水线添加"last deploy"徽章 curl --request POST --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" \ "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/pipelines/${CI_PIPELINE_ID}/labels" \ --data "labels=last deploy" only: - main # 替换成你要触发的分支/标签规则 when: on_success # 只有当前面的部署job成功时才执行
3. 设置徽章自定义颜色
GitLab的流水线标签支持自定义颜色,你需要预先在项目中配置好:
- 进入项目的 Settings > Repository > Labels
- 新建一个标签,名称填
last deploy,选择你想要的颜色(比如蓝色、绿色) - 保存后,后续通过API添加这个标签时,就会自动显示你设置的颜色了
注意事项
- 确保你的访问令牌拥有足够权限:需要
api范围,以及项目的maintainer或更高权限 - 如果你的流水线数量极多,可以调整
per_page参数或者添加分页逻辑来覆盖所有旧流水线 - 可以根据需求调整
only规则,比如只在特定标签或合并请求触发时执行这个job
这样配置后,每次部署阶段成功完成,当前流水线就会带上"last deploy"彩色徽章,同时之前的同类型徽章会被自动移除,完美实现你要的效果!
内容的提问来源于stack exchange,提问作者Dieter Casier
相关产品推荐
相关产品推荐

