Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
282 changes: 282 additions & 0 deletions .github/workflows/package-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,282 @@
name: Package Release

on:
workflow_dispatch:
inputs:
tag:
description: 'Tag/version to package, for example v0.2.2'
required: true
type: string
publish_release:
description: 'Upload assets to the GitHub release'
required: true
default: false
type: boolean
push:
tags:
- 'v*'
pull_request:
paths:
- '.github/workflows/package-release.yml'
- 'Cargo.toml'
- 'Cargo.lock'
- 'Makefile'
- 'expected/**'
- 'scripts/package-deb.sh'
- 'scripts/validate-deb-package.sh'
- 'sql/**'

permissions:
contents: write

env:
CARGO_TERM_COLOR: always
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
CARGO_PGRX_VERSION: 0.16.1
PACKAGE_HTTP_FEATURE: http-allow-azure-domains

concurrency:
group: package-release-${{ github.event.inputs.tag || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
build-packages:
name: Build PG${{ matrix.pg_version }} ${{ matrix.platform.type }} package
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
pg_version: [17, 18]
platform:
- type: amd64
docker_platform: linux/amd64
file_pattern: x86-64

Comment thread
pinodeca marked this conversation as resolved.
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.tag || github.ref }}

- name: Set version
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "VERSION=${{ github.event.inputs.tag }}" >> "$GITHUB_ENV"
elif [ "${{ github.event_name }}" = "pull_request" ]; then
crate_version=$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -1)
echo "VERSION=${crate_version}~pr${{ github.event.pull_request.number }}+${GITHUB_SHA::7}" >> "$GITHUB_ENV"
else
echo "VERSION=${GITHUB_REF#refs/tags/}" >> "$GITHUB_ENV"
fi

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

Comment thread
pinodeca marked this conversation as resolved.
- name: Build pgrx package in Docker
run: |
docker run --rm \
--platform "${{ matrix.platform.docker_platform }}" \
-e VERSION \
-v "$PWD:/work" \
-w /work \
--user root \
rustlang/rust:nightly-bookworm \
bash -euxo pipefail -c '
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release \
pkg-config \
libssl-dev \
libclang-dev \
clang \
build-essential \
bison \
flex \
libreadline-dev \
zlib1g-dev \
libxml2-dev \
libxslt1-dev \
libicu-dev \
file \
zip

install -d -m 0755 /usr/share/keyrings
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc \
| gpg --dearmor -o /usr/share/keyrings/postgresql-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/postgresql-keyring.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" \
> /etc/apt/sources.list.d/pgdg.list
apt-get update
apt-get install -y \
postgresql-${{ matrix.pg_version }} \
postgresql-server-dev-${{ matrix.pg_version }}

export PG_CONFIG="/usr/lib/postgresql/${{ matrix.pg_version }}/bin/pg_config"
export PATH="/usr/lib/postgresql/${{ matrix.pg_version }}/bin:$PATH"
cargo install cargo-pgrx --version "${{ env.CARGO_PGRX_VERSION }}" --locked
cargo pgrx init --pg${{ matrix.pg_version }} "$PG_CONFIG"

FEATURES="pg${{ matrix.pg_version }}"
if [ -n "${{ env.PACKAGE_HTTP_FEATURE }}" ]; then
FEATURES="$FEATURES,${{ env.PACKAGE_HTTP_FEATURE }}"
fi

cargo pgrx package \
--pg-config "$PG_CONFIG" \
--no-default-features \
--features "$FEATURES"

scripts/package-deb.sh \
"$VERSION" \
"$PWD/target/release/pg_durable-pg${{ matrix.pg_version }}" \
"${{ matrix.platform.type }}" \
"${{ matrix.pg_version }}"
'

- name: Verify Debian package
run: |
sudo chown -R "$USER:$USER" dist target || true
deb_file=$(ls dist/pg-durable-postgresql-${{ matrix.pg_version }}_*_${{ matrix.platform.type }}.deb)
echo "Checking $deb_file"
dpkg-deb --info "$deb_file"
dpkg-deb --contents "$deb_file" | grep "usr/lib/postgresql/${{ matrix.pg_version }}/lib/pg_durable.so"
dpkg-deb --contents "$deb_file" | grep "usr/share/postgresql/${{ matrix.pg_version }}/extension/pg_durable.control"
rm -rf check-package
mkdir check-package
dpkg-deb -x "$deb_file" check-package
file "check-package/usr/lib/postgresql/${{ matrix.pg_version }}/lib/pg_durable.so" | grep -E "${{ matrix.platform.file_pattern }}"

- name: Create package archive
run: |
cd dist
zip "pg-durable-${VERSION}-pg${{ matrix.pg_version }}-${{ matrix.platform.type }}.zip" \
pg-durable-postgresql-${{ matrix.pg_version }}_*_${{ matrix.platform.type }}.deb

