name: Release on: push: tags: - devel - v* concurrency: # Terminate all previous runs of the same workflow for the same tag. group: release-${{ github.ref }} # TODO: Enable this once https://github.com/orgs/community/discussions/13015 is solved cancel-in-progress: false jobs: build: name: Build uses: ./.github/workflows/build.yaml secrets: CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }} prepare: name: Prepare runs-on: ubuntu-24.04 needs: - build steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Check the version to be released run: | cabal_version="$(grep -oP '^version:\s*\K.*' postgrest.cabal)" if [ "${GITHUB_REF_NAME}" != "devel" ] && [ "${GITHUB_REF_NAME}" != "v$cabal_version" ]; then echo "Tagged version ($GITHUB_REF_NAME) does not match the one in postgrest.cabal (v$cabal_version). Aborting release..." exit 1 fi - name: Identify changes from CHANGELOG.md run: | if [ "${GITHUB_REF_NAME}" == "devel" ]; then echo "Getting unreleased changes..." sed -n "1,/## Unreleased/d;/## \[/q;p" CHANGELOG.md > CHANGES.md else version="$(grep -oP '^version:\s*\K.*' postgrest.cabal)" echo "Propper release, getting changes for version $version ..." sed -n "1,/## \[$version\]/d;/## \[/q;p" CHANGELOG.md > CHANGES.md fi echo "Relevant extract from CHANGELOG.md:" cat CHANGES.md - name: Save CHANGES.md as artifact uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 with: name: release-changes path: CHANGES.md if-no-files-found: error github: name: GitHub permissions: contents: write runs-on: ubuntu-24.04 needs: - prepare steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Download all artifacts uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 with: path: artifacts - name: Create release bundle with archives for all builds run: | find artifacts -type f -iname postgrest -exec chmod +x {} \; mkdir -p release-bundle tar cJvf "release-bundle/postgrest-${GITHUB_REF_NAME}-linux-static-x86-64.tar.xz" \ -C artifacts/postgrest-linux-static-x86-64 postgrest tar cJvf "release-bundle/postgrest-${GITHUB_REF_NAME}-macos-aarch64.tar.xz" \ -C artifacts/postgrest-macos-aarch64 postgrest 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 - name: Save release bundle uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 with: name: release-bundle path: release-bundle if-no-files-found: error - name: Publish release on GitHub env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | echo "Releasing version ${GITHUB_REF_NAME} on GitHub..." if [ "${GITHUB_REF_NAME}" == "devel" ]; then # To replace the existing release, we must first delete the old assets, # then modify the release, then add the new assets. gh release view devel --json assets \ | jq -r '.assets[] | .name' \ | xargs -rn1 \ gh release delete-asset -y devel gh release edit devel \ -t devel \ --verify-tag \ -F artifacts/release-changes/CHANGES.md \ --prerelease gh release upload --clobber devel release-bundle/* else gh release create "${GITHUB_REF_NAME}" \ -t "${GITHUB_REF_NAME}" \ --verify-tag \ -F artifacts/release-changes/CHANGES.md \ release-bundle/* fi docker: name: Docker Hub runs-on: ubuntu-24.04-arm needs: - prepare if: | vars.DOCKER_REPO && vars.DOCKER_USER env: DOCKER_REPO: ${{ vars.DOCKER_REPO }} steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Download x86-64 Docker image uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 with: name: postgrest-docker-x86-64 - name: Download aarch64 binary uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 with: name: postgrest-ubuntu-aarch64 - uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 - uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.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 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" # 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" else echo "Skipping push to 'latest' tag for pre-release..." fi docker-description: name: Docker Hub Description runs-on: ubuntu-24.04 if: | vars.DOCKER_REPO && vars.DOCKER_USER && github.ref == 'refs/tags/devel' steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - uses: peter-evans/dockerhub-description@1b9a80c056b620d92cedb9d9b5a223409c68ddfa # v5.0.0 with: username: ${{ vars.DOCKER_USER }} password: ${{ secrets.DOCKER_PASS }} repository: ${{ vars.DOCKER_REPO }}/postgrest short-description: ${{ github.event.repository.description }} readme-filepath: ./docker-hub-readme.md