ABI Test #1520
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Test minimum and maximum ABI compatible postgres version | |
# | |
# Build timescaledb against specific postgres version and then run our | |
# tests with that library loaded in a different postgres version. | |
# This is to detect changes in required minimum/maximum postgres versions | |
# for our built packages. | |
# This test is expected to fail when upstream does ABI incompatible changes | |
# in a new minor postgresql version. | |
name: ABI Test | |
"on": | |
schedule: | |
# run daily 20:00 on main branch | |
- cron: '0 20 * * *' | |
push: | |
branches: | |
- prerelease_test | |
- trigger/abi | |
pull_request: | |
paths: .github/workflows/abi.yaml | |
jobs: | |
config: | |
runs-on: ubuntu-latest | |
outputs: | |
pg14_abi_min: ${{ steps.config.outputs.pg14_abi_min }} | |
pg15_abi_min: ${{ steps.config.outputs.pg15_abi_min }} | |
pg16_abi_min: ${{ steps.config.outputs.pg16_abi_min }} | |
pg17_abi_min: ${{ steps.config.outputs.pg17_abi_min }} | |
pg14_latest: ${{ steps.config.outputs.pg14_latest }} | |
pg15_latest: ${{ steps.config.outputs.pg15_latest }} | |
pg16_latest: ${{ steps.config.outputs.pg16_latest }} | |
pg17_latest: ${{ steps.config.outputs.pg17_latest }} | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v4 | |
- name: Read configuration | |
id: config | |
run: python .github/gh_config_reader.py | |
abi_test: | |
name: ABI Test ${{ matrix.dir }} PG${{ matrix.pg }} | |
runs-on: ubuntu-latest | |
needs: config | |
strategy: | |
fail-fast: false | |
matrix: | |
dir: [ "forward", "backward" ] | |
pg: [ 14, 15, 16, 17 ] | |
include: | |
- dir: backward | |
pg: 14 | |
builder: ${{ fromJson(needs.config.outputs.pg14_latest) }}-alpine3.19 | |
tester: ${{ fromJson(needs.config.outputs.pg14_abi_min) }}-alpine | |
ignores: memoize | |
- dir: forward | |
pg: 14 | |
builder: ${{ fromJson(needs.config.outputs.pg14_abi_min) }}-alpine | |
tester: ${{ fromJson(needs.config.outputs.pg14_latest) }}-alpine3.19 | |
- dir: backward | |
pg: 15 | |
builder: ${{ fromJson(needs.config.outputs.pg15_latest) }}-alpine3.19 | |
tester: ${{ fromJson(needs.config.outputs.pg15_abi_min) }}-alpine | |
- dir: forward | |
pg: 15 | |
builder: ${{ fromJson(needs.config.outputs.pg15_abi_min) }}-alpine | |
tester: ${{ fromJson(needs.config.outputs.pg15_latest) }}-alpine3.19 | |
- dir: backward | |
pg: 16 | |
builder: ${{ fromJson(needs.config.outputs.pg16_latest) }}-alpine3.19 | |
tester: ${{ fromJson(needs.config.outputs.pg16_abi_min) }}-alpine | |
# this test has issues with 16.0 version of pg_dump binary | |
# which affects backwards test only | |
ignores: pg_dump_unprivileged | |
- dir: forward | |
pg: 16 | |
builder: ${{ fromJson(needs.config.outputs.pg16_abi_min) }}-alpine | |
tester: ${{ fromJson(needs.config.outputs.pg16_latest) }}-alpine3.19 | |
- dir: backward | |
pg: 17 | |
builder: ${{ fromJson(needs.config.outputs.pg17_latest) }}-alpine3.19 | |
tester: ${{ fromJson(needs.config.outputs.pg17_abi_min) }}-alpine | |
- dir: forward | |
pg: 17 | |
builder: ${{ fromJson(needs.config.outputs.pg17_abi_min) }}-alpine | |
tester: ${{ fromJson(needs.config.outputs.pg17_latest) }}-alpine3.19 | |
steps: | |
- name: Checkout TimescaleDB | |
uses: actions/checkout@v4 | |
- name: Build extension | |
run: | | |
BUILDER_IMAGE="postgres:${{matrix.builder}}" | |
docker pull ${BUILDER_IMAGE} | |
docker buildx imagetools inspect ${BUILDER_IMAGE} | |
docker run -i --rm -v $(pwd):/mnt -e EXTRA_PKGS="${EXTRA_PKGS}" ${BUILDER_IMAGE} bash <<"EOF" | |
apk add cmake gcc make build-base krb5-dev git ${EXTRA_PKGS} | |
# We run the same extension on different docker images, old versions | |
# have OpenSSL 1.1 and the new versions have OpenSSL 3, so we try to | |
# pin the 1.1. Note that depending on PG version, both images might | |
# have 1.1 or 3, so we first try to install the versioned 1.1 package, | |
# and if it's not present, it means the unversioned package is 1.1, so | |
# we install it. | |
apk add openssl1.1-compat-dev || apk add openssl-dev | |
git config --global --add safe.directory /mnt | |
cd /mnt | |
BUILD_DIR=build_abi BUILD_FORCE_REMOVE=true ./bootstrap | |
make -C build_abi install | |
mkdir -p build_abi/install_ext build_abi/install_lib | |
cp `pg_config --sharedir`/extension/timescaledb*.{control,sql} build_abi/install_ext | |
cp `pg_config --pkglibdir`/timescaledb*.so build_abi/install_lib | |
EOF | |
- name: Run tests | |
run: | | |
TEST_IMAGE="postgres:${{ matrix.tester }}" | |
docker pull ${TEST_IMAGE} | |
docker buildx imagetools inspect ${TEST_IMAGE} | |
docker run -i --rm -v $(pwd):/mnt -e EXTRA_PKGS="${EXTRA_PKGS}" ${TEST_IMAGE} bash <<"EOF" | |
apk add cmake gcc make build-base krb5-dev sudo ${EXTRA_PKGS} | |
apk add openssl1.1-compat-dev || apk add openssl-dev | |
cd /mnt | |
cp build_abi/install_ext/* `pg_config --sharedir`/extension/ | |
cp build_abi/install_lib/* `pg_config --pkglibdir` | |
chown -R postgres /mnt | |
set -o pipefail | |
[ -f /usr/bin/gmake ] || ln -s /usr/bin/make /usr/bin/gmake | |
sudo -u postgres make -C build_abi -k regresscheck regresscheck-t \ | |
regresscheck-shared IGNORES="${{matrix.ignores}}" | tee installcheck.log | |
EOF | |
- name: Show regression diffs | |
if: always() | |
id: collectlogs | |
run: | | |
sudo chmod a+rw . | |
sudo find build_abi -name regression.diffs -exec cat {} + > regression.log | |
sudo find build_abi -name postmaster.log -exec cat {} + > postmaster.log | |
if [[ -s regression.log ]]; then echo "regression_diff=true" >>$GITHUB_OUTPUT; fi | |
grep -e 'FAILED' -e 'failed (ignored)' -e 'not ok' installcheck.log || true | |
cat regression.log | |
- name: Save regression diffs | |
if: always() && steps.collectlogs.outputs.regression_diff == 'true' | |
uses: actions/upload-artifact@v4 | |
with: | |
name: Regression diff ABI Breakage ${{ matrix.dir }} PG${{ matrix.pg }} | |
path: regression.log | |
- name: Save postmaster.log | |
if: always() | |
uses: actions/upload-artifact@v4 | |
with: | |
name: PostgreSQL log ABI Breakage ${{ matrix.dir }} PG${{ matrix.pg }} | |
path: postmaster.log | |