diff --git a/src/GitVersion.BuildAgents.Tests/Agents/AzurePipelinesTests.cs b/src/GitVersion.BuildAgents.Tests/Agents/AzurePipelinesTests.cs index e647086ad3..79c27fb26c 100644 --- a/src/GitVersion.BuildAgents.Tests/Agents/AzurePipelinesTests.cs +++ b/src/GitVersion.BuildAgents.Tests/Agents/AzurePipelinesTests.cs @@ -77,4 +77,43 @@ public void AzurePipelinesBuildNumberWithSemVer(string buildNumberFormat, string var logMessage = this.buildServer.SetBuildNumber(vars); logMessage.ShouldBe(logPrefix + expectedBuildNumber); } + + [Test] + public void GetCurrentBranchShouldHandleBranches() + { + // Arrange + this.environment.SetEnvironmentVariable("BUILD_SOURCEBRANCH", $"refs/heads/{MainBranch}"); + + // Act + var result = this.buildServer.GetCurrentBranch(false); + + // Assert + result.ShouldBe($"refs/heads/{MainBranch}"); + } + + [Test] + public void GetCurrentBranchShouldHandleTags() + { + // Arrange + this.environment.SetEnvironmentVariable("BUILD_SOURCEBRANCH", "refs/tags/1.0.0"); + + // Act + var result = this.buildServer.GetCurrentBranch(false); + + // Assert + result.ShouldBeNull(); + } + + [Test] + public void GetCurrentBranchShouldHandlePullRequests() + { + // Arrange + this.environment.SetEnvironmentVariable("BUILD_SOURCEBRANCH", "refs/pull/1/merge"); + + // Act + var result = this.buildServer.GetCurrentBranch(false); + + // Assert + result.ShouldBe("refs/pull/1/merge"); + } } diff --git a/src/GitVersion.BuildAgents/Agents/AzurePipelines.cs b/src/GitVersion.BuildAgents/Agents/AzurePipelines.cs index c8fef2b6e6..ef5763ede1 100644 --- a/src/GitVersion.BuildAgents/Agents/AzurePipelines.cs +++ b/src/GitVersion.BuildAgents/Agents/AzurePipelines.cs @@ -17,8 +17,24 @@ public override string[] SetOutputVariables(string name, string? value) => $"##vso[task.setvariable variable=GitVersion.{name};isOutput=true]{value}" ]; - public override string? GetCurrentBranch(bool usingDynamicRepos) => Environment.GetEnvironmentVariable("GIT_BRANCH") - ?? Environment.GetEnvironmentVariable("BUILD_SOURCEBRANCH"); + public override string? GetCurrentBranch(bool usingDynamicRepos) + { + var gitBranch = Environment.GetEnvironmentVariable("GIT_BRANCH"); + if (gitBranch is not null) + return gitBranch; + + var sourceBranch = Environment.GetEnvironmentVariable("BUILD_SOURCEBRANCH"); + + // https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml + // BUILD_SOURCEBRANCH must be used only for "real" branches, not for tags. + // Azure Pipelines sets BUILD_SOURCEBRANCH to refs/tags/ when the pipeline is triggered for a tag. + if (sourceBranch?.StartsWith("refs/tags", StringComparison.OrdinalIgnoreCase) == true) + { + return null; + } + + return sourceBranch; + } public override bool PreventFetch() => true;