Skip to content

Commit c997aa5

Browse files
committed
chore: build pg15 with docker
1 parent 23ce1bb commit c997aa5

File tree

4 files changed

+106
-75
lines changed

4 files changed

+106
-75
lines changed

.github/workflows/ami-release.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,25 @@ jobs:
5656
tar xvf "$layer" -C ansible/files/extensions --strip-components 1
5757
done
5858
59+
- name: Build Postgres deb
60+
uses: docker/build-push-action@v3
61+
with:
62+
push: false
63+
load: true
64+
file: docker/Dockerfile
65+
target: pg-deb
66+
tags: supabase/postgres:deb
67+
platforms: linux/${{ matrix.arch }}
68+
cache-from: type=gha
69+
cache-to: type=gha,mode=max
70+
- name: Extract Postgres deb
71+
run: |
72+
mkdir -p /tmp/build ansible/files/postgres
73+
docker save supabase/postgres:deb | tar xv -C /tmp/build
74+
for layer in /tmp/build/*/layer.tar; do
75+
tar xvf "$layer" -C ansible/files/postgres --strip-components 1
76+
done
77+
5978
- name: Build AMI
6079
run: |
6180
GIT_SHA=${{github.sha}}

ansible/tasks/setup-postgres.yml

Lines changed: 15 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,13 @@
1-
# Downloading dependencies
2-
- name: GPG dependencies
3-
apt:
4-
name: gnupg
5-
6-
- name: Add Postgres GPG key
7-
apt_key:
8-
keyserver: keyserver.ubuntu.com
9-
id: B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
10-
11-
- name: Add Postgres PPA
12-
apt_repository:
13-
repo: "deb https://apt-archive.postgresql.org/pub/repos/apt {{ ansible_distribution_release }}-pgdg-archive main"
14-
state: present
1+
- name: Postgres - copy package
2+
copy:
3+
src: files/postgres/
4+
dest: /tmp/build/
155

16-
# let's build binaries from their published source packages
17-
- name: Add Postgres PPA - source
6+
- name: Postgres - add PPA
187
apt_repository:
19-
repo: "deb-src https://apt-archive.postgresql.org/pub/repos/apt {{ ansible_distribution_release }}-pgdg-archive main"
8+
repo: "deb [ trusted=yes ] file:///tmp/build ./"
209
state: present
2110

22-
- name: Create temporary build directory
23-
tempfile:
24-
state: directory
25-
register: pg_build_dir
26-
27-
- name: Setting mcpu (arm)
28-
set_fact:
29-
mcpu: "neoverse-n1"
30-
when: platform == "arm64"
31-
32-
- name: Postgres - build
33-
shell: |
34-
set -e
35-
export PYTHONDONTWRITEBYTECODE=1
36-
savedAptMark="$(apt-mark showmanual)"
37-
cd "{{ pg_build_dir.path }}"
38-
39-
# create a temporary local APT repo to install from (so that dependency resolution can be handled by APT, as it should be)
40-
apt-get update
41-
apt-get install -y --no-install-recommends dpkg-dev
42-
echo "deb [ trusted=yes ] file://{{ pg_build_dir.path }} ./" > /etc/apt/sources.list.d/temp.list
43-
_update_repo() {
44-
dpkg-scanpackages . > Packages
45-
apt-get -o Acquire::GzipIndexes=false update
46-
}
47-
_update_repo
48-
49-
# build .deb files from upstream's source packages (which are verified by apt-get)
50-
export DEB_BUILD_OPTIONS="nocheck parallel=$(nproc)"
51-
export DEB_CPPFLAGS_APPEND="-mcpu={{ mcpu }} -fsigned-char"
52-
53-
# we have to build postgresql-common first because postgresql-15 shares "debian/rules" logic with it: https://salsa.debian.org/postgresql/postgresql/-/commit/99f44476e258cae6bf9e919219fa2c5414fa2876
54-
# (and it "Depends: pgdg-keyring")
55-
apt-get build-dep -y postgresql-common pgdg-keyring
56-
apt-get source --compile postgresql-common pgdg-keyring
57-
_update_repo
58-
apt-get build-dep -y "postgresql-{{ postgresql_major }}={{ postgresql_release }}-1.pgdg20.04+1"
59-
apt-get source --compile "postgresql-{{ postgresql_major }}={{ postgresql_release }}-1.pgdg20.04+1"
60-
61-
# we don't remove APT lists here because they get re-downloaded and removed later
62-
# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
63-
# (which is done after we install the built packages so we don't have to redownload any overlapping dependencies)
64-
apt-mark showmanual | xargs apt-mark auto > /dev/null
65-
apt-mark manual $savedAptMark
66-
_update_repo
67-
6811
- name: Postgres - install commons
6912
apt:
7013
name: postgresql-common
@@ -79,17 +22,15 @@
7922
name: postgresql-{{ postgresql_major }}={{ postgresql_release }}-1.pgdg20.04+1
8023
install_recommends: no
8124

82-
# if we have leftovers from building, let's purge them (including extra, unnecessary build deps)
83-
- name: Remove build dependencies
84-
shell: |
85-
set -e
86-
rm -rf /var/lib/apt/lists/*
87-
apt-get purge -y --auto-remove
88-
rm -rf "{{ pg_build_dir.path }}" /etc/apt/sources.list.d/temp.list
89-
find /usr -name '*.pyc' -type f -exec bash -c 'for pyc; do dpkg -S "$pyc" &> /dev/null || rm -vf "$pyc"; done' -- '{}' +
90-
91-
- name: Hold postgres {{ postgresql_release }} from apt upgrade
92-
shell: apt-mark hold postgresql-{{ postgresql_major }}
25+
- name: Postgres - remove PPA
26+
apt_repository:
27+
repo: "deb [ trusted=yes ] file:///tmp/build ./"
28+
state: absent
29+
30+
- name: Postgres - cleanup package
31+
file:
32+
path: /tmp/build
33+
state: absent
9334

9435
- name: Create symlink to /usr/lib/postgresql/bin
9536
shell:

common.vars.pkr.hcl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
postgres-version = "15.1.0.89-rc0"
1+
postgres-version = "15.1.0.89-rc1"

docker/Dockerfile

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
ARG ubuntu_release=focal
2+
FROM ubuntu:${ubuntu_release} as base
3+
4+
ARG ubuntu_release
5+
ARG postgresql_major=15
6+
ARG postgresql_release=${postgresql_major}.1
7+
8+
FROM base as pg-source
9+
10+
# Install build dependencies
11+
RUN apt-get update && apt-get install -y --no-install-recommends \
12+
gnupg \
13+
dpkg-dev \
14+
ca-certificates \
15+
&& rm -rf /var/lib/apt/lists/*
16+
17+
# Add Postgres PPA
18+
ARG postgresql_gpg_key=B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
19+
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys "${postgresql_gpg_key}" && \
20+
echo "deb https://apt-archive.postgresql.org/pub/repos/apt ${ubuntu_release}-pgdg-archive main" > /etc/apt/sources.list.d/pgdg.list && \
21+
echo "deb-src https://apt-archive.postgresql.org/pub/repos/apt ${ubuntu_release}-pgdg-archive main" > /etc/apt/sources.list.d/pgdg.list
22+
23+
# Create local PPA
24+
WORKDIR /tmp/build
25+
RUN echo "deb [ trusted=yes ] file:///tmp/build ./" > /etc/apt/sources.list.d/temp.list && \
26+
dpkg-scanpackages . > Packages && \
27+
apt-get -o Acquire::GzipIndexes=false update
28+
29+
ENV DEBIAN_FRONTEND=noninteractive
30+
ENV PYTHONDONTWRITEBYTECODE=1
31+
ENV DEB_BUILD_OPTIONS="nocheck parallel=$(nproc)"
32+
33+
# Configure processor optimised build
34+
ARG CPPFLAGS="-mcpu=neoverse-n1"
35+
ENV DEB_CPPFLAGS_APPEND="${CPPFLAGS} -fsigned-char"
36+
37+
RUN apt-get build-dep -y postgresql-common pgdg-keyring && \
38+
apt-get source --compile postgresql-common pgdg-keyring && \
39+
dpkg-scanpackages . > Packages && \
40+
apt-get -o Acquire::GzipIndexes=false update
41+
42+
RUN apt-get build-dep -y "postgresql-${postgresql_major}=${postgresql_release}-1.pgdg20.04+1" && \
43+
apt-get source --compile "postgresql-${postgresql_major}=${postgresql_release}-1.pgdg20.04+1" && \
44+
dpkg-scanpackages . > Packages && \
45+
apt-get -o Acquire::GzipIndexes=false update
46+
47+
# Remove source directories
48+
RUN rm -rf /tmp/build/*/
49+
50+
FROM base as pg
51+
52+
# Inherit args from base stage
53+
ARG postgresql_major
54+
ARG postgresql_release
55+
56+
COPY --from=pg-source /tmp/build /tmp/build
57+
58+
ENV DEBIAN_FRONTEND=noninteractive
59+
RUN echo "deb [ trusted=yes ] file:///tmp/build ./" > /etc/apt/sources.list.d/temp.list && \
60+
apt-get -o Acquire::GzipIndexes=false update && \
61+
apt-get install -y --no-install-recommends postgresql-common && \
62+
sed -ri 's/#(create_main_cluster) .*$/\1 = false/' /etc/postgresql-common/createcluster.conf && \
63+
apt-get install -y --no-install-recommends "postgresql-${postgresql_major}=${postgresql_release}-1.pgdg20.04+1" && \
64+
rm -rf /var/lib/apt/lists/* && \
65+
rm -rf /tmp/build /etc/apt/sources.list.d/temp.list
66+
67+
ENV PATH $PATH:/usr/lib/postgresql/${postgresql_major}/bin
68+
69+
FROM scratch as pg-deb
70+
71+
COPY --from=pg-source /tmp/build /tmp

0 commit comments

Comments
 (0)