Skip to content

Commit 3aff3e3

Browse files
authored
Merge pull request #522 from qmfrederik/features/unit-test-netcoreapp-3.1
Support unit testing NB.GV on Ubuntu 20.04/.NET 3.1
2 parents fef67e7 + 63fb2cd commit 3aff3e3

File tree

12 files changed

+195
-53
lines changed

12 files changed

+195
-53
lines changed

azure-pipelines.yml

Lines changed: 48 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ resources:
1414
containers:
1515
- container: xenial
1616
image: andrewarnott/linux-buildagent
17-
- container: bionic
17+
- container: bionic-2.1
1818
image: microsoft/dotnet:2.1-sdk-bionic
19-
- container: bionic-3.0
20-
image: mcr.microsoft.com/dotnet/core/sdk:3.0-bionic
21-
- container: disco
19+
- container: bionic
20+
image: mcr.microsoft.com/dotnet/core/sdk:3.1-bionic
21+
- container: focal
22+
image: mcr.microsoft.com/dotnet/core/sdk:3.1-focal
23+
- container: disco-3.0
2224
image: mcr.microsoft.com/dotnet/core/sdk:3.0-disco
2325
- container: archlinux
2426
image: andrewarnott/archlinux
@@ -32,10 +34,20 @@ variables:
3234
stages:
3335
- stage: Build
3436
jobs:
35-
- job: Windows
36-
pool: Hosted Windows 2019 with VS2019
37+
- job: Build
38+
strategy:
39+
matrix:
40+
linux:
41+
imageName: 'ubuntu-20.04'
42+
testModifier: -f netcoreapp3.1
43+
windows:
44+
imageName: 'windows-2019'
45+
testModifier:
3746
variables:
38-
- group: dotnetfoundation code signing
47+
- ${{ if eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/andrewarnott/') }}:
48+
- group: dotnetfoundation code signing
49+
pool:
50+
vmImage: $(imageName)
3951
steps:
4052
- checkout: self
4153
clean: true
@@ -53,9 +65,9 @@ stages:
5365
- script: dotnet --info
5466
displayName: Show dotnet SDK info
5567

56-
- script: |
68+
- pwsh: |
5769
dotnet tool install --tool-path . nbgv
58-
.\nbgv cloud -a
70+
./nbgv cloud -a
5971
displayName: Set build number
6072
6173
- task: DotNetCoreCLI@2
@@ -68,27 +80,27 @@ stages:
6880
nugetConfigPath: src/nuget.config
6981
workingDirectory: src
7082

71-
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
83+
- task: YarnInstaller@3
7284
displayName: 'Use Yarn 1.x'
73-
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-task.Yarn@2
85+
- task: Yarn@3
7486
displayName: 'Yarn install'
7587
inputs:
76-
ProjectDirectory: 'src/nerdbank-gitversioning.npm'
88+
projectDirectory: 'src/nerdbank-gitversioning.npm'
7789

7890
- script: dotnet build -c $(BuildConfiguration) --no-restore /t:build,pack /bl:"$(Build.ArtifactStagingDirectory)/build_logs/msbuild.binlog"
7991
displayName: Build NuGet package and tests
8092
workingDirectory: src
8193

82-
- script: dotnet publish -c $(BuildConfiguration) -o ..\nerdbank-gitversioning.npm\out\nbgv.cli\tools\netcoreapp2.1\any /bl:"$(Build.ArtifactStagingDirectory)/build_logs/nbgv_publish.binlog"
94+
- script: dotnet publish -c $(BuildConfiguration) -o ../nerdbank-gitversioning.npm/out/nbgv.cli/tools/netcoreapp2.1/any /bl:"$(Build.ArtifactStagingDirectory)/build_logs/nbgv_publish.binlog"
8395
displayName: Publish nbgv tool
84-
workingDirectory: src\nbgv
96+
workingDirectory: src/nbgv
8597

8698
- task: gulp@0
8799
displayName: Build nerdbank-gitversioning NPM package
88100
inputs:
89-
gulpfile: src\nerdbank-gitversioning.npm\gulpfile.js
101+
gulpfile: src/nerdbank-gitversioning.npm/gulpfile.js
90102

91-
- script: dotnet test Nerdbank.GitVersioning.Tests --no-build -c $(BuildConfiguration) --filter "TestCategory!=FailsOnAzurePipelines" --logger "trx;LogFileName=$(Build.ArtifactStagingDirectory)\TestLogs\TestResults.trx"
103+
- script: dotnet test NerdBank.GitVersioning.Tests --no-build $(testModifier) -c $(BuildConfiguration) --filter "TestCategory!=FailsOnAzurePipelines" --logger "trx;LogFileName=$(Build.ArtifactStagingDirectory)/TestLogs/TestResults.trx"
92104
displayName: Run tests
93105
workingDirectory: src
94106

@@ -97,7 +109,7 @@ stages:
97109
inputs:
98110
testResultsFormat: VSTest
99111
testResultsFiles: '*.trx'
100-
searchFolder: $(Build.ArtifactStagingDirectory)\TestLogs
112+
searchFolder: $(Build.ArtifactStagingDirectory)/TestLogs
101113
buildPlatform: $(BuildPlatform)
102114
buildConfiguration: $(BuildConfiguration)
103115
condition: always()
@@ -125,14 +137,17 @@ stages:
125137
--name 'Nerdbank.GitVersioning'
126138
--descriptionUrl 'https://github.com/dotnet/Nerdbank.GitVersioning'
127139
displayName: Code sign
128-
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
140+
condition: and(succeeded(), eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/andrewarnott/'), eq(variables['Agent.OS'], 'Windows_NT'), ne(variables['Build.Reason'], 'PullRequest'))
129141
130142
- task: PublishBuildArtifacts@1
131143
inputs:
132144
PathtoPublish: $(Build.ArtifactStagingDirectory)/deployables
133145
ArtifactName: deployables
134146
ArtifactType: Container
135147
displayName: Publish deployables artifacts
148+
# Only deploy when from a single build in the build matrix
149+
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
150+
136151
- task: PublishBuildArtifacts@1
137152
inputs:
138153
PathtoPublish: $(Build.ArtifactStagingDirectory)/build_logs
@@ -148,23 +163,23 @@ stages:
148163
nuGetFeedType: internal
149164
publishVstsFeed: OSS/PublicCI
150165
allowPackageConflicts: true
151-
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
166+
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'), eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/andrewarnott/'), ne(variables['Build.Reason'], 'PullRequest'))
152167

153168
- pwsh: Set-Content -Path "$(Agent.TempDirectory)/.npmrc" -Value "registry=https://pkgs.dev.azure.com/andrewarnott/OSS/_packaging/PublicCI/npm/registry/`nalways-auth=true"
154169
displayName: Prepare to push to PublicCI
155-
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
170+
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'), eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/andrewarnott/'), ne(variables['Build.Reason'], 'PullRequest'))
156171
- task: npmAuthenticate@0
157172
displayName: Authenticate to PublicCI
158173
inputs:
159174
workingFile: $(Agent.TempDirectory)/.npmrc
160-
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
175+
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'), eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/andrewarnott/'), ne(variables['Build.Reason'], 'PullRequest'))
161176
- pwsh: |
162177
$tgz = (Get-ChildItem "$(Build.ArtifactStagingDirectory)/deployables/*.tgz")[0].FullName
163178
Write-Host "Will publish $tgz"
164179
npm publish $tgz
165180
workingDirectory: $(Agent.TempDirectory)
166181
displayName: npm publish to PublicCI feed
167-
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
182+
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'), eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/andrewarnott/'), ne(variables['Build.Reason'], 'PullRequest'))
168183
169184
- stage: Test
170185
jobs:
@@ -177,24 +192,31 @@ stages:
177192
displayName: Install git
178193
- template: azure-pipelines/xplattest-pipeline.yml
179194

