Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ci: Introduce workflow for testing docker compose #166

Merged
merged 10 commits into from
Nov 20, 2024
163 changes: 163 additions & 0 deletions .github/workflows/test-docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -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/[email protected]
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/[email protected]
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