mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-08 03:38:23 +00:00
scripts/tests/environment/ becomes scripts/tests/workspace/ with one subdirectory per track. base/ prepares the workspace and is a prerequisite; compose/ and swarm/ are independent of each other, so CI can run them as separate jobs with a budget each. 00_orchestrator.sh runs the tracks named by INFINITO_WORKSPACE_TRACKS and aborts on an unknown one. The job count stays at five: cli.meta.ci.dev_runtime matrix assigns exactly one track per distro and flips the split with the run number, so two consecutive runs cover both tracks on every distro without doubling the matrix. The workspace_track input (rotate|compose|swarm) pins it from manual steer through the orchestrator for a targeted re-run. Job names carry the track glyph from utils/symbol_glossary and the image shortened to its last two segments, so quay.io/centos/centos:latest reads as centos:latest. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
120 lines
3.8 KiB
Bash
Executable File
120 lines
3.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Shared bootstrap, constants, and generic helpers for the environment
|
|
# test suite. Sourcing this file loads the repository env modules and
|
|
# configures git's safe.directory for the mounted workflow checkout.
|
|
# Cache-specific helpers live in cache.sh.
|
|
set -euo pipefail
|
|
|
|
DASHBOARD_APP="web-app-dashboard"
|
|
MATOMO_APP="web-app-matomo"
|
|
MARIADB_APP="svc-db-mariadb"
|
|
POSTGRES_APP="svc-db-postgres"
|
|
DASHBOARD_URL="https://dashboard.infinito.example"
|
|
MATOMO_URL="https://matomo.infinito.example"
|
|
|
|
: "${DASHBOARD_APP}" "${MATOMO_APP}" "${MARIADB_APP}" "${POSTGRES_APP}" "${DASHBOARD_URL}" "${MATOMO_URL}"
|
|
|
|
UTILS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
REPO_ROOT="$(cd "${UTILS_DIR}/../../../.." && pwd)"
|
|
|
|
ensure_git_safe_directory() {
|
|
local git_probe=""
|
|
|
|
if ! command -v git >/dev/null 2>&1; then
|
|
return 0
|
|
fi
|
|
|
|
if git -C "${REPO_ROOT}" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
|
return 0
|
|
fi
|
|
|
|
git_probe="$(git -C "${REPO_ROOT}" rev-parse --is-inside-work-tree 2>&1 || true)"
|
|
if [[ "${git_probe}" != *"detected dubious ownership"* ]]; then
|
|
return 0
|
|
fi
|
|
|
|
if ! git config --global --get-all safe.directory 2>/dev/null | grep -Fx "${REPO_ROOT}" >/dev/null 2>&1; then
|
|
echo "Configuring Git safe.directory for the mounted workflow checkout."
|
|
git config --global --add safe.directory "${REPO_ROOT}"
|
|
fi
|
|
}
|
|
|
|
load_repo_env() {
|
|
if ! command -v python3 >/dev/null 2>&1; then
|
|
return 0
|
|
fi
|
|
local previous_pwd
|
|
previous_pwd="$(pwd)"
|
|
cd "${REPO_ROOT}"
|
|
unset INFINITO_ENV_LOADED
|
|
unset PYTHON
|
|
unset PIP
|
|
# shellcheck source=scripts/meta/env/load.sh
|
|
source scripts/meta/env/load.sh
|
|
cd "${previous_pwd}"
|
|
}
|
|
|
|
load_repo_env
|
|
ensure_git_safe_directory
|
|
|
|
# Print the generated inventory and host_vars for debugging and verification.
|
|
#
|
|
# Matrix-variant deploys write `${INFINITO_INVENTORY_DIR}-0/devices.yml`,
|
|
# `${INFINITO_INVENTORY_DIR}-1/devices.yml`, ... never the unsuffixed
|
|
# `${INFINITO_INVENTORY_DIR}/devices.yml`. Discover every variant inside the
|
|
# infinito_nexus container (where the inventories actually live) and
|
|
# print each one; fall back to the unsuffixed path when no variants
|
|
# exist.
|
|
#
|
|
# cmd is executed via `sh -lc` (see scripts/tests/deploy/local/exec/container.sh)
|
|
# — keep the inner shell strictly POSIX (no bash arrays, no `shopt`, no `(( ))`).
|
|
inspect_glob_print() {
|
|
local glob_pattern="$1" fallback="$2"
|
|
make compose-exec cmd="set -eu; \
|
|
any=; \
|
|
for f in ${glob_pattern}; do \
|
|
[ -f \"\$f\" ] || continue; \
|
|
any=1; \
|
|
echo \"==> \$f\"; \
|
|
cat \"\$f\"; \
|
|
done; \
|
|
if [ -z \"\$any\" ]; then \
|
|
echo \"==> ${fallback}\"; \
|
|
cat \"${fallback}\"; \
|
|
fi"
|
|
}
|
|
|
|
inspect() {
|
|
echo "Printing the generated inventory to verify which roles were deployed."
|
|
inspect_glob_print "${INFINITO_INVENTORY_DIR}-*/devices.yml" "${INFINITO_INVENTORY_FILE}"
|
|
echo "Printing host_vars to verify per-host configuration."
|
|
inspect_glob_print "${INFINITO_INVENTORY_DIR}-*/host_vars/localhost.yml" "${INFINITO_INVENTORY_HOST_VARS_FILE}"
|
|
}
|
|
|
|
# Check that a URL responds with the expected HTTP status code.
|
|
# Usage: assert_http_status <expected_code> <url>
|
|
assert_http_status() {
|
|
local expected="${1}"
|
|
local url="${2}"
|
|
local actual
|
|
actual="$(curl -sS -o /dev/null -w '%{http_code}' "${url}" || true)"
|
|
if [ "${actual}" != "${expected}" ]; then
|
|
echo "[FAIL] ${url} returned HTTP ${actual}, expected ${expected}" >&2
|
|
exit 1
|
|
fi
|
|
echo "[OK] ${url} returned HTTP ${actual}"
|
|
}
|
|
|
|
# Print every group-conditional service key, comma-separated for `disable=`.
|
|
# Usage: variable_services [keep_key ...]
|
|
# Param keep_key: service keys the deploy under test needs, kept enabled.
|
|
variable_services() {
|
|
local out
|
|
out="$(cd "${REPO_ROOT}" && "${PYTHON}" -m cli.meta.roles.applications.dynamic_services --exclude "$@")"
|
|
[ -n "${out}" ] || {
|
|
echo "[FAIL] variable_services resolved to an empty disable set" >&2
|
|
exit 1
|
|
}
|
|
printf '%s' "${out}"
|
|
}
|