-
Notifications
You must be signed in to change notification settings - Fork 19
86 lines (74 loc) · 2.76 KB
/
test-docker-compose.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
name: Test Docker Compose
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
default-stack:
name: Test default Docker Compose 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 with Docker Compose
uses: hoverkraft-tech/compose-action@v2.0.2
with:
compose-file: "./docker-compose.yml"
up-flags: "-d"
- name: Run tests
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 Docker Compose
if: always()
run: docker compose down