Skip to content

Commit bd5d5ca

Browse files
committed
feat: pg_cron version switcher in pkg and prestart
1 parent a56ae15 commit bd5d5ca

File tree

4 files changed

+94
-5
lines changed

4 files changed

+94
-5
lines changed

ansible/files/postgres_prestart.sh.j2

+55
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,62 @@ update_orioledb_buffers() {
2626
fi
2727
}
2828

29+
check_extensions_file() {
30+
local extensions_file="/root/pg_extensions.json"
31+
if [ ! -f "$extensions_file" ]; then
32+
echo "extensions: No extensions file found, skipping extensions versions check"
33+
return 1
34+
fi
35+
return 0
36+
}
37+
38+
get_pg_cron_version() {
39+
if ! check_extensions_file; then
40+
return
41+
fi
42+
43+
local version
44+
version=$(sudo -u postgres /home/postgres/.nix-profile/bin/jq -r '.pg_cron // empty' "/root/pg_extensions.json")
45+
if [ -z "$version" ]; then
46+
echo "pg_cron: Not specified in extensions file"
47+
return
48+
fi
49+
50+
if ! [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
51+
echo "pg_cron: Invalid version format: $version"
52+
return
53+
fi
54+
55+
echo "$version"
56+
}
57+
58+
switch_pg_cron_version() {
59+
local version="$1"
60+
local switch_script="/home/postgres/.nix-profile/bin/switch_pg_cron_version"
61+
62+
if [ ! -x "$switch_script" ]; then
63+
echo "pg_cron: No version switch script available"
64+
return
65+
fi
66+
67+
echo "pg_cron: Switching to version $version"
68+
sudo -u postgres "$switch_script" "$version"
69+
echo "pg_cron: Version switch completed"
70+
}
71+
72+
handle_pg_cron_version() {
73+
local version
74+
version=$(get_pg_cron_version)
75+
if [ -n "$version" ]; then
76+
switch_pg_cron_version "$version"
77+
fi
78+
}
79+
2980
main() {
81+
# 1. pg_cron version handling
82+
handle_pg_cron_version
83+
84+
# 2. orioledb handling
3085
local has_orioledb=$(check_orioledb_enabled)
3186
if [ "$has_orioledb" -lt 1 ]; then
3287
return 0

ansible/tasks/stage2-setup-postgres.yml

+6
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@
9090
shell: |
9191
sudo -u postgres bash -c ". /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && nix profile install github:supabase/postgres/{{ git_commit_sha }}#{{postgresql_version}}_src"
9292
when: stage2_nix
93+
94+
- name: Install jq from nix binary cache
95+
become: yes
96+
shell: |
97+
sudo -u postgres bash -c ". /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && nix profile install github:supabase/postgres/{{ git_commit_sha }}#jq"
98+
when: stage2_nix
9399

94100
- name: Set ownership and permissions for /etc/ssl/private
95101
become: yes

ansible/vars.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ postgres_major:
99

1010
# Full version strings for each major version
1111
postgres_release:
12-
postgresorioledb-17: "17.0.1.067-orioledb-rc-1"
13-
postgres17: "17.4.1.017-rc-1"
14-
postgres15: "15.8.1.074-rc-1"
12+
postgresorioledb-17: "17.0.1.067-orioledb-pgcron-2"
13+
postgres17: "17.4.1.017-pgcron-2"
14+
postgres15: "15.8.1.074-pgcron-2"
1515

1616
# Non Postgres Extensions
1717
pgbouncer_release: "1.19.0"

nix/ext/pg_cron.nix

+30-2
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ let
5050
'';
5151

5252
installPhase = ''
53-
mkdir -p $out/{lib,share/postgresql/extension}
53+
mkdir -p $out/{lib,share/postgresql/extension,bin}
5454
5555
# Install versioned library
5656
install -Dm755 pg_cron${postgresql.dlSuffix} $out/lib/pg_cron-${pgCronVersion}${postgresql.dlSuffix}
@@ -83,7 +83,7 @@ stdenv.mkDerivation {
8383
dontBuild = true;
8484

8585
installPhase = ''
86-
mkdir -p $out/{lib,share/postgresql/extension}
86+
mkdir -p $out/{lib,share/postgresql/extension,bin}
8787
8888
# Install all versions
8989
for drv in ${lib.concatStringsSep " " (lib.attrValues allVersionsForPg)}; do
@@ -101,6 +101,34 @@ stdenv.mkDerivation {
101101
102102
# Library symlink
103103
ln -sfnv pg_cron-$latest_version${postgresql.dlSuffix} $out/lib/pg_cron${postgresql.dlSuffix}
104+
105+
# Create version switcher script
106+
cat > $out/bin/switch_pg_cron_version <<'EOF'
107+
#!/bin/sh
108+
set -e
109+
110+
if [ $# -ne 1 ]; then
111+
echo "Usage: $0 <version>"
112+
echo "Example: $0 1.4.2"
113+
exit 1
114+
fi
115+
116+
VERSION=$1
117+
LIB_DIR=$(dirname "$0")/../lib
118+
119+
# Check if version exists
120+
if [ ! -f "$LIB_DIR/pg_cron-$VERSION${postgresql.dlSuffix}" ]; then
121+
echo "Error: Version $VERSION not found"
122+
exit 1
123+
fi
124+
125+
# Update library symlink
126+
ln -sfnv "pg_cron-$VERSION${postgresql.dlSuffix}" "$LIB_DIR/pg_cron${postgresql.dlSuffix}"
127+
128+
echo "Successfully switched pg_cron to version $VERSION"
129+
EOF
130+
131+
chmod +x $out/bin/switch_pg_cron_version
104132
'';
105133

106134
meta = with lib; {

0 commit comments

Comments
 (0)