101 lines
3.3 KiB
Bash
Executable File
101 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# 2026-03-11 12:30
|
|
# Наборный тест: собирает образ, выполняет несколько пушей с разными тегами
|
|
# и выводит статистику (количество успешных/проваленных, время и попытки).
|
|
|
|
set -euo pipefail
|
|
|
|
SECRETS_FILE="secrets/pearlharbor_registry.txt"
|
|
if [ ! -f "$SECRETS_FILE" ]; then
|
|
echo "secrets file not found: $SECRETS_FILE" >&2
|
|
exit 1
|
|
fi
|
|
|
|
NUM_PUSHES=${NUM_PUSHES:-5}
|
|
RETRIES_PER_PUSH=${RETRIES_PER_PUSH:-3}
|
|
BACKOFF=${BACKOFF:-2}
|
|
PROJECT=${PROJECT:-pearlharbor}
|
|
REGISTRY_USER=${REGISTRY_USER:-admin}
|
|
CREATE_PROJECT=${CREATE_PROJECT:-false}
|
|
|
|
connection_url=$(grep -E '^connection_url=' "$SECRETS_FILE" | cut -d'=' -f2-)
|
|
admin_pass=$(grep -E '^admin_pass=' "$SECRETS_FILE" | cut -d'=' -f2-)
|
|
registry=$(echo "$connection_url" | sed -E 's~https?://~~' | sed -E 's~/$~~')
|
|
|
|
if ! command -v docker >/dev/null 2>&1; then
|
|
echo "docker not found" >&2
|
|
exit 2
|
|
fi
|
|
|
|
echo "Registry: $registry"
|
|
echo "Project: $PROJECT"
|
|
echo "Pushes: $NUM_PUSHES, retries per push: $RETRIES_PER_PUSH"
|
|
|
|
echo "Building local image..."
|
|
docker build -t sless-sample:local -f examples/push-sample/Dockerfile examples/push-sample
|
|
|
|
if [ "$CREATE_PROJECT" = "true" ]; then
|
|
echo "Ensuring project $PROJECT exists..."
|
|
create_code=$(curl -s -u "$REGISTRY_USER:$admin_pass" -o /dev/null -w "%{http_code}" -X POST "https://$registry/api/v2.0/projects" -H 'Content-Type: application/json' -d "{\"project_name\":\"$PROJECT\",\"metadata\":{\"public\":\"true\"}}") || create_code=0
|
|
echo "Project create response: $create_code"
|
|
fi
|
|
|
|
echo "Logging in to registry..."
|
|
if ! echo "$admin_pass" | docker login "$registry" -u "$REGISTRY_USER" --password-stdin >/dev/null 2>&1; then
|
|
echo "docker login failed" >&2
|
|
exit 3
|
|
fi
|
|
|
|
results=()
|
|
start_all=$(date +%s.%N)
|
|
for i in $(seq 1 "$NUM_PUSHES"); do
|
|
tag="test-$(date +%Y%m%d%H%M%S)-$i"
|
|
remote="$registry/$PROJECT/sless-sample:$tag"
|
|
echo "\n=== Push $i/$NUM_PUSHES -> $remote ==="
|
|
docker tag sless-sample:local "$remote"
|
|
|
|
attempt=0
|
|
success=0
|
|
t_start=$(date +%s.%N)
|
|
last_err=""
|
|
while [ $attempt -lt $RETRIES_PER_PUSH ]; do
|
|
attempt=$((attempt+1))
|
|
echo "Attempt $attempt for $remote"
|
|
if docker push "$remote"; then
|
|
success=1
|
|
break
|
|
else
|
|
last_err="push failed on attempt $attempt"
|
|
sleep_time=$((BACKOFF ** attempt))
|
|
echo "push failed, sleeping $sleep_time s"
|
|
sleep $sleep_time
|
|
fi
|
|
done
|
|
t_end=$(date +%s.%N)
|
|
elapsed=$(printf "%.3f" "$(echo "$t_end - $t_start" | bc -l)")
|
|
results+=("$remote|$success|$attempt|$elapsed|$last_err")
|
|
done
|
|
end_all=$(date +%s.%N)
|
|
total_time=$(printf "%.3f" "$(echo "$end_all - $start_all" | bc -l)")
|
|
|
|
echo "\n=== Summary ==="
|
|
echo "Total pushes: $NUM_PUSHES, total time: ${total_time}s"
|
|
printf "%s\n" "TAG | SUCCESS | ATTEMPTS | TIME_S | MESSAGE"
|
|
for r in "${results[@]}"; do
|
|
IFS='|' read -r tag ok attempts time msg <<< "$r"
|
|
if [ "$ok" -eq 1 ]; then ok_str="OK"; else ok_str="FAIL"; fi
|
|
printf "%s | %s | %s | %s | %s\n" "$tag" "$ok_str" "$attempts" "$time" "${msg:--}"
|
|
done
|
|
|
|
fail_count=0
|
|
for r in "${results[@]}"; do
|
|
IFS='|' read -r tag ok attempts time msg <<< "$r"
|
|
if [ "$ok" -ne 1 ]; then fail_count=$((fail_count+1)); fi
|
|
done
|
|
|
|
echo "Failures: $fail_count / $NUM_PUSHES"
|
|
if [ "$fail_count" -ne 0 ]; then
|
|
exit 4
|
|
fi
|
|
exit 0
|