diff --git a/src/GitVersion.Core.Tests/BuildAgents/AzurePipelinesTests.cs b/src/GitVersion.Core.Tests/BuildAgents/AzurePipelinesTests.cs index d14d9ec83c..0845c862d5 100644 --- a/src/GitVersion.Core.Tests/BuildAgents/AzurePipelinesTests.cs +++ b/src/GitVersion.Core.Tests/BuildAgents/AzurePipelinesTests.cs @@ -80,4 +80,43 @@ public void AzurePipelinesBuildNumberWithSemVer(string buildNumberFormat, string var logMessage = this.buildServer.GenerateSetVersionMessage(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.ShouldBeNull(); + } } diff --git a/src/GitVersion.Core.Tests/BuildAgents/BuildKiteTests.cs b/src/GitVersion.Core.Tests/BuildAgents/BuildKiteTests.cs index 4bbd4541fb..a07fb28a68 100644 --- a/src/GitVersion.Core.Tests/BuildAgents/BuildKiteTests.cs +++ b/src/GitVersion.Core.Tests/BuildAgents/BuildKiteTests.cs @@ -72,7 +72,7 @@ public void GetCurrentBranchShouldHandlePullRequests() var result = this.buildServer.GetCurrentBranch(false); // Assert - result.ShouldBe("refs/pull/55/head"); + result.ShouldBeNull(); } [Test] diff --git a/src/GitVersion.Core.Tests/BuildAgents/CodeBuildTests.cs b/src/GitVersion.Core.Tests/BuildAgents/CodeBuildTests.cs index b81e4f1e91..6f0406bef5 100644 --- a/src/GitVersion.Core.Tests/BuildAgents/CodeBuildTests.cs +++ b/src/GitVersion.Core.Tests/BuildAgents/CodeBuildTests.cs @@ -102,4 +102,30 @@ private void AssertVariablesAreWrittenToFile(string file) props.ShouldContain("GitVersion_Major=1"); props.ShouldContain("GitVersion_Minor=2"); } + + [Test] + public void GetCurrentBranchShouldHandleTags() + { + // Arrange + this.environment.SetEnvironmentVariable("CODEBUILD_WEBHOOK_HEAD_REF", "refs/tags/1.0.0"); + + // Act + var result = this.buildServer.GetCurrentBranch(false); + + // Assert + result.ShouldBeNull(); + } + + [Test] + public void GetCurrentBranchShouldHandlePullRequests() + { + // Arrange + this.environment.SetEnvironmentVariable("CODEBUILD_SOURCE_VERSION", "refs/pull/1/merge"); + + // Act + var result = this.buildServer.GetCurrentBranch(false); + + // Assert + result.ShouldBeNull(); + } } diff --git a/src/GitVersion.Core.Tests/BuildAgents/GitHubActionsTests.cs b/src/GitVersion.Core.Tests/BuildAgents/GitHubActionsTests.cs index f4fbc1b621..7b30d97db5 100644 --- a/src/GitVersion.Core.Tests/BuildAgents/GitHubActionsTests.cs +++ b/src/GitVersion.Core.Tests/BuildAgents/GitHubActionsTests.cs @@ -83,7 +83,7 @@ public void GetCurrentBranchShouldHandleTags() var result = this.buildServer.GetCurrentBranch(false); // Assert - result.ShouldBe("refs/tags/1.0.0"); + result.ShouldBeNull(); } [Test] @@ -96,7 +96,7 @@ public void GetCurrentBranchShouldHandlePullRequests() var result = this.buildServer.GetCurrentBranch(false); // Assert - result.ShouldBe("refs/pull/1/merge"); + result.ShouldBeNull(); } [Test] diff --git a/src/GitVersion.Core.Tests/BuildAgents/SpaceAutomationTests.cs b/src/GitVersion.Core.Tests/BuildAgents/SpaceAutomationTests.cs index f4160a9154..938d7834f2 100644 --- a/src/GitVersion.Core.Tests/BuildAgents/SpaceAutomationTests.cs +++ b/src/GitVersion.Core.Tests/BuildAgents/SpaceAutomationTests.cs @@ -1,11 +1,10 @@ -using GitVersion; using GitVersion.BuildAgents; using GitVersion.Core.Tests.Helpers; using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; using Shouldly; -namespace GitVersionCore.Tests.BuildAgents; +namespace GitVersion.Core.Tests.BuildAgents; [TestFixture] public class SpaceAutomationTests : TestBase @@ -71,7 +70,7 @@ public void GetCurrentBranchShouldHandleTags() var result = this.buildServer.GetCurrentBranch(false); // Assert - result.ShouldBe("refs/tags/1.0.0"); + result.ShouldBeNull(); } [Test] @@ -84,7 +83,7 @@ public void GetCurrentBranchShouldHandlePullRequests() var result = this.buildServer.GetCurrentBranch(false); // Assert - result.ShouldBe("refs/pull/1/merge"); + result.ShouldBeNull(); } [Test] diff --git a/src/GitVersion.Core/BuildAgents/AzurePipelines.cs b/src/GitVersion.Core/BuildAgents/AzurePipelines.cs index 30e08ee059..ebb223479d 100644 --- a/src/GitVersion.Core/BuildAgents/AzurePipelines.cs +++ b/src/GitVersion.Core/BuildAgents/AzurePipelines.cs @@ -21,7 +21,17 @@ public override string[] GenerateSetParameterMessage(string name, string value) $"##vso[task.setvariable variable=GitVersion.{name};isOutput=true]{value}" }; - public override string? GetCurrentBranch(bool usingDynamicRepos) => Environment.GetEnvironmentVariable("BUILD_SOURCEBRANCH"); + public override string? GetCurrentBranch(bool usingDynamicRepos) + { + // https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables + // BUILD_SOURCEBRANCH does not contain the branch name if the build was triggered by a tag or pull request. + string? branchName = Environment.GetEnvironmentVariable("BUILD_SOURCEBRANCH"); + if (branchName != null && branchName.StartsWith("refs/heads/")) + { + return branchName; + } + return null; + } public override bool PreventFetch() => true; diff --git a/src/GitVersion.Core/BuildAgents/BuildKite.cs b/src/GitVersion.Core/BuildAgents/BuildKite.cs index f54fb2a1ca..d6cff4b4d4 100644 --- a/src/GitVersion.Core/BuildAgents/BuildKite.cs +++ b/src/GitVersion.Core/BuildAgents/BuildKite.cs @@ -30,9 +30,9 @@ public override string[] GenerateSetParameterMessage(string name, string value) } else { - // For pull requests BUILDKITE_BRANCH refers to the head, so adjust the - // branch name for pull request versioning to function as expected - return string.Format("refs/pull/{0}/head", pullRequest); + // To align the behavior with the other BuildAgent implementations + // we return here also null. + return null; } } diff --git a/src/GitVersion.Core/BuildAgents/CodeBuild.cs b/src/GitVersion.Core/BuildAgents/CodeBuild.cs index 1b06d29ce4..1c1fbc7f99 100644 --- a/src/GitVersion.Core/BuildAgents/CodeBuild.cs +++ b/src/GitVersion.Core/BuildAgents/CodeBuild.cs @@ -25,9 +25,17 @@ public override string[] GenerateSetParameterMessage(string name, string value) public override string? GetCurrentBranch(bool usingDynamicRepos) { - var currentBranch = Environment.GetEnvironmentVariable(WebHookEnvironmentVariableName); - - return currentBranch.IsNullOrEmpty() ? Environment.GetEnvironmentVariable(SourceVersionEnvironmentVariableName) : currentBranch; + string? branchName = Environment.GetEnvironmentVariable(WebHookEnvironmentVariableName); + if (string.IsNullOrEmpty(branchName)) + { + branchName = Environment.GetEnvironmentVariable(SourceVersionEnvironmentVariableName); + } + + if (branchName != null && branchName.StartsWith("refs/heads/")) + { + return branchName; + } + return null; } public override void WriteIntegration(Action writer, VersionVariables variables, bool updateBuildNumber = true) diff --git a/src/GitVersion.Core/BuildAgents/GitHubActions.cs b/src/GitVersion.Core/BuildAgents/GitHubActions.cs index f1a694367e..a9b955c8bf 100644 --- a/src/GitVersion.Core/BuildAgents/GitHubActions.cs +++ b/src/GitVersion.Core/BuildAgents/GitHubActions.cs @@ -50,7 +50,18 @@ public override void WriteIntegration(Action writer, VersionVariables v } } - public override string? GetCurrentBranch(bool usingDynamicRepos) => Environment.GetEnvironmentVariable("GITHUB_REF"); + public override string? GetCurrentBranch(bool usingDynamicRepos) + { + // https://docs.github.com/en/actions/learn-github-actions/environment-variables#default-environment-variables + // GITHUB_REF must be used only for "real" branches, not for tags and pull requests. + // Bug fix for https://github.com/GitTools/GitVersion/issues/2838 + string? githubRef = Environment.GetEnvironmentVariable("GITHUB_REF"); + if (githubRef != null && githubRef.StartsWith("refs/heads/")) + { + return githubRef; + } + return null; + } public override bool PreventFetch() => true; } diff --git a/src/GitVersion.Core/BuildAgents/GitLabCi.cs b/src/GitVersion.Core/BuildAgents/GitLabCi.cs index e20adcf783..3b1c7cb171 100644 --- a/src/GitVersion.Core/BuildAgents/GitLabCi.cs +++ b/src/GitVersion.Core/BuildAgents/GitLabCi.cs @@ -22,7 +22,9 @@ public override string[] GenerateSetParameterMessage(string name, string value) $"GitVersion_{name}={value}" }; - public override string? GetCurrentBranch(bool usingDynamicRepos) => Environment.GetEnvironmentVariable("CI_COMMIT_REF_NAME"); + // According to https://docs.gitlab.com/ee/ci/variables/predefined_variables.html + // the CI_COMMIT_BRANCH environment variable must be used. + public override string? GetCurrentBranch(bool usingDynamicRepos) => Environment.GetEnvironmentVariable("CI_COMMIT_BRANCH"); public override bool PreventFetch() => true; diff --git a/src/GitVersion.Core/BuildAgents/SpaceAutomation.cs b/src/GitVersion.Core/BuildAgents/SpaceAutomation.cs index 43be822a07..bda08aaf28 100644 --- a/src/GitVersion.Core/BuildAgents/SpaceAutomation.cs +++ b/src/GitVersion.Core/BuildAgents/SpaceAutomation.cs @@ -13,7 +13,15 @@ public SpaceAutomation(IEnvironment environment, ILog log) : base(environment, l protected override string EnvironmentVariable => EnvironmentVariableName; - public override string? GetCurrentBranch(bool usingDynamicRepos) => Environment.GetEnvironmentVariable("JB_SPACE_GIT_BRANCH"); + public override string? GetCurrentBranch(bool usingDynamicRepos) + { + string? branchName = Environment.GetEnvironmentVariable("JB_SPACE_GIT_BRANCH"); + if (branchName != null && branchName.StartsWith("refs/heads/")) + { + return branchName; + } + return null; + } public override string[] GenerateSetParameterMessage(string name, string value) => Array.Empty();