#1150: added simple way to get release notes using cake and git

This commit is contained in:
Tom Pallister 2020-03-12 22:14:18 +00:00 committed by GitHub
parent b280b1c530
commit 1a280ddd7f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 64 additions and 36 deletions

View File

@ -17,4 +17,7 @@ run_benchmarks:
run_unit_tests: run_unit_tests:
./build.sh --target=RunUnitTests ./build.sh --target=RunUnitTests
release_notes:
./build.sh --target=ReleaseNotes

View File

@ -15,7 +15,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
GitVersion.yml = GitVersion.yml GitVersion.yml = GitVersion.yml
LICENSE.md = LICENSE.md LICENSE.md = LICENSE.md
README.md = README.md README.md = README.md
ReleaseNotes.md = ReleaseNotes.md releasenotes.md = releasenotes.md
EndProjectSection EndProjectSection
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{5B401523-36DA-4491-B73A-7590A26E420B}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{5B401523-36DA-4491-B73A-7590A26E420B}"

View File

@ -1 +0,0 @@
No issues closed since last release

View File

@ -1,5 +1,4 @@
#tool "nuget:?package=GitVersion.CommandLine&version=5.0.1" #tool "nuget:?package=GitVersion.CommandLine&version=5.0.1"
#tool "nuget:?package=GitReleaseNotes"
#addin nuget:?package=Cake.Json #addin nuget:?package=Cake.Json
#addin nuget:?package=Newtonsoft.Json #addin nuget:?package=Newtonsoft.Json
#addin nuget:?package=System.Net.Http #addin nuget:?package=System.Net.Http
@ -63,6 +62,9 @@ Task("Default")
Task("Build") Task("Build")
.IsDependentOn("RunTests"); .IsDependentOn("RunTests");
Task("ReleaseNotes")
.IsDependentOn("CreateReleaseNotes");
Task("RunTests") Task("RunTests")
.IsDependentOn("RunUnitTests") .IsDependentOn("RunUnitTests")
.IsDependentOn("RunAcceptanceTests") .IsDependentOn("RunAcceptanceTests")
@ -96,8 +98,62 @@ Task("Clean")
} }
CreateDirectory(artifactsDir); CreateDirectory(artifactsDir);
}); });
Task("CreateReleaseNotes")
.Does(() =>
{
Information("Generating release notes at " + releaseNotesFile);
IEnumerable<string> lastReleaseTag;
var lastReleaseTagExitCode = StartProcess(
"git",
new ProcessSettings {
Arguments = "describe --tags --abbrev=0",
RedirectStandardOutput = true
},
out lastReleaseTag
);
if (lastReleaseTagExitCode != 0)
{
throw new Exception("Failed to get latest release tag");
}
var lastRelease = lastReleaseTag.First();
Information("Last release tag is " + lastRelease);
IEnumerable<string> releaseNotes;
var releaseNotesExitCode = StartProcess(
"git",
new ProcessSettings {
Arguments = $"log --pretty=format:\"%h - %an - %s\" {lastRelease}..HEAD",
RedirectStandardOutput = true
},
out releaseNotes
);
if (releaseNotesExitCode != 0)
{
throw new Exception("Failed to generate release notes");
}
EnsureDirectoryExists(packagesDir);
System.IO.File.WriteAllLines(releaseNotesFile, releaseNotes);
if (string.IsNullOrEmpty(System.IO.File.ReadAllText(releaseNotesFile)))
{
System.IO.File.WriteAllText(releaseNotesFile, "No commits since last release");
}
Information("Release notes are\r\n" + System.IO.File.ReadAllText(releaseNotesFile));
});
Task("Version") Task("Version")
.IsDependentOn("CreateReleaseNotes")
.Does(() => .Does(() =>
{ {
versioning = GetNuGetVersionForCommit(); versioning = GetNuGetVersionForCommit();
@ -210,17 +266,13 @@ Task("CreateArtifacts")
CopyFiles("./src/**/Release/Ocelot.*.nupkg", packagesDir); CopyFiles("./src/**/Release/Ocelot.*.nupkg", packagesDir);
// todo fix this for docker build
//GenerateReleaseNotes(releaseNotesFile);
var projectFiles = GetFiles("./src/**/Release/Ocelot.*.nupkg"); var projectFiles = GetFiles("./src/**/Release/Ocelot.*.nupkg");
foreach(var projectFile in projectFiles) foreach(var projectFile in projectFiles)
{ {
System.IO.File.AppendAllLines(artifactsFile, new[]{ System.IO.File.AppendAllLines(artifactsFile, new[]{
projectFile.GetFilename().FullPath, projectFile.GetFilename().FullPath,
// todo fix this for docker build "releaseNotes:releasenotes.md"
//"releaseNotes:releasenotes.md"
}); });
} }
@ -339,32 +391,6 @@ private void PersistVersion(string committedVersion, string newVersion)
} }
} }
/// generates release notes based on issues closed in GitHub since the last release
private void GenerateReleaseNotes(ConvertableFilePath file)
{
if(!IsRunningOnWindows())
{
Warning("We are not running on Windows so we cannot generate release notes.");
return;
}
Information("Generating release notes at " + file);
var releaseNotesExitCode = StartProcess(
@"tools/GitReleaseNotes/tools/gitreleasenotes.exe",
new ProcessSettings { Arguments = ". /o " + file });
if (string.IsNullOrEmpty(System.IO.File.ReadAllText(file)))
{
System.IO.File.WriteAllText(file, "No issues closed since last release");
}
if (releaseNotesExitCode != 0)
{
throw new Exception("Failed to generate release notes");
}
}
/// Publishes code and symbols packages to nuget feed, based on contents of artifacts file /// Publishes code and symbols packages to nuget feed, based on contents of artifacts file
private void PublishPackages(ConvertableDirectoryPath packagesDir, ConvertableFilePath artifactsFile, string feedApiKey, string codeFeedUrl, string symbolFeedUrl) private void PublishPackages(ConvertableDirectoryPath packagesDir, ConvertableFilePath artifactsFile, string feedApiKey, string codeFeedUrl, string symbolFeedUrl)
{ {
@ -392,7 +418,7 @@ private void PublishPackages(ConvertableDirectoryPath packagesDir, ConvertableFi
private void CreateGitHubRelease() private void CreateGitHubRelease()
{ {
var json = $"{{ \"tag_name\": \"{versioning.NuGetVersion}\", \"target_commitish\": \"master\", \"name\": \"{versioning.NuGetVersion}\", \"body\": \"todo: notes coming\", \"draft\": true, \"prerelease\": true }}"; var json = $"{{ \"tag_name\": \"{versioning.NuGetVersion}\", \"target_commitish\": \"master\", \"name\": \"{versioning.NuGetVersion}\", \"body\": \"{System.IO.File.ReadAllText(releaseNotesFile)}\", \"draft\": true, \"prerelease\": true }}";
var content = new System.Net.Http.StringContent(json, System.Text.Encoding.UTF8, "application/json"); var content = new System.Net.Http.StringContent(json, System.Text.Encoding.UTF8, "application/json");
using(var client = new System.Net.Http.HttpClient()) using(var client = new System.Net.Http.HttpClient())
@ -442,7 +468,7 @@ private void UploadFileToGitHubRelease(FilePath file)
private void CompleteGitHubRelease() private void CompleteGitHubRelease()
{ {
var json = $"{{ \"tag_name\": \"{versioning.NuGetVersion}\", \"target_commitish\": \"master\", \"name\": \"{versioning.NuGetVersion}\", \"body\": \"todo: notes coming\", \"draft\": false, \"prerelease\": false }}"; var json = $"{{ \"tag_name\": \"{versioning.NuGetVersion}\", \"target_commitish\": \"master\", \"name\": \"{versioning.NuGetVersion}\", \"body\": \"{System.IO.File.ReadAllText(releaseNotesFile)}\", \"draft\": false, \"prerelease\": false }}";
var request = new System.Net.Http.HttpRequestMessage(new System.Net.Http.HttpMethod("Patch"), $"https://api.github.com/repos/ThreeMammals/Ocelot/releases/{releaseId}"); var request = new System.Net.Http.HttpRequestMessage(new System.Net.Http.HttpMethod("Patch"), $"https://api.github.com/repos/ThreeMammals/Ocelot/releases/{releaseId}");
request.Content = new System.Net.Http.StringContent(json, System.Text.Encoding.UTF8, "application/json"); request.Content = new System.Net.Http.StringContent(json, System.Text.Encoding.UTF8, "application/json");

0
releasenotes.md Normal file
View File