Not able to copy the azure branch policy from one repo to another repo using the below PowerShell script
PowerShell script
[CmdletBinding()]
param([Parameter(Mandatory=$true)][string] $AzureDevOpsPAT,[Parameter(Mandatory=$true)][string] $OrganizationName,[Parameter(Mandatory=$true)][string] $SourceProjectName,[Parameter(Mandatory=$true)][string] $SourcerepositoryName,[Parameter(Mandatory=$true)][string] $SourceBranch,[Parameter(Mandatory=$true)][string] $TargetProjectName,[Parameter(Mandatory=$true)][string] $TargetrepositoryName,[Parameter(Mandatory=$true)][string] $TargetBranch)
$ErrorActionPreference = ‘Stop’;
$User=“”;
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes((“{0}:{1}” -f $User,$AzureDevOpsPAT)));$header = @{Authorization=(“Basic {0}” -f $base64AuthInfo)};
Get Source repository
$sourceurl = ‘https://dev.azure.com/'+ $OrganizationName + ‘/’ + $SourceProjectName + ‘/_apis/git/repositories/’ + $SourcerepositoryName +’?api-version=5.1’$sourcerepository = Invoke-RestMethod -Uri $sourceurl -Method Get -ContentType application/json -Headers $header
$sourcepolicy = 'https://dev.azure.com/'+ $OrganizationName + ‘/’ + $teamProjectName +‘/_apis/git/policy/configurations?repositoryId=’ + $sourcerepository.id + ‘&refName=refs/heads/’ + $SourceBranch + ‘&api-version=5.1-preview.1’
Get Target repository
$targeturl = ‘https://dev.azure.com/'+ $OrganizationName + ‘/’ + $TargetProjectName + ‘/_apis/git/repositories/’ + $TargetrepositoryName +’?api-version=5.1’$targetpository = Invoke-RestMethod -Uri $targeturl -Method Get -ContentType application/json -Headers $headerWrite-Output $targetpository
get policies
$Url = 'https://dev.azure.com/'+ $OrganizationName + ‘/’ + $SourceProjectName + ‘/_apis/policy/configurations?api-version=5.1’;$policies = Invoke-RestMethod -Uri $Url -Method Get -ContentType application/json -Headers $header
$policies.value | ConvertTo-Json
foreach($policy in $policies.value){if ($policy.type.id -eq ‘0517f88d-4ec5-4343-9d26-9930ebd53069’){continue; # skipping GitRepositorySettingsPolicyName}
# remove properties from policy so it can be applied to target branch
$props = $policy.PSObject.Properties
$props.remove('createdBy');
$props.remove('createdDate');
$props.remove('revision');
$props.remove('id');
$props.remove('url');
$policy._links.PSObject.Properties.Remove('self')
# set target branch
if (($null -ne $policy.settings.scope[0].refname))
{
$policy.settings.scope[0].refName = 'refs/heads/' + $TargetBranch;
}
if (($null -ne $policy.settings.searchBranches))
{
$policy.settings.searchBranches[0] = 'refs/heads/' + $TargetBranch;
}
# create policy in target branch
$body = $policy | ConvertTo-Json -Depth 10
$policyCreateResponse = Invoke-RestMethod -Uri $Url -Method Post -Body $body -ContentType application/json -Headers $header
$policyCreateResponse
}
The error
Invoke-RestMethod : {"$id":"1","innerException":null,"message":"The update is rejected by
policy.","typeName":"Microsoft.TeamFoundation.Policy.Server.PolicyChangeRejectedByPolicyException,
Microsoft.TeamFoundation.Policy.Server","typeKey":"PolicyChangeRejectedByPolicyException","errorCode":0,"eventId":3000}
I am seeking a solution to copy a branch policy from one repository to another using either a script or an Azure pipeline. Can you please assist me with this task?
According to my testing, the reason you encounter the error "The update is rejected by policy" is that you are creating a branch policy on the source branch, which already has such a branch policy.
$Urlis your source project.I made some modifications based on your scripts and it works fine.
Based on the
policy.type.idin my scriptif ($policy.type.id -in "fa4e907d-c16b-4a4c-9dfa-4916e5d171ab", "c6a1889d-b943-4856-b76f-9e46bb6b0df2", "40e92b44-2fe1-4dd6-b3d8-74a9c21d0c6e", "fa4e907d-c16b-4a4c-9dfa-4906e5d171dd"), it works for the following branch policies.