From 2edff73c20a46b5a24e7f191ee76758a618a81e5 Mon Sep 17 00:00:00 2001 From: Luke Channings <461449+LukeChannings@users.noreply.github.com> Date: Tue, 13 Feb 2024 15:57:41 +0000 Subject: [PATCH] Support for multi-arch (x86 + ARM64) images --- .github/workflows/ci.yml | 105 ++++++++++++++++++++++----------------- bin.dockerfile | 4 +- 2 files changed, 63 insertions(+), 46 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ca1298a..d83fbba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,25 +6,47 @@ jobs: build-bin: name: bin runs-on: ubuntu-22.04-xl + services: + # Docker save / load does not support multi-arch images. + # This sets up a local registry that I can push the images to. + registry: + image: registry:2 + ports: + - 5000:5000 + env: + REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /var/lib/registry + volumes: + # The images pushed to the local registry will be persisted for this workflow. + - ${{github.workspace}}/registry:/var/lib/registry steps: - name: Clone repository uses: actions/checkout@v4 - - name: Build and export image - run: | - docker build -f bin.dockerfile -t bin . - docker save bin -o /tmp/bin-image.tar + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: bin-image - path: /tmp/bin-image.tar + - name: Build image + run: > + docker buildx build + -f bin.dockerfile + --platform=linux/amd64,linux/arm64 + -t localhost:5000/bin --push + . build: needs: build-bin name: ${{ matrix.kind }} runs-on: ubuntu-22.04-xl + services: + # Service containers are spun up for each job, so it needs to be run again. + registry: + image: registry:2 + ports: + - 5000:5000 + env: + REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /var/lib/registry + volumes: + - ${{github.workspace}}/registry:/var/lib/registry strategy: matrix: kind: ["alpine", "centos", "debian", "distroless", "ubuntu"] @@ -32,65 +54,58 @@ jobs: - name: Clone repository uses: actions/checkout@v4 - - name: Download bin image artifact - uses: actions/download-artifact@v4 - with: - name: bin-image - path: /tmp - - - name: Load bin image - run: | - docker load --input /tmp/bin-image.tar - docker inspect bin + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 - name: Build image - run: | - docker build -f ${{ matrix.kind }}.dockerfile --build-arg BIN_IMAGE=bin -t ${{ matrix.kind }} . + run: > + docker buildx build -f ${{ matrix.kind }}.dockerfile + --platform=linux/amd64,linux/arm64 + --build-arg BIN_IMAGE=localhost:5000/bin + -t localhost:5000/${{ matrix.kind }} --push + . - name: Test default CMD run: | - docker run -t ${{ matrix.kind }} + docker run -t localhost:5000/${{ matrix.kind }} - name: Test if entry script forwards to deno binary run: | - docker run -t ${{ matrix.kind }} eval "console.log('Welcome to Deno!')" + docker run -t localhost:5000/${{ matrix.kind }} eval "console.log('Welcome to Deno!')" # if typescript is present in the output, then probably deno --version worked - docker run -t ${{ matrix.kind }} --version | grep typescript + docker run -t localhost:5000/${{ matrix.kind }} --version | grep typescript - name: Test if entry script forwards to other binaries if: ${{ matrix.kind != 'distroless' }} run: | - docker run -t ${{ matrix.kind }} deno eval "console.log('Welcome to Deno!')" - docker run -t ${{ matrix.kind }} echo 'test entry script' + docker run -t localhost:5000/${{ matrix.kind }} deno eval "console.log('Welcome to Deno!')" + docker run -t localhost:5000/${{ matrix.kind }} echo 'test entry script' - name: Login to Docker Hub - if: github.repository == 'denoland/deno_docker' && startsWith(github.ref, 'refs/tags/') + if: github.repository == 'denoland/deno_docker' && github.ref_type == 'tag' uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Push named images - if: github.repository == 'denoland/deno_docker' && startsWith(github.ref, 'refs/tags/') - run: | - docker tag ${{ matrix.kind }} denoland/deno:${{ matrix.kind }}-${GITHUB_REF#refs/*/} - docker tag ${{ matrix.kind }} denoland/deno:${{ matrix.kind }} - docker push denoland/deno:${{ matrix.kind }}-${GITHUB_REF#refs/*/} - docker push denoland/deno:${{ matrix.kind }} + if: github.repository == 'denoland/deno_docker' && github.ref_type == 'tag' + run: > + docker buildx imagetools create localhost:8000/${{ matrix.kind }} + -t denoland/deno:${{ matrix.kind }}-${GITHUB_REF#refs/*/} + -t denoland/deno:${{ matrix.kind }} - name: Push bin image - if: github.repository == 'denoland/deno_docker' && startsWith(github.ref, 'refs/tags/') && matrix.kind == 'debian' - run: | - docker tag bin denoland/deno:bin-${GITHUB_REF#refs/*/} - docker tag bin denoland/deno:bin - docker push denoland/deno:bin-${GITHUB_REF#refs/*/} - docker push denoland/deno:bin + if: github.repository == 'denoland/deno_docker' && github.ref_type == 'tag' && matrix.kind == 'debian' + run: > + docker buildx imagetools create localhost:8000/bin + -t denoland/deno:bin-${GITHUB_REF#refs/*/} + -t denoland/deno:bin - name: Push default image - if: github.repository == 'denoland/deno_docker' && startsWith(github.ref, 'refs/tags/') && matrix.kind == 'debian' - run: | - docker tag ${{ matrix.kind }} denoland/deno:${GITHUB_REF#refs/*/} - docker tag ${{ matrix.kind }} denoland/deno:latest - docker push denoland/deno:${GITHUB_REF#refs/*/} - docker push denoland/deno:latest + if: github.repository == 'denoland/deno_docker' && github.ref_type == 'tag' && matrix.kind == 'debian' + run: > + docker buildx imagetools create localhost:8000/${{ matrix.kind }} + -t denoland/deno:${{ matrix.kind }}-${GITHUB_REF#refs/*/} + -t denoland/deno:latest diff --git a/bin.dockerfile b/bin.dockerfile index 9fa69e0..37ff5fa 100644 --- a/bin.dockerfile +++ b/bin.dockerfile @@ -9,7 +9,9 @@ RUN export DEBIAN_FRONTEND=noninteractive \ && rm -rf /var/lib/apt/lists/* ARG DENO_VERSION -RUN curl -fsSL https://github.com/denoland/deno/releases/download/v${DENO_VERSION}/deno-x86_64-unknown-linux-gnu.zip \ +ARG TARGETARCH + +RUN curl -fsSL https://github.com/denoland/deno/releases/download/v${DENO_VERSION}/deno-$(echo $TARGETARCH | sed -e 's/arm64/aarch64/' -e 's/amd64/x86_64/')-unknown-linux-gnu.zip \ --output deno.zip \ && unzip deno.zip \ && rm deno.zip \