- name: Upload package artifact
uses: actions/upload-artifact@v4
with:
name: pg-durable-package-${{ github.run_id }}-pg${{ matrix.pg_version }}-${{ matrix.platform.type }}
path: |
dist/*.deb
dist/*.zip
retention-days: 30

validate-packages:
name: Validate PG${{ matrix.pg_version }} ${{ matrix.platform.type }} package
needs: build-packages
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
pg_version: [17, 18]
platform:
- type: amd64
docker_platform: linux/amd64
Comment thread
pinodeca marked this conversation as resolved.

steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.tag || github.ref }}

- name: Download package artifact
uses: actions/download-artifact@v4
with:
name: pg-durable-package-${{ github.run_id }}-pg${{ matrix.pg_version }}-${{ matrix.platform.type }}
path: dist

- name: Validate Debian package in PostgreSQL
run: |
docker run --rm \
--platform "${{ matrix.platform.docker_platform }}" \
-v "$PWD:/work" \
-w /work \
--user root \
debian:bookworm \
bash -euxo pipefail -c 'scripts/validate-deb-package.sh "${{ matrix.pg_version }}" "${{ matrix.platform.type }}"'
Comment thread
pinodeca marked this conversation as resolved.

- name: Upload validation diagnostics on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: pg-durable-validation-diagnostics-${{ github.run_id }}-pg${{ matrix.pg_version }}-${{ matrix.platform.type }}
path: |
package-validation-logs/**
regression.out
regression.diffs
if-no-files-found: ignore

build-source:
name: Build source archives
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.tag || github.ref }}

- name: Set version
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "VERSION=${{ github.event.inputs.tag }}" >> "$GITHUB_ENV"
elif [ "${{ github.event_name }}" = "pull_request" ]; then
crate_version=$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -1)
echo "VERSION=${crate_version}~pr${{ github.event.pull_request.number }}+${GITHUB_SHA::7}" >> "$GITHUB_ENV"
else
echo "VERSION=${GITHUB_REF#refs/tags/}" >> "$GITHUB_ENV"
fi

- name: Create source archives
run: |
clean_version="${VERSION#v}"
mkdir -p dist
git archive --format=tar --prefix="pg_durable-${clean_version}/" HEAD -o "dist/pg_durable-${clean_version}.tar"
gzip -c "dist/pg_durable-${clean_version}.tar" > "dist/pg_durable-${clean_version}.tar.gz"
bzip2 -k "dist/pg_durable-${clean_version}.tar"
rm "dist/pg_durable-${clean_version}.tar"

- name: Upload source artifact
uses: actions/upload-artifact@v4
with:
name: pg-durable-source-${{ github.run_id }}
path: dist/pg_durable-*.tar.*
retention-days: 30

release:
name: Upload release assets
needs: [validate-packages, build-source]
runs-on: ubuntu-latest
if: github.event_name == 'push' || github.event.inputs.publish_release == 'true'

steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.tag || github.ref }}

- name: Set version
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "VERSION=${{ github.event.inputs.tag }}" >> "$GITHUB_ENV"
else
echo "VERSION=${GITHUB_REF#refs/tags/}" >> "$GITHUB_ENV"
fi

- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: artifacts

- name: Upload assets
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
if ! gh release view "$VERSION" >/dev/null 2>&1; then
gh release create "$VERSION" \
--title "Release $VERSION" \
--notes "Release $VERSION" \
--draft
fi

find artifacts -type f \( -name '*.zip' -o -name '*.tar.gz' -o -name '*.tar.bz2' \) -print0 \
| xargs -0 -I {} gh release upload "$VERSION" "{}" --clobber
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,20 @@ SELECT df.start(
- Rust (nightly)
- [cargo-pgrx](https://github.com/pgcentralfoundation/pgrx) 0.16.1

## Packages

Tagged releases publish Debian packages for PostgreSQL 17 and 18 on amd64 from the GitHub release assets. Packages are named `pg-durable-postgresql-<PG major>_<pg_durable version>-1_<arch>.deb` and install the extension library, control file, and SQL upgrade files into the matching PostgreSQL installation directories.
Comment thread
pinodeca marked this conversation as resolved.

After installing a package, add `pg_durable` to `shared_preload_libraries`, restart PostgreSQL, and create the extension in the configured pg_durable database:

```sql
CREATE EXTENSION pg_durable;
```

The default pg_durable database is `postgres`; see [User Guide](USER_GUIDE.md) for background worker configuration and privilege setup.

Release assets also include source archives for building from source.

## Development Installation

### GitHub Codespace
Expand Down
Loading
Loading