implemented release command

master
Harald Wolff 2020-12-09 12:06:51 +01:00
parent b6cde40c20
commit 5f265a41d9
8 changed files with 143 additions and 3 deletions

View File

@ -1,6 +1,7 @@
using System;
using System.IO;
using ln.build.repositories;
using ln.build.semver;
using ln.logging;
namespace ln.build.pipeline
@ -15,7 +16,36 @@ namespace ln.build.pipeline
public static void Release(Stage stage,params string[] arguments)
{
stage.CommandEnvironment.Logger.Log(LogLevel.WARNING, "stage command: release not yet implemented");
if (stage.CommandEnvironment.CIJob.Repository is Repository repository)
{
SemVersion releaseVersion = (SemVersion)stage.CommandEnvironment.Get("RELEASE_VERSION");
if (releaseVersion != null)
{
Release release = repository.GetRelease(releaseVersion.ToString());
if (release != null)
{
stage.CommandEnvironment.Logger.Log(LogLevel.WARNING, "source repository already has release {0}", releaseVersion);
} else
{
string releaseBody = "";
string release_ref = stage.CommandEnvironment.Get("REPO_REF");
if (release_ref == null)
{
stage.CommandEnvironment.Logger.Log(LogLevel.WARNING,"release: no source repository reference found. can't create release!");
} else
{
release = repository.CreateRelease(releaseVersion, releaseBody, release_ref);
foreach (string artefact in stage.CommandEnvironment.Get("RELEASE_ARTEFACTS","").Split(':'))
{
release.CreateOrReplaceAttachment(artefact,Path.GetFileName(artefact));
}
}
}
}
} else
{
stage.CommandEnvironment.Logger.Log(LogLevel.WARNING, "release: no repository interface attached to CIJob");
}
}

View File

@ -36,7 +36,8 @@ namespace ln.build.commands
// ToDo: Parse .sln files for referenced projects
SemVersion highestVersion = new SemVersion(0,0,0);
foreach (string projectFileName in projectFiles)
{
stage.PipeLine.CommandEnvironment.Extend("DOTNET_PROJECTS", projectFileName);
@ -47,8 +48,12 @@ namespace ln.build.commands
string ot = csp.GetOutputType();
stage.CommandEnvironment.Logger.Log(LogLevel.INFO, "dotnet prepare: project {0} version={1} type={2}", projectName, projectVersion, ot);
if (projectVersion > highestVersion)
highestVersion = projectVersion;
}
stage.PipeLine.CommandEnvironment.Set("RELEASE_VERSION", highestVersion.ToString());
}
public static void Build(Stage stage,params string[] arguments)
@ -174,6 +179,11 @@ namespace ln.build.commands
string[] nupkgList = stage.CommandEnvironment.Get("DOTNET_ARTEFACTS","").Split(':').Where((fn)=>fn.EndsWith(".nupkg")).ToArray();
string[] binaryList = stage.CommandEnvironment.Get("DOTNET_ARTEFACTS","").Split(':').Where((fn)=>!fn.EndsWith(".nupkg")).ToArray();
foreach (string binaryArtefact in binaryList)
{
stage.PipeLine.CommandEnvironment.Extend("RELEASE_ARTEFACTS", binaryArtefact);
}
if (nupkgList.Length > 0)
{
string nugetSource = stage.CommandEnvironment.Get("NUGET_SOURCE");
@ -200,6 +210,8 @@ namespace ln.build.commands
{
argNupkg.SetValue(nupkg);
cr.Run(stage.CommandEnvironment);
stage.PipeLine.CommandEnvironment.Extend("RELEASE_ARTEFACTS", nupkg);
}
}
}

View File

@ -13,6 +13,8 @@ namespace ln.build.repositories
public Boolean IsDraft {get; set; }
public Boolean IsPreRelease {get; set; }
public string TargetCommit { get; set; }
public string Body { get; set; }
public abstract Repository Repository { get; }

View File

@ -1,5 +1,6 @@
using System;
using ln.build.semver;
using ln.http;
namespace ln.build.repositories
@ -14,6 +15,8 @@ namespace ln.build.repositories
public abstract Release GetRelease(string tagName);
public abstract Release GetRelease(int id);
public abstract Release CreateRelease(SemVersion releaseVersion, string body, string target_reference);
public abstract void CommitAndPush(string message, string[] addedPaths, string[] modifiedPaths, string[] removedPaths);

View File

