Skip to content

Commit 739cd3c

Browse files
committed
Add checks for version tags
1 parent c766a91 commit 739cd3c

9 files changed

+105
-45
lines changed

.nuke/build.schema.json

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
"build": {
77
"type": "object",
88
"properties": {
9+
"ChangelogFile": {
10+
"type": "string"
11+
},
912
"CheckForUnityMetaFilesExcludeDirectories": {
1013
"type": "array",
1114
"items": {
@@ -84,15 +87,15 @@
8487
"items": {
8588
"type": "string",
8689
"enum": [
87-
"CheckChangelogVersionMatchesGitTagVersion",
88-
"CheckChangelogVersionMatchesUnityPackageVersion",
90+
"ChangelogVersionMatchesGitTagVersion",
8991
"CheckForUnityMetaFiles",
9092
"Clean",
9193
"Compile",
9294
"Publish",
9395
"PublishGitHubRelease",
9496
"Restore",
95-
"Test"
97+
"Test",
98+
"UnityPackageVersionMatchesGitTagVersion"
9699
]
97100
}
98101
},
@@ -102,22 +105,25 @@
102105
"items": {
103106
"type": "string",
104107
"enum": [
105-
"CheckChangelogVersionMatchesGitTagVersion",
106-
"CheckChangelogVersionMatchesUnityPackageVersion",
108+
"ChangelogVersionMatchesGitTagVersion",
107109
"CheckForUnityMetaFiles",
108110
"Clean",
109111
"Compile",
110112
"Publish",
111113
"PublishGitHubRelease",
112114
"Restore",
113-
"Test"
115+
"Test",
116+
"UnityPackageVersionMatchesGitTagVersion"
114117
]
115118
}
116119
},
117120
"UnitTestProject": {
118121
"type": "string",
119122
"description": "Path to a solution file that is automatically loaded"
120123
},
124+
"UnityPackageFile": {
125+
"type": "string"
126+
},
121127
"Verbosity": {
122128
"type": "string",
123129
"description": "Logging verbosity during build execution. Default is 'Normal'",

.nuke/parameters.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,7 @@
33
"UnitTestProject": "./tests/tests.csproj",
44
"CheckForUnityMetaFilesIncludeDirectories": [
55
"./src/Assets/SimpleCodeGenerator"
6-
]
6+
],
7+
"ChangelogFile": "./CHANGELOG.md",
8+
"UnityPackageFile": "./src/Assets/SimpleCodeGenerator/package.json"
79
}

build/Build.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
InvokedTargets = new[] { nameof(Publish) },
2626
PublishCondition = "always()"
2727
)]
28-
class Build : NukeBuild, ICheckForUnityMetaFiles, ICheckChangelogVersionMatchesUnityPackageVersion, ICheckChangelogVersionMatchesGitTagVersion, IPublishGitHubRelease
28+
class Build : NukeBuild, ICheckForUnityMetaFiles, IUnityPackageVersionMatchesGitTagVersion, IChangelogVersionMatchesGitTagVersion, IPublishGitHubRelease
2929
{
3030
public static int Main() => Execute<Build>(x => x.Publish);
3131

@@ -35,9 +35,6 @@ class Build : NukeBuild, ICheckForUnityMetaFiles, ICheckChangelogVersionMatchesU
3535
[Solution]
3636
readonly Solution UnitTestProject;
3737

38-
[GitRepository]
39-
readonly GitRepository GitRepository;
40-
4138
Target Clean => _ => _
4239
.Executes(() =>
4340
{
@@ -56,6 +53,7 @@ class Build : NukeBuild, ICheckForUnityMetaFiles, ICheckChangelogVersionMatchesU
5653

5754
Target Compile => _ => _
5855
.DependsOn(Restore)
56+
.DependsOn<ICheckForUnityMetaFiles>()
5957
.Executes(() =>
6058
{
6159
DotNetTasks.DotNetBuild(settings => settings
@@ -81,6 +79,9 @@ class Build : NukeBuild, ICheckForUnityMetaFiles, ICheckChangelogVersionMatchesU
8179

8280
Target Publish => _ => _
8381
.DependsOn(Test)
84-
.DependsOn<ICheckForUnityMetaFiles>()
85-
.Triggers<IPublishGitHubRelease>();
82+
.Triggers<IPublishGitHubRelease>()
83+
.Executes(() =>
84+
{
85+
Log.Debug("IsServerBuild: {IsServerBuild}", IsServerBuild);
86+
});
8687
}

build/GitRepositoryExtensions.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using System.Linq;
1+
// #define MOCK_GIT_TAG
2+
3+
using System.Linq;
24
using NuGet.Versioning;
35
using Nuke.Common;
46
using Nuke.Common.Git;
@@ -8,13 +10,21 @@ public static class GitRepositoryExtensions
810
{
911
public static bool CurrentCommitHasVersionTag(this GitRepository gitRepository)
1012
{
13+
#if MOCK_GIT_TAG
14+
return true;
15+
#endif
16+
1117
var versionTagsOnCurrentCommit = gitRepository.Tags.Select(t => SemanticVersion.TryParse(t.TrimStart('v'), out SemanticVersion v) ? v : null).WhereNotNull();
1218

1319
return versionTagsOnCurrentCommit.Any();
1420
}
1521

16-
public static SemanticVersion GetLatestVersionTag(this GitRepository gitRepository)
22+
public static SemanticVersion GetLatestVersionTagOnCurrentCommit(this GitRepository gitRepository)
1723
{
24+
#if MOCK_GIT_TAG
25+
return new SemanticVersion(1, 2, 3);
26+
#endif
27+
1828
var versionTagsOnCurrentCommit = gitRepository.Tags.Select(t => SemanticVersion.TryParse(t.TrimStart('v'), out SemanticVersion v) ? v : null).WhereNotNull().OrderByDescending(t => t).ToArray();
1929

2030
Assert.True(versionTagsOnCurrentCommit.Any(), $"The current commit '{gitRepository.Commit}' has no valid tag!");
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System.Linq;
2+
using NuGet.Versioning;
3+
using Nuke.Common;
4+
using Nuke.Common.ChangeLog;
5+
using Nuke.Common.Git;
6+
using Nuke.Common.IO;
7+
using Serilog;
8+
9+
interface IChangelogVersionMatchesGitTagVersion : INukeBuild
10+
{
11+
[GitRepository] private GitRepository GitRepository => TryGetValue(() => GitRepository);
12+
13+
[Parameter] AbsolutePath ChangelogFile => TryGetValue(() => ChangelogFile);
14+
15+
Target ChangelogVersionMatchesGitTagVersion => _ => _
16+
.OnlyWhenStatic(() => GitRepository.CurrentCommitHasVersionTag())
17+
.Executes(() =>
18+
{
19+
SemanticVersion versionFromChangelog = GetLatestVersionFromChangelog(ChangelogFile);
20+
SemanticVersion versionFromGitTag = GitRepository.GetLatestVersionTagOnCurrentCommit();
21+
22+
Assert.True(versionFromChangelog == versionFromGitTag, $"The version {versionFromChangelog} from the changelog does not match the version {versionFromGitTag} from the git tag!");
23+
24+
Log.Information("Changelog version and git tag version match");
25+
});
26+
27+
static SemanticVersion GetLatestVersionFromChangelog(AbsolutePath pathToChangelogFile)
28+
{
29+
Assert.True(pathToChangelogFile != null, "No path has been provided!");
30+
31+
return ChangelogTasks.ReadChangelog(pathToChangelogFile).ReleaseNotes.MaxBy(n => n.Version)?.Version;
32+
}
33+
}

build/ICheckChangelogVersionMatchesGitTagVersion.cs

Lines changed: 0 additions & 16 deletions
This file was deleted.

build/ICheckChangelogVersionMatchesUnityPackageVersion.cs

Lines changed: 0 additions & 12 deletions
This file was deleted.

build/IPublishGitHubRelease.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Nuke.Common;
2+
using Nuke.Common.CI.GitHubActions;
23
using Nuke.Common.Git;
34
using Serilog;
45

@@ -9,8 +10,9 @@ interface IPublishGitHubRelease : INukeBuild
910

1011
Target PublishGitHubRelease => _ => _
1112
.OnlyWhenStatic(() => GitRepository.CurrentCommitHasVersionTag())
12-
.DependsOn<ICheckChangelogVersionMatchesUnityPackageVersion>()
13-
.DependsOn<ICheckChangelogVersionMatchesGitTagVersion>()
13+
.OnlyWhenStatic(() => IsServerBuild)
14+
.DependsOn<IUnityPackageVersionMatchesGitTagVersion>()
15+
.DependsOn<IChangelogVersionMatchesGitTagVersion>()
1416
.Executes(() =>
1517
{
1618
Log.Warning("TODO");
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System.IO;
2+
using Newtonsoft.Json;
3+
using NuGet.Versioning;
4+
using Nuke.Common;
5+
using Nuke.Common.Git;
6+
using Nuke.Common.IO;
7+
using Serilog;
8+
9+
interface IUnityPackageVersionMatchesGitTagVersion : INukeBuild
10+
{
11+
[GitRepository] private GitRepository GitRepository => TryGetValue(() => GitRepository);
12+
13+
[Parameter] AbsolutePath UnityPackageFile => TryGetValue(() => UnityPackageFile);
14+
15+
Target UnityPackageVersionMatchesGitTagVersion => _ => _
16+
.OnlyWhenStatic(() => GitRepository.CurrentCommitHasVersionTag())
17+
.Executes(() =>
18+
{
19+
SemanticVersion versionFromUnityPackageFile = GetVersionFromUnityPackageFile(UnityPackageFile);
20+
SemanticVersion versionFromGitTag = GitRepository.GetLatestVersionTagOnCurrentCommit();
21+
22+
Assert.True(versionFromUnityPackageFile == versionFromGitTag, $"The version {versionFromUnityPackageFile} from the Unity package file does not match the version {versionFromGitTag} from the git tag!");
23+
24+
Log.Information("Unity package version and git tag version match");
25+
});
26+
27+
static SemanticVersion GetVersionFromUnityPackageFile(AbsolutePath pathToUnityPackageFile)
28+
{
29+
Assert.True(pathToUnityPackageFile != null, "No path has been provided!");
30+
31+
dynamic packageFile = JsonConvert.DeserializeObject(File.ReadAllText(pathToUnityPackageFile));
32+
return SemanticVersion.Parse(packageFile.version.ToString());
33+
}
34+
}

0 commit comments

Comments
 (0)