Skip to content

Commit

Permalink
Upgrade to pgTAP 1.3.1
Browse files Browse the repository at this point in the history
Planned for release as 2.5.0.

- Upgraded pgTAP to 1.3.1.

- Update support for the released version of PostgreSQL 16.

- Changed maintenance procedures to:

  - Add the version of Alpine to `package-versions.json` and use that for image
    builds.
  - Change maintenance procedure to automatically generate the
    `build/pgtap/Dockerfile`. The latest versions required some updates because
    of CLANG and LLVM version mismatches.

Signed-off-by: Austin Ziegler <[email protected]>
  • Loading branch information
halostatue committed Sep 26, 2023
1 parent eff7414 commit 560fbbb
Show file tree
Hide file tree
Showing 28 changed files with 990 additions and 370 deletions.
4 changes: 3 additions & 1 deletion .github/workflows/build-test-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@ jobs:
load: true
tags: kineticcafe/sqitch-pgtap:test
build-args: |
PG_PROVE_VERSION=${{ fromJSON(steps.package-versions.outputs.data).pg_prove.version }}
ALPINE_VERSION=${{ fromJSON(steps.package-versions.outputs.data).alpine.version }}
PGTAP_VERSION=${{ fromJSON(steps.package-versions.outputs.data).pgtap.version }}
PG_PROVE_VERSION=${{ fromJSON(steps.package-versions.outputs.data).pg_prove.version }}
SQITCH_VERSION=${{ fromJSON(steps.package-versions.outputs.data).sqitch.version }}
__DOCKERFILE_VERSION__=${{ fromJSON(steps.package-versions.outputs.data).version }}
cache-from: type=gha
cache-to: type=gha,mode=max

Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/publish-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,11 @@ jobs:
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
PG_PROVE_VERSION=${{ fromJSON(steps.package-versions.outputs.data).pg_prove.version }}
ALPINE_VERSION=${{ fromJSON(steps.package-versions.outputs.data).alpine.version }}
PGTAP_VERSION=${{ fromJSON(steps.package-versions.outputs.data).pgtap.version }}
PG_PROVE_VERSION=${{ fromJSON(steps.package-versions.outputs.data).pg_prove.version }}
SQITCH_VERSION=${{ fromJSON(steps.package-versions.outputs.data).sqitch.version }}
__DOCKERFILE_VERSION__=${{ fromJSON(steps.package-versions.outputs.data).version }}
platforms: |
linux/amd64
linux/arm64
Expand Down
14 changes: 14 additions & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# kineticcafe/sqitch-pgtap Changelog

## 2.5.0 / 2023-09-27

- Upgraded pgTAP to 1.3.1.

- Update support for the released version of PostgreSQL 16.

- Changed maintenance procedures to:

- Add the version of Alpine to `package-versions.json` and use that for image
builds.
- Change maintenance procedure to automatically generate the
`build/pgtap/Dockerfile`. The latest versions required some updates because
of CLANG and LLVM version mismatches.

## 2.4.0 / 2023-08-16

- Upgraded pgTAP to 1.3.0.
Expand Down
94 changes: 56 additions & 38 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,50 +1,68 @@
FROM alpine:3.18
# syntax=docker/dockerfile:1

ARG ALPINE_VERSION

FROM alpine:$ALPINE_VERSION

ARG PG_PROVE_VERSION
ARG PGTAP_VERSION
ARG SQITCH_VERSION
ARG __DOCKERFILE_VERSION__

RUN <<SETUP
set -eux

apk update

apk add \
bash \
build-base \
curl \
jq \
less \
make \
nano \
openssl \
perl \
perl-app-cpanminus \
perl-dev \
postgresql-client \
postgresql-dev \
tzdata \
wget

cpanm --quiet --notest --no-man-pages \
App::Sqitch@$SQITCH_VERSION \
TAP::Parser::SourceHandler::pgTAP@$PG_PROVE_VERSION \
Template \
DBD::Pg

ENV __DOCKERFILE_VERSION__=2.4.0

