From 79b6b2b4df457c87e72ab01f71d5bd7202b74172 Mon Sep 17 00:00:00 2001 From: PPawlowski Date: Wed, 20 Nov 2024 17:29:05 +0100 Subject: [PATCH] ci: Introduce workflow for testing docker compose (#166) --- .github/workflows/test-docker-compose.yaml | 163 +++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 .github/workflows/test-docker-compose.yaml diff --git a/.github/workflows/test-docker-compose.yaml b/.github/workflows/test-docker-compose.yaml new file mode 100644 index 0000000..6b58586 --- /dev/null +++ b/.github/workflows/test-docker-compose.yaml @@ -0,0 +1,163 @@ +name: Test Docker Compose + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + default-stack: + name: Test default stack + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Create .env file for default settings + run: | + cp .env.example .env + sed -i 's/DOMAIN=.*/DOMAIN=ci-example.com/' .env + + - name: Create stack + uses: hoverkraft-tech/compose-action@v2.0.2 + with: + compose-file: "./docker-compose.yml" + up-flags: "-d --quiet-pull" + + - name: Check readiness + run: | + has_healthcheck() { + local container=$1 + local health_status=$(docker inspect --format='{{if .Config.Healthcheck}}true{{else}}false{{end}}' "$container") + [ "$health_status" = "true" ] + } + + check_containers() { + containers=$(docker compose ps -q) + for container in $containers; do + container_name=$(docker inspect --format '{{.Name}}' "$container" | sed 's/\///') + container_ip=$(docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container") + + if has_healthcheck "$container"; then + echo "Container has healthcheck defined" + status=$(docker inspect --format "{{.State.Health.Status}}" "$container") + if [ "$status" != "healthy" ]; then + echo "❌ Container $container_name is not healthy (status: $status)" + return 1 + fi + else + running=$(docker inspect --format "{{.State.Running}}" "$container") + if [ "$running" != "true" ]; then + echo "❌ Container $container_name is not running" + return 1 + fi + fi + + echo "✅ Container $container_name is ready" + done + return 0 + } + + # Wait for containers with timeout + TIMEOUT=300 # 5 minutes timeout + ELAPSED=0 + SLEEP_TIME=10 + + until check_containers; do + if [ $ELAPSED -ge $TIMEOUT ]; then + echo "❌ Timeout waiting for containers to be ready" + docker compose ps + docker compose logs + exit 1 + fi + echo "⏳ Waiting for containers... ($ELAPSED seconds elapsed)" + sleep $SLEEP_TIME + ELAPSED=$((ELAPSED + SLEEP_TIME)) + done + + echo "✅ All containers are ready!" + docker compose ps + + - name: Tear down the stack + if: always() + run: docker compose down + + + quick-start-stack: + name: Test quick-start stack + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Create .env file for default settings + run: | + cp .env.example .env + sed -i 's/DOMAIN=.*/DOMAIN=ci-example.com/' .env + + - name: Create stack + uses: hoverkraft-tech/compose-action@v2.0.2 + with: + compose-file: "./docker-compose-quick-start.yml" + up-flags: "-d --quiet-pull" + + - name: Check readiness + run: | + has_healthcheck() { + local container=$1 + local health_status=$(docker inspect --format='{{if .Config.Healthcheck}}true{{else}}false{{end}}' "$container") + [ "$health_status" = "true" ] + } + + check_containers() { + containers=$(docker compose ps -q) + for container in $containers; do + container_name=$(docker inspect --format '{{.Name}}' "$container" | sed 's/\///') + container_ip=$(docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container") + + if has_healthcheck "$container"; then + echo "Container has healthcheck defined" + status=$(docker inspect --format "{{.State.Health.Status}}" "$container") + if [ "$status" != "healthy" ]; then + echo "❌ Container $container_name is not healthy (status: $status)" + return 1 + fi + else + running=$(docker inspect --format "{{.State.Running}}" "$container") + if [ "$running" != "true" ]; then + echo "❌ Container $container_name is not running" + return 1 + fi + fi + + echo "✅ Container $container_name is ready" + done + return 0 + } + + # Wait for containers with timeout + TIMEOUT=300 # 5 minutes timeout + ELAPSED=0 + SLEEP_TIME=10 + + until check_containers; do + if [ $ELAPSED -ge $TIMEOUT ]; then + echo "❌ Timeout waiting for containers to be ready" + docker compose ps + docker compose logs + exit 1 + fi + echo "⏳ Waiting for containers... ($ELAPSED seconds elapsed)" + sleep $SLEEP_TIME + ELAPSED=$((ELAPSED + SLEEP_TIME)) + done + + echo "✅ All containers are ready!" + docker compose ps + + - name: Tear down the stack + if: always() + run: docker compose down