Gitlab CI:如何仅针对唯一提交运行作业?
解决GitLab CI/CD同一提交重复触发构建的问题
针对你遇到的同一提交被推送到多个分支导致重复构建的问题,有两种简洁的实现方式,无需手动维护外部文件:
方案一:利用GitLab CI缓存跟踪已处理提交
通过GitLab的缓存机制存储已处理的提交SHA,每次作业前校验是否已处理,避免重复执行:
# 配置跨分支共享的缓存,存储已处理提交列表 cache: key: global-commit-tracker paths: - .processed_commits build_and_deliver: script: # 检查当前提交是否已在缓存中记录 - if grep -q "$CI_COMMIT_SHA" .processed_commits 2>/dev/null; then echo "Commit $CI_COMMIT_SHA already processed, skipping build."; exit 0; fi # 执行你的构建逻辑 - echo "Starting build for commit $CI_COMMIT_SHA..." # 这里替换成实际的构建命令(如npm run build、mvn package等) # 构建完成后发送产物到测试组 - echo "Delivering artifacts to test team..." # 替换成实际的交付命令 # 将当前提交SHA写入缓存文件,避免后续重复触发 - echo "$CI_COMMIT_SHA" >> .processed_commits
注意事项:
- 缓存的
key设置为固定值(如global-commit-tracker),确保所有分支共享同一缓存 - GitLab缓存默认会保留一段时间,若担心缓存失效,可配合GitLab的CI/CD变量存储已处理列表(但缓存更简洁)
方案二:通过GitLab API查询已完成流水线
直接调用GitLab内置API,检查当前提交是否已有成功完成的流水线,这种方式更可靠,不受缓存有效期影响:
build_and_deliver: before_script: # 安装jq工具用于解析API返回的JSON(根据镜像调整安装命令,如Alpine用apk add jq) - apt-get update && apt-get install -y jq script: # 调用GitLab API查询当前提交的成功流水线数量 - | SUCCESS_PIPELINES=$(curl -s --header "PRIVATE-TOKEN: $CI_JOB_TOKEN" \ "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines?sha=$CI_COMMIT_SHA&status=success" \ | jq '. | length') if [ "$SUCCESS_PIPELINES" -gt 0 ]; then echo "Commit $CI_COMMIT_SHA already has a successful pipeline, exiting." exit 0 fi # 执行构建与交付逻辑 - echo "Starting build for commit $CI_COMMIT_SHA..." # 替换成实际构建命令 - echo "Delivering artifacts to test team..." # 替换成实际交付命令
优势:
- 直接依赖GitLab的流水线历史,不会出现缓存丢失导致的重复执行
$CI_JOB_TOKEN是GitLab自动注入的权限令牌,无需额外配置API密钥
两种方案都能实现“每个提交仅触发一次构建作业”的需求,方案一更轻量,方案二更可靠,可根据团队实际情况选择。
内容的提问来源于stack exchange,提问作者Mr. Don't know
相关产品推荐
相关产品推荐