RUN apk update \
&& apk add --no-cache --update \
build-base \
curl \
make \
perl-dev \
postgresql-dev \
wget \
&& apk add --no-cache --update \
bash \
jq \
less \
nano \
openssl \
perl \
perl-app-cpanminus \
postgresql-client \
tzdata \
&& cpanm --quiet --notest --no-man-pages \
App::Sqitch@$SQITCH_VERSION \
TAP::Parser::SourceHandler::pgTAP@$PG_PROVE_VERSION \
Template DBD::Pg \
&& adduser --disabled-password sqitch \
&& mkdir -p /opt /home/sqitch/bin \
&& echo $__DOCKERFILE_VERSION__ > /home/sqitch/VERSION \
&& apk del \
build-base \
curl \
make \
perl-dev \
postgresql-dev \
wget \
&& rm -rf /var/cache/apk/* /tmp/* /root/.cpanm
apk del \
build-base \
curl \
make \
perl-dev \
postgresql-dev \
wget

rm -rf /var/cache/apk/* /tmp/* /root/.cpanm
SETUP

COPY opt/pgtap /opt/pgtap/
COPY scripts/* /home/sqitch/bin/
COPY package-versions.json /home/sqitch/
RUN chmod +x /home/sqitch/bin/* \
&& chown -R sqitch:sqitch /home

RUN <<FINALIZE
set -eux

adduser --disabled-password sqitch
mkdir -p /opt /home/sqitch/bin

echo $__DOCKERFILE_VERSION__ > /home/sqitch/VERSION

chmod +x /home/sqitch/bin/*
chown -R sqitch:sqitch /home
FINALIZE

ENV LESS=-R LC_ALL=C.UTF-8 LANG=C.UTF-8 SQITCH_EDITOR=nano SQITCH_PAGER=less
USER sqitch
Expand Down
129 changes: 114 additions & 15 deletions Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ pg_prove_version := `jq -r .pg_prove.version < package-versions.json`
pgtap_version := `jq -r .pgtap.version < package-versions.json`
pgtap_hashref := `jq -r '.pgtap.hashref // empty' < package-versions.json`
sqitch_version := `jq -r .sqitch.version < package-versions.json`
alpine_version := `jq -r .alpine.version < package-versions.json`
image_version := `jq -r .VERSION < package-versions.json`

# Show the version as it would be from the built image
Expand All @@ -21,11 +22,19 @@ version:
cat <<EOS
[gchr.io/]kineticcafe/sqitch-pgtap:{{ image_version }}

alpine {{ alpine_version }}
sqitch (App::Sqitch) v{{ sqitch_version }}
pgtap ${pgtap_version}
pg_prove {{ pg_prove_version }}
EOS

# Set new alpine version
alpine-set-version NEW_VERSION:
@just _update_package_versions alpine.version {{ NEW_VERSION }}
@jq '.defaults.alpine = "{{ NEW_VERSION }}"' \
{{ justfile_directory() }}/build/pgtap/versions.json | \
sponge {{ justfile_directory() }}/build/pgtap/versions.json

# Set the new sqitch version
sqitch-set-version NEW_VERSION:
@just _update_package_versions sqitch.version {{ NEW_VERSION }}
Expand Down Expand Up @@ -67,12 +76,36 @@ build:
set -euo pipefail

docker build \
--build-arg ALPINE_VERSION="{{ alpine_version }}" \
--build-arg PG_PROVE_VERSION="{{ pg_prove_version }}" \
--build-arg PGTAP_VERSION="{{ pgtap_version }}" \
--build-arg SQITCH_VERSION="{{ sqitch_version }}" \
--build-arg __DOCKERFILE_VERSION__="{{ image_version }}" \
--tag kineticcafe/sqitch-pgtap:latest .

get-pgtap:
# Update the pgTAP sources
update-pgtap: _download_pgtap _generate_pgtap_dockerfile
#!/usr/bin/env bash
set -euo pipefail

docker build \
--build-arg PGTAP_VERSION="{{ pgtap_version }}" \
--tag build-pgtap:latest \
"{{ justfile_directory() }}/build/pgtap"
docker container create --name builder build-pgtap:latest
docker container cp --quiet builder:/opt/pgtap.tar "{{ justfile_directory() }}"
docker container rm builder
docker image rm build-pgtap:latest
tar xf pgtap.tar

rm -rf {{ justfile_directory() }}/build/pgtap/pgtap-"{{ pgtap_version }}" \
{{ justfile_directory() }}/build/pgtap/pgtap-"{{ pgtap_version }}".zip \
{{ justfile_directory() }}/pgtap.tar

git add opt/pgtap

_download_pgtap:
#!/usr/bin/env bash
set -euo pipefail
Expand All @@ -89,25 +122,91 @@ get-pgtap:
else
curl -sq -LO \
"https://api.pgxn.org/dist/pgtap/{{ pgtap_version }}/pgtap-{{ pgtap_version }}.zip"
unzip -d "{{ justfile_directory() }}/build/pgtap" "pgtap-{{ pgtap_version }}.zip"
unzip -qq -d "{{ justfile_directory() }}/build/pgtap" "pgtap-{{ pgtap_version }}.zip"
fi

docker build --build-arg PGTAP_VERSION="{{ pgtap_version }}" \
--tag build-pgtap:latest "{{ justfile_directory() }}/build/pgtap"
docker container create --name builder build-pgtap:latest
docker container cp --quiet builder:/opt/pgtap.tar "{{ justfile_directory() }}"
docker container rm builder
docker image rm build-pgtap:latest
tar xf pgtap.tar
_generate_pgtap_dockerfile:
#!/usr/bin/env ruby
rm -rf {{ justfile_directory() }}/build/pgtap/pgtap-"{{ pgtap_version }}" \
{{ justfile_directory() }}/build/pgtap/pgtap-"{{ pgtap_version }}".zip \
{{ justfile_directory() }}/pgtap.tar
require 'json'

git add opt/pgtap
versions = JSON.load_file("{{ justfile_directory() }}/build/pgtap/versions.json")

blocks = versions["postgres"].map { |pg_version|
name = pg_version.fetch("name")
version = pg_version.fetch("version") { name }
alpine = pg_version.fetch("alpine") { versions.dig("defaults", "alpine") }

<<~BUILD_BLOCK
FROM postgres:#{version}-alpine#{alpine} AS build-pgtap-psql-#{name}

ARG PGTAP_VERSION

COPY pgtap-$PGTAP_VERSION /opt/pgtap-$PGTAP_VERSION

RUN <<SETUP
set -eux

apk update

apk add \\
bash \\
build-base \\
make \\
openssl \\
perl \\
perl-dev \\
postgresql-dev \\
wget

wanted_clang=$(
pg_config --configure |
tr ' ' '\\n' |
grep CLANG |
sed "s/'CLANG=\\(.*\\)'/\\1/"
)

if ! command -v "${wanted_clang}" >/dev/null 2>/dev/null; then
version="${wanted_clang/clang-}"
apk add clang"${version}" llvm"${version}"
fi

mkdir -p /opt/pgtap/#{name}
SETUP

RUN <<BUILD
set -eux

cd /opt/pgtap-$PGTAP_VERSION
make
make install
mv sql/pgtap.sql sql/uninstall_pgtap.sql /opt/pgtap/#{name}
BUILD
BUILD_BLOCK

}

copy = versions["postgres"].map { |pg_version|
name = pg_version.fetch("name")
"COPY --from=build-pgtap-psql-#{name} /opt/pgtap/#{name} /opt/pgtap/#{name}"
}

dockerfile = <<~DOCKERFILE
# syntax=docker/dockerfile:1

#{blocks.join("\n\n")}

FROM alpine:{{ alpine_version }} AS package-pgtap

RUN mkdir -p /opt/pgtap

#{copy.join("\n")}

RUN tar cf /opt/pgtap.tar /opt/pgtap
DOCKERFILE

File.write("build/pgtap/Dockerfile", dockerfile)

_update_package_versions key value:
@jq -c '.{{ key }} = "{{ value }}"' {{ justfile_directory() }}/package-versions.json | \
sponge {{ justfile_directory() }}/package-versions.json

_read_package_versions key:
Loading

0 comments on commit 560fbbb

Please sign in to comment.