Skip to content

Commit

Permalink
Add test to make sure healthcheck works
Browse files Browse the repository at this point in the history
Allow fpm status from ipv6 localhost
  • Loading branch information
joecorall committed Jan 14, 2025
1 parent f469dd6 commit 5dca265
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 0 deletions.
1 change: 1 addition & 0 deletions nginx/rootfs/etc/nginx/shared/fpm.conf
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
# Not accessible outside of the container.
location ~ ^/(status|ping)$ {
allow 127.0.0.1;
allow ::1;
deny all;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
Expand Down
56 changes: 56 additions & 0 deletions nginx/tests/ServiceHealthcheck/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import plugins.TestsPlugin.DockerComposeUp
import plugins.TestsPlugin.DockerComposeUp.Companion.pool
import java.lang.Thread.sleep
import java.time.Duration.ofSeconds
import java.util.concurrent.CompletableFuture.supplyAsync
import java.io.ByteArrayOutputStream

tasks.named<DockerComposeUp>("test") {
doFirst {
supplyAsync(
{
val maxAttempts = 10
val delayBetweenAttempts = 5000L // 5 seconds in milliseconds
var attempt = 0
var foundHealthyService = false

while (attempt < maxAttempts) {
attempt++
val outputStream = ByteArrayOutputStream()
project.exec {
commandLine = baseArguments + listOf("ps", "--all")
standardOutput = outputStream
workingDir = project.projectDir
}
val output = outputStream.toString()

// Regex to match a healthy service in the ps output
val healthyServicePattern = """(?m)^.+\s+.+\s+Up \d+ seconds \(healthy\).*$""".toRegex()
foundHealthyService = output.lines().any { line ->
healthyServicePattern.matches(line)
}

if (foundHealthyService) {
println("Healthy service found on attempt $attempt.")
project.exec {
commandLine = baseArguments + listOf("stop")
standardOutput = outputStream
workingDir = project.projectDir
}
break
}

if (attempt < maxAttempts) {
println("No healthy service found. Retrying in ${delayBetweenAttempts / 1000} seconds...")
sleep(delayBetweenAttempts)
}
}

// Throw an exception if no healthy service was found after all attempts
if (!foundHealthyService) {
throw GradleException("No service is marked as healthy in docker compose ps output after $maxAttempts attempts.")
}
}, pool
)
}
}
19 changes: 19 additions & 0 deletions nginx/tests/ServiceHealthcheck/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---

# Common to all services
x-common: &common
restart: "no"

name: nginx-servicehealthcheck
services:
nginx:
<<: *common
image: ${NGINX:-islandora/nginx:local}
healthcheck:
interval: 10s
retries: 3
start_period: 10s
volumes:
- ./test.sh:/test.sh # Test to run.
command:
- /test.sh # Run test and exit.
16 changes: 16 additions & 0 deletions nginx/tests/ServiceHealthcheck/test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/command/with-contenv bash
# shellcheck shell=bash

on_terminate() {
echo "Termination signal received. Exiting..."
exit 0
}
trap 'on_terminate' SIGTERM

# Wait for Nginx to be ready.
s6-svwait -U /run/service/nginx

sleep 60

# Service must start for us to get to this point.
exit 1

0 comments on commit 5dca265

Please sign in to comment.