name: Build and Push Docker Images on: workflow_dispatch: push: branches: [main] pull_request: branches: [main] release: types: [released] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true permissions: packages: write jobs: configure: runs-on: ubuntu-latest outputs: matrix: ${{ steps.get-versions.outputs.result }} steps: - name: Checkout to repository uses: actions/checkout@v4 - name: Get dependency versions uses: mikefarah/yq@v4.43.1 id: get-versions with: cmd: yq eval -o=json -I=0 versions.yaml build_and_push: runs-on: ubuntu-latest needs: configure strategy: # Prevent a failure in one image from stopping the other builds fail-fast: false matrix: ${{ fromJson(needs.configure.outputs.matrix) }} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up QEMU uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3.3.0 - name: Login to GitHub Container Registry uses: docker/login-action@v3.1.0 if: ${{ !github.event.pull_request.head.repo.fork }} with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERIO_USERNAME }} password: ${{ secrets.DOCKERIO_TOKEN }} - name: Determine version change id: changed-version uses: tj-actions/changed-files@v44 with: files: versions.yaml - name: Determine image push uses: actions/github-script@v7 id: should-release with: script: | if (context.eventName == "pull_request") return false; if (context.eventName == "workflow_dispatch") return true; return "${{ steps.changed-version.outputs.any_changed }}" == "true"; - name: Set major postgres version id: version run: | pg_major=$(echo ${{ matrix.cnpg }} | cut -d'.' -f1) echo "pg_major=$pg_major" >> "$GITHUB_OUTPUT" - name: Generate docker image tags id: metadata uses: docker/metadata-action@v5 with: flavor: | # Disable latest tag latest=false images: | name=ghcr.io/${{ github.repository }} name=tensorchord/cloudnative-pgvecto-rs tags: | type=raw,value=${{ matrix.cnpg }}-${{ matrix.pgvectors }},enable=${{ steps.should-release.outputs.result }} type=raw,value=${{ steps.version.outputs.pg_major }}-${{ matrix.pgvectors }},enable=${{ steps.should-release.outputs.result }} type=raw,value=${{ matrix.cnpg }},enable=${{ steps.should-release.outputs.result }} type=raw,value=${{ steps.version.outputs.pg_major }},enable=${{ steps.should-release.outputs.result }} - name: Build and push image uses: docker/build-push-action@v5.3.0 with: context: . platforms: linux/amd64,linux/arm64 push: ${{ !github.event.pull_request.head.repo.fork && steps.metadata.outputs.tags != '' }} cache-from: type=gha cache-to: type=gha,mode=max tags: ${{ steps.metadata.outputs.tags }} labels: ${{ steps.metadata.outputs.labels }} build-args: | CNPG_TAG=${{ matrix.cnpg }} PGVECTORS_TAG=${{ matrix.pgvectors }} results: if: ${{ always() }} runs-on: ubuntu-latest name: Build results needs: [build_and_push] steps: - run: | result="${{ needs.build_and_push.result }}" if [[ $result == "success" || $result == "skipped" ]]; then exit 0 else exit 1 fi