Skip to content

Add pg_lake extension via separate Debian-based image #20

Add pg_lake extension via separate Debian-based image

Add pg_lake extension via separate Debian-based image #20

Workflow file for this run

name: Build and Push Docker Images
on:
push:
branches: [main]
tags: ['v*']
pull_request:
branches: [main]
env:
REGISTRY: ghcr.io
PG_VERSION: '17'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
# Build postgres-plus (Alpine, lean image without pg_lake)
build-postgres-plus:
strategy:
fail-fast: false
matrix:
include:
- platform: linux/amd64
arch: amd64
runner: ubuntu-latest
- platform: linux/arm64
arch: arm64
runner: ubuntu-24.04-arm
runs-on: ${{ matrix.runner }}
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Container Registry
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/constructive-io/docker/postgres-plus
tags: |
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
type=raw,value=${{ env.PG_VERSION }},enable=${{ github.ref == 'refs/heads/main' }}
type=sha,format=short,prefix=
type=semver,pattern={{version}},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
type=semver,pattern={{major}}.{{minor}},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
- name: Build (PR only)
if: github.event_name == 'pull_request'
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
platforms: ${{ matrix.platform }}
push: false
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
PG_VERSION=${{ env.PG_VERSION }}
cache-from: type=gha,scope=postgres-plus-${{ matrix.arch }}
cache-to: type=gha,mode=max,scope=postgres-plus-${{ matrix.arch }}
- name: Build & push by digest
if: github.event_name != 'pull_request'
id: build
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
outputs: type=image,name=${{ env.REGISTRY }}/constructive-io/docker/postgres-plus,push-by-digest=true,push=true
build-args: |
PG_VERSION=${{ env.PG_VERSION }}
cache-from: type=gha,scope=postgres-plus-${{ matrix.arch }}
cache-to: type=gha,mode=max,scope=postgres-plus-${{ matrix.arch }}
- name: Export digest
if: github.event_name != 'pull_request'
run: |
mkdir -p "${{ runner.temp }}/digests-postgres-plus"
digest="${{ steps.build.outputs.digest }}"
touch "${{ runner.temp }}/digests-postgres-plus/${digest#sha256:}"
- name: Upload digest
if: github.event_name != 'pull_request'
uses: actions/upload-artifact@v4
with:
name: digests-postgres-plus-${{ matrix.arch }}
path: ${{ runner.temp }}/digests-postgres-plus/*
# Build postgres-plus-lake (Debian, includes pg_lake)
build-postgres-plus-lake:
strategy:
fail-fast: false
matrix:
include:
- platform: linux/amd64
arch: amd64
runner: ubuntu-latest
- platform: linux/arm64
arch: arm64
runner: ubuntu-24.04-arm
runs-on: ${{ matrix.runner }}
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Container Registry
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/constructive-io/docker/postgres-plus-lake
tags: |
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
type=raw,value=${{ env.PG_VERSION }},enable=${{ github.ref == 'refs/heads/main' }}
type=sha,format=short,prefix=
type=semver,pattern={{version}},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
type=semver,pattern={{major}}.{{minor}},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
- name: Build (PR only)
if: github.event_name == 'pull_request'
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile.pg_lake
platforms: ${{ matrix.platform }}
push: false
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
# Note: pg_lake image uses Dockerfile default PG_VERSION (full version like 17.7)
# because it builds PostgreSQL from source and needs exact version number
cache-from: type=gha,scope=postgres-plus-lake-${{ matrix.arch }}
cache-to: type=gha,mode=max,scope=postgres-plus-lake-${{ matrix.arch }}
- name: Build & push by digest
if: github.event_name != 'pull_request'
id: build
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile.pg_lake
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
outputs: type=image,name=${{ env.REGISTRY }}/constructive-io/docker/postgres-plus-lake,push-by-digest=true,push=true
# Note: pg_lake image uses Dockerfile default PG_VERSION (full version like 17.7)
# because it builds PostgreSQL from source and needs exact version number
cache-from: type=gha,scope=postgres-plus-lake-${{ matrix.arch }}
cache-to: type=gha,mode=max,scope=postgres-plus-lake-${{ matrix.arch }}
- name: Export digest
if: github.event_name != 'pull_request'
run: |
mkdir -p "${{ runner.temp }}/digests-postgres-plus-lake"
digest="${{ steps.build.outputs.digest }}"
touch "${{ runner.temp }}/digests-postgres-plus-lake/${digest#sha256:}"
- name: Upload digest
if: github.event_name != 'pull_request'
uses: actions/upload-artifact@v4
with:
name: digests-postgres-plus-lake-${{ matrix.arch }}
path: ${{ runner.temp }}/digests-postgres-plus-lake/*
# Publish postgres-plus manifest
publish-postgres-plus-manifest:
if: github.event_name != 'pull_request'
runs-on: ubuntu-latest
needs: build-postgres-plus
permissions:
contents: read
packages: write
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Download digests
uses: actions/download-artifact@v4
with:
pattern: digests-postgres-plus-*
path: ${{ runner.temp }}/digests
merge-multiple: true
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/constructive-io/docker/postgres-plus
tags: |
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
type=raw,value=${{ env.PG_VERSION }},enable=${{ github.ref == 'refs/heads/main' }}
type=sha,format=short,prefix=
type=semver,pattern={{version}},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
type=semver,pattern={{major}}.{{minor}},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
- name: Create and push multi-arch manifests
run: |
set -euo pipefail
image="${{ env.REGISTRY }}/constructive-io/docker/postgres-plus"
digest_dir="${{ runner.temp }}/digests"
if [ ! -d "$digest_dir" ]; then
echo "No digests directory found at $digest_dir"
exit 1
fi
digests=""
for digest_file in "$digest_dir"/*; do
digest="$(basename "$digest_file")"
digests="$digests $image@sha256:$digest"
done
if [ -z "$digests" ]; then
echo "No digests found to create manifest"
exit 1
fi
echo "Creating manifests for tags:"
echo "${{ steps.meta.outputs.tags }}"
echo "${{ steps.meta.outputs.tags }}" | while read -r tag; do
[ -z "$tag" ] && continue
echo "Creating multi-arch manifest for $tag"
docker buildx imagetools create -t "$tag" $digests
done
# Publish postgres-plus-lake manifest
publish-postgres-plus-lake-manifest:
if: github.event_name != 'pull_request'
runs-on: ubuntu-latest
needs: build-postgres-plus-lake
permissions:
contents: read
packages: write
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Download digests
uses: actions/download-artifact@v4
with:
pattern: digests-postgres-plus-lake-*
path: ${{ runner.temp }}/digests
merge-multiple: true
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/constructive-io/docker/postgres-plus-lake
tags: |
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
type=raw,value=${{ env.PG_VERSION }},enable=${{ github.ref == 'refs/heads/main' }}
type=sha,format=short,prefix=
type=semver,pattern={{version}},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
type=semver,pattern={{major}}.{{minor}},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
- name: Create and push multi-arch manifests
run: |
set -euo pipefail
image="${{ env.REGISTRY }}/constructive-io/docker/postgres-plus-lake"
digest_dir="${{ runner.temp }}/digests"
if [ ! -d "$digest_dir" ]; then
echo "No digests directory found at $digest_dir"
exit 1
fi
digests=""
for digest_file in "$digest_dir"/*; do
digest="$(basename "$digest_file")"
digests="$digests $image@sha256:$digest"
done
if [ -z "$digests" ]; then
echo "No digests found to create manifest"
exit 1
fi
echo "Creating manifests for tags:"
echo "${{ steps.meta.outputs.tags }}"
echo "${{ steps.meta.outputs.tags }}" | while read -r tag; do
[ -z "$tag" ] && continue
echo "Creating multi-arch manifest for $tag"
docker buildx imagetools create -t "$tag" $digests
done