Skip to content

Commit eaf0a6c

Browse files
Merge pull request #7 from helmhub-io/ft/image-migration
fix: pipeline failure and retry logic
2 parents 6e016a3 + 9450290 commit eaf0a6c

File tree

1 file changed

+37
-9
lines changed

1 file changed

+37
-9
lines changed

migrate-images.sh

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@ DEST_USER="helmhubio"
77

88
# -------------------------------------------------------------------
99
# 🔐 Docker login credentials (set these before running)
10-
# Example:
11-
# export DOCKER_USER="helmhubio"
12-
# export DOCKER_PASS="your-access-token"
1310
# -------------------------------------------------------------------
1411

1512
DOCKER_USER="${DOCKER_USER:-}"
@@ -34,6 +31,26 @@ for cmd in curl jq docker; do
3431
fi
3532
done
3633

34+
# -------------------------------------------------------------------
35+
# 🔁 [NEW] Retry Helper Function
36+
# -------------------------------------------------------------------
37+
retry() {
38+
local cmd=$1
39+
local max_retries=${2:-3}
40+
local delay=${3:-5}
41+
local count=0
42+
43+
until eval "$cmd"; do
44+
count=$((count + 1))
45+
if [ $count -ge $max_retries ]; then
46+
echo "❌ Command failed after ${max_retries} attempts: $cmd"
47+
return 1
48+
fi
49+
echo "⚠️ Retry ${count}/${max_retries} for: $cmd (waiting ${delay}s)"
50+
sleep "$delay"
51+
done
52+
}
53+
3754
# -------------------------------------------------------------------
3855
# 🔑 Login to Docker Hub
3956
# -------------------------------------------------------------------
@@ -53,7 +70,7 @@ URL="https://hub.docker.com/v2/repositories/${SRC_USER}/?page_size=100"
5370

5471
while [ -n "$URL" ] && [ "$URL" != "null" ]; do
5572
echo "📥 Fetching from: $URL"
56-
RESP=$(curl -s "$URL")
73+
RESP=$(retry "curl -s \"$URL\"" 3 5)
5774
NAMES=$(echo "$RESP" | jq -r '.results[].name')
5875
REPOS+=($NAMES)
5976
URL=$(echo "$RESP" | jq -r '.next')
@@ -74,15 +91,25 @@ for REPO in "${REPOS[@]}"; do
7491
echo "🚀 Processing repository: ${REPO}"
7592

7693
TAGS_URL="https://hub.docker.com/v2/repositories/${SRC_USER}/${REPO}/tags?page_size=100"
77-
TAGS_JSON=$(curl -s "$TAGS_URL")
94+
95+
# [NEW] Retry fetching tags
96+
TAGS_JSON=$(retry "curl -s \"$TAGS_URL\"" 3 5)
97+
98+
# Debug: Show actual API response if it's not valid JSON
99+
if [ -z "$TAGS_JSON" ] || ! echo "$TAGS_JSON" | jq -e '.results' >/dev/null 2>&1; then
100+
echo "❌ API Error for ${REPO}:"
101+
echo "URL: $TAGS_URL"
102+
echo "Response: $TAGS_JSON"
103+
continue
104+
fi
78105

79106
# 🧠 Filter out sha256-* tags and sort by last_updated (newest first)
80107
LATEST_TAG=$(echo "$TAGS_JSON" \
81108
| jq -r '.results
82109
| map(select(.name | startswith("sha256-") | not))
83110
| sort_by(.last_updated)
84111
| reverse
85-
| .[0].name')
112+
| .[0].name' 2>/dev/null || echo "")
86113

87114
if [ "$LATEST_TAG" = "null" ] || [ -z "$LATEST_TAG" ]; then
88115
echo "⚠️ No valid (non-sha) tags found for ${REPO}, skipping."
@@ -106,10 +133,11 @@ for REPO in "${REPOS[@]}"; do
106133
echo "📦 Using most recent real tag: ${LATEST_TAG}"
107134

108135
# -------------------------------------------------------------------
109-
# 📥 Pull, tag, and push
136+
# 📥 Pull, tag, and push (with retries)
110137
# -------------------------------------------------------------------
138+
111139
echo "📥 Pulling ${SRC_IMAGE}..."
112-
if ! docker pull "$SRC_IMAGE"; then
140+
if ! retry "docker pull \"$SRC_IMAGE\"" 3 10; then
113141
echo "❌ Failed to pull ${SRC_IMAGE}, skipping."
114142
continue
115143
fi
@@ -121,7 +149,7 @@ for REPO in "${REPOS[@]}"; do
121149
fi
122150

123151
echo "☁️ Pushing ${DEST_IMAGE}..."
124-
if ! docker push "$DEST_IMAGE"; then
152+
if ! retry "docker push \"$DEST_IMAGE\"" 3 10; then
125153
echo "❌ Failed to push ${DEST_IMAGE}, skipping."
126154
continue
127155
fi

0 commit comments

Comments
 (0)