From fe8e894ea31ab6ae1c4325fc343c624d50986d7c Mon Sep 17 00:00:00 2001 From: Artur Stolear Date: Wed, 27 Dec 2023 16:27:50 +0100 Subject: [PATCH] fix arm64 build --- .github/workflows/_docker.yml | 10 +++++++ .github/workflows/ci.yml | 4 +-- .../Tasks/ArtifactsDotnetToolTest.cs | 2 +- .../Tasks/ArtifactsMsBuildCoreTest.cs | 2 +- build/artifacts/Tasks/ArtifactsNativeTest.cs | 2 +- build/artifacts/Tasks/ArtifactsPrepare.cs | 2 +- build/common/Utilities/Constants.cs | 3 --- build/common/Utilities/ContextExtensions.cs | 12 +++++++++ .../Utilities/DockerContextExtensions.cs | 27 +++++++------------ build/docker/Tasks/DockerBuild.cs | 1 - build/docker/Tasks/DockerPublish.cs | 1 - build/docker/Tasks/DockerTest.cs | 2 +- 12 files changed, 39 insertions(+), 29 deletions(-) diff --git a/.github/workflows/_docker.yml b/.github/workflows/_docker.yml index 5bb5dd65f9..b69abb8172 100644 --- a/.github/workflows/_docker.yml +++ b/.github/workflows/_docker.yml @@ -37,6 +37,16 @@ jobs: with: name: nuget path: ${{ github.workspace }}/artifacts/packages/nuget + - + name: Setup QEMU + if: inputs.arch == 'arm64' + uses: docker/setup-qemu-action@v3 + - + name: Setup Docker Buildx + if: inputs.arch == 'arm64' + uses: docker/setup-buildx-action@v3 + with: + install: true - name: Docker Test if: success() && github.event_name == 'pull_request' || github.repository_owner != 'GitTools' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a4dadf0b10..c1225fbf4e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,7 +62,7 @@ jobs: strategy: fail-fast: false matrix: - arch: [ amd64, amd64 ] + arch: [ amd64, arm64 ] uses: ./.github/workflows/_artifacts_linux.yml with: @@ -75,7 +75,7 @@ jobs: strategy: fail-fast: false matrix: - arch: [ amd64, amd64 ] + arch: [ amd64, arm64 ] uses: ./.github/workflows/_docker.yml with: diff --git a/build/artifacts/Tasks/ArtifactsDotnetToolTest.cs b/build/artifacts/Tasks/ArtifactsDotnetToolTest.cs index 9419b532dd..c8b590dcda 100644 --- a/build/artifacts/Tasks/ArtifactsDotnetToolTest.cs +++ b/build/artifacts/Tasks/ArtifactsDotnetToolTest.cs @@ -27,7 +27,7 @@ public override void Run(BuildContext context) foreach (var dockerImage in context.Images) { - if (context.SkipImageForArtifacts(dockerImage)) continue; + if (context.SkipImageTesting(dockerImage)) continue; var cmd = $"{rootPrefix}/scripts/test-global-tool.sh --version {version} --nugetPath {rootPrefix}/nuget --repoPath {rootPrefix}/repo"; diff --git a/build/artifacts/Tasks/ArtifactsMsBuildCoreTest.cs b/build/artifacts/Tasks/ArtifactsMsBuildCoreTest.cs index 39a939c8bf..77e4617ad8 100644 --- a/build/artifacts/Tasks/ArtifactsMsBuildCoreTest.cs +++ b/build/artifacts/Tasks/ArtifactsMsBuildCoreTest.cs @@ -26,7 +26,7 @@ public override void Run(BuildContext context) foreach (var dockerImage in context.Images) { - if (context.SkipImageForArtifacts(dockerImage)) continue; + if (context.SkipImageTesting(dockerImage)) continue; var framework = dockerImage.TargetFramework; diff --git a/build/artifacts/Tasks/ArtifactsNativeTest.cs b/build/artifacts/Tasks/ArtifactsNativeTest.cs index d0fdcf983a..b0dc47029c 100644 --- a/build/artifacts/Tasks/ArtifactsNativeTest.cs +++ b/build/artifacts/Tasks/ArtifactsNativeTest.cs @@ -27,7 +27,7 @@ public override void Run(BuildContext context) foreach (var dockerImage in context.Images) { - if (context.SkipImageForArtifacts(dockerImage)) continue; + if (context.SkipImageTesting(dockerImage)) continue; var runtime = "linux"; if (dockerImage.Distro.StartsWith("alpine")) diff --git a/build/artifacts/Tasks/ArtifactsPrepare.cs b/build/artifacts/Tasks/ArtifactsPrepare.cs index be061d4188..0e4b833566 100644 --- a/build/artifacts/Tasks/ArtifactsPrepare.cs +++ b/build/artifacts/Tasks/ArtifactsPrepare.cs @@ -21,7 +21,7 @@ public override void Run(BuildContext context) { foreach (var dockerImage in context.Images) { - if (context.SkipImageForArtifacts(dockerImage)) continue; + if (context.SkipImageTesting(dockerImage)) continue; context.DockerPullImage(dockerImage); } } diff --git a/build/common/Utilities/Constants.cs b/build/common/Utilities/Constants.cs index 49c693b514..fbeb19a1f0 100644 --- a/build/common/Utilities/Constants.cs +++ b/build/common/Utilities/Constants.cs @@ -22,9 +22,6 @@ public class Constants public static readonly string[] VersionsToBuild = [Version60, Version70, Version80]; public static readonly string[] Frameworks = [NetVersion60, NetVersion70, NetVersion80]; - public static readonly string[] DistrosToSkipForArtifacts = []; - public static readonly string[] DistrosToSkipForDocker = []; - public const string DockerBaseImageName = "gittools/build-images"; public const string DockerImageName = "gittools/gitversion"; diff --git a/build/common/Utilities/ContextExtensions.cs b/build/common/Utilities/ContextExtensions.cs index 6ac97988c2..02117a83b1 100644 --- a/build/common/Utilities/ContextExtensions.cs +++ b/build/common/Utilities/ContextExtensions.cs @@ -1,5 +1,7 @@ +using System.Runtime.InteropServices; using Cake.Common.Build.AzurePipelines; using Xunit; +using ProcessArchitecture = System.Runtime.InteropServices.Architecture; namespace Common.Utilities; @@ -12,6 +14,7 @@ public static IEnumerable ExecuteCommand(this ICakeContext context, File { processSettings.WorkingDirectory = workDir; } + context.StartProcess(exe, processSettings, out var redirectedOutput); return redirectedOutput.ToList(); } @@ -79,6 +82,12 @@ public static string GetOS(this ICakeContext context) return string.Empty; } + public static bool IsRunningOnAmd64(this ICakeContext _) + => RuntimeInformation.ProcessArchitecture == ProcessArchitecture.X64; + + public static bool IsRunningOnArm64(this ICakeContext _) => + RuntimeInformation.ProcessArchitecture == ProcessArchitecture.Arm64; + public static string GetBuildAgent(this ICakeContext context) { var buildSystem = context.BuildSystem(); @@ -142,6 +151,7 @@ public static string GetBranchName(this ICakeContext context) { repositoryBranch = buildSystem.GitHubActions.Environment.Workflow.Ref.Replace("refs/heads/", ""); } + return repositoryBranch; } @@ -161,6 +171,7 @@ public static string GetRepositoryName(this ICakeContext context) { repositoryName = buildSystem.GitHubActions.Environment.Workflow.Repository; } + return repositoryName; } @@ -172,6 +183,7 @@ public static string GetRepositoryName(this ICakeContext context) context.GetFiles($"src/GitVersion.App/bin/{Constants.DefaultConfiguration}/{Constants.NetVersionLatest}/gitversion.dll").SingleOrDefault(); public static FilePath? GetGitVersionDotnetToolLocation(this ICakeContext context) => context.MakeAbsolute(Paths.Tools.Combine("gitversion").CombineWithFilePath("gitversion.dll")); + public static FilePath? GetSchemaDotnetToolLocation(this ICakeContext context) => context.MakeAbsolute(Paths.Tools.Combine("schema").CombineWithFilePath("schema.dll")); } diff --git a/build/common/Utilities/DockerContextExtensions.cs b/build/common/Utilities/DockerContextExtensions.cs index ba5e27ee74..9e81adbc33 100644 --- a/build/common/Utilities/DockerContextExtensions.cs +++ b/build/common/Utilities/DockerContextExtensions.cs @@ -10,26 +10,19 @@ public enum Architecture public static class DockerContextExtensions { - public static bool SkipImageForArtifacts(this ICakeContext context, DockerImage dockerImage) + public static bool SkipImageTesting(this ICakeContext context, DockerImage dockerImage) { var (distro, targetFramework, architecture, _, _) = dockerImage; - if (architecture == Architecture.Amd64) return false; - if (!Constants.DistrosToSkipForArtifacts.Contains(distro)) return false; - - context.Information($"Skipping Target: {targetFramework}, Distro: {distro}, Arch: {architecture}"); - return true; - } - - public static bool SkipImageForDocker(this ICakeContext context, DockerImage dockerImage) - { - var (distro, targetFramework, architecture, _, _) = dockerImage; - - if (architecture == Architecture.Amd64) return false; - if (!Constants.DistrosToSkipForDocker.Contains(distro)) return false; - - context.Information($"Skipping Target: {targetFramework}, Distro: {distro}, Arch: {architecture}"); - return true; + switch (architecture) + { + case Architecture.Amd64: + case Architecture.Arm64 when context.IsRunningOnArm64(): + return false; + default: + context.Information($"Skipping Target: {targetFramework}, Distro: {distro}, Arch: {architecture}"); + return true; + } } public static void DockerBuildImage(this BuildContextBase context, DockerImage dockerImage) diff --git a/build/docker/Tasks/DockerBuild.cs b/build/docker/Tasks/DockerBuild.cs index 35aa4285b1..893827301a 100644 --- a/build/docker/Tasks/DockerBuild.cs +++ b/build/docker/Tasks/DockerBuild.cs @@ -27,7 +27,6 @@ public override void Run(BuildContext context) foreach (var dockerImage in context.Images) { - if (context.SkipImageForDocker(dockerImage)) continue; context.DockerBuildImage(dockerImage); } } diff --git a/build/docker/Tasks/DockerPublish.cs b/build/docker/Tasks/DockerPublish.cs index 11922ab391..16012720f9 100644 --- a/build/docker/Tasks/DockerPublish.cs +++ b/build/docker/Tasks/DockerPublish.cs @@ -45,7 +45,6 @@ public override void Run(BuildContext context) { foreach (var dockerImage in context.Images) { - if (context.SkipImageForDocker(dockerImage)) continue; context.DockerPushImage(dockerImage); } } diff --git a/build/docker/Tasks/DockerTest.cs b/build/docker/Tasks/DockerTest.cs index dbe409f922..446ef7dd87 100644 --- a/build/docker/Tasks/DockerTest.cs +++ b/build/docker/Tasks/DockerTest.cs @@ -23,7 +23,7 @@ public override void Run(BuildContext context) { foreach (var dockerImage in context.Images) { - if (context.SkipImageForDocker(dockerImage)) continue; + if (context.SkipImageTesting(dockerImage)) continue; context.DockerTestImage(dockerImage); } }