Skip to content

ABI Test

ABI Test #1289

Workflow file for this run

# 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:
pg13_abi_min: ${{ steps.config.outputs.pg13_abi_min }}
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 }}
pg13_latest: ${{ steps.config.outputs.pg13_latest }}
pg14_latest: ${{ steps.config.outputs.pg14_latest }}
pg15_latest: ${{ steps.config.outputs.pg15_latest }}
pg16_latest: ${{ steps.config.outputs.pg16_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: [ 13, 14, 15 ]
os: [ windows-2019 ]
include:
- dir: backward
pg: 13
builder: ${{ fromJson(needs.config.outputs.pg13_latest) }}-alpine3.18
tester: ${{ fromJson(needs.config.outputs.pg13_abi_min ) }}-alpine
- dir: forward
pg: 13
builder: ${{ fromJson(needs.config.outputs.pg13_abi_min ) }}-alpine
tester: ${{ fromJson(needs.config.outputs.pg13_latest) }}-alpine3.18
- dir: backward
pg: 14
builder: ${{ fromJson(needs.config.outputs.pg14_latest) }}-alpine3.18
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.18
- dir: backward
pg: 15
builder: ${{ fromJson(needs.config.outputs.pg15_latest) }}-alpine3.18
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.18
- dir: backward
pg: 16
builder: ${{ fromJson(needs.config.outputs.pg16_latest) }}-alpine3.18
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.18
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
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