195+
- job: Ubuntu_Bionic_2_1
196+
pool:
197+
vmImage: Ubuntu 16.04 # not a bug. we always use this pool, but use containers for the specific version
198+
container: bionic-2.1
199+
steps:
200+
- template: azure-pipelines/xplattest-pipeline.yml
201+
180202
- job: Ubuntu_Bionic
181203
pool:
182204
vmImage: Ubuntu 16.04 # not a bug. we always use this pool, but use containers for the specific version
183205
container: bionic
184206
steps:
185207
- template: azure-pipelines/xplattest-pipeline.yml
186208

187-
- job: Ubuntu_Bionic_3_0
209+
- job: Ubuntu_Focal
188210
pool:
189211
vmImage: Ubuntu 16.04 # not a bug. we always use this pool, but use containers for the specific version
190-
container: bionic-3.0
212+
container: focal
191213
steps:
192214
- template: azure-pipelines/xplattest-pipeline.yml
193215

194-
- job: Ubuntu_Disco
216+
- job: Ubuntu_Disco_3_0
195217
pool:
196218
vmImage: Ubuntu 16.04 # not a bug. we always use this pool, but use containers for the specific version
197-
container: disco
219+
container: disco-3.0
198220
steps:
199221
- template: azure-pipelines/xplattest-pipeline.yml
200222

src/NerdBank.GitVersioning.Tests/BuildIntegrationTests.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -742,7 +742,9 @@ public async Task PublicRelease_RegEx_SatisfiedByCheckedOutBranch()
742742
}
743743
}
744744

