From cf46c5cfe778ad8cbcf43a6546ee1d8a5e9546ff Mon Sep 17 00:00:00 2001 From: Muhammad Aqeel Date: Tue, 6 Oct 2026 17:36:21 +0500 Subject: [PATCH 1/6] build: upgrade standard image extensions and give each flavor its own epoch --- CHANGELOG.md | 4 +- .../amd64/pg16.15-spock5.0.12-standard.txt | 6 +- .../pg16.15-spock6.0.0-beta1-standard.txt | 6 +- .../amd64/pg17.11-spock5.0.12-standard.txt | 6 +- .../pg17.11-spock6.0.0-beta1-standard.txt | 6 +- .../amd64/pg18.6-spock5.0.12-standard.txt | 6 +- .../pg18.6-spock6.0.0-beta1-standard.txt | 6 +- .../arm64/pg16.15-spock5.0.12-standard.txt | 6 +- .../pg16.15-spock6.0.0-beta1-standard.txt | 6 +- .../arm64/pg17.11-spock5.0.12-standard.txt | 6 +- .../pg17.11-spock6.0.0-beta1-standard.txt | 6 +- .../arm64/pg18.6-spock5.0.12-standard.txt | 6 +- .../pg18.6-spock6.0.0-beta1-standard.txt | 6 +- scripts/build_pgedge_images.py | 111 ++++++++++-------- 14 files changed, 97 insertions(+), 90 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f491ab..2b70c4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,8 @@ ## Unreleased - Upgraded to PostgreSQL 16.15, 17.11, and 18.6 -- Upgraded PostGIS to 3.6.4, pgBackRest to 2.59.0, and system_stats to 4.0 in - standard images +- Upgraded PostGIS to 3.6.4, pgBackRest to 2.59.3, system_stats to 4.0, + supautils to 3.4.4, and pgvector to 0.8.7 in standard images - Upgraded Spock to 5.0.12 in the spock 5 images ## 2025-09-03 diff --git a/packagelists/amd64/pg16.15-spock5.0.12-standard.txt b/packagelists/amd64/pg16.15-spock5.0.12-standard.txt index d424681..a324391 100644 --- a/packagelists/amd64/pg16.15-spock5.0.12-standard.txt +++ b/packagelists/amd64/pg16.15-spock5.0.12-standard.txt @@ -1,7 +1,7 @@ pgedge-pgaudit_16-16.1-1.el9 pgedge-postgis36_16-3.6.4-1.el9 -pgedge-pgvector_16-0.8.5-1.el9 -pgedge-pgbackrest-2.59.0-1.el9 +pgedge-pgvector_16-0.8.7-1.el9 +pgedge-pgbackrest-2.59.3-1.el9 pgedge-python3-psycopg2-2.9.12-1.el9 pgedge-pgmq_16-1.13.0-1.el9 pgedge-pg_cron_16-1.6.8-1.el9 @@ -11,5 +11,5 @@ pgedge-pg-stat-monitor_16-2.4.0-1.el9 pgedge-vchord-bm25_16-0.2.2-1.el9 pgedge-vectorizer_16-1.1-1.el9 pgedge-system_stats_16-4.0-1.el9 -pgedge-supautils_16-3.2.2-1.el9 +pgedge-supautils_16-3.4.4-1.el9 pgedge-safesession_16-1.0-1.el9 diff --git a/packagelists/amd64/pg16.15-spock6.0.0-beta1-standard.txt b/packagelists/amd64/pg16.15-spock6.0.0-beta1-standard.txt index d424681..a324391 100644 --- a/packagelists/amd64/pg16.15-spock6.0.0-beta1-standard.txt +++ b/packagelists/amd64/pg16.15-spock6.0.0-beta1-standard.txt @@ -1,7 +1,7 @@ pgedge-pgaudit_16-16.1-1.el9 pgedge-postgis36_16-3.6.4-1.el9 -pgedge-pgvector_16-0.8.5-1.el9 -pgedge-pgbackrest-2.59.0-1.el9 +pgedge-pgvector_16-0.8.7-1.el9 +pgedge-pgbackrest-2.59.3-1.el9 pgedge-python3-psycopg2-2.9.12-1.el9 pgedge-pgmq_16-1.13.0-1.el9 pgedge-pg_cron_16-1.6.8-1.el9 @@ -11,5 +11,5 @@ pgedge-pg-stat-monitor_16-2.4.0-1.el9 pgedge-vchord-bm25_16-0.2.2-1.el9 pgedge-vectorizer_16-1.1-1.el9 pgedge-system_stats_16-4.0-1.el9 -pgedge-supautils_16-3.2.2-1.el9 +pgedge-supautils_16-3.4.4-1.el9 pgedge-safesession_16-1.0-1.el9 diff --git a/packagelists/amd64/pg17.11-spock5.0.12-standard.txt b/packagelists/amd64/pg17.11-spock5.0.12-standard.txt index d3a9d00..1bc7dd7 100644 --- a/packagelists/amd64/pg17.11-spock5.0.12-standard.txt +++ b/packagelists/amd64/pg17.11-spock5.0.12-standard.txt @@ -1,7 +1,7 @@ pgedge-pgaudit_17-17.1-1.el9 pgedge-postgis36_17-3.6.4-1.el9 -pgedge-pgvector_17-0.8.5-1.el9 -pgedge-pgbackrest-2.59.0-1.el9 +pgedge-pgvector_17-0.8.7-1.el9 +pgedge-pgbackrest-2.59.3-1.el9 pgedge-python3-psycopg2-2.9.12-1.el9 pgedge-pgmq_17-1.13.0-1.el9 pgedge-pg_cron_17-1.6.8-1.el9 @@ -11,5 +11,5 @@ pgedge-pg-stat-monitor_17-2.4.0-1.el9 pgedge-vchord-bm25_17-0.2.2-1.el9 pgedge-vectorizer_17-1.1-1.el9 pgedge-system_stats_17-4.0-1.el9 -pgedge-supautils_17-3.2.2-1.el9 +pgedge-supautils_17-3.4.4-1.el9 pgedge-safesession_17-1.0-1.el9 diff --git a/packagelists/amd64/pg17.11-spock6.0.0-beta1-standard.txt b/packagelists/amd64/pg17.11-spock6.0.0-beta1-standard.txt index d3a9d00..1bc7dd7 100644 --- a/packagelists/amd64/pg17.11-spock6.0.0-beta1-standard.txt +++ b/packagelists/amd64/pg17.11-spock6.0.0-beta1-standard.txt @@ -1,7 +1,7 @@ pgedge-pgaudit_17-17.1-1.el9 pgedge-postgis36_17-3.6.4-1.el9 -pgedge-pgvector_17-0.8.5-1.el9 -pgedge-pgbackrest-2.59.0-1.el9 +pgedge-pgvector_17-0.8.7-1.el9 +pgedge-pgbackrest-2.59.3-1.el9 pgedge-python3-psycopg2-2.9.12-1.el9 pgedge-pgmq_17-1.13.0-1.el9 pgedge-pg_cron_17-1.6.8-1.el9 @@ -11,5 +11,5 @@ pgedge-pg-stat-monitor_17-2.4.0-1.el9 pgedge-vchord-bm25_17-0.2.2-1.el9 pgedge-vectorizer_17-1.1-1.el9 pgedge-system_stats_17-4.0-1.el9 -pgedge-supautils_17-3.2.2-1.el9 +pgedge-supautils_17-3.4.4-1.el9 pgedge-safesession_17-1.0-1.el9 diff --git a/packagelists/amd64/pg18.6-spock5.0.12-standard.txt b/packagelists/amd64/pg18.6-spock5.0.12-standard.txt index eab98a1..b5a60cc 100644 --- a/packagelists/amd64/pg18.6-spock5.0.12-standard.txt +++ b/packagelists/amd64/pg18.6-spock5.0.12-standard.txt @@ -1,7 +1,7 @@ pgedge-pgaudit_18-18.0-1.el9 pgedge-postgis36_18-3.6.4-1.el9 -pgedge-pgvector_18-0.8.5-1.el9 -pgedge-pgbackrest-2.59.0-1.el9 +pgedge-pgvector_18-0.8.7-1.el9 +pgedge-pgbackrest-2.59.3-1.el9 pgedge-python3-psycopg2-2.9.12-1.el9 pgedge-pgmq_18-1.13.0-1.el9 pgedge-pg_cron_18-1.6.8-1.el9 @@ -11,5 +11,5 @@ pgedge-pg-stat-monitor_18-2.4.0-1.el9 pgedge-vchord-bm25_18-0.2.2-1.el9 pgedge-vectorizer_18-1.1-1.el9 pgedge-system_stats_18-4.0-1.el9 -pgedge-supautils_18-3.2.2-1.el9 +pgedge-supautils_18-3.4.4-1.el9 pgedge-safesession_18-1.0-1.el9 diff --git a/packagelists/amd64/pg18.6-spock6.0.0-beta1-standard.txt b/packagelists/amd64/pg18.6-spock6.0.0-beta1-standard.txt index eab98a1..b5a60cc 100644 --- a/packagelists/amd64/pg18.6-spock6.0.0-beta1-standard.txt +++ b/packagelists/amd64/pg18.6-spock6.0.0-beta1-standard.txt @@ -1,7 +1,7 @@ pgedge-pgaudit_18-18.0-1.el9 pgedge-postgis36_18-3.6.4-1.el9 -pgedge-pgvector_18-0.8.5-1.el9 -pgedge-pgbackrest-2.59.0-1.el9 +pgedge-pgvector_18-0.8.7-1.el9 +pgedge-pgbackrest-2.59.3-1.el9 pgedge-python3-psycopg2-2.9.12-1.el9 pgedge-pgmq_18-1.13.0-1.el9 pgedge-pg_cron_18-1.6.8-1.el9 @@ -11,5 +11,5 @@ pgedge-pg-stat-monitor_18-2.4.0-1.el9 pgedge-vchord-bm25_18-0.2.2-1.el9 pgedge-vectorizer_18-1.1-1.el9 pgedge-system_stats_18-4.0-1.el9 -pgedge-supautils_18-3.2.2-1.el9 +pgedge-supautils_18-3.4.4-1.el9 pgedge-safesession_18-1.0-1.el9 diff --git a/packagelists/arm64/pg16.15-spock5.0.12-standard.txt b/packagelists/arm64/pg16.15-spock5.0.12-standard.txt index d424681..a324391 100644 --- a/packagelists/arm64/pg16.15-spock5.0.12-standard.txt +++ b/packagelists/arm64/pg16.15-spock5.0.12-standard.txt @@ -1,7 +1,7 @@ pgedge-pgaudit_16-16.1-1.el9 pgedge-postgis36_16-3.6.4-1.el9 -pgedge-pgvector_16-0.8.5-1.el9 -pgedge-pgbackrest-2.59.0-1.el9 +pgedge-pgvector_16-0.8.7-1.el9 +pgedge-pgbackrest-2.59.3-1.el9 pgedge-python3-psycopg2-2.9.12-1.el9 pgedge-pgmq_16-1.13.0-1.el9 pgedge-pg_cron_16-1.6.8-1.el9 @@ -11,5 +11,5 @@ pgedge-pg-stat-monitor_16-2.4.0-1.el9 pgedge-vchord-bm25_16-0.2.2-1.el9 pgedge-vectorizer_16-1.1-1.el9 pgedge-system_stats_16-4.0-1.el9 -pgedge-supautils_16-3.2.2-1.el9 +pgedge-supautils_16-3.4.4-1.el9 pgedge-safesession_16-1.0-1.el9 diff --git a/packagelists/arm64/pg16.15-spock6.0.0-beta1-standard.txt b/packagelists/arm64/pg16.15-spock6.0.0-beta1-standard.txt index d424681..a324391 100644 --- a/packagelists/arm64/pg16.15-spock6.0.0-beta1-standard.txt +++ b/packagelists/arm64/pg16.15-spock6.0.0-beta1-standard.txt @@ -1,7 +1,7 @@ pgedge-pgaudit_16-16.1-1.el9 pgedge-postgis36_16-3.6.4-1.el9 -pgedge-pgvector_16-0.8.5-1.el9 -pgedge-pgbackrest-2.59.0-1.el9 +pgedge-pgvector_16-0.8.7-1.el9 +pgedge-pgbackrest-2.59.3-1.el9 pgedge-python3-psycopg2-2.9.12-1.el9 pgedge-pgmq_16-1.13.0-1.el9 pgedge-pg_cron_16-1.6.8-1.el9 @@ -11,5 +11,5 @@ pgedge-pg-stat-monitor_16-2.4.0-1.el9 pgedge-vchord-bm25_16-0.2.2-1.el9 pgedge-vectorizer_16-1.1-1.el9 pgedge-system_stats_16-4.0-1.el9 -pgedge-supautils_16-3.2.2-1.el9 +pgedge-supautils_16-3.4.4-1.el9 pgedge-safesession_16-1.0-1.el9 diff --git a/packagelists/arm64/pg17.11-spock5.0.12-standard.txt b/packagelists/arm64/pg17.11-spock5.0.12-standard.txt index d3a9d00..1bc7dd7 100644 --- a/packagelists/arm64/pg17.11-spock5.0.12-standard.txt +++ b/packagelists/arm64/pg17.11-spock5.0.12-standard.txt @@ -1,7 +1,7 @@ pgedge-pgaudit_17-17.1-1.el9 pgedge-postgis36_17-3.6.4-1.el9 -pgedge-pgvector_17-0.8.5-1.el9 -pgedge-pgbackrest-2.59.0-1.el9 +pgedge-pgvector_17-0.8.7-1.el9 +pgedge-pgbackrest-2.59.3-1.el9 pgedge-python3-psycopg2-2.9.12-1.el9 pgedge-pgmq_17-1.13.0-1.el9 pgedge-pg_cron_17-1.6.8-1.el9 @@ -11,5 +11,5 @@ pgedge-pg-stat-monitor_17-2.4.0-1.el9 pgedge-vchord-bm25_17-0.2.2-1.el9 pgedge-vectorizer_17-1.1-1.el9 pgedge-system_stats_17-4.0-1.el9 -pgedge-supautils_17-3.2.2-1.el9 +pgedge-supautils_17-3.4.4-1.el9 pgedge-safesession_17-1.0-1.el9 diff --git a/packagelists/arm64/pg17.11-spock6.0.0-beta1-standard.txt b/packagelists/arm64/pg17.11-spock6.0.0-beta1-standard.txt index d3a9d00..1bc7dd7 100644 --- a/packagelists/arm64/pg17.11-spock6.0.0-beta1-standard.txt +++ b/packagelists/arm64/pg17.11-spock6.0.0-beta1-standard.txt @@ -1,7 +1,7 @@ pgedge-pgaudit_17-17.1-1.el9 pgedge-postgis36_17-3.6.4-1.el9 -pgedge-pgvector_17-0.8.5-1.el9 -pgedge-pgbackrest-2.59.0-1.el9 +pgedge-pgvector_17-0.8.7-1.el9 +pgedge-pgbackrest-2.59.3-1.el9 pgedge-python3-psycopg2-2.9.12-1.el9 pgedge-pgmq_17-1.13.0-1.el9 pgedge-pg_cron_17-1.6.8-1.el9 @@ -11,5 +11,5 @@ pgedge-pg-stat-monitor_17-2.4.0-1.el9 pgedge-vchord-bm25_17-0.2.2-1.el9 pgedge-vectorizer_17-1.1-1.el9 pgedge-system_stats_17-4.0-1.el9 -pgedge-supautils_17-3.2.2-1.el9 +pgedge-supautils_17-3.4.4-1.el9 pgedge-safesession_17-1.0-1.el9 diff --git a/packagelists/arm64/pg18.6-spock5.0.12-standard.txt b/packagelists/arm64/pg18.6-spock5.0.12-standard.txt index eab98a1..b5a60cc 100644 --- a/packagelists/arm64/pg18.6-spock5.0.12-standard.txt +++ b/packagelists/arm64/pg18.6-spock5.0.12-standard.txt @@ -1,7 +1,7 @@ pgedge-pgaudit_18-18.0-1.el9 pgedge-postgis36_18-3.6.4-1.el9 -pgedge-pgvector_18-0.8.5-1.el9 -pgedge-pgbackrest-2.59.0-1.el9 +pgedge-pgvector_18-0.8.7-1.el9 +pgedge-pgbackrest-2.59.3-1.el9 pgedge-python3-psycopg2-2.9.12-1.el9 pgedge-pgmq_18-1.13.0-1.el9 pgedge-pg_cron_18-1.6.8-1.el9 @@ -11,5 +11,5 @@ pgedge-pg-stat-monitor_18-2.4.0-1.el9 pgedge-vchord-bm25_18-0.2.2-1.el9 pgedge-vectorizer_18-1.1-1.el9 pgedge-system_stats_18-4.0-1.el9 -pgedge-supautils_18-3.2.2-1.el9 +pgedge-supautils_18-3.4.4-1.el9 pgedge-safesession_18-1.0-1.el9 diff --git a/packagelists/arm64/pg18.6-spock6.0.0-beta1-standard.txt b/packagelists/arm64/pg18.6-spock6.0.0-beta1-standard.txt index eab98a1..b5a60cc 100644 --- a/packagelists/arm64/pg18.6-spock6.0.0-beta1-standard.txt +++ b/packagelists/arm64/pg18.6-spock6.0.0-beta1-standard.txt @@ -1,7 +1,7 @@ pgedge-pgaudit_18-18.0-1.el9 pgedge-postgis36_18-3.6.4-1.el9 -pgedge-pgvector_18-0.8.5-1.el9 -pgedge-pgbackrest-2.59.0-1.el9 +pgedge-pgvector_18-0.8.7-1.el9 +pgedge-pgbackrest-2.59.3-1.el9 pgedge-python3-psycopg2-2.9.12-1.el9 pgedge-pgmq_18-1.13.0-1.el9 pgedge-pg_cron_18-1.6.8-1.el9 @@ -11,5 +11,5 @@ pgedge-pg-stat-monitor_18-2.4.0-1.el9 pgedge-vchord-bm25_18-0.2.2-1.el9 pgedge-vectorizer_18-1.1-1.el9 pgedge-system_stats_18-4.0-1.el9 -pgedge-supautils_18-3.2.2-1.el9 +pgedge-supautils_18-3.4.4-1.el9 pgedge-safesession_18-1.0-1.el9 diff --git a/scripts/build_pgedge_images.py b/scripts/build_pgedge_images.py index 61dee63..d0acd08 100755 --- a/scripts/build_pgedge_images.py +++ b/scripts/build_pgedge_images.py @@ -60,11 +60,6 @@ def from_env() -> "Config": "coldfront": "COLDFRONT_PACKAGE_LIST_FILE", } -# Flavors built for every spock line. coldfront is opted in per image (its -# protocol is validated against spock 5 only); postgres is listed once per major. -DEFAULT_FLAVORS = ["minimal", "standard"] - - @dataclass class Tag: postgres_version: str @@ -127,23 +122,20 @@ def parent_build_tag(self) -> str: The per-flavor wave model builds each flavor FROM the image the previous wave published, so the stage is never rebuilt on a different runner. - A spock-independent parent is shared by every spock line, so it is - addressed by the epoch it was actually published with rather than this - image's own. Without that, two spock lines on different epochs would - each demand a base image tagged with their epoch, and only one could - exist. Within a line the parent shares this image's epoch. + The parent is addressed by the epoch it was actually published with, + never by this image's own. An epoch marks a change to one image, so a + flavor that did not change keeps its epoch while a descendant moves on; + deriving the parent tag from the child would demand a parent rebuild + that never happened. Falls back to this image's epoch when the parent + is not in the table. """ parent = FLAVOR_PARENTS.get(self.flavor) if not parent: return "" - if parent in SPOCK_INDEPENDENT_FLAVORS: - spock_version = "" - epoch = base_image_epoch(self.postgres_version, parent) - if epoch is None: - epoch = self.epoch - else: - spock_version = self.spock_version + spock_version = "" if parent in SPOCK_INDEPENDENT_FLAVORS else self.spock_version + epoch = parent_epoch(self.postgres_version, spock_version, parent) + if epoch is None: epoch = self.epoch return str( @@ -228,34 +220,42 @@ def all_tags(self) -> list[Tag]: return [self.build_tag, *self.extra_tags] -def make_all_flavor_images( +def make_flavor_images( postgres_version: str, spock_version: str, - epoch: int, + epochs: dict[str, int], is_latest_for_pg_major: bool = False, is_latest_for_spock_major: bool = False, package_release_channel: str = "", - flavors: list[str] = None, ) -> list[PgEdgeImage]: - images: list[PgEdgeImage] = [] - for flavor in flavors if flavors is not None else DEFAULT_FLAVORS: - images.append( - PgEdgeImage( - postgres_version=postgres_version, - spock_version=spock_version, - epoch=epoch, - is_latest_for_pg_major=is_latest_for_pg_major, - is_latest_for_spock_major=is_latest_for_spock_major, - flavor=flavor, - package_release_channel=package_release_channel, - ) - ) + """Build one image per entry in `epochs`, which maps flavor -> epoch. - return images + The mapping declares both which flavors this spock line has and the epoch + each one sits on, so a flavor that changed moves while the others keep + theirs and are not rebuilt. An unknown flavor fails later on its missing + packagelist rather than silently inheriting someone else's epoch. + """ + return [ + PgEdgeImage( + postgres_version=postgres_version, + spock_version=spock_version, + epoch=epoch, + is_latest_for_pg_major=is_latest_for_pg_major, + is_latest_for_spock_major=is_latest_for_spock_major, + flavor=flavor, + package_release_channel=package_release_channel, + ) + for flavor, epoch in epochs.items() + ] # This is the list of all images that this script will build. Any new images should be # added to this list. +# TEMPORARY: supautils 3.4.4, pgvector 0.8.7 and pgBackRest 2.59.3 are only in +# the staging channel, so the spock lines build from staging until those are +# promoted. REVERT by deleting every package_release_channel="staging" below +# once they land in release; the images then build from release as usual. +# The postgres base images are untouched: their packages are already in release. all_images: list[PgEdgeImage] = [ # PostgreSQL-only base, one per major; no spock segment. PgEdgeImage( @@ -271,66 +271,73 @@ def make_all_flavor_images( is_latest_for_pg_major=True, ), # pg16 images - *make_all_flavor_images( + *make_flavor_images( postgres_version="16.15", spock_version="5.0.12", - epoch=1, + package_release_channel="staging", + epochs={"minimal": 1, "standard": 2, "coldfront": 2}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, - flavors=DEFAULT_FLAVORS + ["coldfront"], ), # pg17 images - *make_all_flavor_images( + *make_flavor_images( postgres_version="17.11", spock_version="5.0.12", - epoch=1, + package_release_channel="staging", + epochs={"minimal": 1, "standard": 2, "coldfront": 2}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, - flavors=DEFAULT_FLAVORS + ["coldfront"], ), # pg18 images - *make_all_flavor_images( + *make_flavor_images( postgres_version="18.6", spock_version="5.0.12", - epoch=1, + package_release_channel="staging", + epochs={"minimal": 1, "standard": 2, "coldfront": 2}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, - flavors=DEFAULT_FLAVORS + ["coldfront"], ), # pg16 spock60 images - *make_all_flavor_images( + *make_flavor_images( postgres_version="16.15", spock_version="6.0.0-beta1", - epoch=5, + package_release_channel="staging", + epochs={"minimal": 5, "standard": 6}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), # pg17 spock60 images - *make_all_flavor_images( + *make_flavor_images( postgres_version="17.11", spock_version="6.0.0-beta1", - epoch=5, + package_release_channel="staging", + epochs={"minimal": 5, "standard": 6}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), # pg18 spock60 images - *make_all_flavor_images( + *make_flavor_images( postgres_version="18.6", spock_version="6.0.0-beta1", - epoch=5, + package_release_channel="staging", + epochs={"minimal": 5, "standard": 6}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), ] -def base_image_epoch(postgres_version: str, flavor: str) -> int: - """Epoch the shared, spock-independent base image for this major is built with. +def parent_epoch(postgres_version: str, spock_version: str, flavor: str) -> int: + """Epoch the image this one is chained FROM is actually built with. Returns None when no such image is defined, letting the caller fall back. """ for image in all_images: - if image.flavor == flavor and image.postgres_version == postgres_version: + if ( + image.flavor == flavor + and image.postgres_version == postgres_version + and image.spock_version == spock_version + ): return image.epoch return None From 385866c3c5ad42477b0672ba83919cc95d9773c1 Mon Sep 17 00:00:00 2001 From: Muhammad Aqeel Date: Tue, 6 Oct 2026 17:57:15 +0500 Subject: [PATCH 2/6] fix: apply the package release channel in every chained stage, not just base --- Dockerfile | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Dockerfile b/Dockerfile index ef4ded6..056a15f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -112,6 +112,7 @@ FROM ${POSTGRES_IMAGE} AS minimal ARG PACKAGE_LIST_FILE ARG TARGETARCH ARG POSTGRES_MAJOR_VERSION +ARG PACKAGE_RELEASE_CHANNEL="" # The inherited stage ends as USER postgres. USER root @@ -125,6 +126,13 @@ set -o errexit set -o pipefail set -o nounset +# The repo config is inherited from the parent image, which may have been built +# from a different channel, so re-point it here rather than relying on the base +# stage. Idempotent: once rewritten there is no "release" left to match. +if [[ -n "${PACKAGE_RELEASE_CHANNEL}" ]]; then + sed -i "s|release|${PACKAGE_RELEASE_CHANNEL}|g" /etc/yum.repos.d/pgedge.repo +fi + # A delta: re-pinning a package the parent's "dnf update -y" has moved past # would be a downgrade, which dnf refuses. xargs dnf install -y < /usr/share/pgedge/packages.txt @@ -146,6 +154,7 @@ FROM ${MINIMAL_IMAGE} AS standard ARG STANDARD_PACKAGE_LIST_FILE ARG TARGETARCH ARG POSTGRES_MAJOR_VERSION +ARG PACKAGE_RELEASE_CHANNEL="" # The inherited stage ends as USER postgres. USER root @@ -159,6 +168,13 @@ set -o errexit set -o pipefail set -o nounset +# The repo config is inherited from the parent image, which may have been built +# from a different channel, so re-point it here rather than relying on the base +# stage. Idempotent: once rewritten there is no "release" left to match. +if [[ -n "${PACKAGE_RELEASE_CHANNEL}" ]]; then + sed -i "s|release|${PACKAGE_RELEASE_CHANNEL}|g" /etc/yum.repos.d/pgedge.repo +fi + # A delta: re-pinning a package the parent's "dnf update -y" has moved past # would be a downgrade, which dnf refuses. xargs dnf install -y < /usr/share/pgedge/packages.txt @@ -243,6 +259,7 @@ FROM ${STANDARD_IMAGE} AS coldfront ARG COLDFRONT_PACKAGE_LIST_FILE ARG TARGETARCH ARG POSTGRES_MAJOR_VERSION +ARG PACKAGE_RELEASE_CHANNEL="" USER root @@ -255,6 +272,13 @@ set -o errexit set -o pipefail set -o nounset +# The repo config is inherited from the parent image, which may have been built +# from a different channel, so re-point it here rather than relying on the base +# stage. Idempotent: once rewritten there is no "release" left to match. +if [[ -n "${PACKAGE_RELEASE_CHANNEL}" ]]; then + sed -i "s|release|${PACKAGE_RELEASE_CHANNEL}|g" /etc/yum.repos.d/pgedge.repo +fi + # Dependencies are dnf's to resolve. No second "dnf update -y": that would move # ColdFront past its pinned NVR. xargs dnf install -y --setopt=install_weak_deps=False < /usr/share/pgedge/coldfront-packages.txt From eed187a3ae90c56100a0669e48d79d765976d38a Mon Sep 17 00:00:00 2001 From: Muhammad Aqeel Date: Tue, 6 Oct 2026 19:47:41 +0500 Subject: [PATCH 3/6] fix: scope the staging channel to the flavors on a new epoch --- scripts/build_pgedge_images.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/scripts/build_pgedge_images.py b/scripts/build_pgedge_images.py index d0acd08..e279a86 100755 --- a/scripts/build_pgedge_images.py +++ b/scripts/build_pgedge_images.py @@ -226,7 +226,7 @@ def make_flavor_images( epochs: dict[str, int], is_latest_for_pg_major: bool = False, is_latest_for_spock_major: bool = False, - package_release_channel: str = "", + channels: dict[str, str] = None, ) -> list[PgEdgeImage]: """Build one image per entry in `epochs`, which maps flavor -> epoch. @@ -234,7 +234,14 @@ def make_flavor_images( each one sits on, so a flavor that changed moves while the others keep theirs and are not rebuilt. An unknown flavor fails later on its missing packagelist rather than silently inheriting someone else's epoch. + + `channels` maps flavor -> package release channel for the flavors that need + one; anything absent builds from the default (release). It is deliberately + per flavor rather than per line: the channel is baked into the image, so + putting a flavor on a non-default channel without also moving its epoch + would let a rebuild change what an already-published immutable tag contains. """ + channels = channels or {} return [ PgEdgeImage( postgres_version=postgres_version, @@ -243,7 +250,7 @@ def make_flavor_images( is_latest_for_pg_major=is_latest_for_pg_major, is_latest_for_spock_major=is_latest_for_spock_major, flavor=flavor, - package_release_channel=package_release_channel, + package_release_channel=channels.get(flavor, ""), ) for flavor, epoch in epochs.items() ] @@ -252,10 +259,11 @@ def make_flavor_images( # This is the list of all images that this script will build. Any new images should be # added to this list. # TEMPORARY: supautils 3.4.4, pgvector 0.8.7 and pgBackRest 2.59.3 are only in -# the staging channel, so the spock lines build from staging until those are -# promoted. REVERT by deleting every package_release_channel="staging" below -# once they land in release; the images then build from release as usual. -# The postgres base images are untouched: their packages are already in release. +# the staging channel, so the flavors carrying them build from staging until +# those are promoted. REVERT by deleting every channels={...} line below once +# they land in release. Scoped to standard and coldfront on purpose: postgres +# and minimal resolve fully on release, and putting them on staging without +# moving their epoch would let a rebuild change an already-published tag. all_images: list[PgEdgeImage] = [ # PostgreSQL-only base, one per major; no spock segment. PgEdgeImage( @@ -274,8 +282,8 @@ def make_flavor_images( *make_flavor_images( postgres_version="16.15", spock_version="5.0.12", - package_release_channel="staging", epochs={"minimal": 1, "standard": 2, "coldfront": 2}, + channels={"standard": "staging", "coldfront": "staging"}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), @@ -283,8 +291,8 @@ def make_flavor_images( *make_flavor_images( postgres_version="17.11", spock_version="5.0.12", - package_release_channel="staging", epochs={"minimal": 1, "standard": 2, "coldfront": 2}, + channels={"standard": "staging", "coldfront": "staging"}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), @@ -292,8 +300,8 @@ def make_flavor_images( *make_flavor_images( postgres_version="18.6", spock_version="5.0.12", - package_release_channel="staging", epochs={"minimal": 1, "standard": 2, "coldfront": 2}, + channels={"standard": "staging", "coldfront": "staging"}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), @@ -301,8 +309,8 @@ def make_flavor_images( *make_flavor_images( postgres_version="16.15", spock_version="6.0.0-beta1", - package_release_channel="staging", epochs={"minimal": 5, "standard": 6}, + channels={"standard": "staging"}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), @@ -310,8 +318,8 @@ def make_flavor_images( *make_flavor_images( postgres_version="17.11", spock_version="6.0.0-beta1", - package_release_channel="staging", epochs={"minimal": 5, "standard": 6}, + channels={"standard": "staging"}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), @@ -319,8 +327,8 @@ def make_flavor_images( *make_flavor_images( postgres_version="18.6", spock_version="6.0.0-beta1", - package_release_channel="staging", epochs={"minimal": 5, "standard": 6}, + channels={"standard": "staging"}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), From 6a623f7eaaad22961ecf2656e0fd35171b6335d4 Mon Sep 17 00:00:00 2001 From: Muhammad Aqeel Date: Thu, 8 Oct 2026 15:24:46 +0500 Subject: [PATCH 4/6] build: upgrade Spock to 5.0.13 and lolor to 1.2.3 --- CHANGELOG.md | 3 +- .../amd64/pg16.15-spock5.0.12-minimal.txt | 3 - ....txt => pg16.15-spock5.0.13-coldfront.txt} | 0 .../amd64/pg16.15-spock5.0.13-minimal.txt | 3 + ...d.txt => pg16.15-spock5.0.13-standard.txt} | 0 .../pg16.15-spock6.0.0-beta1-minimal.txt | 2 +- .../amd64/pg17.11-spock5.0.12-minimal.txt | 3 - ....txt => pg17.11-spock5.0.13-coldfront.txt} | 0 .../amd64/pg17.11-spock5.0.13-minimal.txt | 3 + ...d.txt => pg17.11-spock5.0.13-standard.txt} | 0 .../pg17.11-spock6.0.0-beta1-minimal.txt | 2 +- .../amd64/pg18.6-spock5.0.12-minimal.txt | 3 - ...t.txt => pg18.6-spock5.0.13-coldfront.txt} | 0 .../amd64/pg18.6-spock5.0.13-minimal.txt | 3 + ...rd.txt => pg18.6-spock5.0.13-standard.txt} | 0 .../amd64/pg18.6-spock6.0.0-beta1-minimal.txt | 2 +- .../arm64/pg16.15-spock5.0.12-minimal.txt | 3 - ....txt => pg16.15-spock5.0.13-coldfront.txt} | 0 .../arm64/pg16.15-spock5.0.13-minimal.txt | 3 + ...d.txt => pg16.15-spock5.0.13-standard.txt} | 0 .../pg16.15-spock6.0.0-beta1-minimal.txt | 2 +- .../arm64/pg17.11-spock5.0.12-minimal.txt | 3 - ....txt => pg17.11-spock5.0.13-coldfront.txt} | 0 .../arm64/pg17.11-spock5.0.13-minimal.txt | 3 + ...d.txt => pg17.11-spock5.0.13-standard.txt} | 0 .../pg17.11-spock6.0.0-beta1-minimal.txt | 2 +- .../arm64/pg18.6-spock5.0.12-minimal.txt | 3 - ...t.txt => pg18.6-spock5.0.13-coldfront.txt} | 0 .../arm64/pg18.6-spock5.0.13-minimal.txt | 3 + ...rd.txt => pg18.6-spock5.0.13-standard.txt} | 0 .../arm64/pg18.6-spock6.0.0-beta1-minimal.txt | 2 +- scripts/build_pgedge_images.py | 59 ++++++++++++------- 32 files changed, 64 insertions(+), 46 deletions(-) delete mode 100644 packagelists/amd64/pg16.15-spock5.0.12-minimal.txt rename packagelists/amd64/{pg16.15-spock5.0.12-coldfront.txt => pg16.15-spock5.0.13-coldfront.txt} (100%) create mode 100644 packagelists/amd64/pg16.15-spock5.0.13-minimal.txt rename packagelists/amd64/{pg16.15-spock5.0.12-standard.txt => pg16.15-spock5.0.13-standard.txt} (100%) delete mode 100644 packagelists/amd64/pg17.11-spock5.0.12-minimal.txt rename packagelists/amd64/{pg17.11-spock5.0.12-coldfront.txt => pg17.11-spock5.0.13-coldfront.txt} (100%) create mode 100644 packagelists/amd64/pg17.11-spock5.0.13-minimal.txt rename packagelists/amd64/{pg17.11-spock5.0.12-standard.txt => pg17.11-spock5.0.13-standard.txt} (100%) delete mode 100644 packagelists/amd64/pg18.6-spock5.0.12-minimal.txt rename packagelists/amd64/{pg18.6-spock5.0.12-coldfront.txt => pg18.6-spock5.0.13-coldfront.txt} (100%) create mode 100644 packagelists/amd64/pg18.6-spock5.0.13-minimal.txt rename packagelists/amd64/{pg18.6-spock5.0.12-standard.txt => pg18.6-spock5.0.13-standard.txt} (100%) delete mode 100644 packagelists/arm64/pg16.15-spock5.0.12-minimal.txt rename packagelists/arm64/{pg16.15-spock5.0.12-coldfront.txt => pg16.15-spock5.0.13-coldfront.txt} (100%) create mode 100644 packagelists/arm64/pg16.15-spock5.0.13-minimal.txt rename packagelists/arm64/{pg16.15-spock5.0.12-standard.txt => pg16.15-spock5.0.13-standard.txt} (100%) delete mode 100644 packagelists/arm64/pg17.11-spock5.0.12-minimal.txt rename packagelists/arm64/{pg17.11-spock5.0.12-coldfront.txt => pg17.11-spock5.0.13-coldfront.txt} (100%) create mode 100644 packagelists/arm64/pg17.11-spock5.0.13-minimal.txt rename packagelists/arm64/{pg17.11-spock5.0.12-standard.txt => pg17.11-spock5.0.13-standard.txt} (100%) delete mode 100644 packagelists/arm64/pg18.6-spock5.0.12-minimal.txt rename packagelists/arm64/{pg18.6-spock5.0.12-coldfront.txt => pg18.6-spock5.0.13-coldfront.txt} (100%) create mode 100644 packagelists/arm64/pg18.6-spock5.0.13-minimal.txt rename packagelists/arm64/{pg18.6-spock5.0.12-standard.txt => pg18.6-spock5.0.13-standard.txt} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b70c4b..acfb042 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,8 @@ - Upgraded to PostgreSQL 16.15, 17.11, and 18.6 - Upgraded PostGIS to 3.6.4, pgBackRest to 2.59.3, system_stats to 4.0, supautils to 3.4.4, and pgvector to 0.8.7 in standard images -- Upgraded Spock to 5.0.12 in the spock 5 images +- Upgraded Spock to 5.0.13 in the spock 5 images +- Upgraded lolor to 1.2.3 in minimal images ## 2025-09-03 diff --git a/packagelists/amd64/pg16.15-spock5.0.12-minimal.txt b/packagelists/amd64/pg16.15-spock5.0.12-minimal.txt deleted file mode 100644 index 4364389..0000000 --- a/packagelists/amd64/pg16.15-spock5.0.12-minimal.txt +++ /dev/null @@ -1,3 +0,0 @@ -pgedge-spock50_16-5.0.12-1.el9 -pgedge-snowflake_16-2.6.0-1.el9 -pgedge-lolor_16-1.2.2-1.el9 diff --git a/packagelists/amd64/pg16.15-spock5.0.12-coldfront.txt b/packagelists/amd64/pg16.15-spock5.0.13-coldfront.txt similarity index 100% rename from packagelists/amd64/pg16.15-spock5.0.12-coldfront.txt rename to packagelists/amd64/pg16.15-spock5.0.13-coldfront.txt diff --git a/packagelists/amd64/pg16.15-spock5.0.13-minimal.txt b/packagelists/amd64/pg16.15-spock5.0.13-minimal.txt new file mode 100644 index 0000000..6be0440 --- /dev/null +++ b/packagelists/amd64/pg16.15-spock5.0.13-minimal.txt @@ -0,0 +1,3 @@ +pgedge-spock50_16-5.0.13-1.el9 +pgedge-snowflake_16-2.6.0-1.el9 +pgedge-lolor_16-1.2.3-1.el9 diff --git a/packagelists/amd64/pg16.15-spock5.0.12-standard.txt b/packagelists/amd64/pg16.15-spock5.0.13-standard.txt similarity index 100% rename from packagelists/amd64/pg16.15-spock5.0.12-standard.txt rename to packagelists/amd64/pg16.15-spock5.0.13-standard.txt diff --git a/packagelists/amd64/pg16.15-spock6.0.0-beta1-minimal.txt b/packagelists/amd64/pg16.15-spock6.0.0-beta1-minimal.txt index 87fc969..e1ad3e1 100644 --- a/packagelists/amd64/pg16.15-spock6.0.0-beta1-minimal.txt +++ b/packagelists/amd64/pg16.15-spock6.0.0-beta1-minimal.txt @@ -1,3 +1,3 @@ pgedge-spock60_16-6.0.0-beta1_1.el9 pgedge-snowflake_16-2.6.0-1.el9 -pgedge-lolor_16-1.2.2-1.el9 +pgedge-lolor_16-1.2.3-1.el9 diff --git a/packagelists/amd64/pg17.11-spock5.0.12-minimal.txt b/packagelists/amd64/pg17.11-spock5.0.12-minimal.txt deleted file mode 100644 index 5d1c94e..0000000 --- a/packagelists/amd64/pg17.11-spock5.0.12-minimal.txt +++ /dev/null @@ -1,3 +0,0 @@ -pgedge-spock50_17-5.0.12-1.el9 -pgedge-snowflake_17-2.6.0-1.el9 -pgedge-lolor_17-1.2.2-1.el9 diff --git a/packagelists/amd64/pg17.11-spock5.0.12-coldfront.txt b/packagelists/amd64/pg17.11-spock5.0.13-coldfront.txt similarity index 100% rename from packagelists/amd64/pg17.11-spock5.0.12-coldfront.txt rename to packagelists/amd64/pg17.11-spock5.0.13-coldfront.txt diff --git a/packagelists/amd64/pg17.11-spock5.0.13-minimal.txt b/packagelists/amd64/pg17.11-spock5.0.13-minimal.txt new file mode 100644 index 0000000..58969ef --- /dev/null +++ b/packagelists/amd64/pg17.11-spock5.0.13-minimal.txt @@ -0,0 +1,3 @@ +pgedge-spock50_17-5.0.13-1.el9 +pgedge-snowflake_17-2.6.0-1.el9 +pgedge-lolor_17-1.2.3-1.el9 diff --git a/packagelists/amd64/pg17.11-spock5.0.12-standard.txt b/packagelists/amd64/pg17.11-spock5.0.13-standard.txt similarity index 100% rename from packagelists/amd64/pg17.11-spock5.0.12-standard.txt rename to packagelists/amd64/pg17.11-spock5.0.13-standard.txt diff --git a/packagelists/amd64/pg17.11-spock6.0.0-beta1-minimal.txt b/packagelists/amd64/pg17.11-spock6.0.0-beta1-minimal.txt index bdad999..26e4ce1 100644 --- a/packagelists/amd64/pg17.11-spock6.0.0-beta1-minimal.txt +++ b/packagelists/amd64/pg17.11-spock6.0.0-beta1-minimal.txt @@ -1,3 +1,3 @@ pgedge-spock60_17-6.0.0-beta1_1.el9 pgedge-snowflake_17-2.6.0-1.el9 -pgedge-lolor_17-1.2.2-1.el9 +pgedge-lolor_17-1.2.3-1.el9 diff --git a/packagelists/amd64/pg18.6-spock5.0.12-minimal.txt b/packagelists/amd64/pg18.6-spock5.0.12-minimal.txt deleted file mode 100644 index 9c97f8b..0000000 --- a/packagelists/amd64/pg18.6-spock5.0.12-minimal.txt +++ /dev/null @@ -1,3 +0,0 @@ -pgedge-spock50_18-5.0.12-1.el9 -pgedge-snowflake_18-2.6.0-1.el9 -pgedge-lolor_18-1.2.2-1.el9 diff --git a/packagelists/amd64/pg18.6-spock5.0.12-coldfront.txt b/packagelists/amd64/pg18.6-spock5.0.13-coldfront.txt similarity index 100% rename from packagelists/amd64/pg18.6-spock5.0.12-coldfront.txt rename to packagelists/amd64/pg18.6-spock5.0.13-coldfront.txt diff --git a/packagelists/amd64/pg18.6-spock5.0.13-minimal.txt b/packagelists/amd64/pg18.6-spock5.0.13-minimal.txt new file mode 100644 index 0000000..92ee528 --- /dev/null +++ b/packagelists/amd64/pg18.6-spock5.0.13-minimal.txt @@ -0,0 +1,3 @@ +pgedge-spock50_18-5.0.13-1.el9 +pgedge-snowflake_18-2.6.0-1.el9 +pgedge-lolor_18-1.2.3-1.el9 diff --git a/packagelists/amd64/pg18.6-spock5.0.12-standard.txt b/packagelists/amd64/pg18.6-spock5.0.13-standard.txt similarity index 100% rename from packagelists/amd64/pg18.6-spock5.0.12-standard.txt rename to packagelists/amd64/pg18.6-spock5.0.13-standard.txt diff --git a/packagelists/amd64/pg18.6-spock6.0.0-beta1-minimal.txt b/packagelists/amd64/pg18.6-spock6.0.0-beta1-minimal.txt index ab432d1..0a3a750 100644 --- a/packagelists/amd64/pg18.6-spock6.0.0-beta1-minimal.txt +++ b/packagelists/amd64/pg18.6-spock6.0.0-beta1-minimal.txt @@ -1,3 +1,3 @@ pgedge-spock60_18-6.0.0-beta1_1.el9 pgedge-snowflake_18-2.6.0-1.el9 -pgedge-lolor_18-1.2.2-1.el9 +pgedge-lolor_18-1.2.3-1.el9 diff --git a/packagelists/arm64/pg16.15-spock5.0.12-minimal.txt b/packagelists/arm64/pg16.15-spock5.0.12-minimal.txt deleted file mode 100644 index 4364389..0000000 --- a/packagelists/arm64/pg16.15-spock5.0.12-minimal.txt +++ /dev/null @@ -1,3 +0,0 @@ -pgedge-spock50_16-5.0.12-1.el9 -pgedge-snowflake_16-2.6.0-1.el9 -pgedge-lolor_16-1.2.2-1.el9 diff --git a/packagelists/arm64/pg16.15-spock5.0.12-coldfront.txt b/packagelists/arm64/pg16.15-spock5.0.13-coldfront.txt similarity index 100% rename from packagelists/arm64/pg16.15-spock5.0.12-coldfront.txt rename to packagelists/arm64/pg16.15-spock5.0.13-coldfront.txt diff --git a/packagelists/arm64/pg16.15-spock5.0.13-minimal.txt b/packagelists/arm64/pg16.15-spock5.0.13-minimal.txt new file mode 100644 index 0000000..6be0440 --- /dev/null +++ b/packagelists/arm64/pg16.15-spock5.0.13-minimal.txt @@ -0,0 +1,3 @@ +pgedge-spock50_16-5.0.13-1.el9 +pgedge-snowflake_16-2.6.0-1.el9 +pgedge-lolor_16-1.2.3-1.el9 diff --git a/packagelists/arm64/pg16.15-spock5.0.12-standard.txt b/packagelists/arm64/pg16.15-spock5.0.13-standard.txt similarity index 100% rename from packagelists/arm64/pg16.15-spock5.0.12-standard.txt rename to packagelists/arm64/pg16.15-spock5.0.13-standard.txt diff --git a/packagelists/arm64/pg16.15-spock6.0.0-beta1-minimal.txt b/packagelists/arm64/pg16.15-spock6.0.0-beta1-minimal.txt index 87fc969..e1ad3e1 100644 --- a/packagelists/arm64/pg16.15-spock6.0.0-beta1-minimal.txt +++ b/packagelists/arm64/pg16.15-spock6.0.0-beta1-minimal.txt @@ -1,3 +1,3 @@ pgedge-spock60_16-6.0.0-beta1_1.el9 pgedge-snowflake_16-2.6.0-1.el9 -pgedge-lolor_16-1.2.2-1.el9 +pgedge-lolor_16-1.2.3-1.el9 diff --git a/packagelists/arm64/pg17.11-spock5.0.12-minimal.txt b/packagelists/arm64/pg17.11-spock5.0.12-minimal.txt deleted file mode 100644 index 5d1c94e..0000000 --- a/packagelists/arm64/pg17.11-spock5.0.12-minimal.txt +++ /dev/null @@ -1,3 +0,0 @@ -pgedge-spock50_17-5.0.12-1.el9 -pgedge-snowflake_17-2.6.0-1.el9 -pgedge-lolor_17-1.2.2-1.el9 diff --git a/packagelists/arm64/pg17.11-spock5.0.12-coldfront.txt b/packagelists/arm64/pg17.11-spock5.0.13-coldfront.txt similarity index 100% rename from packagelists/arm64/pg17.11-spock5.0.12-coldfront.txt rename to packagelists/arm64/pg17.11-spock5.0.13-coldfront.txt diff --git a/packagelists/arm64/pg17.11-spock5.0.13-minimal.txt b/packagelists/arm64/pg17.11-spock5.0.13-minimal.txt new file mode 100644 index 0000000..58969ef --- /dev/null +++ b/packagelists/arm64/pg17.11-spock5.0.13-minimal.txt @@ -0,0 +1,3 @@ +pgedge-spock50_17-5.0.13-1.el9 +pgedge-snowflake_17-2.6.0-1.el9 +pgedge-lolor_17-1.2.3-1.el9 diff --git a/packagelists/arm64/pg17.11-spock5.0.12-standard.txt b/packagelists/arm64/pg17.11-spock5.0.13-standard.txt similarity index 100% rename from packagelists/arm64/pg17.11-spock5.0.12-standard.txt rename to packagelists/arm64/pg17.11-spock5.0.13-standard.txt diff --git a/packagelists/arm64/pg17.11-spock6.0.0-beta1-minimal.txt b/packagelists/arm64/pg17.11-spock6.0.0-beta1-minimal.txt index bdad999..26e4ce1 100644 --- a/packagelists/arm64/pg17.11-spock6.0.0-beta1-minimal.txt +++ b/packagelists/arm64/pg17.11-spock6.0.0-beta1-minimal.txt @@ -1,3 +1,3 @@ pgedge-spock60_17-6.0.0-beta1_1.el9 pgedge-snowflake_17-2.6.0-1.el9 -pgedge-lolor_17-1.2.2-1.el9 +pgedge-lolor_17-1.2.3-1.el9 diff --git a/packagelists/arm64/pg18.6-spock5.0.12-minimal.txt b/packagelists/arm64/pg18.6-spock5.0.12-minimal.txt deleted file mode 100644 index 9c97f8b..0000000 --- a/packagelists/arm64/pg18.6-spock5.0.12-minimal.txt +++ /dev/null @@ -1,3 +0,0 @@ -pgedge-spock50_18-5.0.12-1.el9 -pgedge-snowflake_18-2.6.0-1.el9 -pgedge-lolor_18-1.2.2-1.el9 diff --git a/packagelists/arm64/pg18.6-spock5.0.12-coldfront.txt b/packagelists/arm64/pg18.6-spock5.0.13-coldfront.txt similarity index 100% rename from packagelists/arm64/pg18.6-spock5.0.12-coldfront.txt rename to packagelists/arm64/pg18.6-spock5.0.13-coldfront.txt diff --git a/packagelists/arm64/pg18.6-spock5.0.13-minimal.txt b/packagelists/arm64/pg18.6-spock5.0.13-minimal.txt new file mode 100644 index 0000000..92ee528 --- /dev/null +++ b/packagelists/arm64/pg18.6-spock5.0.13-minimal.txt @@ -0,0 +1,3 @@ +pgedge-spock50_18-5.0.13-1.el9 +pgedge-snowflake_18-2.6.0-1.el9 +pgedge-lolor_18-1.2.3-1.el9 diff --git a/packagelists/arm64/pg18.6-spock5.0.12-standard.txt b/packagelists/arm64/pg18.6-spock5.0.13-standard.txt similarity index 100% rename from packagelists/arm64/pg18.6-spock5.0.12-standard.txt rename to packagelists/arm64/pg18.6-spock5.0.13-standard.txt diff --git a/packagelists/arm64/pg18.6-spock6.0.0-beta1-minimal.txt b/packagelists/arm64/pg18.6-spock6.0.0-beta1-minimal.txt index ab432d1..0a3a750 100644 --- a/packagelists/arm64/pg18.6-spock6.0.0-beta1-minimal.txt +++ b/packagelists/arm64/pg18.6-spock6.0.0-beta1-minimal.txt @@ -1,3 +1,3 @@ pgedge-spock60_18-6.0.0-beta1_1.el9 pgedge-snowflake_18-2.6.0-1.el9 -pgedge-lolor_18-1.2.2-1.el9 +pgedge-lolor_18-1.2.3-1.el9 diff --git a/scripts/build_pgedge_images.py b/scripts/build_pgedge_images.py index e279a86..578f9a6 100755 --- a/scripts/build_pgedge_images.py +++ b/scripts/build_pgedge_images.py @@ -258,12 +258,17 @@ def make_flavor_images( # This is the list of all images that this script will build. Any new images should be # added to this list. -# TEMPORARY: supautils 3.4.4, pgvector 0.8.7 and pgBackRest 2.59.3 are only in -# the staging channel, so the flavors carrying them build from staging until -# those are promoted. REVERT by deleting every channels={...} line below once -# they land in release. Scoped to standard and coldfront on purpose: postgres -# and minimal resolve fully on release, and putting them on staging without -# moving their epoch would let a rebuild change an already-published tag. +# TEMPORARY: spock 5.0.13, lolor 1.2.3, supautils 3.4.4, pgvector 0.8.7 and +# pgBackRest 2.59.3 are only in the staging channel, so the flavors carrying them build +# from staging until those are promoted. REVERT by deleting every +# channels={...} line below once they land in release. +# +# Every flavor on staging sits on an epoch that has never been published -- +# spock 5.0.13 is a new identity, so its whole line starts at 1. That is the +# rule: a non-default channel is baked into the image, so it only goes on an +# image whose tag does not exist yet, or a rebuild could change what an +# already-published immutable tag contains. The postgres base images stay on +# release: their packages are already there and their epoch is published. all_images: list[PgEdgeImage] = [ # PostgreSQL-only base, one per major; no spock segment. PgEdgeImage( @@ -281,27 +286,39 @@ def make_flavor_images( # pg16 images *make_flavor_images( postgres_version="16.15", - spock_version="5.0.12", - epochs={"minimal": 1, "standard": 2, "coldfront": 2}, - channels={"standard": "staging", "coldfront": "staging"}, + spock_version="5.0.13", + epochs={"minimal": 1, "standard": 1, "coldfront": 1}, + channels={ + "minimal": "staging", + "standard": "staging", + "coldfront": "staging", + }, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), # pg17 images *make_flavor_images( postgres_version="17.11", - spock_version="5.0.12", - epochs={"minimal": 1, "standard": 2, "coldfront": 2}, - channels={"standard": "staging", "coldfront": "staging"}, + spock_version="5.0.13", + epochs={"minimal": 1, "standard": 1, "coldfront": 1}, + channels={ + "minimal": "staging", + "standard": "staging", + "coldfront": "staging", + }, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), # pg18 images *make_flavor_images( postgres_version="18.6", - spock_version="5.0.12", - epochs={"minimal": 1, "standard": 2, "coldfront": 2}, - channels={"standard": "staging", "coldfront": "staging"}, + spock_version="5.0.13", + epochs={"minimal": 1, "standard": 1, "coldfront": 1}, + channels={ + "minimal": "staging", + "standard": "staging", + "coldfront": "staging", + }, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), @@ -309,8 +326,8 @@ def make_flavor_images( *make_flavor_images( postgres_version="16.15", spock_version="6.0.0-beta1", - epochs={"minimal": 5, "standard": 6}, - channels={"standard": "staging"}, + epochs={"minimal": 6, "standard": 6}, + channels={"minimal": "staging", "standard": "staging"}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), @@ -318,8 +335,8 @@ def make_flavor_images( *make_flavor_images( postgres_version="17.11", spock_version="6.0.0-beta1", - epochs={"minimal": 5, "standard": 6}, - channels={"standard": "staging"}, + epochs={"minimal": 6, "standard": 6}, + channels={"minimal": "staging", "standard": "staging"}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), @@ -327,8 +344,8 @@ def make_flavor_images( *make_flavor_images( postgres_version="18.6", spock_version="6.0.0-beta1", - epochs={"minimal": 5, "standard": 6}, - channels={"standard": "staging"}, + epochs={"minimal": 6, "standard": 6}, + channels={"minimal": "staging", "standard": "staging"}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), From 5897efbab2e114ca3c214f8bf6002456761a2be5 Mon Sep 17 00:00:00 2001 From: Muhammad Aqeel Date: Thu, 8 Oct 2026 17:14:53 +0500 Subject: [PATCH 5/6] fix: chain from the parent's published image in the standalone build path --- scripts/build_pgedge_images.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/scripts/build_pgedge_images.py b/scripts/build_pgedge_images.py index 578f9a6..0d4ae26 100755 --- a/scripts/build_pgedge_images.py +++ b/scripts/build_pgedge_images.py @@ -536,6 +536,20 @@ def build( if only_arch: bake_args.extend(("--set", f"default.platform=linux/{only_arch}")) + # Start FROM the parent's published image, the way the CI waves do. Left to + # the Dockerfile default this would be a single-graph build, and bake + # applies one PACKAGE_RELEASE_CHANNEL to every stage in that graph -- so a + # flavor on a non-default channel would rebuild its ancestors on that + # channel too, and publish an image the wave model never produces under the + # same tag. all_images is ordered base-first and each image is pushed before + # the next is processed, so the parent is always there by the time we + # reference it. + parent_env = {} + parent = image.parent_build_tag + parent_arg = FLAVOR_IMAGE_ARGS.get(image.flavor, "") + if parent and parent_arg: + parent_env[parent_arg] = f"{repo}:{parent}" + subprocess.check_output( bake_cmd(*bake_args), env={ @@ -543,6 +557,7 @@ def build( "PACKAGE_RELEASE_CHANNEL": image.package_release_channel, "POSTGRES_MAJOR_VERSION": image.postgres_major, **image.package_list_args, + **parent_env, "TAG": f"{repo}:{image.build_tag}", "TARGET": image.flavor, }, From 6c4795d2e6eecdd8ef1360b06adc8d57f066427a Mon Sep 17 00:00:00 2001 From: Muhammad Aqeel Date: Fri, 9 Oct 2026 14:43:32 +0500 Subject: [PATCH 6/6] build: drop the temporary staging channel overrides --- scripts/build_pgedge_images.py | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/scripts/build_pgedge_images.py b/scripts/build_pgedge_images.py index 0d4ae26..ba4a5a8 100755 --- a/scripts/build_pgedge_images.py +++ b/scripts/build_pgedge_images.py @@ -258,17 +258,6 @@ def make_flavor_images( # This is the list of all images that this script will build. Any new images should be # added to this list. -# TEMPORARY: spock 5.0.13, lolor 1.2.3, supautils 3.4.4, pgvector 0.8.7 and -# pgBackRest 2.59.3 are only in the staging channel, so the flavors carrying them build -# from staging until those are promoted. REVERT by deleting every -# channels={...} line below once they land in release. -# -# Every flavor on staging sits on an epoch that has never been published -- -# spock 5.0.13 is a new identity, so its whole line starts at 1. That is the -# rule: a non-default channel is baked into the image, so it only goes on an -# image whose tag does not exist yet, or a rebuild could change what an -# already-published immutable tag contains. The postgres base images stay on -# release: their packages are already there and their epoch is published. all_images: list[PgEdgeImage] = [ # PostgreSQL-only base, one per major; no spock segment. PgEdgeImage( @@ -288,11 +277,6 @@ def make_flavor_images( postgres_version="16.15", spock_version="5.0.13", epochs={"minimal": 1, "standard": 1, "coldfront": 1}, - channels={ - "minimal": "staging", - "standard": "staging", - "coldfront": "staging", - }, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), @@ -301,11 +285,6 @@ def make_flavor_images( postgres_version="17.11", spock_version="5.0.13", epochs={"minimal": 1, "standard": 1, "coldfront": 1}, - channels={ - "minimal": "staging", - "standard": "staging", - "coldfront": "staging", - }, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), @@ -314,11 +293,6 @@ def make_flavor_images( postgres_version="18.6", spock_version="5.0.13", epochs={"minimal": 1, "standard": 1, "coldfront": 1}, - channels={ - "minimal": "staging", - "standard": "staging", - "coldfront": "staging", - }, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), @@ -327,7 +301,6 @@ def make_flavor_images( postgres_version="16.15", spock_version="6.0.0-beta1", epochs={"minimal": 6, "standard": 6}, - channels={"minimal": "staging", "standard": "staging"}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), @@ -336,7 +309,6 @@ def make_flavor_images( postgres_version="17.11", spock_version="6.0.0-beta1", epochs={"minimal": 6, "standard": 6}, - channels={"minimal": "staging", "standard": "staging"}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ), @@ -345,7 +317,6 @@ def make_flavor_images( postgres_version="18.6", spock_version="6.0.0-beta1", epochs={"minimal": 6, "standard": 6}, - channels={"minimal": "staging", "standard": "staging"}, is_latest_for_pg_major=True, is_latest_for_spock_major=True, ),