name: Publish GHCR Image on: push: tags: - "release-*" permissions: contents: read packages: write concurrency: group: publish-ghcr-${{ github.ref }} cancel-in-progress: false jobs: publish: runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v4 - name: Set up Bun uses: oven-sh/setup-bun@v2 with: bun-version: 1.3.11 - name: Install dependencies run: bun install --frozen-lockfile - name: Run typecheck run: bun run typecheck - name: Run tests run: bun run test - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to GHCR uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Derive image metadata shell: bash run: | set -euo pipefail version="${GITHUB_REF_NAME#release-}" version="${version#v}" if [[ -z "$version" ]]; then echo "Release version is empty after stripping prefix from tag: $GITHUB_REF_NAME" >&2 exit 1 fi image_name="ghcr.io/${GITHUB_REPOSITORY,,}" { echo "VERSION=$version" echo "IMAGE_NAME=$image_name" } >> "$GITHUB_ENV" - name: Build and push image uses: docker/build-push-action@v6 with: context: . file: ./Dockerfile push: true tags: | ${{ env.IMAGE_NAME }}:${{ env.VERSION }} ${{ env.IMAGE_NAME }}:latest labels: | org.opencontainers.image.source=https://github.com/${{ github.repository }} org.opencontainers.image.revision=${{ github.sha }} org.opencontainers.image.version=${{ env.VERSION }}