Skip to content

Commit e23ee1a

Browse files
committed
Add logic for GitHub release
1 parent 739cd3c commit e23ee1a

10 files changed

+78
-28
lines changed

.github/workflows/tests.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ jobs:
3636
key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }}
3737
- name: 'Run: Publish'
3838
run: ./build.cmd Publish
39+
env:
40+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
3941
- name: 'Publish: TestResults'
4042
uses: actions/upload-artifact@v3
4143
if: always()

.nuke/build.schema.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"build": {
77
"type": "object",
88
"properties": {
9-
"ChangelogFile": {
9+
"ChangelogVersionMatchesGitTagVersionChangelogFile": {
1010
"type": "string"
1111
},
1212
"CheckForUnityMetaFilesExcludeDirectories": {
@@ -77,6 +77,9 @@
7777
"type": "string"
7878
}
7979
},
80+
"PublishGitHubReleaseChangelogFile": {
81+
"type": "string"
82+
},
8083
"Root": {
8184
"type": "string",
8285
"description": "Root directory during build execution"
@@ -121,7 +124,7 @@
121124
"type": "string",
122125
"description": "Path to a solution file that is automatically loaded"
123126
},
124-
"UnityPackageFile": {
127+
"UnityPackageVersionMatchesGitTagVersionUnityPackageFile": {
125128
"type": "string"
126129
},
127130
"Verbosity": {

.nuke/parameters.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"CheckForUnityMetaFilesIncludeDirectories": [
55
"./src/Assets/SimpleCodeGenerator"
66
],
7-
"ChangelogFile": "./CHANGELOG.md",
8-
"UnityPackageFile": "./src/Assets/SimpleCodeGenerator/package.json"
7+
"ChangelogVersionMatchesGitTagVersionChangelogFile": "./CHANGELOG.md",
8+
"PublishGitHubReleaseChangelogFile": "./CHANGELOG.md",
9+
"UnityPackageVersionMatchesGitTagVersionUnityPackageFile": "./src/Assets/SimpleCodeGenerator/package.json"
910
}

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10-
### Added
10+
## [1.0.0] - 2023-08-27
1111

1212
- Initial release

build/Build.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
GitHubActionsImage.UbuntuLatest,
2424
OnPushBranches = new[] { "main" },
2525
InvokedTargets = new[] { nameof(Publish) },
26-
PublishCondition = "always()"
26+
PublishCondition = "always()",
27+
EnableGitHubToken = true
2728
)]
2829
class Build : NukeBuild, ICheckForUnityMetaFiles, IUnityPackageVersionMatchesGitTagVersion, IChangelogVersionMatchesGitTagVersion, IPublishGitHubRelease
2930
{
@@ -79,9 +80,5 @@ class Build : NukeBuild, ICheckForUnityMetaFiles, IUnityPackageVersionMatchesGit
7980

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

build/ChangelogExtensions.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System.Linq;
2+
using Nuke.Common.ChangeLog;
3+
using Nuke.Common.Utilities.Collections;
4+
5+
public static class ChangelogExtensions
6+
{
7+
public static ReleaseNotes GetLatestReleaseNotes(this ChangeLog changelog)
8+
{
9+
return changelog.ReleaseNotes.IsEmpty() ? null : changelog.ReleaseNotes.MaxBy(n => n.Version);
10+
}
11+
}

build/GitRepositoryExtensions.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
using System.Linq;
44
using NuGet.Versioning;
5-
using Nuke.Common;
65
using Nuke.Common.Git;
76
using Nuke.Common.Utilities.Collections;
87

@@ -22,13 +21,11 @@ public static bool CurrentCommitHasVersionTag(this GitRepository gitRepository)
2221
public static SemanticVersion GetLatestVersionTagOnCurrentCommit(this GitRepository gitRepository)
2322
{
2423
#if MOCK_GIT_TAG
25-
return new SemanticVersion(1, 2, 3);
24+
return new SemanticVersion(1, 0, 0);
2625
#endif
2726

2827
var versionTagsOnCurrentCommit = gitRepository.Tags.Select(t => SemanticVersion.TryParse(t.TrimStart('v'), out SemanticVersion v) ? v : null).WhereNotNull().OrderByDescending(t => t).ToArray();
2928

30-
Assert.True(versionTagsOnCurrentCommit.Any(), $"The current commit '{gitRepository.Commit}' has no valid tag!");
31-
32-
return versionTagsOnCurrentCommit.First();
29+
return versionTagsOnCurrentCommit.Any() ? versionTagsOnCurrentCommit.First() : new SemanticVersion(0, 0, 0);
3330
}
3431
}

build/IChangelogVersionMatchesGitTagVersion.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
using System.Linq;
2-
using NuGet.Versioning;
1+
using NuGet.Versioning;
32
using Nuke.Common;
43
using Nuke.Common.ChangeLog;
54
using Nuke.Common.Git;
65
using Nuke.Common.IO;
76
using Serilog;
87

8+
[ParameterPrefix(nameof(ChangelogVersionMatchesGitTagVersion))]
99
interface IChangelogVersionMatchesGitTagVersion : INukeBuild
1010
{
1111
[GitRepository] private GitRepository GitRepository => TryGetValue(() => GitRepository);
@@ -20,14 +20,14 @@ interface IChangelogVersionMatchesGitTagVersion : INukeBuild
2020
SemanticVersion versionFromGitTag = GitRepository.GetLatestVersionTagOnCurrentCommit();
2121

2222
Assert.True(versionFromChangelog == versionFromGitTag, $"The version {versionFromChangelog} from the changelog does not match the version {versionFromGitTag} from the git tag!");
23-
23+
2424
Log.Information("Changelog version and git tag version match");
2525
});
2626

