Skip to content

Build and Publish Docker Image #12

Build and Publish Docker Image

Build and Publish Docker Image #12

Workflow file for this run

name: Build and Publish Docker Image
on:
schedule:
- cron: "0 0 * * 6" # Runs every Saturday at midnight
workflow_dispatch: # Allows manual triggering
env:
REGISTRY_IMAGE: ghcr.io/${{ github.repository }}
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
platform:
- linux/amd64
- linux/arm64
steps:
- name: Prepare
run: |
platform=${{ matrix.platform }}
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
- name: Checkout repository
uses: actions/checkout@v3
- name: Get latest release tag and check for new release
id: check_release
run: |
RELEASE_TAG=$(curl -s https://api.github.com/repos/get-convex/convex-backend/releases/latest | grep "tag_name" | cut -d\" -f4)
echo "RELEASE_TAG=$RELEASE_TAG" >> $GITHUB_ENV
PREVIOUS_TAG=$(docker inspect ghcr.io/${{ github.repository }}:latest --format '{{ index .Config.Labels "org.opencontainers.image.version" }}' || echo "none")
if [ -z "$PREVIOUS_TAG" ]; then
echo "No previous image found. Proceeding with the build of release: $RELEASE_TAG."
elif [ "$RELEASE_TAG" == "$PREVIOUS_TAG" ]; then
echo "No new release detected. Exiting."
exit 0
else
echo "New release detected: $RELEASE_TAG"
fi
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Docker Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push by digest
id: build
uses: docker/build-push-action@v6
with:
context: .
platforms: ${{ matrix.platform }}
build-args: |
RELEASE_TAG=${{ env.RELEASE_TAG }}
labels: |
org.opencontainers.image.version=${{ env.RELEASE_TAG }}
cache-from: type=gha
cache-to: type=gha,mode=max
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
- name: Export digest
run: |
mkdir -p /tmp/digests
digest="${{ steps.build.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@v4
with:
name: digests-${{ env.PLATFORM_PAIR }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1
merge:
runs-on: ubuntu-latest
needs: build
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Docker Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Download digests
uses: actions/download-artifact@v4
with:
path: /tmp/digests
pattern: digests-*
merge-multiple: true
- name: Create multi-platform manifest and push
working-directory: /tmp/digests
run: |
docker buildx imagetools create --tag ${{ env.REGISTRY_IMAGE }}:${{ env.RELEASE_TAG }} --tag ${{ env.REGISTRY_IMAGE }}:latest \
$(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
- name: Create GitHub Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ env.RELEASE_TAG }}
release_name: "Release ${{ env.RELEASE_TAG }}"
body: |
This is based on convex-backend's release: ${{ env.RELEASE_TAG }}](https://github.com/get-convex/convex-backend/releases/tag/${{ env.RELEASE_TAG }}).
New Docker images have been built and are available at the following locations:
- `ghcr.io/${{ github.repository }}:${{ env.RELEASE_TAG }}`
- `ghcr.io/${{ github.repository }}:latest`
draft: false
prerelease: false
- name: Post build cleanup
run: docker system prune -f