如何追踪GitLab CI共享作业的执行次数及使用情况?
解决方案:追踪GitLab CI配置的包含与执行情况
一、GitLab内置方式的局限性
GitLab本身没有直接提供跨项目追踪include配置及对应作业执行的内置功能:
- 审计日志仅记录单个项目内的操作(如修改CI配置、触发流水线),无法获取其他项目include你配置的记录。
- 流水线和作业的元数据仅存储在调用方项目中,你无法直接访问,除非对方主动共享。
二、自建API的安全实现方案
如果通过自建API追踪执行情况,可通过以下方式确保请求合法性:
1. 利用GitLab CI_JOB_TOKEN验证
每个CI作业都会生成唯一的CI_JOB_TOKEN,你可以在API中验证该令牌的有效性:
- 在上报请求中携带
CI_JOB_TOKEN(比如放在请求头Authorization: Bearer $CI_JOB_TOKEN)。 - 你的API收到请求后,调用GitLab的
GET /api/v4/jobs/${CI_JOB_ID}接口(需匹配调用方的GitLab实例地址),验证令牌是否对应真实存在的作业,且作业状态合法。 - 验证通过后,再记录
CI_PROJECT_PATH(调用方项目路径)、CI_JOB_STARTED_AT(执行时间)等元数据。
2. IP白名单限制
只允许GitLab官方IP段访问你的API:
- 从GitLab官方文档获取对应实例的IP范围(如GitLab.com的IP段)。
- 在API服务器的防火墙、Nginx或负载均衡器中配置白名单,拒绝非GitLab IP的请求。
3. 简化的上报脚本示例
修改你的作业脚本,加入上报逻辑:
somejob: only: ["master"] script: - curl https://somegitlab/.../raw/.../analyse_code.sh - | # 上报执行信息到自建API curl -X POST https://your-tracking-api.com/log \ -H "Authorization: Bearer $CI_JOB_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "project_path": "'"$CI_PROJECT_PATH"'", "job_id": "'"$CI_JOB_ID"'", "started_at": "'"$CI_JOB_STARTED_AT"'", "included_from": "my-group/my-project" }' - bash analyse_code.sh
三、其他可行建议
- 将上报逻辑嵌入分析脚本:把上报代码直接写到
analyse_code.sh中,调用方无需修改CI作业,执行脚本即可自动上报,降低使用门槛。 - 使用GitLab CI模板规范调用:将你的作业定义为CI模板(如在你的项目中创建
templates/code-analysis.yml),让调用方通过include引用模板。模板中统一加入上报逻辑,确保所有调用都能被追踪。 - 添加自定义标识:要求调用方在CI变量中设置唯一的客户ID,上报时一并提交,方便区分不同使用者(适合精细化统计场景)。
内容的提问来源于stack exchange,提问作者azro
相关产品推荐
相关产品推荐