2727
static SemanticVersion GetLatestVersionFromChangelog(AbsolutePath pathToChangelogFile)
2828
{
2929
Assert.True(pathToChangelogFile != null, "No path has been provided!");
30-
31-
return ChangelogTasks.ReadChangelog(pathToChangelogFile).ReleaseNotes.MaxBy(n => n.Version)?.Version;
30+
31+
return ChangelogTasks.ReadChangelog(pathToChangelogFile).GetLatestReleaseNotes()?.Version;
3232
}
3333
}

build/IPublishGitHubRelease.cs

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,58 @@
1-
using Nuke.Common;
1+
using System;
2+
using System.Linq;
3+
using NuGet.Versioning;
4+
using Nuke.Common;
5+
using Nuke.Common.ChangeLog;
26
using Nuke.Common.CI.GitHubActions;
37
using Nuke.Common.Git;
8+
using Nuke.Common.IO;
9+
using Nuke.Common.Tools.GitHub;
10+
using Nuke.Common.Utilities.Collections;
11+
using Octokit;
412
using Serilog;
513

614
[ParameterPrefix(nameof(PublishGitHubRelease))]
715
interface IPublishGitHubRelease : INukeBuild
816
{
917
[GitRepository] private GitRepository GitRepository => TryGetValue(() => GitRepository);
1018

19+
[Parameter] AbsolutePath ChangelogFile => TryGetValue(() => ChangelogFile);
20+
1121
Target PublishGitHubRelease => _ => _
12-
.OnlyWhenStatic(() => GitRepository.CurrentCommitHasVersionTag())
13-
.OnlyWhenStatic(() => IsServerBuild)
14-
.DependsOn<IUnityPackageVersionMatchesGitTagVersion>()
15-
.DependsOn<IChangelogVersionMatchesGitTagVersion>()
16-
.Executes(() =>
22+
// .OnlyWhenStatic(() => GitRepository.CurrentCommitHasVersionTag())
23+
// .OnlyWhenStatic(() => IsServerBuild)
24+
// .DependsOn<IUnityPackageVersionMatchesGitTagVersion>()
25+
// .DependsOn<IChangelogVersionMatchesGitTagVersion>()
26+
.Executes(async () =>
1727
{
18-
Log.Warning("TODO");
28+
Assert.True(ChangelogFile != null, "No path has been provided!");
29+
30+
ChangeLog changelog = ChangelogTasks.ReadChangelog(ChangelogFile);
31+
ReleaseNotes latestReleaseNotes = changelog.GetLatestReleaseNotes();
32+
var trimmedNotes = latestReleaseNotes.Notes.SkipUntil(n => !string.IsNullOrWhiteSpace(n)).Reverse().SkipUntil(n => !string.IsNullOrWhiteSpace(n)).Reverse();
33+
34+
string changelogBody = string.Join(Environment.NewLine, trimmedNotes);
35+
36+
SemanticVersion version = GitRepository.GetLatestVersionTagOnCurrentCommit();
37+
38+
var release = new NewRelease($"v{version}")
39+
{
40+
Draft = true,
41+
Name = $"v{version}",
42+
Prerelease = version.IsPrerelease,
43+
Body = changelogBody
44+
};
45+
46+
string owner = GitRepository.GetGitHubOwner();
47+
string name = GitRepository.GetGitHubName();
48+
49+
var credentials = new Credentials(GitHubActions.Instance.Token);
50+
GitHubTasks.GitHubClient = new GitHubClient(new ProductHeaderValue(nameof(NukeBuild)), new Octokit.Internal.InMemoryCredentialStore(credentials));
51+
52+
Log.Information("Creating GitHub release...");
53+
54+
Release createdRelease = await GitHubTasks.GitHubClient.Repository.Release.Create(owner, name, release);
55+
56+
// await GitHubTasks.GitHubClient.Repository.Release.Edit(owner, name, createdRelease.Id, new ReleaseUpdate { Draft = false });
1957
});
2058
}

build/IUnityPackageVersionMatchesGitTagVersion.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Nuke.Common.IO;
77
using Serilog;
88

9+
[ParameterPrefix(nameof(UnityPackageVersionMatchesGitTagVersion))]
910
interface IUnityPackageVersionMatchesGitTagVersion : INukeBuild
1011
{
1112
[GitRepository] private GitRepository GitRepository => TryGetValue(() => GitRepository);

0 commit comments

Comments
 (0)