如何通过Az Cli将Azure DevOps分支的所有策略复制到另一分支
实现Azure DevOps分支创建+策略批量复制(Az Cli+YAML流水线)
整体思路
由于Az Cli没有批量复制所有分支策略的原生命令,我们需要先获取源分支的策略列表,再针对不同策略类型调用对应的创建命令,完成策略复制。
步骤1:创建新分支
通过Az Cli从指定源分支生成新分支:
# 定义核心变量 REPO_NAME="你的仓库名称" SOURCE_BRANCH="develop" NEW_BRANCH="目标新分支名" # 获取仓库ID REPOID=$(az repos list --query "[?name == '$REPO_NAME'].id" --output tsv) # 获取源分支的Object ID(用于创建新分支) SOURCE_BRANCH_REF="refs/heads/$SOURCE_BRANCH" SOURCE_OBJECT_ID=$(az repos ref show --name $SOURCE_BRANCH_REF --repository-id $REPOID --query "objectId" --output tsv) # 创建新分支 az repos ref create --name "refs/heads/$NEW_BRANCH" --object-id $SOURCE_OBJECT_ID --repository-id $REPOID
步骤2:批量复制分支策略
使用jq解析获取到的策略JSON数据,遍历每个策略并根据类型执行对应的创建命令,以下是可直接嵌入YAML流水线的完整脚本:
steps: - script: | # 配置参数 REPO_NAME="你的仓库名" SOURCE_BRANCH="develop" NEW_BRANCH="目标新分支名" # 获取仓库ID REPOID=$(az repos list --query "[?name == '$REPO_NAME'].id" --output tsv) # 1. 创建新分支 SOURCE_BRANCH_REF="refs/heads/$SOURCE_BRANCH" SOURCE_OBJECT_ID=$(az repos ref show --name $SOURCE_BRANCH_REF --repository-id $REPOID --query "objectId" --output tsv) az repos ref create --name "refs/heads/$NEW_BRANCH" --object-id $SOURCE_OBJECT_ID --repository-id $REPOID # 2. 获取源分支所有策略并保存为JSON文件 POLICIES=$(az repos policy list --branch $SOURCE_BRANCH --repository-id $REPOID) echo "$POLICIES" > policies.json # 3. 遍历策略并复制到新分支 cat policies.json | jq -c '.[]' | while read policy; do # 提取通用策略属性 POLICY_TYPE=$(echo "$policy" | jq -r '.type.id') DISPLAY_NAME=$(echo "$policy" | jq -r '.displayName') IS_ENABLED=$(echo "$policy" | jq -r '.isEnabled') IS_BLOCKING=$(echo "$policy" | jq -r '.isBlocking') IS_OVERRIDABLE=$(echo "$policy" | jq -r '.isOverridable') # 根据策略类型执行对应创建命令 case $POLICY_TYPE in # 审阅者策略 "Microsoft.RequiredReviewers") REVIEWERS=$(echo "$policy" | jq -r '.settings.requiredReviewers | tojson') az repos policy required-reviewer create \ --branch "$NEW_BRANCH" \ --repository-id "$REPOID" \ --display-name "$DISPLAY_NAME" \ --enabled "$IS_ENABLED" \ --blocking "$IS_BLOCKING" \ --overridable "$IS_OVERRIDABLE" \ --reviewers "$REVIEWERS" ;; # 构建验证策略 "Microsoft.Build") BUILD_DEFINITION_ID=$(echo "$policy" | jq -r '.settings.buildDefinitionId') QUEUE_ON_UPDATE=$(echo "$policy" | jq -r '.settings.queueOnSourceUpdateOnly') VALID_DURATION=$(echo "$policy" | jq -r '.settings.validDuration') PATH_FILTER=$(echo "$policy" | jq -r '.settings.pathFilter // ""') az repos policy build create \ --branch "$NEW_BRANCH" \ --repository-id "$REPOID" \ --display-name "$DISPLAY_NAME" \ --enabled "$IS_ENABLED" \ --blocking "$IS_BLOCKING" \ --overridable "$IS_OVERRIDABLE" \ --build-definition-id "$BUILD_DEFINITION_ID" \ --queue-on-source-update-only "$QUEUE_ON_UPDATE" \ --valid-duration "$VALID_DURATION" \ ${PATH_FILTER:+--path-filter "$PATH_FILTER"} ;; # 工作项链接策略 "Microsoft.WorkItemLinking") az repos policy work-item-linking create \ --branch "$NEW_BRANCH" \ --repository-id "$REPOID" \ --display-name "$DISPLAY_NAME" \ --enabled "$IS_ENABLED" \ --blocking "$IS_BLOCKING" \ --overridable "$IS_OVERRIDABLE" ;; # 合并策略(如Squash、Rebase) "Microsoft.PullRequestMergeStrategy") MERGE_STRATEGY=$(echo "$policy" | jq -r '.settings.mergeStrategy') az repos policy merge-strategy create \ --branch "$NEW_BRANCH" \ --repository-id "$REPOID" \ --display-name "$DISPLAY_NAME" \ --enabled "$IS_ENABLED" \ --blocking "$IS_BLOCKING" \ --overridable "$IS_OVERRIDABLE" \ --merge-strategy "$MERGE_STRATEGY" ;; # 状态检查策略 "Microsoft.StatusCheck") CHECK_NAME=$(echo "$policy" | jq -r '.settings.statusCheckName') az repos policy status-check create \ --branch "$NEW_BRANCH" \ --repository-id "$REPOID" \ --display-name "$DISPLAY_NAME" \ --enabled "$IS_ENABLED" \ --blocking "$IS_BLOCKING" \ --overridable "$IS_OVERRIDABLE" \ --status-check-name "$CHECK_NAME" ;; # 未覆盖的策略类型可自行扩展 *) echo "跳过未支持的策略类型: $POLICY_TYPE" ;; esac done displayName: '创建新分支并复制分支策略' env: AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
关键注意事项
- 权限配置:确保流水线使用的
System.AccessToken(或服务主体)拥有仓库分支创建权限和分支策略管理权限。 - jq工具依赖:微软托管Ubuntu代理默认已安装jq;Windows代理需先通过
choco install jq安装。 - 策略扩展:如需支持更多策略类型(如代码所有者策略),可在
case语句中添加对应逻辑,参考Az Cli官方文档的创建参数。 - OAuth令牌设置:需在流水线设置中启用"允许脚本访问OAuth令牌",保证
System.AccessToken能正常用于Az Cli认证。
内容的提问来源于stack exchange,提问作者Stepness
相关产品推荐
相关产品推荐

