diff --git a/.github/workflows/build-deps.yml b/.github/workflows/build-deps.yml index 31fc5a6..7fe989e 100644 --- a/.github/workflows/build-deps.yml +++ b/.github/workflows/build-deps.yml @@ -40,14 +40,21 @@ jobs: run: dotnet run/build.dll --target=SetMatrix build_deps: - name: Deps + name: Build Deps (${{ matrix.arch }} - ${{ matrix.distro }}) needs: [ prepare ] env: PUSH_IMAGES: ${{github.event_name != 'pull_request' && github.repository_owner == 'GitTools'}} - runs-on: ubuntu-24.04 + runs-on: ${{ matrix.runner }} strategy: matrix: + arch: [ amd64, arm64 ] + runner: [ ubuntu-24.04, ubuntu-24.04-arm ] distro: ${{ fromJson(needs.prepare.outputs.dockerDistros) }} + exclude: + - runner: ubuntu-24.04-arm + arch: amd64 + - runner: ubuntu-24.04 + arch: arm64 fail-fast: false steps: - name: Checkout @@ -66,8 +73,6 @@ jobs: uses: docker/setup-docker-action@v4 with: daemon-config: '{ "features": { "containerd-snapshotter": true } }' - - name: Setup QEMU - uses: docker/setup-qemu-action@v3 - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 with: @@ -80,12 +85,74 @@ jobs: with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - - - name: '[Build Docker images]' + - name: '[Build Docker images] DockerHub' + shell: pwsh + run: | + dotnet run/build.dll ` + --target=DockerBuildDeps --arch=${{ matrix.arch }} ` + --dotnet_distro=${{ matrix.distro }} --docker_registry=dockerhub ` + --push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic + - name: Login to GitHub Container Registry + if: success() && env.PUSH_IMAGES == 'true' + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.DOCKER_GITHUB_TOKEN }} + - name: '[Build Docker images] GitHub' shell: pwsh - run: dotnet run/build.dll --target=DockerBuildDeps --dotnet_distro=${{ matrix.distro }} --docker_registry=dockerhub ` - --push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic + run: | + dotnet run/build.dll ` + --target=DockerBuildDeps --arch=${{ matrix.arch }} ` + --dotnet_distro=${{ matrix.distro }} --docker_registry=github ` + --push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic + build_deps_manifests: + name: Build Deps Manifests (${{ matrix.distro }}) + needs: [ prepare, build_deps ] + env: + PUSH_IMAGES: ${{github.event_name != 'pull_request' && github.repository_owner == 'GitTools'}} + runs-on: ubuntu-24.04 + strategy: + matrix: + distro: ${{ fromJson(needs.prepare.outputs.dockerDistros) }} + fail-fast: false + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Use cached cake frosting + id: cache-cake + uses: actions/cache@v4 + with: + path: run + key: run-${{ runner.os }}-${{ hashFiles('./build/**') }} + - name: Setup .NET SDK + uses: actions/setup-dotnet@v4 + with: + global-json-file: build/global.json + - name: Set up Docker + uses: docker/setup-docker-action@v4 + with: + daemon-config: '{ "features": { "containerd-snapshotter": true } }' + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + version: 'latest' + driver-opts: 'image=moby/buildkit:buildx-stable-1' + install: true + - name: Login to DockerHub + if: success() && env.PUSH_IMAGES == 'true' + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: '[Build Docker manifests] DockerHub' + shell: pwsh + run: | + dotnet run/build.dll ` + --target=DockerBuildDepsManifest ` + --dotnet_distro=${{ matrix.distro }} --docker_registry=dockerhub ` + --push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic - name: Login to GitHub Container Registry if: success() && env.PUSH_IMAGES == 'true' uses: docker/login-action@v3 @@ -93,7 +160,10 @@ jobs: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.DOCKER_GITHUB_TOKEN }} - - name: '[Build Docker images]' + - name: '[Build Docker manifests] GitHub' shell: pwsh - run: dotnet run/build.dll --target=DockerBuildDeps --dotnet_distro=${{ matrix.distro }} --docker_registry=github ` - --push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic + run: | + dotnet run/build.dll ` + --target=DockerBuildDepsManifest ` + --dotnet_distro=${{ matrix.distro }} --docker_registry=github ` + --push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml new file mode 100644 index 0000000..2909a6c --- /dev/null +++ b/.github/workflows/build-images.yml @@ -0,0 +1,181 @@ +name: Build Images + +on: + workflow_dispatch: + workflow_run: + workflows: [ Build Deps ] + types: + - completed +jobs: + prepare: + name: Prepare Build + runs-on: ubuntu-24.04 + outputs: + dockerDistros: ${{ steps.set_matrix.outputs.dockerDistros }} + dotnetVersions: ${{ steps.set_matrix.outputs.dotnetVersions }} + dotnetVariants: ${{ steps.set_matrix.outputs.dotnetVariants }} + if: ${{ github.event.workflow_run.conclusion == 'success' }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.event.workflow_run.head_branch }} + - name: Cache cake frosting + id: cache-cake + uses: actions/cache@v4 + with: + path: run + key: run-${{ runner.os }}-${{ hashFiles('./build/**') }} + - name: Setup .NET SDK + uses: actions/setup-dotnet@v4 + with: + global-json-file: build/global.json + - name: '[Prepare]' + if: steps.cache-cake.outputs.cache-hit != 'true' + run: dotnet build build/CI.sln --configuration=Release + - name: '[Matrix]' + id: set_matrix + run: dotnet run/build.dll --target=SetMatrix + + build_images: + name: Build Images (${{ matrix.arch }} - ${{ matrix.distro }}) (${{ matrix.version }} - ${{ matrix.variant }}) + needs: [ prepare ] + env: + PUSH_IMAGES: ${{github.event_name != 'pull_request' && github.repository_owner == 'GitTools'}} + runs-on: ${{ matrix.runner }} + strategy: + matrix: + arch: [ amd64, arm64 ] + runner: [ ubuntu-24.04, ubuntu-24.04-arm ] + distro: ${{ fromJson(needs.prepare.outputs.dockerDistros) }} + version: ${{ fromJson(needs.prepare.outputs.dotnetVersions) }} + variant: ${{ fromJson(needs.prepare.outputs.dotnetVariants) }} + exclude: + - runner: ubuntu-24.04-arm + arch: amd64 + - runner: ubuntu-24.04 + arch: arm64 + fail-fast: false + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.event.workflow_run.head_branch }} + - name: Use cached cake frosting + id: cache-cake + uses: actions/cache@v4 + with: + path: run + key: run-${{ runner.os }}-${{ hashFiles('./build/**') }} + - name: Setup .NET SDK + uses: actions/setup-dotnet@v4 + with: + global-json-file: build/global.json + - name: Set up Docker + uses: docker/setup-docker-action@v4 + with: + daemon-config: '{ "features": { "containerd-snapshotter": true } }' + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + version: 'latest' + driver-opts: 'image=moby/buildkit:buildx-stable-1' + install: true + - name: Login to DockerHub + if: success() && env.PUSH_IMAGES == 'true' + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: '[Build Docker images]' + shell: pwsh + run: | + dotnet run/build.dll ` + --target=DockerBuildImages --arch=${{ matrix.arch }} ` + --dotnet_version=${{ matrix.version }} --dotnet_variant=${{ matrix.variant }} ` + --dotnet_distro=${{ matrix.distro }} --docker_registry=dockerhub ` + --push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic + - name: Login to GitHub Container Registry + if: success() && env.PUSH_IMAGES == 'true' + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.DOCKER_GITHUB_TOKEN }} + - name: '[Build Docker images]' + shell: pwsh + run: | + dotnet run/build.dll ` + --target=DockerBuildImages --arch=${{ matrix.arch }} ` + --dotnet_version=${{ matrix.version }} --dotnet_variant=${{ matrix.variant }} ` + --dotnet_distro=${{ matrix.distro }} --docker_registry=github ` + --push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic + + build_images_manifest: + name: Build Images (${{ matrix.distro }}) (${{ matrix.version }} - ${{ matrix.variant }}) + needs: [ prepare, build_images ] + env: + PUSH_IMAGES: ${{github.event_name != 'pull_request' && github.repository_owner == 'GitTools'}} + runs-on: ubuntu-24.04 + strategy: + matrix: + distro: ${{ fromJson(needs.prepare.outputs.dockerDistros) }} + version: ${{ fromJson(needs.prepare.outputs.dotnetVersions) }} + variant: ${{ fromJson(needs.prepare.outputs.dotnetVariants) }} + fail-fast: false + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.event.workflow_run.head_branch }} + - name: Use cached cake frosting + id: cache-cake + uses: actions/cache@v4 + with: + path: run + key: run-${{ runner.os }}-${{ hashFiles('./build/**') }} + - name: Setup .NET SDK + uses: actions/setup-dotnet@v4 + with: + global-json-file: build/global.json + - name: Set up Docker + uses: docker/setup-docker-action@v4 + with: + daemon-config: '{ "features": { "containerd-snapshotter": true } }' + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + version: 'latest' + driver-opts: 'image=moby/buildkit:buildx-stable-1' + install: true + - name: Login to DockerHub + if: success() && env.PUSH_IMAGES == 'true' + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: '[Build Docker images]' + shell: pwsh + run: | + dotnet run/build.dll ` + --target=DockerBuildImagesManifest ` + --dotnet_version=${{ matrix.version }} --dotnet_variant=${{ matrix.variant }} ` + --dotnet_distro=${{ matrix.distro }} --docker_registry=dockerhub ` + --push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic + - name: Login to GitHub Container Registry + if: success() && env.PUSH_IMAGES == 'true' + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.DOCKER_GITHUB_TOKEN }} + - name: '[Build Docker images]' + shell: pwsh + run: | + dotnet run/build.dll ` + --target=DockerBuildImagesManifest ` + --dotnet_version=${{ matrix.version }} --dotnet_variant=${{ matrix.variant }} ` + --dotnet_distro=${{ matrix.distro }} --docker_registry=github ` + --push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index c22c154..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,100 +0,0 @@ -name: Build - -on: - workflow_dispatch: - workflow_run: - workflows: [ Build Deps ] - types: - - completed -jobs: - prepare: - name: Prepare Build - runs-on: ubuntu-24.04 - outputs: - dockerDistros: ${{ steps.set_matrix.outputs.dockerDistros }} - dotnetVersions: ${{ steps.set_matrix.outputs.dotnetVersions }} - dotnetVariants: ${{ steps.set_matrix.outputs.dotnetVariants }} - if: ${{ github.event.workflow_run.conclusion == 'success' }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Cache cake frosting - id: cache-cake - uses: actions/cache@v4 - with: - path: run - key: run-${{ runner.os }}-${{ hashFiles('./build/**') }} - - name: Setup .NET SDK - uses: actions/setup-dotnet@v4 - with: - global-json-file: build/global.json - - name: '[Prepare]' - if: steps.cache-cake.outputs.cache-hit != 'true' - run: dotnet build build/CI.sln --configuration=Release - - name: '[Matrix]' - id: set_matrix - run: dotnet run/build.dll --target=SetMatrix - - build: - name: Build - needs: [ prepare ] - env: - PUSH_IMAGES: ${{github.event_name != 'pull_request' && github.repository_owner == 'GitTools'}} - runs-on: ubuntu-24.04 - strategy: - matrix: - distro: ${{ fromJson(needs.prepare.outputs.dockerDistros) }} - version: ${{ fromJson(needs.prepare.outputs.dotnetVersions) }} - variant: ${{ fromJson(needs.prepare.outputs.dotnetVariants) }} - fail-fast: false - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Use cached cake frosting - id: cache-cake - uses: actions/cache@v4 - with: - path: run - key: run-${{ runner.os }}-${{ hashFiles('./build/**') }} - - name: Setup .NET SDK - uses: actions/setup-dotnet@v4 - with: - global-json-file: build/global.json - - name: Set up Docker - uses: docker/setup-docker-action@v4 - with: - daemon-config: '{ "features": { "containerd-snapshotter": true } }' - - name: Setup QEMU - uses: docker/setup-qemu-action@v3 - - name: Setup Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - version: 'latest' - driver-opts: 'image=moby/buildkit:buildx-stable-1' - install: true - - name: Login to DockerHub - if: success() && env.PUSH_IMAGES == 'true' - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - name: '[Build Docker images]' - shell: pwsh - run: | - dotnet run/build.dll --target=DockerBuild --dotnet_version=${{ matrix.version }} --dotnet_variant=${{ matrix.variant }} ` - --dotnet_distro=${{ matrix.distro }} --docker_registry=dockerhub ` - --push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic - - name: Login to GitHub Container Registry - if: success() && env.PUSH_IMAGES == 'true' - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.DOCKER_GITHUB_TOKEN }} - - name: '[Build Docker images]' - shell: pwsh - run: | - dotnet run/build.dll --target=DockerBuild --dotnet_version=${{ matrix.version }} --dotnet_variant=${{ matrix.variant }} ` - --dotnet_distro=${{ matrix.distro }} --docker_registry=github ` - --push_images=${{env.PUSH_IMAGES}} --verbosity=diagnostic diff --git a/build/CI.sln b/build/CI.sln index aac0e14..a57521e 100644 --- a/build/CI.sln +++ b/build/CI.sln @@ -5,7 +5,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sln", "sln", "{FBAD8CD3-87BB-4EC8-B467-58328E304F9B}" ProjectSection(SolutionItems) = preProject Directory.Build.props = Directory.Build.props - ..\.github\workflows\build.yml = ..\.github\workflows\build.yml + ..\.github\workflows\build-images.yml = ..\.github\workflows\build-images.yml ..\.github\workflows\build-deps.yml = ..\.github\workflows\build-deps.yml global.json = global.json EndProjectSection diff --git a/build/build/Tasks/DockerBaseTask.cs b/build/build/Tasks/BaseDockerBuild.cs similarity index 56% rename from build/build/Tasks/DockerBaseTask.cs rename to build/build/Tasks/BaseDockerBuild.cs index 88eb502..143db36 100644 --- a/build/build/Tasks/DockerBaseTask.cs +++ b/build/build/Tasks/BaseDockerBuild.cs @@ -1,9 +1,8 @@ using DockerBuildXBuildSettings = Build.Cake.Docker.DockerBuildXBuildSettings; -using DockerBuildXImageToolsCreateSettings = Build.Cake.Docker.DockerBuildXImageToolsCreateSettings; namespace Build; -public abstract class DockerBaseTask : FrostingTask +public abstract class BaseDockerBuild : FrostingTask { protected const string Prefix = "org.opencontainers.image"; @@ -32,37 +31,11 @@ protected virtual void DockerImage(BuildContext context, DockerDepsImage dockerI } } - protected void DockerManifest(BuildContext context, DockerDepsImage dockerImage) - { - var manifestTags = GetDockerTags(dockerImage, context.DockerRegistry); - foreach (var tag in manifestTags) - { - var amd64Tag = $"{tag}-{Architecture.Amd64.ToSuffix()}"; - var arm64Tag = $"{tag}-{Architecture.Arm64.ToSuffix()}"; - - var settings = GetManifestSettings(dockerImage, tag); - context.DockerBuildXImageToolsCreate(settings, [amd64Tag, arm64Tag]); - } - } - - protected virtual DockerBuildXImageToolsCreateSettings GetManifestSettings(DockerDepsImage dockerImage, string tag) - { - var settings = new DockerBuildXImageToolsCreateSettings - { - Tag = [tag], - Annotation = - [ - .. Annotations.Select(a => "index:" + a).ToArray(), - ] - }; - return settings; - } - protected virtual DockerBuildXBuildSettings GetBuildSettings(DockerDepsImage dockerImage, string registry) { var arch = dockerImage.Architecture; var suffix = arch.ToSuffix(); - var dockerTags = GetDockerTags(dockerImage, registry, arch).ToArray(); + var dockerTags = dockerImage.GetDockerTags(registry, arch).ToArray(); var buildSettings = new DockerBuildXBuildSettings { Rm = true, @@ -82,7 +55,4 @@ protected virtual DockerBuildXBuildSettings GetBuildSettings(DockerDepsImage doc } protected abstract DirectoryPath GetWorkingDir(DockerDepsImage dockerImage); - - protected abstract IEnumerable GetDockerTags(DockerDepsImage dockerImage, string dockerRegistry, - Architecture? arch = null); } diff --git a/build/build/Tasks/BaseDockerBuildManifest.cs b/build/build/Tasks/BaseDockerBuildManifest.cs new file mode 100644 index 0000000..8a874cf --- /dev/null +++ b/build/build/Tasks/BaseDockerBuildManifest.cs @@ -0,0 +1,42 @@ +namespace Build; +using DockerBuildXImageToolsCreateSettings = Build.Cake.Docker.DockerBuildXImageToolsCreateSettings; + +public abstract class BaseDockerBuildManifest : FrostingTask +{ + protected const string Prefix = "org.opencontainers.image"; + + private static readonly string[] Annotations = + [ + $"{Prefix}.authors=GitTools Maintainers", + $"{Prefix}.vendor=GitTools", + $"{Prefix}.licenses=MIT", + $"{Prefix}.source=https://github.com/GitTools/build-images.git", + $"{Prefix}.created={DateTime.UtcNow:O}", + ]; + + protected void DockerManifest(BuildContext context, DockerDepsImage dockerImage) + { + var manifestTags = dockerImage.GetDockerTags(context.DockerRegistry); + foreach (var tag in manifestTags) + { + var amd64Tag = $"{tag}-{Architecture.Amd64.ToSuffix()}"; + var arm64Tag = $"{tag}-{Architecture.Arm64.ToSuffix()}"; + + var settings = GetManifestSettings(dockerImage, tag); + context.DockerBuildXImageToolsCreate(settings, [amd64Tag, arm64Tag]); + } + } + + protected virtual DockerBuildXImageToolsCreateSettings GetManifestSettings(DockerDepsImage dockerImage, string tag) + { + var settings = new DockerBuildXImageToolsCreateSettings + { + Tag = [tag], + Annotation = + [ + .. Annotations.Select(a => "index:" + a).ToArray(), + ] + }; + return settings; + } +} diff --git a/build/build/Tasks/DockerBuildDeps.cs b/build/build/Tasks/DockerBuildDeps.cs index a42291a..2694741 100644 --- a/build/build/Tasks/DockerBuildDeps.cs +++ b/build/build/Tasks/DockerBuildDeps.cs @@ -1,11 +1,10 @@ using DockerBuildXBuildSettings = Build.Cake.Docker.DockerBuildXBuildSettings; -using DockerBuildXImageToolsCreateSettings = Build.Cake.Docker.DockerBuildXImageToolsCreateSettings; namespace Build; [TaskName(nameof(DockerBuildDeps))] [TaskDescription("Builds the docker images dependencies")] -public sealed class DockerBuildDeps : DockerBaseTask +public sealed class DockerBuildDeps : BaseDockerBuild { public override void Run(BuildContext context) { @@ -14,16 +13,6 @@ public override void Run(BuildContext context) { DockerImage(context, dockerImage); } - - if (!context.PushImages) - return; - - // build/push manifests - foreach (var group in context.DepsImages.GroupBy(x => new { x.Distro })) - { - var dockerImage = group.First(); - DockerManifest(context, dockerImage); - } } protected override DirectoryPath GetWorkingDir(DockerDepsImage dockerImage) => @@ -49,29 +38,4 @@ protected override DockerBuildXBuildSettings GetBuildSettings(DockerDepsImage do return buildSettings; } - - protected override DockerBuildXImageToolsCreateSettings GetManifestSettings(DockerDepsImage dockerImage, string tag) - { - var settings = base.GetManifestSettings(dockerImage, tag); - settings.Annotation = - [ - .. settings.Annotation, - $"index:{Prefix}.description=GitTools deps images ({dockerImage.Distro})" - ]; - return settings; - } - - protected override IEnumerable GetDockerTags(DockerDepsImage dockerImage, string dockerRegistry, - Architecture? arch = null) - { - var tags = new[] - { - $"{dockerRegistry}/{Constants.DockerImageDeps}:{dockerImage.Distro}" - }; - - if (!arch.HasValue) return tags; - - var suffix = arch.Value.ToSuffix(); - return tags.Select(x => $"{x}-{suffix}"); - } } diff --git a/build/build/Tasks/DockerBuildDepsManifest.cs b/build/build/Tasks/DockerBuildDepsManifest.cs new file mode 100644 index 0000000..2760d96 --- /dev/null +++ b/build/build/Tasks/DockerBuildDepsManifest.cs @@ -0,0 +1,31 @@ +namespace Build; +using DockerBuildXImageToolsCreateSettings = Build.Cake.Docker.DockerBuildXImageToolsCreateSettings; + +[TaskName(nameof(DockerBuildDepsManifest))] +[TaskDescription("Builds the docker images dependencies manifest")] +public class DockerBuildDepsManifest : BaseDockerBuildManifest +{ + public override void Run(BuildContext context) + { + if (!context.PushImages) + return; + + // build/push manifests + foreach (var group in context.DepsImages.GroupBy(x => new { x.Distro })) + { + var dockerImage = group.First(); + DockerManifest(context, dockerImage); + } + } + + protected override DockerBuildXImageToolsCreateSettings GetManifestSettings(DockerDepsImage dockerImage, string tag) + { + var settings = base.GetManifestSettings(dockerImage, tag); + settings.Annotation = + [ + .. settings.Annotation, + $"index:{Prefix}.description=GitTools deps images ({dockerImage.Distro})" + ]; + return settings; + } +} diff --git a/build/build/Tasks/DockerBuild.cs b/build/build/Tasks/DockerBuildImages.cs similarity index 60% rename from build/build/Tasks/DockerBuild.cs rename to build/build/Tasks/DockerBuildImages.cs index 6af59a2..b016f18 100644 --- a/build/build/Tasks/DockerBuild.cs +++ b/build/build/Tasks/DockerBuildImages.cs @@ -1,11 +1,10 @@ using DockerBuildXBuildSettings = Build.Cake.Docker.DockerBuildXBuildSettings; -using DockerBuildXImageToolsCreateSettings = Build.Cake.Docker.DockerBuildXImageToolsCreateSettings; namespace Build; -[TaskName(nameof(DockerBuild))] +[TaskName(nameof(DockerBuildImages))] [TaskDescription("Builds the docker images")] -public sealed class DockerBuild : DockerBaseTask +public sealed class DockerBuildImages : BaseDockerBuild { public override void Run(BuildContext context) { @@ -14,16 +13,6 @@ public override void Run(BuildContext context) { DockerImage(context, dockerImage); } - - if (!context.PushImages) - return; - - // build/push manifests - foreach (var group in context.Images.GroupBy(x => new { x.Distro, x.Variant, x.Version })) - { - var dockerImage = group.First(); - DockerManifest(context, dockerImage); - } } protected override void DockerImage(BuildContext context, DockerDepsImage dockerImage) @@ -60,43 +49,6 @@ protected override DockerBuildXBuildSettings GetBuildSettings(DockerDepsImage do return buildSettings; } - protected override DockerBuildXImageToolsCreateSettings GetManifestSettings(DockerDepsImage dockerImage, string tag) - { - var (distro, version, variant, _) = (DockerImage)dockerImage; - var suffix = $"({distro}-{variant}-{version})"; - var settings = base.GetManifestSettings(dockerImage, tag); - settings.Annotation = - [ - .. settings.Annotation, - $"index:{Prefix}.description=GitTools build images {suffix}", - ]; - return settings; - } - - protected override IEnumerable GetDockerTags(DockerDepsImage dockerImage, string dockerRegistry, - Architecture? arch = null) - { - var (distro, version, variant, _) = (dockerImage as DockerImage)!; - - var tags = new List - { - $"{dockerRegistry}/{Constants.DockerImageName}:{distro}-{variant}-{version}" - }; - - if (version == Constants.DockerDistroLatest) - { - tags.AddRange(new[] - { - $"{dockerRegistry}/{Constants.DockerImageName}:{distro}-{variant}-latest" - }); - } - - if (!arch.HasValue) return tags; - - var suffix = arch.Value.ToSuffix(); - return tags.Select(x => $"{x}-{suffix}"); - } - private static void GenerateDockerfile(ICakeContext context, DirectoryPath? workDir, DockerDepsImage dockerImage) { var variant = ((DockerImage)dockerImage).Variant; diff --git a/build/build/Tasks/DockerBuildImagesManifest.cs b/build/build/Tasks/DockerBuildImagesManifest.cs new file mode 100644 index 0000000..e061e8d --- /dev/null +++ b/build/build/Tasks/DockerBuildImagesManifest.cs @@ -0,0 +1,33 @@ +namespace Build; +using DockerBuildXImageToolsCreateSettings = Build.Cake.Docker.DockerBuildXImageToolsCreateSettings; + +[TaskName(nameof(DockerBuildImagesManifest))] +[TaskDescription("Builds the docker images manifest")] +public class DockerBuildImagesManifest : BaseDockerBuildManifest +{ + public override void Run(BuildContext context) + { + if (!context.PushImages) + return; + + // build/push manifests + foreach (var group in context.Images.GroupBy(x => new { x.Distro, x.Variant, x.Version })) + { + var dockerImage = group.First(); + DockerManifest(context, dockerImage); + } + } + + protected override DockerBuildXImageToolsCreateSettings GetManifestSettings(DockerDepsImage dockerImage, string tag) + { + var (distro, version, variant, _) = (DockerImage)dockerImage; + var suffix = $"({distro}-{variant}-{version})"; + var settings = base.GetManifestSettings(dockerImage, tag); + settings.Annotation = + [ + .. settings.Annotation, + $"index:{Prefix}.description=GitTools build images {suffix}", + ]; + return settings; + } +} diff --git a/build/build/Utils/DockerImageExtensions.cs b/build/build/Utils/DockerImageExtensions.cs new file mode 100644 index 0000000..b1cb373 --- /dev/null +++ b/build/build/Utils/DockerImageExtensions.cs @@ -0,0 +1,31 @@ +namespace Build; + +public static class DockerImageExtensions +{ + public static IEnumerable GetDockerTags(this DockerDepsImage dockerImage, string dockerRegistry, + Architecture? arch = null) + { + var tags = new List(); + + if (dockerImage is DockerImage image) + { + var (distro, version, variant, _) = image; + + tags.Add($"{dockerRegistry}/{Constants.DockerImageName}:{distro}-{variant}-{version}"); + + if (version == Constants.DockerDistroLatest) + { + tags.Add($"{dockerRegistry}/{Constants.DockerImageName}:{distro}-{variant}-latest"); + } + } + else + { + tags.Add($"{dockerRegistry}/{Constants.DockerImageDeps}:{dockerImage.Distro}"); + } + + if (!arch.HasValue) return tags; + + var suffix = arch.Value.ToSuffix(); + return tags.Select(x => $"{x}-{suffix}"); + } +}