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.45.3 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.6.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3.11.1 - name: Login to GitHub Container Registry uses: docker/login-action@v3.4.0 if: ${{ !github.event.pull_request.head.repo.fork }} with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Determine version change id: changed-version run: | BASE=${{ github.event_name == 'pull_request' && format('origin/{0}', github.base_ref) || 'HEAD~1' }} CHANGED_FILES=$(git diff --name-only $BASE...HEAD) echo $CHANGED_FILES # Looking for: # versions.yaml # Dockerfile if echo "$CHANGED_FILES" | grep -q -e "^versions.yaml$" -e "^Dockerfile$"; then echo "any_changed=true" >> $GITHUB_OUTPUT else echo "any_changed=false" >> $GITHUB_OUTPUT fi - 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_owner }}/cloudnative-vectorchord-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@v6.18.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 }} VECTORCHORD_TAG=${{ matrix.vectorchord }} 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