@ -15,11 +15,17 @@ namespace ln.build.repositories.gitea
{
public override Repository Repository => GiteaRepository;
public GiteaRepository GiteaRepository { get; }
public GiteaRelease(GiteaRepository repository)
{
GiteaRepository = repository;
}
public GiteaRelease(GiteaRepository repository,JSONObject jsonRelease) : this(repository)
{
UpdateFromJson(jsonRelease);
}
public void UpdateFromJson(JSONObject jsonRelease)
{
Id = (int)(long)jsonRelease["id"].ToNative();
Name = jsonRelease["name"].ToNative().ToString();
@ -27,6 +33,20 @@ namespace ln.build.repositories.gitea
Body = jsonRelease["body"].ToNative().ToString();
IsDraft = (bool)jsonRelease["draft"].ToNative();
IsPreRelease = (bool)jsonRelease["prerelease"].ToNative();
TargetCommit = jsonRelease["target_commitish"].ToNative().ToString();
}
public JSONObject ToJson()
{
JSONObject jsonRelease = new JSONObject();
jsonRelease.Add("name", Name);
jsonRelease.Add("tag_name", TagName);
jsonRelease.Add("target_comittish", TargetCommit);
jsonRelease.Add("prerelease",IsPreRelease);
jsonRelease.Add("draft",IsDraft);
jsonRelease.Add("body",Body);
return jsonRelease;
}
public override Attachment CreateOrReplaceAttachment(string localPath, string remoteFileName)
@ -63,6 +83,7 @@ namespace ln.build.repositories.gitea
public override string Name { get; set; }
public override string DownloadURL { get => downloadURL; set => throw new NotImplementedException(); }
public GiteaAttachment(GiteaRelease giteaRelease)
{
GiteaRelease = giteaRelease;

View File

@ -88,7 +88,11 @@ namespace ln.build.repositories.gitea
public override Release GetRelease(string tagName)
{
throw new NotImplementedException();
if (HttpStatusCode.OK == Client.GetJson(out JSONValue jsonRelease, "repos", Owner, Name, "releases", "tags", tagName))
{
return new GiteaRelease(this, jsonRelease as JSONObject);
}
return null;
}
public override Release GetRelease(int releaseId)
{
@ -99,6 +103,16 @@ namespace ln.build.repositories.gitea
return null;
}
public override Release CreateRelease(SemVersion releaseVersion, string body, string target_reference)
{
GiteaRelease giteaRelease = new GiteaRelease(this){ TagName = releaseVersion.ToString(), Body = body, TargetCommit = target_reference };
if (HttpStatusCode.Created != Client.PostJson(giteaRelease.ToJson(), out JSONValue jsonRelease, "repos", Owner, Name, "releases"))
throw new Exception(string.Format("release could not be created => {0}", giteaRelease.ToJson()));
giteaRelease.UpdateFromJson(jsonRelease as JSONObject);
return giteaRelease;
}
public bool ContainsFile(string filename,string _ref) => (Client.GetJson(out JSONValue response, "repos", Owner, Name, "contents", string.Format("{0}?ref={1}",filename, _ref)) == HttpStatusCode.OK);

View File

@ -38,6 +38,7 @@
"priority": 1000,
"commands": [
"dotnet push",
"release",
"deploy"
]
}

View File

@ -20,6 +20,7 @@ namespace ln.build.semver
public bool IsPreRelease => !PreRelease?.Equals(string.Empty) ?? false;
public bool IsRelease => PreRelease?.Equals(string.Empty) ?? true;
public SemVersion(int major,int minor,int patch) : this(major, minor, patch, ""){ }
public SemVersion(int major,int minor,int patch,string prerelease)
{
Major = major;
@ -78,6 +79,62 @@ namespace ln.build.semver
return version;
}
public static bool operator <(SemVersion a,SemVersion b)
{
if (a.Major < b.Major)
return true;
if (a.Major > b.Major)
return false;
if (a.Minor < b.Minor)
return true;
if (a.Minor > b.Minor)
return false;
if (a.Patch < b.Patch)
return true;
if (a.Patch > b.Patch)
return false;
if (a.IsPreRelease && b.IsRelease)
return true;
if (a.IsRelease && b.IsPreRelease)
return false;
if (a.IsRelease && b.IsRelease)
return false;
return a.PreRelease.CompareTo(b.PreRelease) > 0;
}
public static bool operator >(SemVersion b,SemVersion a)
{
if (a.Major < b.Major)
return true;
if (a.Major > b.Major)
return false;
if (a.Minor < b.Minor)
return true;
if (a.Minor > b.Minor)
return false;
if (a.Patch < b.Patch)
return true;
if (a.Patch > b.Patch)
return false;
if (a.IsPreRelease && b.IsRelease)
return true;
if (a.IsRelease && b.IsPreRelease)
return false;
if (a.IsRelease && b.IsRelease)
return false;
return a.PreRelease.CompareTo(b.PreRelease) > 0;
}
public static explicit operator SemVersion(string versionString) => versionString == null ? null : SemVersion.Parse(versionString);
}