求基于GitLab API批量配置仓库MR模板等规则的可行脚本示例
Bash脚本批量配置GitLab仓库(解决字符串格式问题)
以下是针对你提到的MR模板、分支命名正则、提交消息正则、Code Owners这几个配置项的可行脚本示例,核心是用jq自动处理JSON转义,避免手动拼接导致的格式错误:
前置依赖
- 安装
curl和jq(jq用于自动处理JSON字符串转义,是解决格式问题的关键) - 拥有GitLab仓库的维护者/管理员权限
- 生成带
api权限的GitLab个人访问令牌
基础脚本框架
先定义通用变量和API请求函数,后续所有配置项都基于这个框架扩展:
#!/bin/bash # 配置参数 GITLAB_TOKEN="your-personal-access-token" GITLAB_BASE_URL="https://your-gitlab-instance.com/api/v4" # 替换为你的目标仓库ID列表,或通过API批量获取(比如组下所有仓库) REPO_IDS=(123 456 789) # 通用GitLab PATCH请求函数 gitlab_api_patch() { local repo_id=$1 local payload=$2 curl -s --request PATCH \ --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \ --header "Content-Type: application/json" \ --data "${payload}" \ "${GITLAB_BASE_URL}/projects/${repo_id}" }
各配置项具体实现
1. 批量设置MR模板
MR模板是多行文本,直接拼接JSON会因为换行、双引号导致格式错误,用jq自动转义:
# 定义MR模板内容(也可以从本地文件读取:MR_TEMPLATE=$(cat ./MR_TEMPLATE.md)) MR_TEMPLATE=$(cat << 'EOF' ## 变更说明 清晰描述本次MR的修改内容、业务背景及影响范围 ## 验证清单 - [ ] 本地功能测试通过 - [ ] 代码评审已完成 - [ ] 相关文档已更新 ## 关联资源 Issue: #XXX 关联MR: !XXX EOF ) # 用jq生成符合JSON规范的payload PAYLOAD=$(jq -n --arg template "$MR_TEMPLATE" '{merge_requests_template: $template}') # 遍历仓库批量配置 for repo_id in "${REPO_IDS[@]}"; do echo "正在设置MR模板到仓库ID: $repo_id" # 可选:添加错误检查 response=$(gitlab_api_patch "$repo_id" "$PAYLOAD") if echo "$response" | jq -e '.id' > /dev/null; then echo "仓库ID $repo_id 配置成功" else echo "仓库ID $repo_id 配置失败: $(echo "$response" | jq '.message')" fi done
2. 批量设置分支命名正则
正则中的特殊字符(如^、$、\)需要正确转义,jq会自动处理:
# 分支命名规则示例:仅允许feature/、bugfix/、hotfix/前缀的分支 BRANCH_REGEX="^feature/[a-z0-9-]+$|^bugfix/[a-z0-9-]+$|^hotfix/[a-z0-9-]+$" PAYLOAD=$(jq -n --arg regex "$BRANCH_REGEX" '{branch_name_regex: $regex}') for repo_id in "${REPO_IDS[@]}"; do echo "正在设置分支命名正则到仓库ID: $repo_id" gitlab_api_patch "$repo_id" "$PAYLOAD" done
3. 批量设置提交消息正则
示例采用Conventional Commits规范,同样用jq处理转义:
# 提交消息正则:遵循Conventional Commits格式 COMMIT_REGEX="^(feat|fix|docs|style|refactor|perf|test|chore)\([a-z0-9-]+\): .{1,50}$" PAYLOAD=$(jq -n --arg regex "$COMMIT_REGEX" '{commit_message_regex: $regex}') for repo_id in "${REPO_IDS[@]}"; do echo "正在设置提交消息正则到仓库ID: $repo_id" gitlab_api_patch "$repo_id" "$PAYLOAD" done
4. 批量设置Code Owners
从本地CODEOWNERS文件读取内容,用jq转义后提交:
# 从本地文件读取Code Owners内容 CODE_OWNERS=$(cat ./CODEOWNERS) PAYLOAD=$(jq -n --arg content "$CODE_OWNERS" '{code_owners: $content}') for repo_id in "${REPO_IDS[@]}"; do echo "正在设置Code Owners到仓库ID: $repo_id" gitlab_api_patch "$repo_id" "$PAYLOAD" done
关键提示
- 绝对不要手动拼接JSON:手动转义换行、双引号、反斜杠极易出错,
jq是最可靠的方式 - 权限验证:确保你的令牌拥有
maintainer或更高权限,否则会返回403错误 - 测试优先:先在单个测试仓库验证脚本,确认配置生效后再批量执行
- 扩展功能:可以通过API批量获取组下所有仓库ID,替换静态的
REPO_IDS数组:# 获取组ID为999的所有仓库ID REPO_IDS=($(curl -s --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" "${GITLAB_BASE_URL}/groups/999/projects?per_page=100" | jq -r '.[].id'))
内容的提问来源于stack exchange,提问作者bruvio
相关产品推荐
相关产品推荐

