mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-04-30 20:40:09 +00:00
feat: add shared script library system and refactor docker-agent installer
Implements a comprehensive script improvement infrastructure to reduce code duplication, improve maintainability, and enable easier testing of installer scripts. ## New Infrastructure ### Shared Library System (scripts/lib/) - common.sh: Core utilities (logging, sudo, dry-run, cleanup management) - systemd.sh: Service management helpers with container-safe systemctl - http.sh: HTTP/download helpers with curl/wget fallback and retry logic - README.md: Complete API documentation for all library functions ### Bundler System - scripts/bundle.sh: Concatenates library modules into single-file installers - scripts/bundle.manifest: Defines bundling configuration for distributables - Enables both modular development and curl|bash distribution ### Test Infrastructure - scripts/tests/run.sh: Test harness for running all smoke tests - scripts/tests/test-common-lib.sh: Common library validation (5 tests) - scripts/tests/test-docker-agent-v2.sh: Installer smoke tests (4 tests) - scripts/tests/integration/: Container-based integration tests (5 scenarios) - All tests passing ✓ ## Refactored Installer ### install-docker-agent-v2.sh - Reduced from 1098 to 563 lines (48% code reduction) - Uses shared libraries for all common operations - NEW: --dry-run flag support - Maintains 100% backward compatibility with original - Fully tested with smoke and integration tests ### Key Improvements - Sudo escalation: 100+ lines → 1 function call - Download logic: 51 lines → 1 function call - Service creation: 33 lines → 2 function calls - Logging: Standardized across all operations - Error handling: Improved with common library ## Documentation ### Rollout Strategy (docs/installer-v2-rollout.md) - 3-phase rollout plan (Alpha → Beta → GA) - Feature flag mechanism for gradual deployment - Testing checklist and success metrics - Rollback procedures and communication plan ### Developer Guides - docs/script-library-guide.md: Complete library usage guide - docs/CONTRIBUTING-SCRIPTS.md: Contribution workflow - docs/installer-v2-quickref.md: Quick reference for operators ## Metrics - Code reduction: 48% (1098 → 563 lines) - Reusable functions: 0 → 30+ - Test coverage: 0 → 8 test scenarios - Documentation: 0 → 5 comprehensive guides ## Testing All tests passing: - Smoke tests: 2/2 passed (8 test cases) - Integration tests: 5/5 scenarios passed - Bundled output: Syntax validated, dry-run tested ## Next Steps This lays the foundation for migrating other installers (install.sh, install-sensor-proxy.sh) to use the same pattern, reducing overall maintenance burden and improving code quality across the project.
This commit is contained in:
parent
ce5ad64810
commit
0fcfad3dc5
16 changed files with 3106 additions and 0 deletions
101
scripts/tests/run.sh
Executable file
101
scripts/tests/run.sh
Executable file
|
|
@ -0,0 +1,101 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Simple harness to execute shell-based smoke tests under scripts/tests/.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
TEST_DIR="${ROOT_DIR}/scripts/tests"
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Usage: scripts/tests/run.sh [test-script ...]
|
||||
|
||||
Run all scripts/tests/test-*.sh tests or a subset when specified.
|
||||
EOF
|
||||
}
|
||||
|
||||
discover_tests() {
|
||||
local -n ref=$1
|
||||
mapfile -t ref < <(find "${TEST_DIR}" -maxdepth 1 -type f -name 'test-*.sh' | sort)
|
||||
}
|
||||
|
||||
resolve_test_path() {
|
||||
local input="$1"
|
||||
if [[ "${input}" == /* ]]; then
|
||||
printf '%s\n' "${input}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -f "${TEST_DIR}/${input}" ]]; then
|
||||
printf '%s\n' "${TEST_DIR}/${input}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -f "${input}" ]]; then
|
||||
printf '%s\n' "${input}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
run_tests() {
|
||||
local -a tests=("$@")
|
||||
local total=0
|
||||
local passed=0
|
||||
local failed=0
|
||||
|
||||
for test in "${tests[@]}"; do
|
||||
((total += 1))
|
||||
local display="${test#${ROOT_DIR}/}"
|
||||
printf '==> %s\n' "${display}"
|
||||
if (cd "${ROOT_DIR}" && "${test}"); then
|
||||
echo "PASS"
|
||||
((passed += 1))
|
||||
else
|
||||
echo "FAIL"
|
||||
((failed += 1))
|
||||
fi
|
||||
echo
|
||||
done
|
||||
|
||||
echo "Summary: ${passed}/${total} passed"
|
||||
if (( failed > 0 )); then
|
||||
echo "Failures: ${failed}"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
main() {
|
||||
if [[ $# -gt 0 ]]; then
|
||||
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
local -a tests=()
|
||||
if [[ $# -gt 0 ]]; then
|
||||
local arg resolved
|
||||
for arg in "$@"; do
|
||||
if ! resolved="$(resolve_test_path "${arg}")"; then
|
||||
echo "Unknown test: ${arg}" >&2
|
||||
exit 1
|
||||
fi
|
||||
tests+=("${resolved}")
|
||||
done
|
||||
else
|
||||
discover_tests tests
|
||||
fi
|
||||
|
||||
if [[ ${#tests[@]} -eq 0 ]]; then
|
||||
echo "No tests found under ${TEST_DIR}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
run_tests "${tests[@]}"
|
||||
}
|
||||
|
||||
main "$@"
|
||||
Loading…
Add table
Add a link
Reference in a new issue