如何用GitLab CI实现基于标签自动筛选提交到环境分支?
实现基于标签的GitLab环境分支自动化部署方案
一、统一标签规范
先明确提交标签的命名规则,确保脚本能准确筛选:
- 标记可部署到production的提交:添加标签
env:prod - 标记可部署到staging的提交:添加标签
env:staging - 一个提交可以同时添加两个标签(支持同时部署到两个环境)
二、编写Git自动化脚本
编写Shell脚本,从dev分支筛选符合标签条件的提交,生成/更新prod和staging分支。
1. 核心脚本逻辑
脚本执行流程:
- 拉取最新的
dev分支和所有标签 - 筛选出对应环境标签关联的提交哈希(去重并按提交时间排序)
- 基于
dev分支重置目标环境分支,批量cherry-pick符合条件的提交 - 推送更新后的环境分支到GitLab
2. 示例脚本(generate_env_branches.sh)
#!/bin/bash set -e # 配置参数 DEV_BRANCH="dev" PROD_BRANCH="prod" STAGING_BRANCH="staging" # 拉取最新代码和标签 git fetch origin git checkout $DEV_BRANCH git pull origin $DEV_BRANCH # 生成指定环境分支的函数 generate_env_branch() { local env_tag=$1 local target_branch=$2 # 筛选带指定环境标签的提交哈希,去重并按提交时间正序排列 COMMITS=$(git for-each-ref refs/tags --format="%(objectname) %(refname:short)" | \ grep "$env_tag" | \ awk '{print $1}' | \ sort -u | \ git log --stdin --pretty="%H" --reverse) # 创建/切换到目标分支,基于dev分支重置 git checkout -B $target_branch origin/$DEV_BRANCH # 批量cherry-pick符合条件的提交 if [ -n "$COMMITS" ]; then git cherry-pick $COMMITS fi # 强制推送分支(环境分支为自动生成,禁止手动修改) git push origin $target_branch --force } # 生成prod分支 generate_env_branch "env:prod" $PROD_BRANCH # 生成staging分支 generate_env_branch "env:staging" $STAGING_BRANCH
三、集成GitLab CI实现自动化执行
在项目根目录创建.gitlab-ci.yml,配置流水线自动触发脚本运行:
1. CI配置示例
stages: - deploy generate_env_branches: stage: deploy image: alpine/git:latest script: - chmod +x generate_env_branches.sh - ./generate_env_branches.sh rules: # 触发条件:dev分支推送、标签更新、手动触发 - if: '$CI_COMMIT_BRANCH == "dev"' - if: '$CI_COMMIT_TAG != null' - if: '$CI_PIPELINE_SOURCE == "web"' tags: - docker # 根据你的GitRunner标签调整
2. CI权限配置
确保GitLab CI/CD拥有推送分支的权限:
- 在项目设置的「仓库」→「分支保护」中,允许维护者/开发者推送
prod和staging分支(或直接关闭分支保护,因为分支为自动生成,禁止手动修改) - 若使用项目部署令牌,需在CI脚本中配置
git config credential.helper完成认证
四、后续维护与注意事项
- 环境分支只读:严格要求团队成员不得直接在
prod或staging分支提交代码,所有变更必须合并到dev分支后,通过添加标签触发自动化更新。 - 冲突处理:若cherry-pick出现冲突,CI流水线会失败,需本地拉取分支手动解决冲突后,重新运行流水线。
- 标签补加:可通过
git tag -a env:prod <commit-hash>给已有提交补加标签,标签添加后CI会自动更新对应环境分支。 - 提交顺序保障:脚本通过
git log --reverse确保cherry-pick顺序与提交时间一致,避免因顺序问题导致逻辑错误或冲突。
内容的提问来源于stack exchange,提问作者DaFri
相关产品推荐
相关产品推荐

