Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions build/Build.AzureWebAppNetCoreShim.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
namespace Calamari.Build;
using Nuke.Common.Utilities;

namespace Calamari.Build;

public partial class Build
{
Target PublishAzureWebAppNetCoreShim =>
_ => _.DependsOn(RestoreSolution)
.DependsOn(GetCalamariFlavourProjectsToPublish)
//we only build the net core shim when there is the AzureWebApp project is being built
.OnlyWhenDynamic(() => CalamariProjects.Any(p => p.Name == "Calamari.AzureWebApp"))
.Executes(() =>
_ => _.Executes(() =>
{
if (!OperatingSystem.IsWindows())
{
Expand Down Expand Up @@ -38,5 +36,8 @@ public partial class Build
archivePath.DeleteFile();

outputPath.CompressTo(archivePath);

//publish as an artifact
TeamCity.Instance?.PublishArtifacts(archivePath);
});
}
16 changes: 11 additions & 5 deletions build/Build.Consolidation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public partial class Build
Target PackConsolidationLibrariesNugetPackages =>
d =>
d.DependsOn(CalamariConsolidationVerification)
.Executes(() =>
.Executes(async () =>
{
// Pack the Consolidation Libraries
const string consolidateCalamariPackagesProjectPrefix = "Calamari.ConsolidateCalamariPackages";
Expand All @@ -109,7 +109,7 @@ public partial class Build
File.Copy(KnownPaths.RootDirectory / "global.json", buildDirectory / "global.json");

//sign the built directory
SignDirectory(buildDirectory);
await SignDirectory(buildDirectory);

//pack the project
DotNetPack(s => s
Expand All @@ -128,9 +128,15 @@ public partial class Build
d.DependsOn(PackConsolidationLibrariesNugetPackages)
.Executes(() =>
{
NuGetPack(s => s.SetTargetPath(KnownPaths.BuildDirectory / "Calamari.Consolidated.nuspec")
.SetBasePath(KnownPaths.BuildDirectory)
DotNetPack(s => s
.SetProject(KnownPaths.BuildDirectory / "Octopus.Calamari.Consolidated.nuspec")
.SetVersion(NugetVersion.Value)
.SetOutputDirectory(KnownPaths.ArtifactsDirectory));
.SetOutputDirectory(KnownPaths.ArtifactsDirectory)
.SetProperty("NuspecBasePath", KnownPaths.BuildDirectory)
);
// NuGetPack(s => s.SetTargetPath(KnownPaths.BuildDirectory / "Octopus.Calamari.Consolidated.nuspec")
// .SetBasePath(KnownPaths.BuildDirectory)
// .SetVersion(NugetVersion.Value)
// .SetOutputDirectory(KnownPaths.ArtifactsDirectory));
});
}
4 changes: 2 additions & 2 deletions build/Build.Contracts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ public partial class Build
Target PackContractsProject =>
d =>
d.DependsOn(RestoreSolution)
.Executes(() =>
.Executes(async () =>
{
var project = Solution.GetProject("Calamari.Contracts")!;

Expand All @@ -23,7 +23,7 @@ public partial class Build
File.Copy(KnownPaths.RootDirectory / "global.json", buildDirectory / "global.json");

//sign the built directory
SignDirectory(buildDirectory);
await SignDirectory(buildDirectory);

//pack the project
DotNetPack(s => s
Expand Down
3 changes: 2 additions & 1 deletion build/Build.Docker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using JetBrains.Annotations;
using Nuke.Common.Tooling;
using Nuke.Common.Tools.Docker;
using Octopus.Calamari.ConsolidatedPackage;

namespace Calamari.Build;

Expand All @@ -21,7 +22,7 @@ public partial class Build
return;
}

var flavours = GetCalamariFlavours();
var flavours = BuildableCalamariProjects.GetCalamariProjectsForDockerImages;
string[] supportedPlatforms = ["linux/amd64", "linux/arm64", "linux/arm"];
var dockerBuildPlatform = string.Join(",", supportedPlatforms);

Expand Down
51 changes: 28 additions & 23 deletions build/Build.PackageCalamariProjects.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using Calamari.Build.Utilities;
using Nuke.Common.ProjectModel;

namespace Calamari.Build;
Expand Down Expand Up @@ -54,7 +55,6 @@ public partial class Build
Target BuildCalamariProjects =>
d =>
d.DependsOn(GetCalamariFlavourProjectsToPublish)
.DependsOn(PublishAzureWebAppNetCoreShim)
.Executes(() =>
{
// Build the solution once without a RID. Per-RID self-contained
Expand Down Expand Up @@ -129,7 +129,7 @@ public partial class Build
Log.Information("Signing published binaries...");
var signTasks = outputPaths
.Where(output => output != null && !output.ToString().Contains("Tests"))
.Select(output => Task.Run(() => SignDirectory(output!)))
.Select(output => Task.Run(async () => await SignDirectory(output!)))
.ToList();

await Task.WhenAll(signTasks);
Expand All @@ -141,27 +141,32 @@ public partial class Build

async Task<AbsolutePath?> PublishPackageAsync(CalamariPackageMetadata calamariPackageMetadata)
{
Log.Information("Publishing {ProjectName} for framework '{Framework}' and arch '{Architecture}'", calamariPackageMetadata.Project.Name, calamariPackageMetadata.Framework, calamariPackageMetadata.Architecture);

var project = calamariPackageMetadata.Project;
var outputDirectory = KnownPaths.PublishDirectory / project.Name / calamariPackageMetadata.Architecture;

await Task.Run(() =>
DotNetPublish(s =>
s.SetConfiguration(Configuration)
.SetProject(project)
.SetFramework(calamariPackageMetadata.Framework)
.SetRuntime(calamariPackageMetadata.Architecture)
.SetVersion(NugetVersion.Value)
.SetInformationalVersion(OctoVersionInfo.Value?.InformationalVersion)
.SetVerbosity(BuildVerbosity)
.EnableNoRestore()
.EnableSelfContained()
.SetOutput(outputDirectory)));

File.Copy(KnownPaths.RootDirectory / "global.json", outputDirectory / "global.json");

return outputDirectory;
return await Logging.InBlock(
$"Publishing {calamariPackageMetadata.Project.Name} for framework {calamariPackageMetadata.Framework} and arch {calamariPackageMetadata.Architecture}"
, async () =>
{
Log.Information("Publishing {ProjectName} for framework '{Framework}' and arch '{Architecture}'", calamariPackageMetadata.Project.Name, calamariPackageMetadata.Framework, calamariPackageMetadata.Architecture);

var project = calamariPackageMetadata.Project;
var outputDirectory = KnownPaths.PublishDirectory / project.Name / calamariPackageMetadata.Architecture;

await Task.Run(() =>
DotNetPublish(s =>
s.SetConfiguration(Configuration)
.SetProject(project)
.SetFramework(calamariPackageMetadata.Framework)
.SetRuntime(calamariPackageMetadata.Architecture)
.SetVersion(NugetVersion.Value)
.SetInformationalVersion(OctoVersionInfo.Value?.InformationalVersion)
.SetVerbosity(BuildVerbosity)
.EnableNoRestore()
.EnableSelfContained()
.SetOutput(outputDirectory)));

File.Copy(KnownPaths.RootDirectory / "global.json", outputDirectory / "global.json");

return outputDirectory;
});
}

async Task CompressCalamariProject(Project project)
Expand Down
32 changes: 32 additions & 0 deletions build/Build.Signing.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using Calamari.Build.Types;

namespace Calamari.Build;

public partial class Build
{
const string JSignDefaultDockerImage = "docker.packages.octopushq.com/octopusdeploy/tool-containers/tool-jsign-cli";
[Parameter("JSign docker tool image to use. Defaults to " + JSignDefaultDockerImage)] public string JSignDockerImage = JSignDefaultDockerImage;

[Parameter(Name = "signing_certificate_password"), Secret]
readonly string SigningCertificatePassword = "Password01!";

[Parameter] readonly string? AzureKeyVaultUrl;

[Parameter] readonly string? AzureKeyVaultAppId;

[Parameter] readonly string? AzureKeyVaultTenantId;

[Parameter, Secret] readonly string? AzureKeyVaultAppSecret;

[Parameter] readonly string? AzureKeyVaultCertificateName;

AzureKeyVaultSettings AzureKeyVaultSettings => new(
AzureKeyVaultUrl,
AzureKeyVaultAppSecret,
AzureKeyVaultAppId,
AzureKeyVaultCertificateName,
AzureKeyVaultTenantId);

[Parameter(Name = "signing_certificate_path")]
readonly string SigningCertificatePath = RootDirectory / "certificates" / "OctopusDevelopment.pfx";
}
62 changes: 32 additions & 30 deletions build/Build.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
using System;
using System.Collections.Generic;
using System.Threading;
using Calamari.Build.Utilities;
using Nuke.Common.Execution;
using Nuke.Common.ProjectModel;
using Nuke.Common.Tooling;
using Nuke.Common.Tools.OctoVersion;
using Nuke.Common.Utilities.Collections;
using Octopus.Calamari.ConsolidatedPackage;
using Logging = Calamari.Build.Utilities.Logging;

namespace Calamari.Build;

Expand All @@ -29,20 +32,6 @@ partial class Build : NukeBuild

[Parameter("Set Calamari Version on OctopusServer")] readonly bool SetOctopusServerVersion;

[Parameter] readonly string? AzureKeyVaultUrl;

[Parameter] readonly string? AzureKeyVaultAppId;

[Parameter] [Secret] readonly string? AzureKeyVaultAppSecret;

[Parameter] [Secret] readonly string? AzureKeyVaultTenantId;

[Parameter] readonly string? AzureKeyVaultCertificateName;

[Parameter(Name = "signing_certificate_path")] readonly string SigningCertificatePath = KnownPaths.RootDirectory / "certificates" / "OctopusDevelopment.pfx";

[Parameter(Name = "signing_certificate_password")] [Secret] readonly string SigningCertificatePassword = "Password01!";

[Parameter] readonly string? TargetRuntime;

const string CiBranchNameEnvVariable = "OCTOVERSION_CurrentBranch";
Expand All @@ -60,7 +49,7 @@ public Build()
// Mimic the behaviour of this attribute, but lazily so we don't pay the OctoVersion cost when it isn't needed
OctoVersionInfo = new Lazy<OctoVersionInfo?>(() =>
{
var attribute = new OctoVersionAttribute { BranchMember = nameof(BranchName), Framework = Frameworks.Net100};
var attribute = new OctoVersionAttribute { BranchMember = nameof(BranchName), Framework = Frameworks.Net100 };

// the Attribute does all the work such as calling TeamCity.Instance?.SetBuildNumber for us
var version = attribute.GetValue(null!, this);
Expand Down Expand Up @@ -129,11 +118,11 @@ public Build()
});
});


Target SetTeamCityVersion => d => d.Executes(() => TeamCity.Instance?.SetBuildNumber(NugetVersion.Value));

Target BuildLocal => d =>
d.DependsOn(PublishCalamariProjects)
d.DependsOn(PublishAzureWebAppNetCoreShim)
.DependsOn(PublishCalamariProjects)
.DependsOn(PackCalamariConsolidatedNugetPackage)
.DependsOn(PackContractsProject)
.DependsOn(UpdateCalamariVersionOnOctopusServer);
Expand All @@ -144,27 +133,39 @@ public Build()
.DependsOn(PackCalamariConsolidatedNugetPackage)
.DependsOn(PackContractsProject)
.DependsOn(PublishNukeBuild);

public static int Main() => Execute<Build>(x => IsServerBuild ? x.BuildCi : x.BuildLocal);

void SignDirectory(string directory)
async Task SignDirectory(AbsolutePath directory)
{
if (!WillSignBinaries)
return;

Log.Information("Signing directory: {Directory} and sub-directories", directory);
var binariesFolders = Directory.GetDirectories(directory, "*", new EnumerationOptions { RecurseSubdirectories = true });
foreach (var subDirectory in binariesFolders.Append(directory))
{
Signing.SignAndTimestampBinaries(subDirectory, AzureKeyVaultUrl, AzureKeyVaultAppId,
AzureKeyVaultAppSecret, AzureKeyVaultTenantId, AzureKeyVaultCertificateName,
SigningCertificatePath, SigningCertificatePassword);
}
await Logging.InBlock($"Signing and timestamping {directory} and sub-directories",
async () =>
{
var binariesFolders = directory.GetDirectories("*", int.MaxValue);
foreach (var subDirectory in binariesFolders.Append(directory))
{
var signing = new Signing(SigningCertificatePath, AzureKeyVaultSettings, JSignDockerImage);

var filesToSign = subDirectory.GlobFiles(
"**/Calamari*.exe",
"**/Calamari*.dll",
"**/Octo*.exe",
"**/Octo*.dll",
"**/docker-credential-octopus*.exe",
"**/docker-credential-octopus*.dll")
.Where(f => !Signing.HasAuthenticodeSignature(f))
.ToList();

await signing.Sign(subDirectory, filesToSign, SigningCertificatePassword);
}
});
}

// Sets the Octopus.Server.csproj Calamari.Consolidated package version


string GetNugetVersion()
{
return AppendTimestamp
Expand All @@ -190,7 +191,8 @@ IReadOnlyCollection<string> GetRuntimeIdentifiers(Project? project)
// This is here purely to make the local build experience on non-Windows devices (with testing) workable
static string[] GetCalamariFlavours()
{
return BuildableCalamariProjects.GetCalamariProjectsToBuild(OperatingSystem.IsWindows());
return IsLocalBuild
? BuildableCalamariProjects.GetCalamariProjectsToBuild(OperatingSystem.IsWindows())
: BuildableCalamariProjects.GetAllCalamariProjects();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@
</metadata>
<files>
<file src="..\artifacts\consolidated\Calamari.*.zip" target="contentFiles\any\any\" />
<file src="Calamari.Consolidated.targets" target="build\" />
<file src="Octopus.Calamari.Consolidated.targets" target="build\" />
</files>
</package>
Loading