Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
96 changes: 96 additions & 0 deletions .github/workflows/docker.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
name: Docker

on:
push:
branches:
- main
- v1
- release/*
paths:
- "docker/**"
- ".github/workflows/docker.yaml"
pull_request:
branches:
- main
- v1
paths:
- "docker/**"
- ".github/workflows/docker.yaml"
types: [opened, reopened, synchronize, ready_for_review]
workflow_dispatch:
inputs:
process:
description: 'Process to build (pgvector | node-sqitch | postgis)'
type: choice
required: true
options:
- pgvector
- node-sqitch
- postgis
default: pgvector
version:
description: 'Specific version to build (must exist in version.yaml)'
type: string
required: true

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-docker
cancel-in-progress: true

jobs:
build-push:
if: github.event_name != 'pull_request' || !github.event.pull_request.draft
runs-on: ubuntu-latest

permissions:
contents: read
packages: write

defaults:
run:
working-directory: docker

strategy:
matrix:
process: [pgvector, node-sqitch, postgis]
max-parallel: 3
Comment on lines 54 to 57
Copy link

Copilot AI Oct 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

workflow_dispatch inputs (process, version) are defined but unused; this matrix always builds all processes, ignoring the user's selection. Gate the matrix on event type or add a dispatch-specific step/job that uses inputs.process and inputs.version (e.g., run make PROCESS='${{ inputs.process }}' VERSION='${{ inputs.version }}' build-push-process-version for workflow_dispatch).

Copilot uses AI. Check for mistakes.

env:
REPO: ghcr.io/${{ github.repository_owner }}
PLATFORMS: linux/amd64,linux/arm64

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up QEMU
uses: docker/setup-qemu-action@v3

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

- name: Login to GHCR
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build (no push)
if: github.event_name == 'pull_request'
run: |
make \
PROCESS=${{ matrix.process }} \
REPO_NAME=$REPO \
PLATFORMS="$PLATFORMS" \
build-process
- name: Build and push (all versions)
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
run: |
make \
PROCESS=${{ matrix.process }} \
REPO_NAME=$REPO \
PLATFORMS="$PLATFORMS" \
build-push-process
98 changes: 84 additions & 14 deletions docker/Makefile
Original file line number Diff line number Diff line change
@@ -1,20 +1,90 @@
.PHONY: all push-all node-sqitch pgvector clean
.PHONY: all push-all build-all build-push-all build-process build-push-process \
build-process-version build-push-process-version pgvector node-sqitch postgis clean

all:
$(MAKE) -C node-sqitch build
$(MAKE) -C pgvector build
REPO_NAME?=pyramation
PLATFORMS?=linux/arm64

push-all:
$(MAKE) -C node-sqitch push
$(MAKE) -C pgvector push
# default process if none specified (can be overridden: `make PROCESS=postgis build-process`)
PROCESS?=pgvector

node-sqitch:
$(MAKE) -C node-sqitch build
# Convenience: list of known processes
PROCESSES:=pgvector node-sqitch postgis

CONTAINER_NAME?=$(PROCESS)

## build-process builds docker image(s) for $(PROCESS) using base+versions from version.yaml
## It will build one image per version listed in $(PROCESS)/version.yaml and tag as <repo>/<process>:<version>
build-process:
@echo "==> Building process: $(PROCESS)"
@BASE=$$(sed -n 's/^base:[[:space:]]*//p' $(PROCESS)/version.yaml | head -n1); \
VERSIONS=$$(sed -n '/^versions:/,$$p' $(PROCESS)/version.yaml | sed -n 's/^-\s*//p'); \
if [ -z "$$BASE" ] || [ -z "$$VERSIONS" ]; then \
Copy link

Copilot AI Oct 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'\s' is not a valid character class in POSIX/GNU sed; VERSIONS will be empty and the build will fail. Use POSIX classes and allow optional indentation: replace the inner sed with sed -n 's/^[[:space:]]-[[:space:]]//p'.

Copilot uses AI. Check for mistakes.
echo "Error: Could not parse base or versions from $(PROCESS)/version.yaml" 1>&2; \
exit 1; \
fi; \
for v in $$VERSIONS; do \
$(MAKE) --no-print-directory BASE=$$BASE VERSION=$$v build-process-version || exit $$?; \
done

build-all:
@for p in $(PROCESSES); do \
$(MAKE) --no-print-directory PROCESS=$$p build-process || exit $$?; \
done

build-push-process:
@echo "==> Building+Pushing process: $(PROCESS)"
@BASE=$$(sed -n 's/^base:[[:space:]]*//p' $(PROCESS)/version.yaml | head -n1); \
VERSIONS=$$(sed -n '/^versions:/,$$p' $(PROCESS)/version.yaml | sed -n 's/^-\s*//p'); \
if [ -z "$$BASE" ] || [ -z "$$VERSIONS" ]; then \
Copy link

Copilot AI Oct 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above: '\s' is not recognized by sed. Update to sed -n 's/^[[:space:]]-[[:space:]]//p' so version items are parsed correctly.

Copilot uses AI. Check for mistakes.
echo "Error: Could not parse base or versions from $(PROCESS)/version.yaml" 1>&2; \
exit 1; \
fi; \
for v in $$VERSIONS; do \
$(MAKE) --no-print-directory BASE=$$BASE VERSION=$$v build-push-process-version || exit $$?; \
done

build-push-all:
@for p in $(PROCESSES); do \
$(MAKE) --no-print-directory PROCESS=$$p build-push-process || exit $$?; \
done

