2016-06-27 11 views
1

Wir verwenden Visual Studio Team Systems mit Git und Team System Build (früher Build vNext). Wenn Sie eine Pull-Anforderung ausführen, wird ein neuer Build ausgelöst, der zum Ausführen von Komponententests und zum Bereitstellen auf einem isolierten Testsystem verwendet wird. Um die Bereitstellung auf einem isolierten System durchführen zu können, muss ich den tatsächlichen Quellzweignamen innerhalb des Build-Prozesses ermitteln. jedoch die Build.SourceBranchName Variable immer "merge" ist,Erhalten Sie echte Quellzweig Name in VSTS Pull Request

Z. B .:

Pull-Request von der Quelle FOO BAR Build.SourceBranch Ziel ist "refs// 1/merge ziehen" und damit Build.SourceBranchName ist "verschmelzen". Aber ich muss irgendwie "FOO" bekommen, um mein Power Shell Skript auszuführen, um das System zu konfigurieren.

Gibt es eine Möglichkeit, den tatsächlichen Quellzweig in einer Git Pull Request innerhalb von VSTS zu erhalten?

Antwort

2

Es gibt keine Variable dafür, aber Sie können ein Power-Shell-Skript erstellen, um es über Rest API zu erhalten.

[String]$projecturi = "$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI" 
[String]$sourcebranch = "$env:BUILD_SOURCEBRANCH" 
[String]$repoid = "$env:BUILD_REPOSITORY_ID" 

$username="alternativeusername" 
$password="alternativepassword" 

$basicAuth= ("{0}:{1}"-f $username,$password) 
$basicAuth=[System.Text.Encoding]::UTF8.GetBytes($basicAuth) 
$basicAuth=[System.Convert]::ToBase64String($basicAuth) 
$headers= @{Authorization=("Basic {0}"-f $basicAuth)} 

#get pull request ID via regex 
$pullrequest = "refs/pull/+(?<pullnumber>\w+?)/merge+" 
if($sourcebranch -match $pullrequest){   
     $pullrequestid = $Matches.pullnumber; 
    } 
else { write-host "Cannot find pull request ID" } 

#get pull request information via API 
$url= $projecturi + "_apis/git/repositories/" + $repoid + "/pullRequests/" + $pullrequestid + "?api-version=1.0-preview.1" 

Write-Host $url 

$getpullrequest = Invoke-RestMethod -Uri $url -headers $headers -Method Get 

#get sourcebranch and targetbranch 
$sourceref = $getpullrequest.sourceRefName 
$targetref = $getpullrequest.targetRefName 
+0

Danke, funktioniert das Skript wie ein Zauber. Ich habe es ein wenig modifiziert, damit es einfacher zu debuggen ist, und setzt eine Variable, die in späteren Build-Aufgaben verwendet werden soll. – wertzui

0

Dieses Skript werden die Parameter von Umgebungsvariablen lesen, wenn in einem Build-Task verwendet oder die mitgelieferten Parameter verwenden, wenn außerhalb eines Build-Task verwendet. Die Variable $ sourcebranch wird so eingestellt, dass sie in einer späteren Build-Task verwendet wird.

[CmdletBinding()] 
param (
    [Parameter(Mandatory=$false)][string]$projectUri = "$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI", 
    [Parameter(Mandatory=$false)][string]$branch = "$env:BUILD_branch", 
    [Parameter(Mandatory=$false)][string]$repositoryName = "$env:BUILD_REPOSITORY_NAME", 
    [Parameter(Mandatory=$false)][string]$projectName = "$env:SYSTEM_TEAMPROJECT", 
    [Parameter(Mandatory=$false)][string]$oAuthToken = "$env:SYSTEM_ACCESSTOKEN", 
    [Parameter(Mandatory=$false)][string]$username, 
    [Parameter(Mandatory=$false)][string]$password 
) 

#check all parameters 
if(!$oAuthToken) { 
    if(!$username -or !$password) { 
     throw "You must either supply an OAuth Token or a username and a password. You can supply the token via the environment variable SYSTEM_ACCESSTOKEN" 
    } 

    $basicAuth= ("{0}:{1}"-f $username,$password) 
    $basicAuth=[System.Text.Encoding]::UTF8.GetBytes($basicAuth) 
    $basicAuth=[System.Convert]::ToBase64String($basicAuth) 
    $headers= @{Authorization=("Basic {0}"-f $basicAuth)} 
} 
else { 
    $headers= @{Authorization="Bearer $oAuthToken"} 
} 

if(!$projectUri) { 
    throw "You must supply a project uri or set the Environment variable SYSTEM_TEAMFOUNDATIONCOLLECTIONURI" 
} 

if(!$branch) { 
    throw "You must supply a branch or set the Environment variable BUILD_branch" 
} 

if(!$repositoryName) { 
    throw "You must supply a repository name or set the Environment variable BUILD_REPOSITORY_NAME" 
} 

if(!$projectName) { 
    throw "You must supply a project name or set the Environment variable SYSTEM_TEAMPROJECT" 
} 

#get pull request ID via regex 
$pullrequest = "refs/pull/+(?<pullnumber>\w+?)/merge+" 
if($branch -match $pullrequest) {   
    $pullrequestid = $Matches.pullnumber; 
    Write-Output "Pull request ID is $pullrequestid" 
} 
else { 
    Write-Output "Cannot find pull request ID" 
} 

#get pull request information via API 
$url= $projectUri + "DefaultCollection/$projectName/_apis/git/repositories/$repositoryName/pullRequests/$pullrequestid\?api-version=1.0-preview.1" 
Write-Output "Getting info from $url" 
$getpullrequest = Invoke-RestMethod -Uri $url -headers $headers -Method Get 

#get sourcebranch and targetbranch ref 
$sourceref = $getpullrequest.sourceRefName 
$targetref = $getpullrequest.targetRefName 

#get the branch name via regex 
$branchref = "refs/heads/(?<realBranchname>.*)" 
if($sourceref -match $branchref) {   
    $sourcebranch = $Matches.realBranchname; 
    Write-Output "Real source branch is $sourcebranch" 
} 
else { 
    Write-Output "Cannot find real source branch" 
} 
if($targetref -match $branchref) {   
    $targetbranch = $Matches.realBranchname; 
    Write-Output "Real target branch is $targetbranch" 
} 
else { 
    Write-Output "Cannot find real target branch" 
} 

#set a variable "sourcebranch" to use it in another build task 
Write-Output "##vso[task.setvariable variable=sourcebranch;]$sourcebranch" 
2

VSTS hat jetzt System.PullRequest.SourceBranch und System.PullRequest.TargetBranch Variablen. , dass Ihr Problem Skripte ohne das Schreiben benutzerdefinierte lösen sollte

Build Variables