feat(tools): add docker scripts

This commit is contained in:
2026-02-22 20:50:26 +01:00
parent 5957ac4789
commit d343524e05
7 changed files with 249 additions and 8 deletions
+54 -8
View File
@@ -6,6 +6,10 @@ PROJECT_FILENAME = pg_morbac
# Read version from control file using centralized script # Read version from control file using centralized script
PROJECT_VERSION = $(shell ./tools/get_version.sh $(PROJECT_FILENAME).control) PROJECT_VERSION = $(shell ./tools/get_version.sh $(PROJECT_FILENAME).control)
# Docker configuration
DOCKER_CONTAINER ?= postgres
DOCKER_PORT ?= 5432
# For development, work on source files in src/ # For development, work on source files in src/
SRC_DIR = src SRC_DIR = src
OUTPUT_DEV_FILENAME = $(PROJECT_FILENAME).sql OUTPUT_DEV_FILENAME = $(PROJECT_FILENAME).sql
@@ -18,6 +22,7 @@ include $(PGXS)
# Custom targets # Custom targets
# Build the extension SQL file from source components
.PHONY: build .PHONY: build
build: build:
@./tools/build.sh $(SRC_DIR) $(OUTPUT_DEV_FILENAME) @./tools/build.sh $(SRC_DIR) $(OUTPUT_DEV_FILENAME)
@@ -38,6 +43,32 @@ install: build
@cp $(OUTPUT_DEV_FILENAME) $(OUTPUT_RELEASE_FILENAME) @cp $(OUTPUT_DEV_FILENAME) $(OUTPUT_RELEASE_FILENAME)
@./tools/install.sh $(PROJECT_FILENAME) $(PROJECT_VERSION) @./tools/install.sh $(PROJECT_FILENAME) $(PROJECT_VERSION)
# Start PostgreSQL Docker container
.PHONY: docker-start
docker-start:
@./tools/start_docker.sh $(DOCKER_CONTAINER) $(DOCKER_PORT)
# Stop PostgreSQL Docker container
.PHONY: docker-stop
docker-stop:
@./tools/stop_docker.sh $(DOCKER_CONTAINER)
# Remove PostgreSQL Docker container
.PHONY: docker-clean
docker-clean:
@./tools/clean_docker.sh $(DOCKER_CONTAINER)
# Build and install extension in Docker container
.PHONY: docker-install
docker-install: build docker-start
@cp $(OUTPUT_DEV_FILENAME) $(OUTPUT_RELEASE_FILENAME)
@./tools/install_docker.sh $(DOCKER_CONTAINER) $(PROJECT_FILENAME) $(PROJECT_VERSION)
# Uninstall extension from Docker container
.PHONY: docker-uninstall
docker-uninstall:
@./tools/uninstall_docker.sh $(DOCKER_CONTAINER) $(PROJECT_FILENAME)
.PHONY: test .PHONY: test
test: build test: build
@dropdb morbac_test 2>/dev/null || true @dropdb morbac_test 2>/dev/null || true
@@ -45,6 +76,11 @@ test: build
@./tools/test.sh morbac_test $(OUTPUT_DEV_FILENAME) @./tools/test.sh morbac_test $(OUTPUT_DEV_FILENAME)
@dropdb morbac_test @dropdb morbac_test
# Build and run tests in Docker container
.PHONY: docker-test
docker-test: build docker-start
@./tools/test_docker.sh $(DOCKER_CONTAINER) morbac_test $(OUTPUT_DEV_FILENAME)
# Uninstall extension from PostgreSQL # Uninstall extension from PostgreSQL
.PHONY: uninstall .PHONY: uninstall
uninstall: uninstall:
@@ -59,12 +95,22 @@ clean:
# Show help # Show help
.PHONY: help .PHONY: help
help: help:
@echo "pg_morbac Makefile targets:" @echo "pg_morbac Makefile - Build and manage the PostgreSQL extension"
@echo " make build - Build $(OUTPUT_DEV_FILENAME) from src/" @echo ""
@echo " make release - Build versioned $(PROJECT_FILENAME)--X.Y.Z.sql from src/" @echo "Makefile targets:"
@echo " make test - Build and run test suite" @echo " make build - Build $(OUTPUT_DEV_FILENAME) from src/"
@echo " make install - Build and install $(PROJECT_FILENAME) to PostgreSQL" @echo " make release - Build versioned $(PROJECT_FILENAME)--X.Y.Z.sql from src/"
@echo " make uninstall - Uninstall $(PROJECT_FILENAME) from PostgreSQL" @echo " make test - Build and run test suite"
@echo " make clean - Clean up generated files" @echo " make install - Build and install $(PROJECT_FILENAME) to PostgreSQL"
@echo " make help - Show this help" @echo " make uninstall - Uninstall $(PROJECT_FILENAME) from PostgreSQL"
@echo " make clean - Clean up generated files"
@echo " make help - Show this help"
@echo ""
@echo "Docker targets:"
@echo " make docker-start - Start PostgreSQL Docker container"
@echo " make docker-stop - Stop PostgreSQL Docker container"
@echo " make docker-clean - Remove PostgreSQL Docker container"
@echo " make docker-install - Build and install extension in Docker container"
@echo " make docker-uninstall - Uninstall extension from Docker container"
@echo " make docker-test - Build and run test suite in Docker container"
@echo "" @echo ""
+21
View File
@@ -0,0 +1,21 @@
#!/bin/bash
# clean_docker.sh - Remove a PostgreSQL Docker container
# Usage: ./clean_docker.sh [container_name]
set -e # Exit immediately if a command exits with a non-zero status
CONTAINER="${1:-postgres}"
if ! docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "Container $CONTAINER does not exist"
exit 0
fi
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "Stopping container $CONTAINER"
docker stop "$CONTAINER"
fi
echo "Removing container $CONTAINER"
docker rm "$CONTAINER"
+52
View File
@@ -0,0 +1,52 @@
#!/bin/bash
# install_docker.sh - Install the PostgreSQL extension to a Docker container
# Usage: ./install_docker.sh [container_name] [project_name] [version]
set -e # Exit immediately if a command exits with a non-zero status
CONTAINER="${1:-postgres}"
PROJECT_FILENAME="${2:-pg_morbac}"
PROJECT_VERSION="${3}"
if [ -z "$PROJECT_VERSION" ]; then
SCRIPT_DIR=$(dirname "$0")
CONTROL_FILE="${PROJECT_FILENAME}.control"
PROJECT_VERSION=$("$SCRIPT_DIR/get_version.sh" "$CONTROL_FILE")
fi
if [ -z "$PROJECT_VERSION" ]; then
echo "Error: could not detect version" >&2
exit 1
fi
SQL_FILE="${PROJECT_FILENAME}--${PROJECT_VERSION}.sql"
CONTROL_FILE="${PROJECT_FILENAME}.control"
if [ ! -f "$SQL_FILE" ]; then
echo "Error: versioned SQL file not found: $SQL_FILE" >&2
exit 1
fi
if [ ! -f "$CONTROL_FILE" ]; then
echo "Error: control file not found: $CONTROL_FILE" >&2
exit 1
fi
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "Error: Docker container not running: $CONTAINER" >&2
exit 1
fi
docker exec "$CONTAINER" mkdir -p /tmp/pg_morbac
docker cp "$CONTROL_FILE" "$CONTAINER:/tmp/pg_morbac/"
docker cp "$SQL_FILE" "$CONTAINER:/tmp/pg_morbac/"
docker exec "$CONTAINER" sh -c "
EXTDIR=\$(pg_config --sharedir)/extension
cp /tmp/pg_morbac/${CONTROL_FILE} \$EXTDIR/
cp /tmp/pg_morbac/${SQL_FILE} \$EXTDIR/
rm -rf /tmp/pg_morbac
"
echo "Installed ${PROJECT_FILENAME} v${PROJECT_VERSION} to container ${CONTAINER}"
+43
View File
@@ -0,0 +1,43 @@
#!/bin/bash
# start_docker.sh - Start a PostgreSQL Docker container
# Usage: ./start_docker.sh [container_name] [port]
set -e # Exit immediately if a command exits with a non-zero status
CONTAINER="${1:-postgres}"
PORT="${2:-5432}"
POSTGRES_PASSWORD="${POSTGRES_PASSWORD:-postgres}"
POSTGRES_USER="${POSTGRES_USER:-postgres}"
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "Container $CONTAINER is already running"
exit 0
else
echo "Starting existing container $CONTAINER"
docker start "$CONTAINER"
sleep 2
fi
else
echo "Creating and starting container $CONTAINER"
docker run -d \
--name "$CONTAINER" \
-e POSTGRES_PASSWORD="$POSTGRES_PASSWORD" \
-e POSTGRES_USER="$POSTGRES_USER" \
-p "${PORT}:5432" \
postgres:latest
sleep 3
fi
echo "Waiting for PostgreSQL to be ready..."
for i in {1..30}; do
if docker exec "$CONTAINER" psql -U "$POSTGRES_USER" -c '\q' 2>/dev/null; then
echo "PostgreSQL is ready in container $CONTAINER"
exit 0
fi
sleep 1
done
echo "Error: PostgreSQL did not become ready in time" >&2
exit 1
+16
View File
@@ -0,0 +1,16 @@
#!/bin/bash
# stop_docker.sh - Stop a PostgreSQL Docker container
# Usage: ./stop_docker.sh [container_name]
set -e # Exit immediately if a command exits with a non-zero status
CONTAINER="${1:-postgres}"
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "Container $CONTAINER is not running"
exit 0
fi
echo "Stopping container $CONTAINER"
docker stop "$CONTAINER"
+41
View File
@@ -0,0 +1,41 @@
#!/bin/bash
# test_docker.sh - Run tests in a Docker container
# Usage: ./test_docker.sh [container_name] [database_name] [sql_file]
set -e # Exit immediately if a command exits with a non-zero status
CONTAINER="${1:-postgres}"
DB="${2:-morbac_test}"
SQL_FILE="${3:-pg_morbac.sql}"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
if [ ! -f "$PROJECT_DIR/$SQL_FILE" ]; then
echo "Error: SQL file not found: $SQL_FILE" >&2
exit 1
fi
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "Error: Docker container not running: $CONTAINER" >&2
exit 1
fi
if ! docker exec "$CONTAINER" psql -U postgres -c '\q' 2>/dev/null; then
echo "Error: PostgreSQL not accessible in container: $CONTAINER" >&2
exit 1
fi
docker exec "$CONTAINER" psql -U postgres -c "DROP DATABASE IF EXISTS $DB" -q
docker exec "$CONTAINER" psql -U postgres -c "CREATE DATABASE $DB" -q
docker exec "$CONTAINER" mkdir -p /tmp/pg_morbac_test/tools
docker cp "$PROJECT_DIR/$SQL_FILE" "$CONTAINER:/tmp/pg_morbac_test/"
docker cp "$PROJECT_DIR/tests" "$CONTAINER:/tmp/pg_morbac_test/"
docker cp "$SCRIPT_DIR/test.sh" "$CONTAINER:/tmp/pg_morbac_test/tools/"
docker exec -w /tmp/pg_morbac_test "$CONTAINER" bash tools/test.sh "$DB" "$SQL_FILE"
docker exec "$CONTAINER" psql -U postgres -c "DROP DATABASE $DB" -q
docker exec "$CONTAINER" rm -rf /tmp/pg_morbac_test
+22
View File
@@ -0,0 +1,22 @@
#!/bin/bash
# uninstall_docker.sh - Uninstall the PostgreSQL extension from a Docker container
# Usage: ./uninstall_docker.sh [container_name] [project_name]
set -e # Exit immediately if a command exits with a non-zero status
CONTAINER="${1:-postgres}"
PROJECT_FILENAME="${2:-pg_morbac}"
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "Error: Docker container not running: $CONTAINER" >&2
exit 1
fi
docker exec "$CONTAINER" sh -c "
EXTDIR=\$(pg_config --sharedir)/extension
rm -f \$EXTDIR/${PROJECT_FILENAME}.control
rm -f \$EXTDIR/${PROJECT_FILENAME}--*.sql
"
echo "Uninstalled ${PROJECT_FILENAME} from container ${CONTAINER}"