745-
[Theory]
745+
// This test builds projects using 'classic' MSBuild projects, which target net45.
746+
// This is not supported on Linux.
747+
[WindowsTheory]
746748
[PairwiseData]
747749
public async Task AssemblyInfo(bool isVB, bool includeNonVersionAttributes, bool gitRepo, bool isPrerelease, bool isPublicRelease)
748750
{
@@ -844,7 +846,11 @@ public async Task AssemblyInfo_HasKeyData(string keyFile, bool delaySigned)
844846

845847
this.WriteVersionFile();
846848
var result = await this.BuildAsync(Targets.GenerateAssemblyVersionInfo, logVerbosity: LoggerVerbosity.Minimal);
847-
string versionCsContent = File.ReadAllText(Path.Combine(this.projectDirectory, result.BuildResult.ProjectStateAfterBuild.GetPropertyValue("VersionSourceFile")));
849+
string versionCsContent = File.ReadAllText(
850+
Path.GetFullPath(
851+
Path.Combine(
852+
this.projectDirectory,
853+
result.BuildResult.ProjectStateAfterBuild.GetPropertyValue("VersionSourceFile"))));
848854
this.Logger.WriteLine(versionCsContent);
849855

850856
var sourceFile = CSharpSyntaxTree.ParseText(versionCsContent);
@@ -1152,7 +1158,7 @@ private ProjectRootElement CreateProjectRootElement(string projectDirectory, str
11521158
private void MakeItAVBProject()
11531159
{
11541160
var csharpImport = this.testProject.Imports.Single(i => i.Project.Contains("CSharp"));
1155-
csharpImport.Project = @"$(MSBuildToolsPath)\Microsoft.VisualBasic.targets";
1161+
csharpImport.Project = "$(MSBuildToolsPath)/Microsoft.VisualBasic.targets";
11561162
var isVbProperty = this.testProject.Properties.Single(p => p.Name == "IsVB");
11571163
isVbProperty.Value = "true";
11581164
}

src/NerdBank.GitVersioning.Tests/FilterPathTests.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,30 @@ public class FilterPathTests
1414
[InlineData("../../some/dir/here", "foo/multi/wow", "foo/some/dir/here")]
1515
[InlineData("relativepath.txt", "foo", "foo/relativepath.txt")]
1616
[InlineData("./relativepath.txt", "foo", "foo/relativepath.txt")]
17-
[InlineData("./dir\\hi/relativepath.txt", "foo", "foo/dir/hi/relativepath.txt")]
18-
[InlineData(".\\relativepath.txt", "foo", "foo/relativepath.txt")]
1917
[InlineData(":^relativepath.txt", "foo", "foo/relativepath.txt")]
2018
[InlineData(":!relativepath.txt", "foo", "foo/relativepath.txt")]
2119
[InlineData(":!/absolutepath.txt", "foo", "absolutepath.txt")]
22-
[InlineData(":!\\absolutepath.txt", "foo", "absolutepath.txt")]
2320
[InlineData("../bar/relativepath.txt", "foo", "bar/relativepath.txt")]
2421
[InlineData("/", "foo", "")]
2522
[InlineData("/absolute/file.txt", "foo", "absolute/file.txt")]
2623
[InlineData(":/", "foo", "")]
2724
[InlineData(":/absolutepath.txt", "foo", "absolutepath.txt")]
2825
[InlineData(":/bar/absolutepath.txt", "foo", "bar/absolutepath.txt")]
29-
[InlineData(":\\bar\\absolutepath.txt", "foo", "bar/absolutepath.txt")]
3026
public void CanBeParsedToRepoRelativePath(string pathSpec, string relativeTo, string expected)
3127
{
3228
Assert.Equal(expected, new FilterPath(pathSpec, relativeTo).RepoRelativePath);
3329
}
3430

31+
[WindowsTheory]
32+
[InlineData("./dir\\hi/relativepath.txt", "foo", "foo/dir/hi/relativepath.txt")]
33+
[InlineData(".\\relativepath.txt", "foo", "foo/relativepath.txt")]
34+
[InlineData(":!\\absolutepath.txt", "foo", "absolutepath.txt")]
35+
[InlineData(":\\bar\\absolutepath.txt", "foo", "bar/absolutepath.txt")]
36+
public void CanBeParsedToRepoRelativePath_WindowsOnly(string pathSpec, string relativeTo, string expected)
37+
{
38+
Assert.Equal(expected, new FilterPath(pathSpec, relativeTo).RepoRelativePath);
39+
}
40+
3541
[Theory]
3642
[InlineData(":!.", "foo", "foo")]
3743
[InlineData(":!.", "foo", "foo/")]

src/NerdBank.GitVersioning.Tests/GitExtensionsTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -529,10 +529,10 @@ public void GetIdAsVersion_ReadsMajorMinorFromVersionTxt()
529529
[Fact]
530530
public void GetIdAsVersion_ReadsMajorMinorFromVersionTxtInSubdirectory()
531531
{
532-
this.WriteVersionFile("4.8", relativeDirectory: @"foo\bar");
532+
this.WriteVersionFile("4.8", relativeDirectory: "foo/bar");
533533
var firstCommit = this.Repo.Commits.First();
534534

535-
Version v1 = firstCommit.GetIdAsVersion(@"foo\bar");
535+
Version v1 = firstCommit.GetIdAsVersion("foo/bar");
536536
Assert.Equal(4, v1.Major);
537537
Assert.Equal(8, v1.Minor);
538538
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#if NETCOREAPP
2+
using System;
3+
using System.IO;
4+
using System.Reflection;
5+
using System.Runtime.InteropServices;
6+
using LibGit2Sharp;
7+
using Nerdbank.GitVersioning;
8+
using RuntimeEnvironment = Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment;
9+
10+
public static class LibGit2Loader
11+
{
12+
public static string RuntimePath = "./runtimes";
13+
14+
static LibGit2Loader()
15+
{
16+
NativeLibrary.SetDllImportResolver(typeof(Repository).Assembly, ImportResolver);
17+
}
18+
19+
public static void EnsureRegistered()
20+
{
21+
// No-op, only here to ensure the static constructor is triggered
22+
}
23+
24+
private static IntPtr ImportResolver(string libraryName, Assembly assembly, DllImportSearchPath? searchPath)
25+
{
26+
IntPtr handle = IntPtr.Zero;
27+
28+
if (libraryName.StartsWith("git2-", StringComparison.Ordinal) ||
29+
libraryName.StartsWith("libgit2-", StringComparison.Ordinal))
30+
{
31+
var directory = GetNativeLibraryDirectory();
32+
var extension = GetNativeLibraryExtension();
33+
34+
if (!libraryName.EndsWith(extension, StringComparison.Ordinal))
35+
{
36+
libraryName += extension;
37+
}
38+
39+
var nativeLibraryPath = Path.Combine(directory, libraryName);
40+
if (!File.Exists(nativeLibraryPath))
41+
{
42+
nativeLibraryPath = Path.Combine(directory, "lib" + libraryName);
43+
}
44+
45+
if (!NativeLibrary.TryLoad(nativeLibraryPath, assembly, DllImportSearchPath.System32, out handle))
46+
{
47+
throw new NotImplementedException($"No support for loading {libraryName} at {nativeLibraryPath}");
48+
}
49+
}
50+
51+
return handle;
52+
}
53+
54+
private static string GetNativeLibraryDirectory()
55+
{
56+
var dir = Path.GetDirectoryName(typeof(Repository).Assembly.Location);
57+
return Path.Combine(dir, RuntimePath, RuntimeIdMap.GetNativeLibraryDirectoryName(RuntimeEnvironment.GetRuntimeIdentifier()), "native");
58+
}
59+
60+
private static string GetNativeLibraryExtension()
61+
{
62+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
63+
{
64+
return ".dll";
65+
}
66+
67+
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
68+
{
69+
return ".dylib";
70+
}
71+
72+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
73+
{
74+
return ".so";
75+
}
76+
77+
throw new PlatformNotSupportedException();
78+
}
79+
}
80+
#endif

src/NerdBank.GitVersioning.Tests/NerdBank.GitVersioning.Tests.csproj

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
3-
<TargetFrameworks>net461;netcoreapp3.1</TargetFrameworks>
3+
<TargetFrameworks>netcoreapp3.1;net461</TargetFrameworks>
44
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
55
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
66
<DebugType>full</DebugType>
@@ -47,7 +47,4 @@
4747
</PackageReference>
4848
<PackageReference Include="Xunit.SkippableFact" Version="1.3.12" />
4949
</ItemGroup>
50-
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp2.0'">
51-
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
52-
</ItemGroup>
5350
</Project>

src/NerdBank.GitVersioning.Tests/RepoTestBase.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Diagnostics;
43
using System.IO;
5-
using System.Linq;
6-
using System.Text;
7-
using System.Threading.Tasks;
84
using LibGit2Sharp;
95
using Nerdbank.GitVersioning;
106
using Validation;
@@ -16,6 +12,10 @@ public abstract class RepoTestBase : IDisposable
1612

1713
public RepoTestBase(ITestOutputHelper logger)
1814
{
15+
#if NETCOREAPP
16+
LibGit2Loader.EnsureRegistered();
17+
#endif
18+
1919
Requires.NotNull(logger, nameof(logger));
2020

2121
this.Logger = logger;

0 commit comments

Comments
 (0)