@@ -144,3 +144,95 @@ jobs:
144144
145145 - name : Perform test
146146 run : cd wrappers && cargo pgrx test --features "wasm_fdw pg15"
147+
148+ # =============================================================
149+ # Extension upgrade test
150+ # =============================================================
151+ test_upgrade :
152+ name : Run extension upgrade test
153+ needs : [changes]
154+ if : needs.changes.outputs.native == 'true'
155+ runs-on : blacksmith-4vcpu-ubuntu-2404
156+
157+ steps :
158+ - name : Checkout code
159+ uses : actions/checkout@v6
160+ with :
161+ fetch-depth : 0
162+
163+ - uses : actions-rust-lang/setup-rust-toolchain@v1
164+ with :
165+ toolchain : 1.88.0
166+
167+ - name : Install PostgreSQL 15
168+ run : |
169+ sudo apt remove -y postgres*
170+ sudo apt -y install curl ca-certificates build-essential pkg-config libssl-dev
171+ sudo install -d /usr/share/postgresql-common/pgdg
172+ sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc
173+ . /etc/os-release
174+ sudo sh -c "echo 'deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $VERSION_CODENAME-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
175+ sudo apt update -y -qq --fix-missing
176+ sudo apt -y install postgresql-client-15 postgresql-15 postgresql-server-dev-15
177+ sudo apt -y autoremove && sudo apt -y clean
178+ sudo chmod a+rwx `/usr/lib/postgresql/15/bin/pg_config --pkglibdir` `/usr/lib/postgresql/15/bin/pg_config --sharedir`/extension /var/run/postgresql/
179+
180+ - run : cargo install --locked cargo-pgrx --version 0.16.1
181+ - run : cargo pgrx init --pg15 /usr/lib/postgresql/15/bin/pg_config
182+ - name : Make Rust toolchain available to sudo
183+ run : sudo ln -sf "$HOME/.cargo/bin"/* /usr/local/bin/
184+
185+ - name : Download and install latest released extension
186+ env :
187+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
188+ run : |
189+ LATEST_TAG=$(gh release list --repo "$GITHUB_REPOSITORY" --limit 50 --json tagName --jq '[.[] | select(.tagName | test("^v[0-9]+\\.[0-9]+\\.[0-9]+$"))] | .[0].tagName')
190+ echo "LATEST_TAG=${LATEST_TAG}" >> "$GITHUB_ENV"
191+ echo "OLD_VERSION=${LATEST_TAG#v}" >> "$GITHUB_ENV"
192+ gh release download "$LATEST_TAG" \
193+ --repo "$GITHUB_REPOSITORY" \
194+ --pattern "wrappers-${LATEST_TAG}-pg15-amd64-linux-gnu.deb" \
195+ --dir /tmp/wrappers-released
196+ sudo dpkg -i /tmp/wrappers-released/*.deb
197+
198+ - name : Build and install current branch extension
199+ run : |
200+ NEW_VERSION=$(cargo metadata --format-version 1 --no-deps --manifest-path wrappers/Cargo.toml | jq -r '.packages[] | select(.name == "wrappers") | .version')
201+ echo "NEW_VERSION=${NEW_VERSION}" >> "$GITHUB_ENV"
202+ cd wrappers && sudo env PATH="$PATH" RUSTUP_HOME="$HOME/.rustup" CARGO_HOME="$HOME/.cargo" PGRX_HOME="$HOME/.pgrx" cargo pgrx install \
203+ --no-default-features \
204+ --features "pg15,native_fdws" \
205+ --pg-config /usr/lib/postgresql/15/bin/pg_config
206+
207+ - name : Create upgrade SQL script
208+ run : |
209+ if [[ "$OLD_VERSION" != "$NEW_VERSION" ]]; then
210+ sudo cp /usr/share/postgresql/15/extension/wrappers--${NEW_VERSION}.sql \
211+ /usr/share/postgresql/15/extension/wrappers--${OLD_VERSION}--${NEW_VERSION}.sql
212+ fi
213+
214+ - name : Run upgrade test
215+ run : |
216+ if ! sudo pg_lsclusters | awk '$1 == "15" && $2 == "main" {found=1} END {exit !found}'; then
217+ sudo pg_createcluster 15 main
218+ fi
219+
220+ sudo pg_ctlcluster 15 main start
221+ PG_PORT=$(sudo pg_lsclusters | awk '$1 == "15" && $2 == "main" {print $3}')
222+ until sudo -u postgres psql -p "$PG_PORT" -c '\q' 2>/dev/null; do sleep 1; done
223+
224+ sudo -u postgres psql -p "$PG_PORT" -c "CREATE EXTENSION wrappers VERSION '${OLD_VERSION}';"
225+
226+ if [[ "$OLD_VERSION" != "$NEW_VERSION" ]]; then
227+ sudo -u postgres psql -p "$PG_PORT" -c "ALTER EXTENSION wrappers UPDATE TO '${NEW_VERSION}';"
228+ EXPECTED="$NEW_VERSION"
229+ else
230+ EXPECTED="$OLD_VERSION"
231+ fi
232+
233+ INSTALLED=$(sudo -u postgres psql -p "$PG_PORT" -t -A -c "SELECT extversion FROM pg_extension WHERE extname = 'wrappers';")
234+ if [[ "$INSTALLED" != "$EXPECTED" ]]; then
235+ echo "Upgrade test FAILED: expected ${EXPECTED}, got ${INSTALLED}"
236+ exit 1
237+ fi
238+ echo "Upgrade test passed: ${OLD_VERSION} -> ${NEW_VERSION}"
0 commit comments