Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/wiki/Configuration-Reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ Content entry paths and package-id keys are matched as globs (case-insensitive),
| --- | --- | --- |
| `Mode` | `None` | `None`, `LocalNuGet`, `NuGet`, or `GitHubRelease` |
| `UploadArtifacts` | `false` | Upload every file in `Build:ArtifactsFolder` as GitHub release assets |
| `MarkPrerelease` | `true` | Create the GitHub release as a prerelease when the package version is a prerelease (for example `2.0.0-prerelease.25`) |

## Example

Expand Down
2 changes: 1 addition & 1 deletion docs/wiki/Pipeline-Modules.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ Moves the `.nupkg`/`.snupkg` files from `Build:ArtifactsFolder` into the local f

Category `Release`. Depends on `PublishNuGetModule`, `ValidatePackModule`, and `VersionModule`. Skip condition: skipped unless `Release:Mode` is `NuGet` or `GitHubRelease` **and** a GitHub token resolves via `GitHub:GetGitHubToken()`.

Creates a GitHub release with tag `v{version}` and `GenerateReleaseNotes = true`. When `Release:UploadArtifacts` is true, uploads every file in `Build:ArtifactsFolder` as a release asset — for Web projects this is the `<package-name>-<version>.zip` produced by `PackModule`. The tag must not already exist; callers gate release eligibility (the tool does not skip an existing tag itself).
Creates a GitHub release with tag `v{version}` and `GenerateReleaseNotes = true`. Releases whose version is a prerelease (for example `2.0.0-prerelease.25`) are created as GitHub prereleases unless `Release:MarkPrerelease` is false, so prerelease builds are not presented as the latest stable release. When `Release:UploadArtifacts` is true, uploads every file in `Build:ArtifactsFolder` as a release asset — for Web projects this is the `<package-name>-<version>.zip` produced by `PackModule`. The tag must not already exist; callers gate release eligibility (the tool does not skip an existing tag itself).

## See also

Expand Down
18 changes: 16 additions & 2 deletions src/src/Build/Modules/CreateGitHubReleaseModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,28 @@ CancellationToken cancellationToken
);
}

// Create a new release on GitHub with the specified tag and generate release notes
// Create a new release on GitHub with the specified tag and generate release notes.
// Prerelease versions are published as prereleases so they are not presented as the
// latest stable release.
var isPrerelease = releaseSettings.Value.ShouldMarkPrerelease(version);
var release = await context
.GitHub()
.Client.Repository.Release.Create(
repositoryId,
new NewRelease(tag) { Name = tag, GenerateReleaseNotes = true }
new NewRelease(tag)
{
Name = tag,
GenerateReleaseNotes = true,
Prerelease = isPrerelease,
}
);

context.Logger.LogInformation(
"Created GitHub release {Tag}{Prerelease}.",
tag,
isPrerelease ? " as a prerelease" : string.Empty
);

if (releaseSettings.Value.UploadArtifacts)
{
var artifactsFolder = buildSettings.Value.ArtifactsFolder;
Expand Down
20 changes: 20 additions & 0 deletions src/src/Build/Settings/ReleaseSettings.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using NuGet.Versioning;

namespace Purview.Build.Settings;

public sealed record ReleaseSettings
Expand All @@ -11,4 +13,22 @@ public sealed record ReleaseSettings
/// (for example .nupkg/.snupkg or .vsix) as release assets.
/// </summary>
public bool UploadArtifacts { get; init; }

/// <summary>
/// When true (the default), a GitHub release whose version is a prerelease (for example
/// <c>2.0.0-prerelease.25</c>) is created as a prerelease, so it is not presented as the latest
/// stable release. Set to false to publish prerelease versions as stable releases.
/// </summary>
public bool MarkPrerelease { get; init; } = true;

/// <summary>
/// Returns whether a release for <paramref name="version"/> should be created as a GitHub
/// prerelease.
/// </summary>
public bool ShouldMarkPrerelease(NuGetVersion version)
{
ArgumentNullException.ThrowIfNull(version);

return MarkPrerelease && version.IsPrerelease;
}
}
3 changes: 2 additions & 1 deletion src/src/Build/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
},
"Release": {
"Mode": "None",
"UploadArtifacts": false
"UploadArtifacts": false,
"MarkPrerelease": true
}
}
39 changes: 39 additions & 0 deletions src/tests/Build.IntegrationTests/ReleaseSettingsTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using NuGet.Versioning;
using Purview.Build.Settings;

namespace Purview.Build;

public class ReleaseSettingsTests
{
[Test]
public async Task ShouldMarkPrerelease_GivenPrereleaseVersionAndDefaults_ReturnsTrue()
{
ReleaseSettings settings = new();

await Assert.That(settings.ShouldMarkPrerelease(NuGetVersion.Parse("2.0.0-prerelease.25"))).IsTrue();
}

[Test]
public async Task ShouldMarkPrerelease_GivenStableVersionAndDefaults_ReturnsFalse()
{
ReleaseSettings settings = new();

await Assert.That(settings.ShouldMarkPrerelease(NuGetVersion.Parse("2.0.0"))).IsFalse();
}

[Test]
public async Task ShouldMarkPrerelease_GivenMarkPrereleaseDisabled_ReturnsFalse()
{
ReleaseSettings settings = new() { MarkPrerelease = false };

await Assert.That(settings.ShouldMarkPrerelease(NuGetVersion.Parse("2.0.0-prerelease.25"))).IsFalse();
}

[Test]
public async Task MarkPrerelease_GivenDefaults_IsTrue()
{
ReleaseSettings settings = new();

await Assert.That(settings.MarkPrerelease).IsTrue();
}
}
Loading