#20 - add release scripts

This commit is contained in:
Philip Wood 2017-01-29 13:00:50 +00:00
parent 93ebb6a0d3
commit e747d3386a
3 changed files with 135 additions and 9 deletions

View File

@ -19,6 +19,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
Ocelot.nuspec = Ocelot.nuspec Ocelot.nuspec = Ocelot.nuspec
push-to-nuget.bat = push-to-nuget.bat push-to-nuget.bat = push-to-nuget.bat
README.md = README.md README.md = README.md
release.cake = release.cake
release.ps1 = release.ps1
run-acceptance-tests.bat = run-acceptance-tests.bat run-acceptance-tests.bat = run-acceptance-tests.bat
run-benchmarks.bat = run-benchmarks.bat run-benchmarks.bat = run-benchmarks.bat
run-tests.bat = run-tests.bat run-tests.bat = run-tests.bat

View File

@ -3,6 +3,7 @@
#tool "nuget:?package=ReportGenerator" #tool "nuget:?package=ReportGenerator"
#tool "nuget:?package=GitReleaseNotes" #tool "nuget:?package=GitReleaseNotes"
#addin nuget:?package=Cake.DoInDirectory #addin nuget:?package=Cake.DoInDirectory
#addin "Cake.Json"
var target = Argument("target", "Default"); var target = Argument("target", "Default");
var artifactsDir = Directory("artifacts"); var artifactsDir = Directory("artifacts");
@ -30,15 +31,27 @@ var artifactsForBenchmarkTestsDir = artifactsDir + Directory("BenchmarkTests");
var benchmarkTestAssemblies = @"./test/Ocelot.Benchmarks"; var benchmarkTestAssemblies = @"./test/Ocelot.Benchmarks";
// packaging // packaging
var packagesDir = artifactsDir + Directory("Packages");
var projectJson = "./src/Ocelot/project.json"; var projectJson = "./src/Ocelot/project.json";
var packagesDir = artifactsDir + Directory("Packages");
// release notes
var releaseNotesFile = packagesDir + File("releasenotes.md"); var releaseNotesFile = packagesDir + File("releasenotes.md");
var artifactsFile = packagesDir + File("artifacts.txt");
//unstable releases
var publishUnstableBuilds = true;
var nugetFeedUnstableKey = EnvironmentVariable("nuget-apikey-unstable");
var nugetFeedUnstableUploadUrl = "https://www.myget.org/F/ocelot-unstable/api/v2/package";
var nugetFeedUnstableSymbolsUploadUrl = "https://www.myget.org/F/ocelot-unstable/symbols/api/v2/package";
//stable releases
var releaseTag = "";
var nugetFeedStableKey = EnvironmentVariable("nuget-apikey-stable");
var nugetFeedStableUploadUrl = "https://www.myget.org/F/ocelot-stable/api/v2/package";
var nugetFeedStableSymbolsUploadUrl = "https://www.myget.org/F/ocelot-stable/symbols/api/v2/package";
Task("Default") Task("Default")
.IsDependentOn("RunTests") .IsDependentOn("RunTests")
.IsDependentOn("Package") .IsDependentOn("CreatePackages")
.IsDependentOn("ReleasePackagesToUnstableFeed")
.Does(() => .Does(() =>
{ {
}); });
@ -56,7 +69,7 @@ Task("Clean")
Task("Version") Task("Version")
.Does(() => .Does(() =>
{ {
var nugetVersion = GetVersion(); var nugetVersion = GetNuGetVersionForCommit();
Information("SemVer version number: " + nugetVersion); Information("SemVer version number: " + nugetVersion);
if (AppVeyor.IsRunningOnAppVeyor) if (AppVeyor.IsRunningOnAppVeyor)
@ -135,7 +148,7 @@ Task("RunTests")
{ {
}); });
Task("Package") Task("CreatePackages")
.Does(() => .Does(() =>
{ {
EnsureDirectoryExists(packagesDir); EnsureDirectoryExists(packagesDir);
@ -150,7 +163,7 @@ Task("Package")
DotNetCorePack(projectJson, settings); DotNetCorePack(projectJson, settings);
System.IO.File.WriteAllLines(packagesDir + File("artifacts"), new[]{ System.IO.File.WriteAllLines(artifactsFile, new[]{
"nuget:Ocelot." + buildVersion + ".nupkg", "nuget:Ocelot." + buildVersion + ".nupkg",
"nugetSymbols:Ocelot." + buildVersion + ".symbols.nupkg", "nugetSymbols:Ocelot." + buildVersion + ".symbols.nupkg",
"releaseNotes:releasenotes.md" "releaseNotes:releasenotes.md"
@ -167,9 +180,71 @@ Task("Package")
} }
}); });
Task("ReleasePackagesToUnstableFeed")
.IsDependentOn("CreatePackages")
.Does(() =>
{
PublishPackages(nugetFeedUnstableKey, nugetFeedUnstableUploadUrl, nugetFeedUnstableSymbolsUploadUrl);
});
Task("EnsureStableReleaseRequirements")
.Does(() =>
{
if (!AppVeyor.IsRunningOnAppVeyor)
{
throw new Exception("Stable release should happen via appveyor");
}
var isTag =
AppVeyor.Environment.Repository.Tag.IsTag &&
!string.IsNullOrWhiteSpace(AppVeyor.Environment.Repository.Tag.Name);
if (!isTag)
{
throw new Exception("Stable release should happen from a published GitHub release");
}
});
Task("UpdateVersionInfo")
.IsDependentOn("EnsureStableReleaseRequirements")
.Does(() =>
{
releaseTag = AppVeyor.Environment.Repository.Tag.Name;
AppVeyor.UpdateBuildVersion(releaseTag);
});
Task("DownloadGitHubReleaseArtifacts")
.IsDependentOn("UpdateVersionInfo")
.Does(() =>
{
EnsureDirectoryExists(packagesDir);
var assets_url = ParseJson(GetResource("https://api.github.com/repos/binarymash/pipelinetesting/releases/tags/" + releaseTag))
.GetValue("assets_url")
.Value<string>();
foreach(var asset in DeserializeJson<JArray>(GetResource(assets_url)))
{
var file = packagesDir + File(asset.Value<string>("name"));
Information("Downloading " + file);
DownloadFile(asset.Value<string>("browser_download_url"), file);
}
});
Task("ReleasePackagesToStableFeed")
.IsDependentOn("DownloadGitHubReleaseArtifacts")
.Does(() =>
{
PublishPackages(nugetFeedStableKey, nugetFeedStableUploadUrl, nugetFeedStableSymbolsUploadUrl);
});
Task("Release")
.IsDependentOn("ReleasePackagesToStableFeed");
RunTarget(target); RunTarget(target);
private string GetVersion() /// Gets nuique nuget version for this commit
private string GetNuGetVersionForCommit()
{ {
GitVersion(new GitVersionSettings{ GitVersion(new GitVersionSettings{
UpdateAssemblyInfo = false, UpdateAssemblyInfo = false,
@ -180,9 +255,11 @@ private string GetVersion()
return versionInfo.NuGetVersion; return versionInfo.NuGetVersion;
} }
/// Updates project version in all of our projects
private void PersistVersion(string version) private void PersistVersion(string version)
{ {
Information(string.Format("We'll search all project.json files for {0} and replace with {1}...", committedVersion, version)); Information(string.Format("We'll search all project.json files for {0} and replace with {1}...", committedVersion, version));
var projectJsonFiles = GetFiles("./**/project.json"); var projectJsonFiles = GetFiles("./**/project.json");
foreach(var projectJsonFile in projectJsonFiles) foreach(var projectJsonFile in projectJsonFiles)
@ -198,6 +275,7 @@ private void PersistVersion(string version)
} }
} }
/// generates release notes based on issues closed in GitHub since the last release
private void GenerateReleaseNotes() private void GenerateReleaseNotes()
{ {
Information("Generating release notes at " + releaseNotesFile); Information("Generating release notes at " + releaseNotesFile);
@ -216,3 +294,48 @@ private void GenerateReleaseNotes()
throw new Exception("Failed to generate release notes"); throw new Exception("Failed to generate release notes");
} }
} }
/// Publishes code and symbols packages to nuget feed, based on contents of artifacts file
private void PublishPackages(string feedApiKey, string codeFeedUrl, string symbolFeedUrl)
{
var artifacts = System.IO.File
.ReadAllLines(artifactsFile)
.Select(l => l.Split(':'))
.ToDictionary(v => v[0], v => v[1]);
var codePackage = packagesDir + File(artifacts["nuget"]);
var symbolsPackage = packagesDir + File(artifacts["nugetSymbols"]);
NuGetPush(
codePackage,
new NuGetPushSettings {
ApiKey = feedApiKey,
Source = codeFeedUrl
});
NuGetPush(
symbolsPackage,
new NuGetPushSettings {
ApiKey = feedApiKey,
Source = symbolFeedUrl
});
}
/// gets the resource from the specified url
private string GetResource(string url)
{
Information("Getting resource from " + url);
var assetsRequest = System.Net.WebRequest.CreateHttp(url);
assetsRequest.Method = "GET";
assetsRequest.Accept = "application/vnd.github.v3+json";
assetsRequest.UserAgent = "BuildScript";
using (var assetsResponse = assetsRequest.GetResponse())
{
var assetsStream = assetsResponse.GetResponseStream();
var assetsReader = new StreamReader(assetsStream);
return assetsReader.ReadToEnd();
}
}

1
release.ps1 Normal file
View File

@ -0,0 +1 @@
./build.ps1 -target Release