130 lines
5.7 KiB
Bash
130 lines
5.7 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
SCRIPT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)/deploy.sh
|
|
TEST_ROOT=$(mktemp -d "${TMPDIR:-/tmp}/sw-frontend-deploy-test.XXXXXX")
|
|
cleanup() {
|
|
[[ "$TEST_ROOT" == "${TMPDIR:-/tmp}/sw-frontend-deploy-test."* ]] || exit 1
|
|
rm -rf -- "$TEST_ROOT"
|
|
}
|
|
trap cleanup EXIT
|
|
mkdir "$TEST_ROOT/bin"
|
|
cat > "$TEST_ROOT/bin/docker" <<'DOCKER'
|
|
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
printf '%s\n' "$*" >> "$TEST_STATE/calls"
|
|
command=$1; shift
|
|
case "$command" in
|
|
inspect)
|
|
format=''
|
|
if [[ "$1" == --format ]]; then format=$2; shift 2; fi
|
|
if [[ "$format" == *RepoDigests* ]]; then
|
|
[[ "$1" == harbor.fuhua91.com/game/sw2:new ]] || exit 1
|
|
if [[ "$TEST_MODE" != digest-missing ]]; then printf 'harbor.fuhua91.com/game/sw2@sha256:%064d\n' 1; fi
|
|
exit 0
|
|
fi
|
|
[[ -d "$TEST_STATE/$1" ]] || exit 1
|
|
case "$format" in
|
|
*com.sw2.application*) cat "$TEST_STATE/$1/app" ;;
|
|
*org.opencontainers.image.revision*) cat "$TEST_STATE/$1/version" ;;
|
|
*State.Running*) cat "$TEST_STATE/$1/running" ;;
|
|
esac ;;
|
|
network|build) exit 0 ;;
|
|
push) [[ "$TEST_MODE" != push-fail ]] ;;
|
|
pull) [[ "$TEST_MODE" != pull-fail ]] ;;
|
|
run)
|
|
name=''; version='new'
|
|
while (($#)); do
|
|
if [[ "$1" == --name ]]; then name=$2; shift 2; else shift; fi
|
|
done
|
|
[[ -n "$name" ]] || exit 0
|
|
mkdir "$TEST_STATE/$name"
|
|
printf 'sw2' > "$TEST_STATE/$name/app"
|
|
printf '%s' "$version" > "$TEST_STATE/$name/version"
|
|
printf 'true' > "$TEST_STATE/$name/running"
|
|
printf 'new-container' > "$TEST_STATE/$name/id" ;;
|
|
port) printf '127.0.0.1:19603\n' ;;
|
|
stop)
|
|
name="${!#}"; printf 'false' > "$TEST_STATE/$name/running" ;;
|
|
start) printf 'true' > "$TEST_STATE/$1/running" ;;
|
|
rename) mv -- "$TEST_STATE/$1" "$TEST_STATE/$2" ;;
|
|
rm)
|
|
name="${!#}"
|
|
[[ "$name" == sw2-frontend* ]] || exit 1
|
|
rm -rf -- "$TEST_STATE/$name" ;;
|
|
*) echo "Unexpected docker command: $command" >&2; exit 1 ;;
|
|
esac
|
|
DOCKER
|
|
cat > "$TEST_ROOT/bin/curl" <<'CURL'
|
|
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
url="${!#}"
|
|
if [[ "$TEST_MODE" == preflight-fail && "$url" == *:19603/* ]]; then exit 1; fi
|
|
if [[ "$TEST_MODE" == final-fail && "$url" == *:9601/* ]]; then exit 1; fi
|
|
if [[ "$url" == */version.txt ]]; then printf 'new'; else printf 'ok'; fi
|
|
CURL
|
|
printf '#!/usr/bin/env bash\nexit 0\n' > "$TEST_ROOT/bin/flock"
|
|
chmod +x "$TEST_ROOT/bin/"*
|
|
export PATH="$TEST_ROOT/bin:$PATH"
|
|
export SW_HEALTH_ATTEMPTS=1
|
|
|
|
for scenario in success preflight-fail final-fail build-only pull-only pull-preflight push-fail pull-fail digest-missing unmanaged; do
|
|
export TEST_STATE="$TEST_ROOT/$scenario"
|
|
export TEST_MODE="$scenario"
|
|
export SW_DEPLOY_BASE="$TEST_STATE/base"
|
|
mkdir -p "$SW_DEPLOY_BASE" "$TEST_STATE/sw2-frontend" "$TEST_STATE/sw2-backend"
|
|
if [[ "$scenario" != pull-only && "$scenario" != pull-preflight ]]; then
|
|
mkdir -p "$SW_DEPLOY_BASE/frontend-releases/new/dist"
|
|
cp "$SCRIPT" "$SW_DEPLOY_BASE/frontend-releases/new/deploy.sh"
|
|
printf '<html>test</html>' > "$SW_DEPLOY_BASE/frontend-releases/new/dist/index.html"
|
|
printf 'new\n' > "$SW_DEPLOY_BASE/frontend-releases/new/dist/version.txt"
|
|
fi
|
|
printf 'old\n' > "$SW_DEPLOY_BASE/current-frontend-release"
|
|
printf 'sw2' > "$TEST_STATE/sw2-frontend/app"
|
|
printf 'old' > "$TEST_STATE/sw2-frontend/version"
|
|
printf 'true' > "$TEST_STATE/sw2-frontend/running"
|
|
printf 'old-container' > "$TEST_STATE/sw2-frontend/id"
|
|
printf 'backend-unchanged' > "$TEST_STATE/sw2-backend/id"
|
|
if [[ "$scenario" == unmanaged ]]; then printf 'other' > "$TEST_STATE/sw2-frontend/app"; fi
|
|
modes=()
|
|
case "$scenario" in
|
|
build-only) modes=(--build-only) ;;
|
|
pull-only) modes=(--pull-only) ;;
|
|
pull-preflight) modes=(--pull-only --build-only) ;;
|
|
esac
|
|
result=0
|
|
entry="$SW_DEPLOY_BASE/frontend-releases/new/deploy.sh"
|
|
if [[ "$scenario" == pull-only || "$scenario" == pull-preflight ]]; then entry="$SCRIPT"; fi
|
|
bash "$entry" new "${modes[@]}" > "$TEST_STATE/output" 2>&1 || result=$?
|
|
case "$scenario" in
|
|
success|pull-only)
|
|
[[ "$result" == 0 && "$(cat "$TEST_STATE/sw2-frontend/id")" == new-container && "$(cat "$TEST_STATE/sw2-frontend-previous/id")" == old-container ]]
|
|
[[ "$(cat "$SW_DEPLOY_BASE/current-frontend-release")" == new ]] ;;
|
|
build-only|pull-preflight)
|
|
[[ "$result" == 0 && "$(cat "$TEST_STATE/sw2-frontend/id")" == old-container ]]
|
|
[[ "$(cat "$SW_DEPLOY_BASE/current-frontend-release")" == old ]] ;;
|
|
*)
|
|
[[ "$result" != 0 && "$(cat "$TEST_STATE/sw2-frontend/id")" == old-container && "$(cat "$TEST_STATE/sw2-frontend/running")" == true ]]
|
|
[[ "$(cat "$SW_DEPLOY_BASE/current-frontend-release")" == old ]] ;;
|
|
esac
|
|
[[ "$(cat "$TEST_STATE/sw2-backend/id")" == backend-unchanged ]]
|
|
! grep -E '(stop|start|rename|rm|run).*sw2-backend' "$TEST_STATE/calls"
|
|
! grep -F 'sw2/frontend:' "$TEST_STATE/calls"
|
|
if [[ "$scenario" == success || "$scenario" == build-only ]]; then
|
|
grep -q '^push harbor.fuhua91.com/game/sw2:new$' "$TEST_STATE/calls"
|
|
grep -q '^pull harbor.fuhua91.com/game/sw2:new$' "$TEST_STATE/calls"
|
|
fi
|
|
if [[ "$scenario" == pull-only || "$scenario" == pull-preflight ]]; then
|
|
! grep -E '^(build|push) ' "$TEST_STATE/calls"
|
|
grep -q '^pull harbor.fuhua91.com/game/sw2:new$' "$TEST_STATE/calls"
|
|
fi
|
|
if [[ "$scenario" == success || "$scenario" == pull-only ]]; then
|
|
grep -q 'harbor.fuhua91.com/game/sw2@sha256:' "$TEST_STATE/calls"
|
|
grep -q '^harbor.fuhua91.com/game/sw2@sha256:' "$SW_DEPLOY_BASE/frontend-images/new.ref"
|
|
fi
|
|
if [[ "$scenario" == push-fail || "$scenario" == pull-fail || "$scenario" == digest-missing ]]; then
|
|
! grep -E '^(stop|rename) ' "$TEST_STATE/calls"
|
|
fi
|
|
[[ "$(find "$TEST_STATE" -maxdepth 1 -name 'sw2-frontend-candidate-*' | wc -l)" == 0 ]]
|
|
done
|
|
echo 'all deployment scenarios passed'
|