From d49010086088778c5f640d933e0e737f923f42a0 Mon Sep 17 00:00:00 2001 From: Cesar Flores Date: Sun, 8 Mar 2026 18:11:18 +0700 Subject: [PATCH] feat: restructure PostgreSQL setup with base variant --- .github/workflows/test-and-push.yml | 52 +++++--------- Justfile | 70 +++++++++---------- {postgres => postgres-base}/.env.example | 0 .../000_extensions.sql | 0 {postgres => postgres-base}/Dockerfile | 0 {postgres => postgres-base}/compose.yml | 0 6 files changed, 52 insertions(+), 70 deletions(-) rename {postgres => postgres-base}/.env.example (100%) rename {postgres => postgres-base}/000_extensions.sql (100%) rename {postgres => postgres-base}/Dockerfile (100%) rename {postgres => postgres-base}/compose.yml (100%) diff --git a/.github/workflows/test-and-push.yml b/.github/workflows/test-and-push.yml index 8cc924b..ddbb896 100644 --- a/.github/workflows/test-and-push.yml +++ b/.github/workflows/test-and-push.yml @@ -9,56 +9,38 @@ jobs: test: runs-on: ubuntu-latest - strategy: + strategy: &db-matrix fail-fast: false matrix: - db: [postgres] - - env: - ### Postgres ### - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: postgres - POSTGRES_PORT: 5432 + include: + - db: postgres + variant: base steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v4 - uses: jdx/mise-action@v3 - - name: Test ${{ matrix.db }} - run: just test ${{ matrix.db }} + - name: Test + run: just test ${{ matrix.db }} ${{ matrix.variant }} - - name: Cleanup ${{ matrix.db }} - run: just clean ${{ matrix.db }} + - name: Cleanup + if: always() + run: just down-all ${{ matrix.db }} ${{ matrix.variant }} publish: needs: test if: startsWith(github.ref, 'refs/tags/v') runs-on: ubuntu-latest - strategy: - matrix: - db: [postgres] - - env: - REGISTRY_URL: ${{ secrets.REGISTRY_URL }} - VERSION: ${{ github.ref_name }} + strategy: *db-matrix steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v4 - uses: jdx/mise-action@v3 - - name: Login to registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY_URL }} - username: ${{ secrets.REGISTRY_USERNAME }} - password: ${{ secrets.REGISTRY_PASSWORD }} + - name: Push + run: just push ${{ matrix.db }} ${{ matrix.variant }} - - name: Push ${{ matrix.db }} - run: just push ${{ matrix.db }} ${{ env.VERSION }} - - - name: Cleanup ${{ matrix.db }} - run: | - just clean ${{ matrix.db }} - just clean-images ${{ matrix.db }} + - name: Cleanup + if: always() + run: just down-all ${{ matrix.db }} ${{ matrix.variant }} diff --git a/Justfile b/Justfile index 374d798..3431eac 100644 --- a/Justfile +++ b/Justfile @@ -1,57 +1,56 @@ set shell := ["bash", "-euo", "pipefail", "-c"] set dotenv-load := true -VARIANT := env("VARIANT", "postgres") -REGISTRY_URL := env("REGISTRY_URL", "") -VERSION := env("VERSION", "latest") +DATABASE := env("DATABASE", "postgres") +VARIANT := env("VARIANT", "base") _default: @echo "Default env variables:" + @echo " DATABASE: {{DATABASE}}" @echo " VARIANT: {{VARIANT}}" - @echo " REGISTRY_URL: {{REGISTRY_URL}}" - @echo " VERSION: {{VERSION}}" @just --list ### Container Management ### # Start the database and wait until it's healthy -up db=VARIANT: - just build {{db}} - docker compose -f {{db}}/compose.yml up -d --wait +up db=DATABASE variant=VARIANT: + just build {{db}} {{variant}} + docker compose -f {{db}}-{{variant}}/compose.yml up -d --wait # Stop the database container but preserve data volumes -down db=VARIANT: - docker compose -f {{db}}/compose.yml down +down db=DATABASE variant=VARIANT: + docker compose -f {{db}}-{{variant}}/compose.yml down -# Stop the database container and remove data volumes -clean db=VARIANT: - docker compose -f {{db}}/compose.yml down -v +# Remove containers and data volumes but preserve images +down-volumes db=DATABASE variant=VARIANT: + docker compose -f {{db}}-{{variant}}/compose.yml down -v -# Remove the database image from local Docker cache -clean-images db=VARIANT: - docker compose -f {{db}}/compose.yml down --rmi local +# Remove containers, volumes, and images +down-all db=DATABASE variant=VARIANT: + docker compose -f {{db}}-{{variant}}/compose.yml down -v --rmi local ### Build & Publish ### # Build image locally -build db=VARIANT: +build db=DATABASE variant=VARIANT: #!/usr/bin/env bash - IMAGE="db-{{db}}:latest" - echo "docker build -f {{db}}/Dockerfile -t ${IMAGE} {{db}}" - docker build -f {{db}}/Dockerfile -t ${IMAGE} {{db}} + IMAGE="db-{{db}}" + VERSION="{{variant}}" + + echo "docker build -f {{db}}-{{variant}}/Dockerfile -t ${IMAGE}:${VERSION} {{db}}-{{variant}}" + docker build -f {{db}}-{{variant}}/Dockerfile -t ${IMAGE}:${VERSION} {{db}}-{{variant}} # Build and push image to registry -push db=VARIANT version=VERSION: +push db=DATABASE variant=VARIANT: #!/usr/bin/env bash - REGISTRY_URL='{{REGISTRY_URL}}' - PREFIX=${REGISTRY_URL:+${REGISTRY_URL}/} + PREFIX="${REGISTRY_URL:+${REGISTRY_URL}/}" IMAGE="db-{{db}}" - VERSION={{version}} + VERSION="{{variant}}" - just build {{db}} + just build {{db}} {{variant}} - echo "docker tag ${IMAGE}:latest ${PREFIX}${IMAGE}:${VERSION}" - docker tag ${IMAGE}:latest ${PREFIX}${IMAGE}:${VERSION} + echo "docker tag ${IMAGE}:${VERSION} ${PREFIX}${IMAGE}:${VERSION}" + docker tag ${IMAGE}:${VERSION} ${PREFIX}${IMAGE}:${VERSION} echo "docker push ${PREFIX}${IMAGE}:${VERSION}" docker push ${PREFIX}${IMAGE}:${VERSION} @@ -59,14 +58,15 @@ push db=VARIANT version=VERSION: ### Tests ### # Run tests against a database variant -test db=VARIANT: - @case "{{db}}" in \ - postgres) just _test-postgres ;; \ - *) echo "Unknown database: {{db}}" >&2; exit 1 ;; \ +test db=DATABASE variant=VARIANT: + #!/usr/bin/env bash + just up {{db}} {{variant}} + case "{{db}}:{{variant}}" in + postgres:base) just _test-postgres base ;; + *) echo "Unknown database: {{db}}" >&2; exit 1 ;; esac + just down {{db}} {{variant}} # Run tests against a Postgres database -_test-postgres: - #!/usr/bin/env bash - just up postgres - docker compose -f postgres/compose.yml exec postgres pg_isready -U ${POSTGRES_USER:-postgres} +_test-postgres variant=VARIANT: + docker compose -f postgres-{{variant}}/compose.yml exec postgres pg_isready -U ${POSTGRES_USER:-postgres} diff --git a/postgres/.env.example b/postgres-base/.env.example similarity index 100% rename from postgres/.env.example rename to postgres-base/.env.example diff --git a/postgres/000_extensions.sql b/postgres-base/000_extensions.sql similarity index 100% rename from postgres/000_extensions.sql rename to postgres-base/000_extensions.sql diff --git a/postgres/Dockerfile b/postgres-base/Dockerfile similarity index 100% rename from postgres/Dockerfile rename to postgres-base/Dockerfile diff --git a/postgres/compose.yml b/postgres-base/compose.yml similarity index 100% rename from postgres/compose.yml rename to postgres-base/compose.yml