@@ -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
1512DOCKER_USER=" ${DOCKER_USER:- } "
@@ -34,6 +31,26 @@ for cmd in curl jq docker; do
3431 fi
3532done
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
5471while [ -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