From fee820bac28dc00380007c17a6c09f9035252db7 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sat, 18 Apr 2026 20:36:54 +0200 Subject: [PATCH] chore: release static executable for aarch64-linux Also makes the aarch64 variant of the docker image consist of a single static executable, similar to the x86_64 variant. --- .github/workflows/build.yaml | 31 ++++++++++---------- .github/workflows/release.yaml | 52 +++++++++++++++------------------- 2 files changed, 39 insertions(+), 44 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0ab47a65d..a1cad4abb 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -30,8 +30,18 @@ concurrency: jobs: static: - name: Nix - Linux x86-64 static - runs-on: ubuntu-24.04 + strategy: + fail-fast: false + matrix: + include: + - name: Linux aarch64 + runs-on: ubuntu-24.04-arm + artifact: aarch64 + - name: Linux x86-64 + runs-on: ubuntu-24.04 + artifact: x86-64 + name: Nix - ${{ matrix.name }} static + runs-on: ${{ matrix.runs-on }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Setup Nix Environment @@ -44,17 +54,17 @@ jobs: - name: Save built executable as artifact uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: - name: postgrest-linux-static-x86-64 + name: postgrest-linux-static-${{ matrix.artifact }} path: result/bin/postgrest if-no-files-found: error - name: Build Docker image - run: nix-build -A docker.image --out-link postgrest-docker.tar.gz + run: nix-build -A docker.image --out-link postgrest-docker-${{ matrix.artifact }}.tar.gz - name: Save built Docker image as artifact uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: - name: postgrest-docker-x86-64 - path: postgrest-docker.tar.gz + name: postgrest-docker-${{ matrix.artifact }} + path: postgrest-docker-${{ matrix.artifact }}.tar.gz if-no-files-found: error @@ -87,15 +97,6 @@ jobs: fail-fast: false matrix: include: - - name: Linux aarch64 - runs-on: ubuntu-24.04-arm - cache: | - ~/.stack/pantry - ~/.stack/snapshots - ~/.stack/stack.sqlite3 - artifact: postgrest-ubuntu-aarch64 - deps: sudo apt-get update && sudo apt-get install libpq-dev - - name: MacOS aarch64 runs-on: macos-14 cache: | diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 43e8d036d..59bdc63ed 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -75,6 +75,9 @@ jobs: mkdir -p release-bundle + tar cJvf "release-bundle/postgrest-${GITHUB_REF_NAME}-linux-static-aarch64.tar.xz" \ + -C artifacts/postgrest-linux-static-aarch64 postgrest + tar cJvf "release-bundle/postgrest-${GITHUB_REF_NAME}-linux-static-x86-64.tar.xz" \ -C artifacts/postgrest-linux-static-x86-64 postgrest @@ -87,9 +90,6 @@ jobs: tar cJvf "release-bundle/postgrest-${GITHUB_REF_NAME}-freebsd-x86-64.tar.xz" \ -C artifacts/postgrest-freebsd-x86-64 postgrest - tar cJvf "release-bundle/postgrest-${GITHUB_REF_NAME}-ubuntu-aarch64.tar.xz" \ - -C artifacts/postgrest-ubuntu-aarch64 postgrest - zip --junk-paths "release-bundle/postgrest-${GITHUB_REF_NAME}-windows-x86-64.zip" \ artifacts/postgrest-windows-x86-64/postgrest.exe @@ -139,49 +139,43 @@ jobs: DOCKER_REPO: ${{ vars.DOCKER_REPO }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: Download aarch64 Docker image + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: postgrest-docker-aarch64 - name: Download x86-64 Docker image uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: postgrest-docker-x86-64 - - name: Download aarch64 binary - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - with: - name: postgrest-ubuntu-aarch64 - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 - uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 with: username: ${{ vars.DOCKER_USER }} password: ${{ secrets.DOCKER_PASS }} - - name: Build aarch64 Docker image - run: | - # This only pushes the image via digest, not a tag. This will not appear - # in the image list on Docker Hub, yet. It will be later added to the main - # tag's manifest. - docker buildx build \ - -t "$DOCKER_REPO/postgrest" \ - --platform linux/arm64 \ - --output push-by-digest=true,type=image,push=true \ - --metadata-file metadata.json \ - . - echo "SHA256_ARM=$(jq -r '."containerimage.digest"' metadata.json)" >> "$GITHUB_ENV" - name: Publish images on Docker Hub run: | - docker load -i postgrest-docker.tar.gz - + docker load -i postgrest-docker-aarch64.tar.gz docker tag postgrest:latest "$DOCKER_REPO/postgrest:${GITHUB_REF_NAME}" docker push "$DOCKER_REPO/postgrest:${GITHUB_REF_NAME}" - docker buildx imagetools create --append \ - -t "$DOCKER_REPO/postgrest:${GITHUB_REF_NAME}" \ - "$DOCKER_REPO/postgrest@$SHA256_ARM" + SHA256_ARM64=$(docker inspect postgrest:latest | jq -r '.[0].Id') + + docker load -i postgrest-docker-x86-64.tar.gz + docker tag postgrest:latest "$DOCKER_REPO/postgrest:${GITHUB_REF_NAME}" + docker push "$DOCKER_REPO/postgrest:${GITHUB_REF_NAME}" + SHA256_AMD64=$(docker inspect postgrest:latest | jq -r '.[0].Id') + + docker manifest create "$DOCKER_REPO/postgrest:${GITHUB_REF_NAME}" \ + "$DOCKER_REPO/postgrest@$SHA256_ARM64" \ + "$DOCKER_REPO/postgrest@$SHA256_AMD64" + docker manifest push "$DOCKER_REPO/postgrest:${GITHUB_REF_NAME}" # Only tag 'latest' for full releases if [ "${GITHUB_REF_NAME}" != "devel" ]; then echo "Pushing to 'latest' tag for full release of ${GITHUB_REF_NAME} ..." - docker tag postgrest:latest "$DOCKER_REPO"/postgrest:latest - docker push "$DOCKER_REPO"/postgrest:latest - docker buildx imagetools create --append \ - -t "$DOCKER_REPO/postgrest:latest" \ - "$DOCKER_REPO/postgrest@$SHA256_ARM" + docker manifest create "$DOCKER_REPO/postgrest:latest" \ + "$DOCKER_REPO/postgrest@$SHA256_ARM64" \ + "$DOCKER_REPO/postgrest@$SHA256_AMD64" + docker manifest push "$DOCKER_REPO/postgrest:latest" else echo "Skipping push to 'latest' tag for pre-release..." fi