# Build only a specific VERSION for $(PROCESS). Intended for internal use by build-process.
# Usage (internal): $(MAKE) BASE=<base> VERSION=<version> build-process-version
build-process-version:
@test -n "$(BASE)" || { echo "Error: BASE is required"; exit 1; }
@test -n "$(VERSION)" || { echo "Error: VERSION is required"; exit 1; }
@echo " -> $(BASE):$(VERSION) => $(REPO_NAME)/$(PROCESS):$(VERSION) (build)"
@docker buildx build \
--platform $(PLATFORMS) \
--build-arg BASE=$(BASE) \
--build-arg BASE_VERSION=$(VERSION) \
-t $(REPO_NAME)/$(PROCESS):$(VERSION) \
$(PROCESS)

# Build+push only a specific VERSION for $(PROCESS). Intended for internal use by build-push-process.
# Usage (internal): $(MAKE) BASE=<base> VERSION=<version> build-push-process-version
build-push-process-version:
@test -n "$(BASE)" || { echo "Error: BASE is required"; exit 1; }
@test -n "$(VERSION)" || { echo "Error: VERSION is required"; exit 1; }
@echo " -> $(BASE):$(VERSION) => $(REPO_NAME)/$(PROCESS):$(VERSION) (push)"
@docker buildx build \
--platform $(PLATFORMS) \
--build-arg BASE=$(BASE) \
--build-arg BASE_VERSION=$(VERSION) \
-t $(REPO_NAME)/$(PROCESS):$(VERSION) \
--push \
$(PROCESS)

# Aliases
all: build-all
push-all: build-push-all

# Convenience per-process targets
pgvector:
$(MAKE) -C pgvector build
$(MAKE) PROCESS=pgvector build-process

node-sqitch:
$(MAKE) PROCESS=node-sqitch build-process

# Git cleanup (repo-level only)
clean:
@git reset --hard
@git ls-files --other --exclude-standard | xargs rm -f
postgis:
$(MAKE) PROCESS=postgis build-process
13 changes: 10 additions & 3 deletions docker/node-sqitch/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
FROM node:20.12.0-alpine3.19 AS sqitch-build
ARG BASE=node
ARG BASE_VERSION=20.12.0-alpine3.19
FROM ${BASE}:${BASE_VERSION} AS sqitch-build

LABEL org.opencontainers.image.source="https://github.com/launchql/launchql"

# Install system dependencies.
WORKDIR /work
Expand Down Expand Up @@ -46,7 +49,11 @@ RUN apk del .build-deps
################################################################################
# Copy to the final image without all the build stuff.

FROM node:20.12.0-alpine3.19 AS sqitch
ARG BASE=node
ARG BASE_VERSION=20.12.0-alpine3.19
FROM ${BASE}:${BASE_VERSION} AS sqitch

LABEL org.opencontainers.image.source="https://github.com/launchql/launchql"

# Install runtime system dependencies and remove unnecesary files.
RUN mkdir -p /usr/share/man/man1 /usr/share/man/man7 \
Expand Down Expand Up @@ -82,4 +89,4 @@ ENV LESS=-R LC_ALL=C.UTF-8 LANG=C.UTF-8 SQITCH_EDITOR=vi SQITCH_PAGER=less
# for gyp and such
RUN apk update && apk add --no-cache bash git python3-dev make g++

ENTRYPOINT ["/bin/sh"]
ENTRYPOINT ["/bin/sh"]
39 changes: 0 additions & 39 deletions docker/node-sqitch/Makefile

This file was deleted.

3 changes: 3 additions & 0 deletions docker/node-sqitch/version.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
base: node
versions:
- 20.12.0-alpine3.19
Copy link

Copilot AI Oct 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Indent the list item for valid YAML: ' - 20.12.0-alpine3.19'.

Suggested change
- 20.12.0-alpine3.19
- 20.12.0-alpine3.19

Copilot uses AI. Check for mistakes.
18 changes: 12 additions & 6 deletions docker/pgvector/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
FROM pyramation/postgis:13.3-alpine
ARG BASE=postgres
ARG BASE_VERSION=13.3-alpine
FROM ${BASE}:${BASE_VERSION}

LABEL org.opencontainers.image.source="https://github.com/launchql/launchql"

# Install PGVector extension
RUN apk add --no-cache --virtual .build-deps \
git \
build-base \
postgresql-dev \
&& git clone --branch v0.5.1 https://github.com/pgvector/pgvector.git \
&& cd pgvector \
&& make && make install \
&& cd .. && rm -rf pgvector \
&& apk del .build-deps
bash \
make

RUN git clone --branch v0.5.1 https://github.com/pgvector/pgvector.git
RUN cd pgvector && make && make install && cd .. && rm -rf pgvector

RUN apk del .build-deps
35 changes: 0 additions & 35 deletions docker/pgvector/Makefile

This file was deleted.

3 changes: 3 additions & 0 deletions docker/pgvector/version.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
base: postgres
versions:
- 13.3-alpine
8 changes: 6 additions & 2 deletions docker/postgis/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
FROM postgres:13.3-alpine
ARG BASE=postgres
ARG BASE_VERSION=13.3-alpine
FROM ${BASE}:${BASE_VERSION}

RUN apk add make
LABEL org.opencontainers.image.source="https://github.com/launchql/launchql"

RUN apk add make bash
35 changes: 0 additions & 35 deletions docker/postgis/Makefile

This file was deleted.

3 changes: 3 additions & 0 deletions docker/postgis/version.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
base: postgres
versions:
- 13.3-alpine
Copy link

Copilot AI Oct 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] YAML list items should be indented under the key; as written many YAML parsers will reject this. Prefer a valid YAML structure and (with the Makefile changes above) allow optional indentation: change to ' - 13.3-alpine'.

Suggested change
- 13.3-alpine
- 13.3-alpine

Copilot uses AI. Check for mistakes.