Wie erhalte ich einen Zweignamen mit einem Schrägstrich in Azure DevOps?

Lesezeit: 4 Minuten

Azure Devops bietet zwei Variablen, die Informationen über den Namen des aktuellen Git-Zweigs enthalten: $(Build.SourceBranchName) und $(Build.SourceBranch).

Während SourceBranch enthält den vollständigen Verweis auf die Branche, SourceBranchName soll nur den kurzen Zweignamen enthalten.

Leider ist das Verhalten etwas unerwartet, wenn der Zweigname einen Schrägstrich enthält (/):

+---------------------------------------------------------------------------------------------------------+
| Situation                     | Git branch name  | Build.SourceBranch          | Build.SourceBranchName |
|---------------------------------------------------------------------------------------------------------|
| branch name contains no slash | mybranch         | refs/heads/mybranch         | mybranch               |
| branch name contains slash    | release/mybranch | refs/heads/release/mybranch | mybranch               |
+---------------------------------------------------------------------------------------------------------+

Der Teil des Zweignamens vor dem Schrägstrich wird nicht als Teil des Zweignamens betrachtet. Mein Kollege wies darauf hin, dass dies der Fall ist dokumentiertes Verhalten von Azure Devops:

Git-Repo-Branch oder Pull-Request: Das letzte Pfadsegment in der ref. In refs/heads/master ist dieser Wert beispielsweise master. In refs/heads/feature/tools ist dieser Wert tools.

Ich bin mir nicht sicher, ob dieses Verhalten besonders nützlich ist: Ich möchte den Zweig auschecken und brauche dazu den Zweignamen enthalten der Schrägstrich. Wenn der Teil vor dem Schrägstrich entfernt wird, kann es außerdem zu Verwirrung über den tatsächlichen Pfad kommen, da der Name mehrdeutig sein könnte.

Ich brauche den Filialnamen einschließlich der Schrägstrich. Gibt es einen einfachen Weg, es zu bekommen? Muss ich sicherheitshalber immer mit dem vollen Ref arbeiten?

  • Es ist so schwer zu entscheiden, was richtiger ist lol

    – Hey

    9. Februar 2020 um 22:07 Uhr

  • Hallo, danke für deine freundliche Antwort. Beide Antworten sind in Ordnung, dasselbe Konzept nur mit unterschiedlicher Implementierung. Sie können eine weitere Anwendung für Ihre Situation auswählen. Wie du willst.

    – PatrickLu-MSFT

    10. Februar 2020 um 12:24 Uhr

Benutzer-Avatar
Schamrai Aleksander

Ich benutze immer Build.SourceBranch in meinen Skripten. Weisen Sie es einfach einer neuen Variablen zu und entfernen Sie es refs/heads/ von Anfang an. Ich verwende nur für CI und PR:

  1. Für CI. ich benutze Build.SourceBranch variabel ohne refs/heads. Ich arbeite mit PowerShell:

$branchSource = “$(Build.SourceBranch)”
$branchSourcePath = $branchSource -replace “refs/heads/”, “”

  1. Für PR. ich benutze System.PullRequest.SourceBranch variabel ohne refs/heads Weil Build.SourceBranch enthält den Pfad zum entfernten PR. Die Ersetzung ist die gleiche wie in der ersten Option, verwenden Sie einfach die richtige Variable.

$branchSource = “$(System.PullRequest.SourceBranch)”
$branchSourcePath = $branchSource -replace “refs/heads/”, “”

  • Haben Sie eine zusätzliche Logik für Fälle, in denen Sie auf einer PR oder einem Tag aufbauen?

    – Hey

    29. Januar 2020 um 1:10 Uhr

Wenn Sie auf einer PR aufbauen, könnten Sie verwenden System.PullRequest.SourceBranch und System.PullRequest.TargetBranch Variablen.

System.PullRequest.TargetBranch

Der Branch, der das Ziel einer Pull-Anfrage ist. Zum Beispiel:
refs/heads/master. Diese Variable wird nur initialisiert, wenn der Build aufgrund einer Git-PR ausgeführt wurde, die von einer Verzweigungsrichtlinie betroffen ist.

Verwenden Sie vordefinierte Build-Variablen

Außerdem können Sie auch Ihre eigene Variable basierend auf Ihren Anforderungen definieren, wenn Sie den vollständigen oder kurzen Pfad verwenden möchten.

Erstellen Sie einfach ein Bash-Skript, das einer Variablen den kürzeren Zweignamen zuweist.

# Bash script
BRANCH_NAME=$(echo "$(System.PullRequest.TargetBranch)" | awk -F/ '{print $NF}')
echo "##vso[task.setvariable variable=PullRequest_Target_Branch;]$BRANCH_NAME"

Dann könnten Sie später in Ihrer Pipeline auf $(PullRequest_Target_Branch) verweisen.

Benutzer-Avatar
TSR

Benutze das, Bruder

variables:
  BRANCH_NAME: $[replace(variables['Build.SourceBranch'], 'refs/heads/', '')]

Verwenden Sie so (bearbeiteter Tippfehler)

$(BRANCH_NAME)

  • Ja, aber Sie müssen verwenden Build.SourceBranch !!! Die var in deinem Beispiel SourceBranchName gibt nur das letzte Pfadsegment in der Referenz zurück.

    – Chris

    16. Juni um 12:37 Uhr

  • Abgesehen von dem Fehler, auf den @Chris hingewiesen hat, sollte dies die akzeptierte Antwort sein

    – lvilasboas

    24. Juni um 12:39 Uhr


Es ist wild, dass es dafür noch keine richtige Lösung gibt.

Hier ist, was wir haben, basierend auf der Kombination einiger Dinge, die ich beim Googeln gefunden habe. Dies ist für Zweigstellen und PR’s

variables:

  ${{ if startsWith(variables['Build.SourceBranch'], 'refs/heads/') }}:
    BRANCH_NAME: $[ replace(variables['Build.SourceBranch'], 'refs/heads/', '') ]
    DOCKER_IMAGE_TAG: $[ replace(replace(variables['Build.SourceBranch'], 'refs/heads/', ''), "https://stackoverflow.com/", '_') ]

  ${{ if startsWith(variables['Build.SourceBranch'], 'refs/pull/') }}:
    BRANCH_NAME: $[ replace(variables['System.PullRequest.SourceBranch'], 'refs/heads/', '') ]
    DOCKER_IMAGE_TAG: $[ replace(replace(variables['System.PullRequest.SourceBranch'], 'refs/heads/', ''), "https://stackoverflow.com/", '_') ]

BRANCH_NAME enthält den Schrägstrich. So refs/heads/mybranch wird sein mybranch aber refs/heads/feature/mybranch wird sein feature/mybranch.

Auch hinzugefügt DOCKER_IMAGE_TAG hier, da wir die ersetzen mussten / mit _ für Docker-Image-Tags

1145620cookie-checkWie erhalte ich einen Zweignamen mit einem Schrägstrich in Azure DevOps?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy