Skip to content

Commit

Permalink
Refactor create release step and add publish to nuget step
Browse files Browse the repository at this point in the history
  • Loading branch information
stevenkuhn committed Sep 7, 2022
1 parent fac6c87 commit 4faef45
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 13 deletions.
1 change: 1 addition & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ jobs:
- name: Create release
env:
GitHub_Access_Token: ${{ secrets.GITHUB_TOKEN }}
GitHub_Repository: ${{ env.GITHUB_REPOSITORY }}
run: ./build.sh --target PublishToGitHub --skip PublishArtifacts


Expand Down
36 changes: 36 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Release

on:
release:
types: [published]

env:
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_NOLOGO: true

jobs:
push_to_nuget:
name: Push to NuGet Feed
runs-on: ubuntu-latest

steps:
- name: Checkout Source
uses: actions/checkout@v2
with:
fetch-depth: 0
ref: ${{ github.event.release.target_commitish }}

- name: Download release assets
uses: Itsblue/download-release-assets-action@master
with:
repo: ${{ env.GITHUB_REPOSITORY }}
version: ${{ github.event.release.id }}
file: "Sknet.*"
path: ./artifacts
token: ${{ secrets.GITHUB_TOKEN }}

- name: Push assets to NuGet
env:
NuGet_Source: ${{ secrets.NUGET_SOURCE }}
NuGet_ApiKey: ${{ secrets.NUGET_APIKEY }}
run: ./build.sh --target PublishToNuGetFeed --skip PublishArtifacts
10 changes: 8 additions & 2 deletions .nuke/build.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@
"type": "string",
"description": "GitHub access token used for creating a new or updating an existing release"
},
"GitHubRepository": {
"type": "string",
"description": "GitHub repository owner and name used for creating a new or updating an existing release. For example: 'stevenkuhn/openiddict-litedb'"
},
"Help": {
"type": "boolean",
"description": "Shows the help text for this build assembly"
Expand Down Expand Up @@ -53,11 +57,11 @@
},
"NuGetApiKey": {
"type": "string",
"description": "NuGet API key used to pushing the Sdk NuGet package"
"description": "NuGet API key used to pushing the NuGet package"
},
"NuGetSource": {
"type": "string",
"description": "NuGet source used for pushing the Sdk NuGet package. Default is NuGet.org"
"description": "NuGet source used for pushing the NuGet package. Default is NuGet.org"
},
"Partition": {
"type": "string",
Expand Down Expand Up @@ -88,6 +92,7 @@
"Compile",
"PublishArtifacts",
"PublishToGitHub",
"PublishToNuGetFeed",
"Restore",
"Test"
]
Expand All @@ -107,6 +112,7 @@
"Compile",
"PublishArtifacts",
"PublishToGitHub",
"PublishToNuGetFeed",
"Restore",
"Test"
]
Expand Down
40 changes: 29 additions & 11 deletions build/Build.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@ class Build : NukeBuild
[Parameter("GitHub access token used for creating a new or updating an existing release.")]
readonly string GitHubAccessToken;

[Parameter("NuGet source used for pushing the Sdk NuGet package. Default is NuGet.org.")]
[Parameter("GitHub repository owner and name used for creating a new or updating an existing release. For example: 'stevenkuhn/openiddict-litedb'.")]
readonly string GitHubRepository = "stevenkuhn/openiddict-litedb";

[Parameter("NuGet source used for pushing the NuGet package. Default is NuGet.org.")]
readonly string NuGetSource = "https://api.nuget.org/v3/index.json";

[Parameter("NuGet API key used to pushing the Sdk NuGet package.")]
[Parameter("NuGet API key used to pushing the NuGet package.")]
readonly string NuGetApiKey;

[Solution] readonly Solution Solution;
Expand All @@ -23,9 +26,6 @@ class Build : NukeBuild
static AbsolutePath TestsDirectory => RootDirectory / "test";
static AbsolutePath ArtifactsDirectory => RootDirectory / "artifacts";

const string GitHubRepositoryName = "openiddict-litedb";
const string GitHubRepositoryOwner = "stevenkuhn";

readonly string[] NuGetRestoreSources = new[] {
"https://api.nuget.org/v3/index.json"
};
Expand Down Expand Up @@ -103,9 +103,12 @@ protected override void OnBuildInitialized()
Target PublishToGitHub => _ => _
.DependsOn(PublishArtifacts)
.Requires(() => GitHubAccessToken)
.Requires(() => GitHubRepository)
.Executes(async () =>
{
Log.Debug($"Creating 'v{GitVersion.SemVer}' release in GitHub...");
(string repositoryOwner, string repositoryName) = GitHubRepository.Split('/');

var github = new Octokit.GitHubClient(new Octokit.ProductHeaderValue("sknet.openiddict.litedb.build"))
{
Credentials = new Octokit.Credentials(GitHubAccessToken)
Expand All @@ -115,19 +118,19 @@ protected override void OnBuildInitialized()
try
{
Log.Information($"Retrieving existing release tagged as 'v{GitVersion.SemVer}'...");
release = await github.Repository.Release.Get(GitHubRepositoryOwner, GitHubRepositoryName, $"v{GitVersion.SemVer}");
release = await github.Repository.Release.Get(repositoryOwner, repositoryName, $"v{GitVersion.SemVer}");
}
catch (Octokit.NotFoundException)
{
Log.Information("Release not found. Retrieving existing draft release...");
var releases = await github.Repository.Release.GetAll(GitHubRepositoryOwner, GitHubRepositoryName);
var releases = await github.Repository.Release.GetAll(repositoryOwner, repositoryName);
release = releases.SingleOrDefault(r => r.Draft && (r.TagName == $"v{GitVersion.SemVer}" || r.TagName.StartsWith($"v{GitVersion.MajorMinorPatch}-{GitVersion.PreReleaseLabel}")));
}

if (release != null)
{
Log.Information($"Release '{release.Name}' found. Updating release...");
release = await github.Repository.Release.Edit(GitHubRepositoryOwner, GitHubRepositoryName, release.Id, new Octokit.ReleaseUpdate
release = await github.Repository.Release.Edit(repositoryOwner, repositoryName, release.Id, new Octokit.ReleaseUpdate
{
Name = $"v{GitVersion.SemVer}",
TagName = $"v{GitVersion.SemVer}",
Expand All @@ -142,7 +145,7 @@ protected override void OnBuildInitialized()
else
{
Log.Information($"Release not found. Creating a new draft release...");
release = await github.Repository.Release.Create(GitHubRepositoryOwner, GitHubRepositoryName, new Octokit.NewRelease($"v{GitVersion.SemVer}")
release = await github.Repository.Release.Create(repositoryOwner, repositoryName, new Octokit.NewRelease($"v{GitVersion.SemVer}")
{
Name = $"v{GitVersion.SemVer}",
Body = $"Release notes for `v{GitVersion.SemVer}` are not available at this time.",
Expand All @@ -153,10 +156,10 @@ protected override void OnBuildInitialized()
}

Log.Information("Removing existing assets (if any)...");
var assets = await github.Repository.Release.GetAllAssets(GitHubRepositoryOwner, GitHubRepositoryName, release.Id);
var assets = await github.Repository.Release.GetAllAssets(repositoryOwner, repositoryName, release.Id);
foreach (var asset in assets)
{
await github.Repository.Release.DeleteAsset(GitHubRepositoryOwner, GitHubRepositoryName, asset.Id);
await github.Repository.Release.DeleteAsset(repositoryOwner, repositoryName, asset.Id);
}

var artifacts = ArtifactsDirectory.GlobFiles($"Sknet.*.{GitVersion.SemVer}.*");
Expand All @@ -174,4 +177,19 @@ protected override void OnBuildInitialized()
});
}
});

Target PublishToNuGetFeed => _ => _
.DependsOn(PublishArtifacts)
.Requires(() => NuGetSource)
.Requires(() => NuGetApiKey)
.After(PublishToGitHub)
.Executes(() =>
{
Log.Debug($"Uploading NuGet package(s) to '{NuGetSource}'...");

NuGetPush(s => s
.SetApiKey(NuGetApiKey)
.SetSource(NuGetSource)
.SetTargetPath(ArtifactsDirectory / $"Sknet.*.{GitVersion.SemVer}.nupkg"));
});
}
9 changes: 9 additions & 0 deletions build/StringExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
static class StringExtensions
{
public static (string T1, string T2) Split(this string value, char separator)
{
var result = value.Split(separator, 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);

return (result[0], result.Length > 1 ? result[1] : string.Empty);
}
}

0 comments on commit 4faef45

Please sign in to comment.