You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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)

关键注意事项

  1. 权限配置:确保流水线使用的System.AccessToken(或服务主体)拥有仓库分支创建权限和分支策略管理权限。
  2. jq工具依赖:微软托管Ubuntu代理默认已安装jq;Windows代理需先通过choco install jq安装。
  3. 策略扩展:如需支持更多策略类型(如代码所有者策略),可在case语句中添加对应逻辑,参考Az Cli官方文档的创建参数。
  4. OAuth令牌设置:需在流水线设置中启用"允许脚本访问OAuth令牌",保证System.AccessToken能正常用于Az Cli认证。

内容的提问来源于stack exchange,提问作者Stepness

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:12:07