mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-02-18 00:17:39 +01:00
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.
86 lines
1.8 KiB
Bash
Executable File
86 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Smoke tests for install-docker-agent-v2.sh
|
|
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
SCRIPT_PATH="${ROOT_DIR}/scripts/install-docker-agent-v2.sh"
|
|
TEST_NAME="install-docker-agent-v2"
|
|
|
|
if [[ ! -f "${SCRIPT_PATH}" ]]; then
|
|
echo "Missing script at ${SCRIPT_PATH}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/pulse-test-XXXXXX")"
|
|
trap 'rm -rf "${TMP_DIR}"' EXIT
|
|
|
|
pass_count=0
|
|
fail_count=0
|
|
|
|
log_pass() {
|
|
echo "[PASS] $1"
|
|
((pass_count++))
|
|
return 0
|
|
}
|
|
|
|
log_fail() {
|
|
echo "[FAIL] $1" >&2
|
|
((fail_count++))
|
|
return 1
|
|
}
|
|
|
|
run_test() {
|
|
local desc="$1"
|
|
shift
|
|
if "$@"; then
|
|
log_pass "$desc"
|
|
else
|
|
local status=$?
|
|
log_fail "$desc (exit ${status})"
|
|
fi
|
|
}
|
|
|
|
set +e
|
|
run_test "syntax check" bash -n "${SCRIPT_PATH}"
|
|
set -e
|
|
|
|
# Test dry-run output captures action hints
|
|
set +e
|
|
DRY_RUN_OUTPUT="$("${SCRIPT_PATH}" --dry-run --url http://test.local --token testtoken 2>&1)"
|
|
DRY_STATUS=$?
|
|
set -e
|
|
if (( DRY_STATUS == 0 )) && [[ "${DRY_RUN_OUTPUT}" == *"[dry-run]"* ]]; then
|
|
log_pass "dry-run outputs actions"
|
|
else
|
|
log_fail "dry-run outputs actions"
|
|
echo "${DRY_RUN_OUTPUT}"
|
|
fi
|
|
|
|
if (( DRY_STATUS == 0 )); then
|
|
log_pass "dry-run exits successfully"
|
|
else
|
|
log_fail "dry-run exits successfully (exit ${DRY_STATUS})"
|
|
echo "${DRY_RUN_OUTPUT}"
|
|
fi
|
|
|
|
# Test argument validation (missing token)
|
|
MISSING_TOKEN_LOG="${TMP_DIR}/missing-token.log"
|
|
set +e
|
|
"${SCRIPT_PATH}" --dry-run --url http://test.local >"${MISSING_TOKEN_LOG}" 2>&1
|
|
ARG_STATUS=$?
|
|
set -e
|
|
if (( ARG_STATUS == 0 )); then
|
|
log_fail "missing token rejected"
|
|
cat "${MISSING_TOKEN_LOG}"
|
|
else
|
|
log_pass "missing token rejected"
|
|
fi
|
|
|
|
if (( fail_count > 0 )); then
|
|
echo "${TEST_NAME}: ${fail_count} failures" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "All ${TEST_NAME} tests passed (${pass_count})"
|