feat: Add GitRepoRegistration cmdlets #5
5 changed files with 103 additions and 38 deletions
feat(build): Create helpers and TagCommit step
- adjust the BaseSourceLocation to be absolute - refactor getting the PowershellModule version to Helpers.cs
commit
1a8bdec589
|
|
@ -1,6 +1,7 @@
|
|||
using Cake.Common.IO;
|
||||
using Cake.Common.IO.Paths;
|
||||
using Cake.Core;
|
||||
using Cake.Core.IO;
|
||||
using Cake.Frosting;
|
||||
|
||||
namespace Build;
|
||||
|
|
@ -10,7 +11,7 @@ public class BuildContext : FrostingContext
|
|||
/// <summary>
|
||||
/// Base source directory
|
||||
/// </summary>
|
||||
public ConvertableDirectoryPath BaseSourceLocation { get; set; }
|
||||
public DirectoryPath BaseSourceLocation { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Powershell module project folder
|
||||
|
|
@ -38,7 +39,7 @@ public class BuildContext : FrostingContext
|
|||
public BuildContext(ICakeContext context)
|
||||
: base(context)
|
||||
{
|
||||
BaseSourceLocation = context.Directory("../src");
|
||||
BaseSourceLocation = context.Directory("../src").Path.MakeAbsolute(context.Environment);
|
||||
PowershellModuleProjectDirectory = BaseSourceLocation + context.Directory("PowershellModule");
|
||||
PowershellModuleCsproj = PowershellModuleProjectDirectory + context.File("PowershellModule.csproj");
|
||||
PowershellModuleOutputDir = context.Directory("../") + context.Directory("output") + context.Directory("PowershellModule");
|
||||
|
|
|
|||
42
build/Helpers.cs
Normal file
42
build/Helpers.cs
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Build;
|
||||
|
||||
public class Helpers
|
||||
{
|
||||
public static string GetPowershellModuleVersion(string powershelModuleOutputLocation)
|
||||
|
pascal_nulah marked this conversation as resolved
|
||||
{
|
||||
var moduleVersionInfo = FileVersionInfo.GetVersionInfo(Path.Combine(powershelModuleOutputLocation, "PowershellModule.dll"));
|
||||
|
||||
// It's (almost) impossible to not have a product version tag here. There is a reason why the implementation
|
||||
// returns a string? but I can't find it and I don't really care too much. If we have null return an empty string
|
||||
// and append no version to the archive bundle.
|
||||
if (moduleVersionInfo.ProductVersion == null)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
var versionRegex = new Regex(@"(\d+\.\d+\.\d+)(?:\-?([\w\-]+)\+?(\w+)?)?");
|
||||
var match = versionRegex.Match(moduleVersionInfo.ProductVersion);
|
||||
if (match.Success)
|
||||
{
|
||||
// If we have 4 groups, we've got a version number, suffix, and commit hash, so we return the first 2 as is
|
||||
// and the commit has capped to 8 characters
|
||||
if (match.Groups.Count == 4)
|
||||
{
|
||||
return $"{match.Groups[1]}-{match.Groups[2]}+{match.Groups[3].Value.Substring(0, 8)}";
|
||||
}
|
||||
|
||||
if (match.Groups.Count == 3)
|
||||
{
|
||||
return $"{match.Groups[1]}-{match.Groups[2]}";
|
||||
}
|
||||
|
||||
return $"{match.Groups[1]}";
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
using System.Diagnostics;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Text.RegularExpressions;
|
||||
|
|
@ -79,7 +80,7 @@ public class CreateBundleArchiveTask : FrostingTask<BuildContext>
|
|||
context.Log.Information($"Bundle files copied");
|
||||
|
||||
GenerateModuleImportScript(moduleFolderLocation, context);
|
||||
var moduleVersionForFilename = GetPowershellModuleVersion(powershelModuleOutputLocation);
|
||||
var moduleVersionForFilename = Helpers.GetPowershellModuleVersion(powershelModuleOutputLocation);
|
||||
CreateBundleZip(bundleRootLocation, moduleFolderLocation, moduleVersionForFilename, context);
|
||||
}
|
||||
|
||||
|
|
@ -132,38 +133,4 @@ public class CreateBundleArchiveTask : FrostingTask<BuildContext>
|
|||
ZipFile.CreateFromDirectory(moduleFolderLocation, bundleZipFileLocaiton, CompressionLevel.Fastest, true);
|
||||
context.Log.Information($"Archive created at '{bundleZipFileLocaiton}'");
|
||||
}
|
||||
|
||||
private static string GetPowershellModuleVersion(string powershelModuleOutputLocation)
|
||||
{
|
||||
var moduleVersionInfo = FileVersionInfo.GetVersionInfo(Path.Combine(powershelModuleOutputLocation, "PowershellModule.dll"));
|
||||
|
||||
// It's (almost) impossible to not have a product version tag here. There is a reason why the implementation
|
||||
// returns a string? but I can't find it and I don't really care too much. If we have null return an empty string
|
||||
// and append no version to the archive bundle.
|
||||
if (moduleVersionInfo.ProductVersion == null)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
var versionRegex = new Regex(@"(\d+\.\d+\.\d+)(?:\-?([\w\-]+)\+?(\w+)?)?");
|
||||
var match = versionRegex.Match(moduleVersionInfo.ProductVersion);
|
||||
if (match.Success)
|
||||
{
|
||||
// If we have 4 groups, we've got a version number, suffix, and commit hash, so we return the first 2 as is
|
||||
// and the commit has capped to 8 characters
|
||||
if (match.Groups.Count == 4)
|
||||
{
|
||||
return $"{match.Groups[1]}-{match.Groups[2]}+{match.Groups[3].Value.Substring(0, 8)}";
|
||||
}
|
||||
|
||||
if (match.Groups.Count == 3)
|
||||
{
|
||||
return $"{match.Groups[1]}-{match.Groups[2]}";
|
||||
}
|
||||
|
||||
return $"{match.Groups[1]}";
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
|
@ -7,6 +7,7 @@ namespace Build.Tasks;
|
|||
// Consider this the "entry" point for builds, task order is defined by a chain of IsDependentOn
|
||||
[TaskName("Default")]
|
||||
[IsDependentOn(typeof(BuildTask))]
|
||||
[IsDependentOn(typeof(TagCommitTask))]
|
||||
[IsDependentOn(typeof(CopyOutputTask))]
|
||||
[IsDependentOn(typeof(CreateBundleArchiveTask))]
|
||||
public class DefaultTask : FrostingTask
|
||||
|
|
|
|||
54
build/Tasks/TagCommitTask.cs
Normal file
54
build/Tasks/TagCommitTask.cs
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using Cake.Core.Diagnostics;
|
||||
using Cake.Frosting;
|
||||
|
||||
namespace Build.Tasks;
|
||||
|
||||
[TaskName("TagCurrentCommitWithVersion")]
|
||||
[IsDependentOn(typeof(BuildTask))]
|
||||
public class TagCommitTask : FrostingTask<BuildContext>
|
||||
{
|
||||
public override void Run(BuildContext context)
|
||||
{
|
||||
// This task only really exists to create pre-release builds for pull requests.
|
||||
// It'll tag the current commit with the same version that'll be used for the bundle archive filename.
|
||||
// TODO: update build.ps1 in the solution root so it doesn't do this tagging task
|
||||
TagCommit(context);
|
||||
base.Run(context);
|
||||
}
|
||||
|
||||
private static void TagCommit(BuildContext context)
|
||||
{
|
||||
var moduleVersionForFilename = Helpers.GetPowershellModuleVersion(context.PowershellModuleOutputDir.Path.MakeAbsolute(context.Environment).FullPath);
|
||||
|
||||
var ps = new ProcessStartInfo("git",
|
||||
["-C", context.BaseSourceLocation.FullPath, "tag", moduleVersionForFilename])
|
||||
{
|
||||
RedirectStandardOutput = true,
|
||||
RedirectStandardError = true,
|
||||
};
|
||||
|
||||
// If the user doesn't have git on their path, this will throw an exception that I don't have to do anything
|
||||
// special with, it'll be unhandled and powershell will handle it
|
||||
var gitProcess = Process.Start(ps);
|
||||
|
||||
// This probably shouldn't be possible?
|
||||
if (gitProcess is null)
|
||||
{
|
||||
throw new Exception("git failed to start")
|
||||
{
|
||||
Source = "git-process",
|
||||
};
|
||||
}
|
||||
|
||||
gitProcess.WaitForExit();
|
||||
|
||||
if (!gitProcess.StandardError.EndOfStream)
|
||||
{
|
||||
throw new Exception($"Unable to tag: {gitProcess.StandardError.ReadToEnd().Trim()}. Either remove the existing tag, or commit your changes before running a build");
|
||||
}
|
||||
|
||||
context.Log.Information($"Tagged commit with {moduleVersionForFilename}");
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue
todo: Document public method