feat: restructure PostgreSQL setup with base variant

This commit is contained in:
2026-03-08 18:11:18 +07:00
parent a3610d6756
commit d490100860
6 changed files with 52 additions and 70 deletions

View File

@@ -9,56 +9,38 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy: &db-matrix
fail-fast: false fail-fast: false
matrix: matrix:
db: [postgres] include:
- db: postgres
env: variant: base
### Postgres ###
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
POSTGRES_PORT: 5432
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v4
- uses: jdx/mise-action@v3 - uses: jdx/mise-action@v3
- name: Test ${{ matrix.db }} - name: Test
run: just test ${{ matrix.db }} run: just test ${{ matrix.db }} ${{ matrix.variant }}
- name: Cleanup ${{ matrix.db }} - name: Cleanup
run: just clean ${{ matrix.db }} if: always()
run: just down-all ${{ matrix.db }} ${{ matrix.variant }}
publish: publish:
needs: test needs: test
if: startsWith(github.ref, 'refs/tags/v') if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy: *db-matrix
matrix:
db: [postgres]
env:
REGISTRY_URL: ${{ secrets.REGISTRY_URL }}
VERSION: ${{ github.ref_name }}
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v4
- uses: jdx/mise-action@v3 - uses: jdx/mise-action@v3
- name: Login to registry - name: Push
uses: docker/login-action@v3 run: just push ${{ matrix.db }} ${{ matrix.variant }}
with:
registry: ${{ env.REGISTRY_URL }}
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Push ${{ matrix.db }} - name: Cleanup
run: just push ${{ matrix.db }} ${{ env.VERSION }} if: always()
run: just down-all ${{ matrix.db }} ${{ matrix.variant }}
- name: Cleanup ${{ matrix.db }}
run: |
just clean ${{ matrix.db }}
just clean-images ${{ matrix.db }}

View File

@@ -1,57 +1,56 @@
set shell := ["bash", "-euo", "pipefail", "-c"] set shell := ["bash", "-euo", "pipefail", "-c"]
set dotenv-load := true set dotenv-load := true
VARIANT := env("VARIANT", "postgres") DATABASE := env("DATABASE", "postgres")
REGISTRY_URL := env("REGISTRY_URL", "") VARIANT := env("VARIANT", "base")
VERSION := env("VERSION", "latest")
_default: _default:
@echo "Default env variables:" @echo "Default env variables:"
@echo " DATABASE: {{DATABASE}}"
@echo " VARIANT: {{VARIANT}}" @echo " VARIANT: {{VARIANT}}"
@echo " REGISTRY_URL: {{REGISTRY_URL}}"
@echo " VERSION: {{VERSION}}"
@just --list @just --list
### Container Management ### ### Container Management ###
# Start the database and wait until it's healthy # Start the database and wait until it's healthy
up db=VARIANT: up db=DATABASE variant=VARIANT:
just build {{db}} just build {{db}} {{variant}}
docker compose -f {{db}}/compose.yml up -d --wait docker compose -f {{db}}-{{variant}}/compose.yml up -d --wait
# Stop the database container but preserve data volumes # Stop the database container but preserve data volumes
down db=VARIANT: down db=DATABASE variant=VARIANT:
docker compose -f {{db}}/compose.yml down docker compose -f {{db}}-{{variant}}/compose.yml down
# Stop the database container and remove data volumes # Remove containers and data volumes but preserve images
clean db=VARIANT: down-volumes db=DATABASE variant=VARIANT:
docker compose -f {{db}}/compose.yml down -v docker compose -f {{db}}-{{variant}}/compose.yml down -v
# Remove the database image from local Docker cache # Remove containers, volumes, and images
clean-images db=VARIANT: down-all db=DATABASE variant=VARIANT:
docker compose -f {{db}}/compose.yml down --rmi local docker compose -f {{db}}-{{variant}}/compose.yml down -v --rmi local
### Build & Publish ### ### Build & Publish ###
# Build image locally # Build image locally
build db=VARIANT: build db=DATABASE variant=VARIANT:
#!/usr/bin/env bash #!/usr/bin/env bash
IMAGE="db-{{db}}:latest" IMAGE="db-{{db}}"
echo "docker build -f {{db}}/Dockerfile -t ${IMAGE} {{db}}" VERSION="{{variant}}"
docker build -f {{db}}/Dockerfile -t ${IMAGE} {{db}}
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 # Build and push image to registry
push db=VARIANT version=VERSION: push db=DATABASE variant=VARIANT:
#!/usr/bin/env bash #!/usr/bin/env bash
REGISTRY_URL='{{REGISTRY_URL}}' PREFIX="${REGISTRY_URL:+${REGISTRY_URL}/}"
PREFIX=${REGISTRY_URL:+${REGISTRY_URL}/}
IMAGE="db-{{db}}" IMAGE="db-{{db}}"
VERSION={{version}} VERSION="{{variant}}"
just build {{db}} just build {{db}} {{variant}}
echo "docker tag ${IMAGE}:latest ${PREFIX}${IMAGE}:${VERSION}" echo "docker tag ${IMAGE}:${VERSION} ${PREFIX}${IMAGE}:${VERSION}"
docker tag ${IMAGE}:latest ${PREFIX}${IMAGE}:${VERSION} docker tag ${IMAGE}:${VERSION} ${PREFIX}${IMAGE}:${VERSION}
echo "docker push ${PREFIX}${IMAGE}:${VERSION}" echo "docker push ${PREFIX}${IMAGE}:${VERSION}"
docker push ${PREFIX}${IMAGE}:${VERSION} docker push ${PREFIX}${IMAGE}:${VERSION}
@@ -59,14 +58,15 @@ push db=VARIANT version=VERSION:
### Tests ### ### Tests ###
# Run tests against a database variant # Run tests against a database variant
test db=VARIANT: test db=DATABASE variant=VARIANT:
@case "{{db}}" in \ #!/usr/bin/env bash
postgres) just _test-postgres ;; \ just up {{db}} {{variant}}
*) echo "Unknown database: {{db}}" >&2; exit 1 ;; \ case "{{db}}:{{variant}}" in
postgres:base) just _test-postgres base ;;
*) echo "Unknown database: {{db}}" >&2; exit 1 ;;
esac esac
just down {{db}} {{variant}}
# Run tests against a Postgres database # Run tests against a Postgres database
_test-postgres: _test-postgres variant=VARIANT:
#!/usr/bin/env bash docker compose -f postgres-{{variant}}/compose.yml exec postgres pg_isready -U ${POSTGRES_USER:-postgres}
just up postgres
docker compose -f postgres/compose.yml exec postgres pg_isready -U ${POSTGRES_USER:-postgres}