diff --git a/.github/workflows/build-ruby.yml b/.github/workflows/build-ruby.yml index 66831f6..5d1d3fe 100644 --- a/.github/workflows/build-ruby.yml +++ b/.github/workflows/build-ruby.yml @@ -53,7 +53,7 @@ jobs: - engine: jruby version: "9.4" runs-on: ubuntu-latest - name: Build (${{ matrix.engine }} ${{ matrix.version }}) + name: Build (${{ matrix.engine }} ${{ matrix.version }} gnu) steps: - name: Set variables id: vars @@ -121,3 +121,143 @@ jobs: if: ${{ inputs.push }} run: | docker buildx build ${{ steps.vars.outputs.SRC }} --builder=container --cache-from=type=registry,ref=${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} --output=type=image,push=true --build-arg BUILDKIT_INLINE_CACHE=1 --platform linux/x86_64,linux/aarch64 -f ${{ steps.vars.outputs.DOCKERFILE }} --tag ${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} + + + build-musl: + strategy: + fail-fast: false + matrix: + include: + - engine: ruby + version: "2.1" + libc: musl + arch: ["x86_64"] + - engine: ruby + version: "2.2" + libc: musl + arch: ["x86_64"] + - engine: ruby + version: "2.3" + libc: musl + arch: ["x86_64", "aarch64"] + - engine: ruby + version: "2.4" + libc: musl + arch: ["x86_64", "aarch64"] + - engine: ruby + version: "2.5" + libc: musl + arch: ["x86_64", "aarch64"] + - engine: ruby + version: "2.6" + libc: musl + arch: ["x86_64", "aarch64"] + - engine: ruby + version: "2.7" + libc: musl + arch: ["x86_64", "aarch64"] + - engine: ruby + version: "3.0" + libc: musl + arch: ["x86_64", "aarch64"] + - engine: ruby + version: "3.1" + libc: musl + arch: ["x86_64", "aarch64"] + - engine: ruby + version: "3.2" + libc: musl + arch: ["x86_64", "aarch64"] + - engine: ruby + version: "3.3" + libc: musl + arch: ["x86_64", "aarch64"] + - engine: ruby + version: "3.4" + libc: musl + arch: ["x86_64", "aarch64"] + - engine: jruby + version: "9.2" + libc: musl + arch: ["x86_64", "aarch64"] + - engine: jruby + version: "9.3" + libc: musl + arch: ["x86_64", "aarch64"] + - engine: jruby + version: "9.4" + libc: musl + arch: ["x86_64", "aarch64"] + runs-on: ubuntu-latest + name: Build (${{ matrix.engine }} ${{ matrix.version }} musl) + steps: + - name: Set variables + id: vars + run: | + echo "SRC=src/engines/${{ matrix.engine }}/${{ matrix.version }}" >> $GITHUB_OUTPUT + echo "IMAGE=${{ env.REGISTRY }}/${{ env.REPO }}/engines/${{ matrix.engine }}" >> $GITHUB_OUTPUT + echo "TAG=${{ matrix.version }}-${{ matrix.libc }}" >> $GITHUB_OUTPUT + echo "DOCKERFILE=src/engines/${{ matrix.engine }}/${{ matrix.version }}/Dockerfile.${{ matrix.libc }}" >> $GITHUB_OUTPUT + - name: Checkout + uses: actions/checkout@v4 + + # Using docker-container engine enables advanced buildx features + - name: Set up Docker container engine + run: | + docker buildx create --name=container --driver=docker-container --use --bootstrap + + # First, build image for x86_64 as it will fail fast + # + # Tagging is necessary to reference the image for the testing step + # Tagging is done separately to avoid interfrence with caching + - name: Build single-arch image (x86_64) + run: | + docker buildx build ${{ steps.vars.outputs.SRC }} --builder=container --cache-from=type=registry,ref=${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} --output=type=image,push=false --platform linux/x86_64 -f ${{ steps.vars.outputs.DOCKERFILE }} + - name: Tag single-arch image (x86_64) + run: | + docker buildx build ${{ steps.vars.outputs.SRC }} --builder=container --cache-from=type=registry,ref=${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} --load --platform linux/x86_64 -f ${{ steps.vars.outputs.DOCKERFILE }} --tag ${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} + - name: Test single-arch image (x86_64) + if: ${{ contains(matrix.arch, 'aarch64') }} + run: | + docker run --platform linux/x86_64 --rm ${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} /bin/sh -c 'true' + docker run --platform linux/x86_64 --rm ${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} ruby -e 'puts RUBY_DESCRIPTION' + docker run --platform linux/x86_64 --rm ${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} gem --version + docker run --platform linux/x86_64 --rm ${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} bundle --version + docker run --platform linux/x86_64 --rm -v "${PWD}":"${PWD}" -w "${PWD}" ${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} /bin/sh -c 'bundle install && bundle exec rake test' + + # Then, build image for aarch64 which, being emulated under qemu, is slower + # + # Tagging is necessary to reference the image for the testing step + # Tagging is done separately to avoid interfrence with caching + # Start by enabling qemu for aarch64 + - name: Enable aarch64 emulation (x86_64) + if: ${{ contains(matrix.arch, 'aarch64') }} + run: | + docker run --privileged --rm tonistiigi/binfmt --install arm64 + - name: Build single-arch image (aarch64) + if: ${{ contains(matrix.arch, 'aarch64') }} + run: | + docker buildx build ${{ steps.vars.outputs.SRC }} --builder=container --cache-from=type=registry,ref=${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} --output=type=image,push=false --platform linux/aarch64 -f ${{ steps.vars.outputs.DOCKERFILE }} + - name: Tag single-arch image (aarch64) + if: ${{ contains(matrix.arch, 'aarch64') }} + run: | + docker buildx build ${{ steps.vars.outputs.SRC }} --builder=container --cache-from=type=registry,ref=${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} --load --platform linux/aarch64 -f ${{ steps.vars.outputs.DOCKERFILE }} --tag ${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} + - name: Test single-arch image (aarch64) + run: | + docker run --platform linux/aarch64 --rm ${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} /bin/sh -c 'true' + docker run --platform linux/aarch64 --rm ${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} ruby -e 'puts RUBY_DESCRIPTION' + docker run --platform linux/aarch64 --rm ${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} gem --version + docker run --platform linux/aarch64 --rm ${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} bundle --version + docker run --platform linux/aarch64 --rm -v "${PWD}":"${PWD}" -w "${PWD}" ${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} /bin/sh -c 'bundle install && bundle exec rake test' + + # Finally, assemble multi-arch image for a combined push to the registry + # + # This reruns docker build but layers are in the cache, so it's fast + - name: Log in to the Container Registry + if: ${{ inputs.push && contains(matrix.arch, 'aarch64') }} + run: | + echo ${{ secrets.GITHUB_TOKEN }} | docker login ${{ env.REGISTRY }} -u ${{ github.actor }} --password-stdin + - name: Build multi-arch image (x86_64, aarch64) + if: ${{ inputs.push }} + run: | + docker buildx build ${{ steps.vars.outputs.SRC }} --builder=container --cache-from=type=registry,ref=${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }} --output=type=image,push=true --build-arg BUILDKIT_INLINE_CACHE=1 --platform linux/x86_64,linux/aarch64 -f ${{ steps.vars.outputs.DOCKERFILE }} --tag ${{ steps.vars.outputs.IMAGE }}:${{ steps.vars.outputs.TAG }}