77
88env :
99 REGISTRY : ghcr.io
10+ IMAGE_NAME : ${{ github.repository_owner }}/${{ github.event.repository.name }}
1011
1112jobs :
12- build-and-push :
13+ load-versions :
1314 runs-on : ubuntu-latest
15+ outputs :
16+ build-matrix : ${{ steps.set-matrix.outputs.build_matrix }}
17+ merge-matrix : ${{ steps.set-matrix.outputs.merge_matrix }}
18+ steps :
19+ - uses : actions/checkout@v6
20+ - id : set-matrix
21+ run : |
22+ RUNNERS='[{"runner":"ubuntu-latest","platform":"linux/amd64"},{"runner":"ubuntu-24.04-arm","platform":"linux/arm64"}]'
23+ BUILD_MATRIX=$(jq -c --argjson runners "$RUNNERS" '{include: [.[] | . as $v | $runners[] | . + $v]}' versions.json)
24+ echo "build_matrix=$BUILD_MATRIX" >> "$GITHUB_OUTPUT"
25+ echo "merge_matrix=$(jq -c '{include: .}' versions.json)" >> "$GITHUB_OUTPUT"
26+
27+ build :
28+ needs : load-versions
29+ runs-on : ${{ matrix.runner }}
30+ timeout-minutes : 30
1431 permissions :
1532 contents : read
1633 packages : write
1734
1835 strategy :
19- matrix :
20- include :
21- - pg_version : " 17.9"
22- postgis_version : " 3.6.2"
23- pgvector_version : " 0.8.2"
24- latest : true
25- - pg_version : " 16.13"
26- postgis_version : " 3.6.2"
27- pgvector_version : " 0.8.2"
28- latest : false
29- - pg_version : " 15.17"
30- postgis_version : " 3.6.2"
31- pgvector_version : " 0.8.2"
32- latest : false
33- - pg_version : " 14.22"
34- postgis_version : " 3.6.2"
35- pgvector_version : " 0.8.2"
36- latest : false
36+ fail-fast : false
37+ matrix : ${{ fromJSON(needs.load-versions.outputs.build-matrix) }}
3738
3839 steps :
3940 - name : Checkout repository
@@ -53,22 +54,86 @@ jobs:
5354 id : meta
5455 uses : docker/metadata-action@v6
5556 with :
56- images : ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ github.event.repository.name }}
57- tags : |
58- type=raw,value=postgres-${{ matrix.pg_version }}-postgis-${{ matrix.postgis_version }}-pgvector-${{ matrix.pgvector_version }}
59- type=raw,value=latest,enable=${{ matrix.latest }}
60- type=ref,event=tag
57+ images : ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
6158
62- - name : Build and push Docker image
59+ - name : Build and push by digest
60+ id : build
6361 uses : docker/build-push-action@v7
6462 with :
6563 context : .
66- push : true
67- tags : ${{ steps.meta.outputs.tags }}
64+ platforms : ${{ matrix.platform }}
65+ provenance : false
66+ sbom : false
6867 labels : ${{ steps.meta.outputs.labels }}
6968 build-args : |
7069 PG_VERSION=${{ matrix.pg_version }}
7170 POSTGIS_VERSION=${{ matrix.postgis_version }}
7271 PGVECTOR_VERSION=${{ matrix.pgvector_version }}
73- cache-from : type=gha
74- cache-to : type=gha,mode=max
72+ cache-from : type=gha,scope=${{ matrix.pg_version }}-${{ matrix.runner }}
73+ outputs : type=image,name=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true
74+
75+ - name : Export digest
76+ env :
77+ DIGEST : ${{ steps.build.outputs.digest }}
78+ run : |
79+ mkdir -p /tmp/digests
80+ touch "/tmp/digests/${DIGEST#sha256:}"
81+
82+ - name : Upload digest
83+ uses : actions/upload-artifact@v4
84+ with :
85+ name : digest-${{ matrix.pg_version }}-${{ matrix.runner }}
86+ path : /tmp/digests/*
87+ if-no-files-found : error
88+ retention-days : 1
89+
90+ merge :
91+ runs-on : ubuntu-latest
92+ timeout-minutes : 10
93+ needs : [load-versions, build]
94+ permissions :
95+ contents : read
96+ packages : write
97+
98+ strategy :
99+ fail-fast : false
100+ matrix : ${{ fromJSON(needs.load-versions.outputs.merge-matrix) }}
101+
102+ steps :
103+ - name : Download digests
104+ uses : actions/download-artifact@v4
105+ with :
106+ pattern : digest-${{ matrix.pg_version }}-*
107+ merge-multiple : true
108+ path : /tmp/digests
109+
110+ - name : Log in to GitHub Container Registry
111+ uses : docker/login-action@v4
112+ with :
113+ registry : ${{ env.REGISTRY }}
114+ username : ${{ github.actor }}
115+ password : ${{ secrets.GITHUB_TOKEN }}
116+
117+ - name : Extract metadata (tags, labels) for Docker
118+ id : meta
119+ uses : docker/metadata-action@v6
120+ with :
121+ images : ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
122+ tags : |
123+ type=raw,value=postgres-${{ matrix.pg_version }}-postgis-${{ matrix.postgis_version }}-pgvector-${{ matrix.pgvector_version }}
124+ type=raw,value=latest,enable=${{ matrix.latest }}
125+ type=ref,event=tag,enable=${{ matrix.latest }}
126+
127+ - name : Create multi-arch manifest and push
128+ working-directory : /tmp/digests
129+ env :
130+ REGISTRY : ${{ env.REGISTRY }}
131+ IMAGE : ${{ env.IMAGE_NAME }}
132+ run : |
133+ docker buildx imagetools create \
134+ $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
135+ $(printf "${REGISTRY}/${IMAGE}@sha256:%s " *)
136+
137+ - name : Verify multi-arch manifest
138+ run : |
139+ docker buildx imagetools inspect $(jq -cr '.tags[0]' <<< "$DOCKER_METADATA_OUTPUT_JSON")
0 commit comments