Skip to content

Commit 228436b

Browse files
samroseclaude
andauthored
feat: images tests and release on pg 17 and orioledb for multigres (#2054)
* feat: images tests and release on pg 17 and orioledb for multigres * feat: ssh and ps * feat: consolidate multigres image, run pg_regress * feat: refactored dockerfile, tests * docs: documentation * feat: add multigres flake input for pgctld packaging Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: package pgctld from github:multigres/multigres as Nix derivation Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: add pg-backrest and pgctld to multigres nix-builder-17 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: add pg-backrest and pgctld to multigres nix-builder-orioledb-17 * feat: multigres docker pgctld * tests: coverage for multigres * fix: format nix * fix: address pr #2054 review comments. * fix: address review comments and fix tests * feat: release multigres images --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent b86b9b0 commit 228436b

63 files changed

Lines changed: 16331 additions & 82 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/docker-image-test.yml

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,20 @@ jobs:
5252
base_ref: ${{ github.base_ref }}
5353

5454
docker-image-test:
55-
name: Test ${{ matrix.dockerfile }}
55+
name: Test ${{ matrix.name }}
5656
needs: check-changes
5757
if: needs.check-changes.outputs.should_run == 'true'
5858
runs-on: large-linux-arm
5959
timeout-minutes: 120
6060
strategy:
6161
fail-fast: false
6262
matrix:
63-
dockerfile:
64-
- Dockerfile-15
65-
- Dockerfile-17
66-
- Dockerfile-orioledb-17
63+
include:
64+
- { dockerfile: Dockerfile-15, target: "", name: 15 }
65+
- { dockerfile: Dockerfile-17, target: "", name: 17 }
66+
- { dockerfile: Dockerfile-orioledb-17, target: "", name: orioledb-17 }
67+
- { dockerfile: Dockerfile-multigres, target: variant-17, name: multigres-17 }
68+
- { dockerfile: Dockerfile-multigres, target: variant-orioledb-17, name: multigres-orioledb-17 }
6769
steps:
6870
- name: Checkout Repo
6971
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
@@ -86,31 +88,38 @@ jobs:
8688

8789
- name: Build Docker image
8890
run: |
89-
echo "Building ${{ matrix.dockerfile }}..."
90-
VERSION="${{ matrix.dockerfile }}"
91-
VERSION="${VERSION#Dockerfile-}"
92-
# Build with tags expected by both tools
93-
docker build -f ${{ matrix.dockerfile }} \
94-
-t "pg-docker-test:${VERSION}" \
95-
-t "supabase-postgres:${VERSION}-analyze" \
91+
echo "Building ${{ matrix.name }}..."
92+
TARGET_ARG=""
93+
if [ -n "${{ matrix.target }}" ]; then
94+
TARGET_ARG="--target ${{ matrix.target }}"
95+
fi
96+
docker build -f "${{ matrix.dockerfile }}" $TARGET_ARG \
97+
-t "pg-docker-test:${{ matrix.name }}" \
98+
-t "supabase-postgres:${{ matrix.name }}-analyze" \
9699
.
97100
98101
- name: Run image size analysis
102+
if: ${{ matrix.target == '' }}
99103
run: |
100-
echo "=== Image Size Analysis for ${{ matrix.dockerfile }} ==="
101-
nix run --accept-flake-config .#image-size-analyzer -- --image ${{ matrix.dockerfile }} --no-build
104+
echo "=== Image Size Analysis for ${{ matrix.name }} ==="
105+
nix run --accept-flake-config .#image-size-analyzer -- --image Dockerfile-${{ matrix.name }} --no-build
102106
103107
- name: Run Docker image tests
108+
if: ${{ matrix.target == '' }}
109+
run: |
110+
echo "=== Running tests for ${{ matrix.name }} ==="
111+
nix run --accept-flake-config .#docker-image-test -- --no-build Dockerfile-${{ matrix.name }}
112+
113+
- name: Run multigres Docker image tests
114+
if: ${{ matrix.target != '' }}
104115
run: |
105-
echo "=== Running tests for ${{ matrix.dockerfile }} ==="
106-
nix run --accept-flake-config .#docker-image-test -- --no-build ${{ matrix.dockerfile }}
116+
echo "=== Running tests for ${{ matrix.name }} ==="
117+
nix run --accept-flake-config .#docker-image-test -- --no-build --target ${{ matrix.target }} ${{ matrix.dockerfile }}
107118
108119
- name: Show container logs on failure
109120
if: failure()
110121
run: |
111-
VERSION="${{ matrix.dockerfile }}"
112-
VERSION="${VERSION#Dockerfile-}"
113-
CONTAINER_NAME=$(docker ps -a --filter "name=pg-test-${VERSION}" --format "{{.Names}}" | head -1)
122+
CONTAINER_NAME=$(docker ps -a --filter "name=pg-test-${{ matrix.name }}" --format "{{.Names}}" | head -1)
114123
if [[ -n "$CONTAINER_NAME" ]]; then
115124
echo "=== Container logs for $CONTAINER_NAME ==="
116125
docker logs "$CONTAINER_NAME" 2>&1 || true
@@ -119,13 +128,9 @@ jobs:
119128
- name: Cleanup
120129
if: always()
121130
run: |
122-
VERSION="${{ matrix.dockerfile }}"
123-
VERSION="${VERSION#Dockerfile-}"
124-
# Remove test containers
125-
docker ps -a --filter "name=pg-test-${VERSION}" -q | xargs -r docker rm -f || true
126-
# Remove test images
127-
docker rmi "pg-docker-test:${VERSION}" || true
128-
docker rmi "supabase-postgres:${VERSION}-analyze" || true
131+
docker ps -a --filter "name=pg-test-${{ matrix.name }}" -q | xargs -r docker rm -f || true
132+
docker rmi "pg-docker-test:${{ matrix.name }}" || true
133+
docker rmi "supabase-postgres:${{ matrix.name }}-analyze" || true
129134
130135
skip-notification:
131136
name: Docker Image Test (Skipped)

.github/workflows/dockerhub-release-matrix.yml

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,39 @@ jobs:
2727
id: set-matrix
2828
run: |
2929
nix run nixpkgs#nushell -- -c 'let versions = (open ansible/vars.yml | get postgres_major)
30-
let matrix = ($versions | each { |ver|
30+
let base_matrix = ($versions | each { |ver|
3131
let version = ($ver | str trim)
3232
let dockerfile = $"Dockerfile-($version)"
3333
if ($dockerfile | path exists) {
3434
{
3535
version: $version,
36-
dockerfile: $dockerfile
36+
dockerfile: $dockerfile,
37+
target: "production"
3738
}
3839
} else {
3940
null
4041
}
4142
} | compact)
4243
44+
# Discover multigres variants by checking for matching targets in Dockerfile-multigres
45+
let multigres_matrix = ($versions | each { |ver|
46+
let version = ($ver | str trim)
47+
let mg_version = $"multigres-($version)"
48+
let mg_dockerfile = "Dockerfile-multigres"
49+
let mg_target = $"variant-($version)"
50+
if ($mg_dockerfile | path exists) and (open --raw $mg_dockerfile | str contains $"AS ($mg_target)") {
51+
{
52+
version: $mg_version,
53+
dockerfile: $mg_dockerfile,
54+
target: $mg_target
55+
}
56+
} else {
57+
null
58+
}
59+
} | compact)
60+
61+
let matrix = ($base_matrix | append $multigres_matrix)
62+
4363
let matrix_config = {
4464
include: $matrix
4565
}
@@ -95,23 +115,29 @@ jobs:
95115
if [[ "${{ matrix.arch }}" == "arm64" ]]; then
96116
pg_version=$(nix run nixpkgs#nushell -- -c '
97117
let version = "${{ matrix.postgres.version }}"
98-
let release_key = if ($version | str contains "orioledb") {
118+
let is_multigres = ($version | str starts-with "multigres-")
119+
let base_version = if $is_multigres { $version | str replace "multigres-" "" } else { $version }
120+
let release_key = if ($base_version | str contains "orioledb") {
99121
$"postgresorioledb-17"
100122
} else {
101-
$"postgres($version)"
123+
$"postgres($base_version)"
102124
}
103-
open ansible/vars.yml | get postgres_release | get $release_key | str trim
125+
let base_tag = (open ansible/vars.yml | get postgres_release | get $release_key | str trim)
126+
if $is_multigres { $"($base_tag)-multigres" } else { $base_tag }
104127
')
105128
echo "pg_version=supabase/postgres:$pg_version" >> $GITHUB_OUTPUT
106129
else
107130
pg_version=$(nix run nixpkgs#nushell -- -c '
108131
let version = "${{ matrix.postgres.version }}"
109-
let release_key = if ($version | str contains "orioledb") {
132+
let is_multigres = ($version | str starts-with "multigres-")
133+
let base_version = if $is_multigres { $version | str replace "multigres-" "" } else { $version }
134+
let release_key = if ($base_version | str contains "orioledb") {
110135
$"postgresorioledb-17"
111136
} else {
112-
$"postgres($version)"
137+
$"postgres($base_version)"
113138
}
114-
open ansible/vars.yml | get postgres_release | get $release_key | str trim
139+
let base_tag = (open ansible/vars.yml | get postgres_release | get $release_key | str trim)
140+
if $is_multigres { $"($base_tag)-multigres" } else { $base_tag }
115141
')
116142
echo "pg_version=supabase/postgres:$pg_version" >> $GITHUB_OUTPUT
117143
fi
@@ -121,7 +147,7 @@ jobs:
121147
push: true
122148
build-args: |
123149
${{ needs.build.outputs.build_args }}
124-
target: production
150+
target: ${{ matrix.postgres.target }}
125151
tags: ${{ steps.image.outputs.pg_version }}_${{ matrix.arch }}
126152
platforms: linux/${{ matrix.arch }}
127153
cache-from: type=gha,scope=${{ github.ref_name }}-latest-${{ matrix.arch }}
@@ -147,12 +173,15 @@ jobs:
147173
run: |
148174
nix run nixpkgs#nushell -- -c '
149175
let version = "${{ matrix.version }}"
150-
let release_key = if ($version | str contains "orioledb") {
176+
let is_multigres = ($version | str starts-with "multigres-")
177+
let base_version = if $is_multigres { $version | str replace "multigres-" "" } else { $version }
178+
let release_key = if ($base_version | str contains "orioledb") {
151179
$"postgresorioledb-17"
152180
} else {
153-
$"postgres($version)"
181+
$"postgres($base_version)"
154182
}
155-
let pg_version = (open ansible/vars.yml | get postgres_release | get $release_key | str trim)
183+
let base_tag = (open ansible/vars.yml | get postgres_release | get $release_key | str trim)
184+
let pg_version = if $is_multigres { $"($base_tag)-multigres" } else { $base_tag }
156185
$"pg_version=supabase/postgres:($pg_version)" | save --append $env.GITHUB_OUTPUT
157186
'
158187
- name: Output version

.github/workflows/manual-docker-release.yml

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,39 @@ jobs:
2424
id: set-matrix
2525
run: |
2626
nix run nixpkgs#nushell -- -c 'let versions = (open ansible/vars.yml | get postgres_major)
27-
let matrix = ($versions | each { |ver|
27+
let base_matrix = ($versions | each { |ver|
2828
let version = ($ver | str trim)
2929
let dockerfile = $"Dockerfile-($version)"
3030
if ($dockerfile | path exists) {
3131
{
3232
version: $version,
33-
dockerfile: $dockerfile
33+
dockerfile: $dockerfile,
34+
target: "production"
3435
}
3536
} else {
3637
null
3738
}
3839
} | compact)
3940
41+
# Discover multigres variants by checking for matching targets in Dockerfile-multigres
42+
let multigres_matrix = ($versions | each { |ver|
43+
let version = ($ver | str trim)
44+
let mg_version = $"multigres-($version)"
45+
let mg_dockerfile = "Dockerfile-multigres"
46+
let mg_target = $"variant-($version)"
47+
if ($mg_dockerfile | path exists) and (open --raw $mg_dockerfile | str contains $"AS ($mg_target)") {
48+
{
49+
version: $mg_version,
50+
dockerfile: $mg_dockerfile,
51+
target: $mg_target
52+
}
53+
} else {
54+
null
55+
}
56+
} | compact)
57+
58+
let matrix = ($base_matrix | append $multigres_matrix)
59+
4060
let matrix_config = {
4161
include: $matrix
4262
}
@@ -92,35 +112,39 @@ jobs:
92112
if [[ "${{ matrix.arch }}" == "arm64" ]]; then
93113
pg_version=$(nix run nixpkgs#nushell -- -c '
94114
let version = "${{ matrix.postgres.version }}"
95-
let release_key = if ($version | str contains "orioledb") {
115+
let is_multigres = ($version | str starts-with "multigres-")
116+
let base_version = if $is_multigres { $version | str replace "multigres-" "" } else { $version }
117+
let release_key = if ($base_version | str contains "orioledb") {
96118
$"postgresorioledb-17"
97119
} else {
98-
$"postgres($version)"
120+
$"postgres($base_version)"
99121
}
100-
let base_version = (open ansible/vars.yml | get postgres_release | get $release_key | str trim)
122+
let base_tag = (open ansible/vars.yml | get postgres_release | get $release_key | str trim)
101123
let final_version = if "${{ inputs.postgresVersion }}" != "" {
102124
"${{ inputs.postgresVersion }}"
103125
} else {
104-
$base_version
126+
$base_tag
105127
}
106-
$final_version | str trim
128+
if $is_multigres { $"($final_version)-multigres" | str trim } else { $final_version | str trim }
107129
')
108130
echo "pg_version=supabase/postgres:$pg_version" >> $GITHUB_OUTPUT
109131
else
110132
pg_version=$(nix run nixpkgs#nushell -- -c '
111133
let version = "${{ matrix.postgres.version }}"
112-
let release_key = if ($version | str contains "orioledb") {
134+
let is_multigres = ($version | str starts-with "multigres-")
135+
let base_version = if $is_multigres { $version | str replace "multigres-" "" } else { $version }
136+
let release_key = if ($base_version | str contains "orioledb") {
113137
$"postgresorioledb-17"
114138
} else {
115-
$"postgres($version)"
139+
$"postgres($base_version)"
116140
}
117-
let base_version = (open ansible/vars.yml | get postgres_release | get $release_key | str trim)
141+
let base_tag = (open ansible/vars.yml | get postgres_release | get $release_key | str trim)
118142
let final_version = if "${{ inputs.postgresVersion }}" != "" {
119143
"${{ inputs.postgresVersion }}"
120144
} else {
121-
$base_version
145+
$base_tag
122146
}
123-
$final_version | str trim
147+
if $is_multigres { $"($final_version)-multigres" | str trim } else { $final_version | str trim }
124148
')
125149
echo "pg_version=supabase/postgres:$pg_version" >> $GITHUB_OUTPUT
126150
fi
@@ -130,7 +154,7 @@ jobs:
130154
push: true
131155
build-args: |
132156
${{ needs.build.outputs.build_args }}
133-
target: production
157+
target: ${{ matrix.postgres.target }}
134158
tags: ${{ steps.image.outputs.pg_version }}_${{ matrix.arch }}
135159
platforms: linux/${{ matrix.arch }}
136160
cache-from: type=gha,scope=${{ github.ref_name }}-latest-${{ matrix.arch }}
@@ -156,12 +180,15 @@ jobs:
156180
run: |
157181
nix run nixpkgs#nushell -- -c '
158182
let version = "${{ matrix.version }}"
159-
let release_key = if ($version | str contains "orioledb") {
183+
let is_multigres = ($version | str starts-with "multigres-")
184+
let base_version = if $is_multigres { $version | str replace "multigres-" "" } else { $version }
185+
let release_key = if ($base_version | str contains "orioledb") {
160186
$"postgresorioledb-17"
161187
} else {
162-
$"postgres($version)"
188+
$"postgres($base_version)"
163189
}
164-
let pg_version = (open ansible/vars.yml | get postgres_release | get $release_key | str trim)
190+
let base_tag = (open ansible/vars.yml | get postgres_release | get $release_key | str trim)
191+
let pg_version = if $is_multigres { $"($base_tag)-multigres" } else { $base_tag }
165192
$"pg_version=supabase/postgres:($pg_version)" | save --append $env.GITHUB_OUTPUT
166193
'
167194
- name: Output version
@@ -258,5 +285,5 @@ jobs:
258285
matrix: ${{ fromJson(needs.combine_results.outputs.matrix) }}
259286
uses: ./.github/workflows/mirror.yml
260287
with:
261-
version: ${{ inputs.postgresVersion != '' && inputs.postgresVersion || matrix.version }}
288+
version: ${{ inputs.postgresVersion != '' && (contains(matrix.version, '-multigres') && format('{0}-multigres', inputs.postgresVersion) || inputs.postgresVersion) || matrix.version }}
262289
secrets: inherit

0 commit comments

Comments
 (0)