sp-containers/tests/lib.sh

114 lines
2.9 KiB
Bash
Raw Normal View History

2023-06-05 15:24:42 +02:00
#!/bin/bash
log() { printf '%s\n' "$*"; }
error() { log "ERROR: $*" >&2; }
fatal() { error "$@"; exit 1; }
run_symfony_app_container() {
set -e
trap "set +e" RETURN
local symfony_version=${1}
local php_version=${2}
local image_tag=${3}
cd "${SCRIPT_DIR}/.."
# Create temporary directory
local project_dir=$(mktemp -d)
local run_id=$(date +%s)
# Defer cleanup on exit
trap_add "rm -rf ${project_dir}" EXIT
# Create dummy Symfony project
symfony new --dir="${project_dir}" --version="${symfony_version}" --php="${php_version}" --webapp 1>&2
cat > "${project_dir}/Dockerfile" <<EOF
FROM reg.cadoles.com/cadoles/symfony:${image_tag}
EOF
cat > "${project_dir}/.dockerignore" <<EOF
/var
/vendor
EOF
local image_name="symfony-test-${image_tag}:${run_id}"
# Build Symfony project image
docker build \
-t "${image_name}" \
"${project_dir}" \
1>&2
local http_port=$(get_unused_port)
local container_name="symfony-test-${image_tag}-${run_id}"
# Start project image
docker run \
-d \
--rm \
-p "${http_port}:8080" \
--name "${container_name}" \
"${image_name}" \
1>&2
# Wait container is healthy with a timeout
local duration=0
local last_tick=$(date +%s)
local container_status=$(docker inspect -f '{{.State.Health.Status}}' ${container_name})
log "Waiting for container to become healthy..." 1>&2
until [ "${container_status}" == "healthy" ]; do
sleep 1
local now=$(date +%s)
duration=$(( ${duration} + ( ${now} - ${last_tick} ) ))
if [ ${duration} -gt 60 ]; then
fail "Container did not become healthy before timeout !"
fi
last_tick=${now}
container_status=$(docker inspect -f '{{.State.Health.Status}}' ${container_name})
done
echo "${container_name}"
}
get_unused_port() {
set -e
trap "set +e" RETURN
local lport=32768;
local uport=60999;
while true; do
local mport=$[${lport} + (${RANDOM} % $uport)];
(echo "" >/dev/tcp/127.0.0.1/${mport}) >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo ${mport};
return 0;
fi
done
}
# From https://stackoverflow.com/a/7287873
trap_add() {
local trap_add_cmd=$1;
shift || fatal "${FUNCNAME} usage error"
for trap_add_name in "$@"; do
trap -- "$(
# helper fn to get existing trap command from output
# of trap -p
extract_trap_cmd() { printf '%s\n' "$3"; }
# print existing trap command with newline
eval "extract_trap_cmd $(trap -p "${trap_add_name}")"
# print the new trap command
printf '%s\n' "${trap_add_cmd}"
)" "${trap_add_name}" \
|| fatal "unable to add to trap ${trap_add_name}"
done
}
declare -f -t trap_add