Skip to content

Commit ed3d41b

Browse files
committed
Written unit tests that show the problems with Jenkins
1 parent 38f7036 commit ed3d41b

File tree

3 files changed

+86
-0
lines changed

3 files changed

+86
-0
lines changed

src/GitVersionCore.Tests/BuildServers/EnvironmentVariableJenkinsTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public class EnvironmentVariableJenkinsTests
99
string key = "JENKINS_URL";
1010
string branch = "GIT_BRANCH";
1111
string localBranch = "GIT_LOCAL_BRANCH";
12+
string pipelineBranch = "BRANCH_NAME";
1213

1314
private void SetEnvironmentVariableForDetection()
1415
{
@@ -60,4 +61,28 @@ public void JenkinsTakesLocalBranchNameNotRemoteName()
6061
Environment.SetEnvironmentVariable(branch, branchOrig);
6162
Environment.SetEnvironmentVariable(localBranch, localBranchOrig);
6263
}
64+
65+
[Test]
66+
public void JenkinsTakesBranchNameInPipelineAsCode()
67+
{
68+
// Save original values so they can be restored
69+
string branchOrig = Environment.GetEnvironmentVariable(branch);
70+
string localBranchOrig = Environment.GetEnvironmentVariable(localBranch);
71+
string pipelineBranchOrig = Environment.GetEnvironmentVariable(pipelineBranch);
72+
73+
// Set BRANCH_NAME in pipeline mode
74+
Environment.SetEnvironmentVariable(pipelineBranch, "master");
75+
// When Jenkins uses a Pipeline, GIT_BRANCH and GIT_LOCAL_BRANCH are not set:
76+
Environment.SetEnvironmentVariable(branch, null);
77+
Environment.SetEnvironmentVariable(localBranch, null);
78+
79+
// Test Jenkins GetCurrentBranch method now returns BRANCH_NAME
80+
var j = new Jenkins();
81+
j.GetCurrentBranch(true).ShouldBe("master");
82+
83+
// Restore environment variables
84+
Environment.SetEnvironmentVariable(branch, branchOrig);
85+
Environment.SetEnvironmentVariable(localBranch, localBranchOrig);
86+
Environment.SetEnvironmentVariable(pipelineBranch, pipelineBranchOrig);
87+
}
6388
}

src/GitVersionExe.Tests/GitVersionExe.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@
114114
<Compile Include="HelpWriterTests.cs" />
115115
<Compile Include="JsonOutputOnBuildServer.cs" />
116116
<Compile Include="MsBuildProjectArgTest.cs" />
117+
<Compile Include="PullRequestInJenkinsPipelineTest.cs" />
117118
<Compile Include="PullRequestInTeamCityTest.cs" />
118119
<Compile Include="AssemblyInfoFileUpdateTests.cs" />
119120
<Compile Include="VersionWriterTests.cs" />
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System;
2+
using GitTools.Testing;
3+
using LibGit2Sharp;
4+
using NUnit.Framework;
5+
using Shouldly;
6+
7+
[TestFixture]
8+
public class PullRequestInJenkinsTest
9+
{
10+
[TestCase]
11+
public void GivenJenkinsPipelineHasDuplicatedOrigin_VersionIsCalculatedProperly()
12+
{
13+
string pipelineBranch = "BRANCH_NAME";
14+
string pipelineBranchOrig = Environment.GetEnvironmentVariable(pipelineBranch);
15+
16+
using (var fixture = new EmptyRepositoryFixture())
17+
{
18+
var remoteRepositoryPath = PathHelper.GetTempPath();
19+
Repository.Init(remoteRepositoryPath);
20+
using (var remoteRepository = new Repository(remoteRepositoryPath))
21+
{
22+
remoteRepository.Config.Set("user.name", "Test");
23+
remoteRepository.Config.Set("user.email", "[email protected]");
24+
fixture.Repository.Network.Remotes.Add("origin", remoteRepositoryPath);
25+
// Jenkins Pipeline will create a duplicate origin:
26+
fixture.Repository.Network.Remotes.Add("origin1", remoteRepositoryPath);
27+
Console.WriteLine("Created git repository at {0}", remoteRepositoryPath);
28+
remoteRepository.MakeATaggedCommit("1.0.3");
29+
30+
var branch = remoteRepository.CreateBranch("FeatureBranch");
31+
Commands.Checkout(remoteRepository, branch);
32+
remoteRepository.MakeCommits(2);
33+
Commands.Checkout(remoteRepository, remoteRepository.Head.Tip.Sha);
34+
//Emulate merge commit
35+
var mergeCommitSha = remoteRepository.MakeACommit().Sha;
36+
Commands.Checkout(remoteRepository, "master"); // HEAD cannot be pointing at the merge commit
37+
remoteRepository.Refs.Add("refs/heads/pull/5/head", new ObjectId(mergeCommitSha));
38+
39+
// Checkout PR commit
40+
Commands.Fetch((Repository)fixture.Repository, "origin", new string[0], new FetchOptions(), null);
41+
Commands.Checkout(fixture.Repository, mergeCommitSha);
42+
}
43+
44+
// Emulating Jenkins environment variable
45+
Environment.SetEnvironmentVariable(pipelineBranch, "PR-5");
46+
Environment.SetEnvironmentVariable("JENKINS_URL", "url", EnvironmentVariableTarget.Process);
47+
48+
var result = GitVersionHelper.ExecuteIn(fixture.RepositoryPath);
49+
50+
result.ExitCode.ShouldBe(0);
51+
result.OutputVariables.FullSemVer.ShouldBe("1.0.4-PullRequest0005.3");
52+
53+
// Cleanup repository files
54+
DirectoryHelper.DeleteDirectory(remoteRepositoryPath);
55+
56+
Environment.SetEnvironmentVariable(pipelineBranch, pipelineBranchOrig);
57+
Environment.SetEnvironmentVariable("JENKINS_URL", null, EnvironmentVariableTarget.Process);
58+
}
59+
}
60+
}

0 commit comments

Comments
 (0)