From ca35d0371ca067b78f26f0860ef93ef4825f4d7b Mon Sep 17 00:00:00 2001 From: danielnovais-tech Date: Thu, 9 Apr 2026 16:11:37 -0700 Subject: [PATCH 1/2] CI: retry Docker Hub pulls + pin tags in smoke-test refresh step --- .github/workflows/smoke-test.yml | 44 +++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index a12455f6..74278296 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -113,13 +113,43 @@ jobs: # Give time for the daemon to startup sleep 5 - # Run latest versions of well known applications - sudo docker run --restart=always -d redis - sudo docker run --restart=always -d rabbitmq - sudo docker run --restart=always -d grafana/grafana - sudo docker run --restart=always -d jenkins/jenkins - sudo docker run --restart=always -d nginx - sudo docker run --restart=always -d -e POSTGRES_HOST_AUTH_METHOD=trust postgres + # Exponential backoff retry for registry pulls (Docker Hub flakes with 5xx sometimes) + pull_with_retry() { + local image="$1" + local max_attempts=5 + local attempt=1 + local wait_time=5 + while [ "$attempt" -le "$max_attempts" ]; do + if sudo docker pull "$image"; then + return 0 + fi + echo "Pull failed (attempt $attempt/$max_attempts) for $image, retrying in ${wait_time}s..." + sleep "$wait_time" + wait_time=$((wait_time * 2)) + attempt=$((attempt + 1)) + done + echo "Failed to pull $image after $max_attempts attempts" + return 1 + } + + # Run containers with pinned tags (avoid :latest drift) + pull_with_retry redis:7 + sudo docker run --restart=always -d redis:7 + + pull_with_retry rabbitmq:3.13 + sudo docker run --restart=always -d rabbitmq:3.13 + + pull_with_retry grafana/grafana:11 + sudo docker run --restart=always -d grafana/grafana:11 + + pull_with_retry jenkins/jenkins:2.462 + sudo docker run --restart=always -d jenkins/jenkins:2.462 + + pull_with_retry nginx:1.27 + sudo docker run --restart=always -d nginx:1.27 + + pull_with_retry postgres:17 + sudo docker run --restart=always -d -e POSTGRES_HOST_AUTH_METHOD=trust postgres:17 # NOTE: adjust this accordingly with the commands above if needed STARTED_CONTAINERS=6 From 9078935bbb106d3ac0c7b9cf2933a0c75aaba100 Mon Sep 17 00:00:00 2001 From: danielnovais-tech Date: Thu, 9 Apr 2026 17:52:38 -0700 Subject: [PATCH 2/2] CI: use exponential backoff and pinned tags for Docker Hub pulls --- .github/workflows/smoke-test.yml | 41 ++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index 74278296..073c14fb 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -113,18 +113,18 @@ jobs: # Give time for the daemon to startup sleep 5 - # Exponential backoff retry for registry pulls (Docker Hub flakes with 5xx sometimes) pull_with_retry() { - local image="$1" + local image=$1 local max_attempts=5 local attempt=1 local wait_time=5 - while [ "$attempt" -le "$max_attempts" ]; do + + while [ $attempt -le $max_attempts ]; do if sudo docker pull "$image"; then return 0 fi - echo "Pull failed (attempt $attempt/$max_attempts) for $image, retrying in ${wait_time}s..." - sleep "$wait_time" + echo "Pull failed (attempt $attempt/$max_attempts), retrying in ${wait_time}s..." + sleep $wait_time wait_time=$((wait_time * 2)) attempt=$((attempt + 1)) done @@ -132,24 +132,29 @@ jobs: return 1 } - # Run containers with pinned tags (avoid :latest drift) - pull_with_retry redis:7 - sudo docker run --restart=always -d redis:7 + REDIS_IMAGE="redis:7" + pull_with_retry "$REDIS_IMAGE" + sudo docker run --restart=always -d "$REDIS_IMAGE" - pull_with_retry rabbitmq:3.13 - sudo docker run --restart=always -d rabbitmq:3.13 + RABBIT_IMAGE="rabbitmq:3.13" + pull_with_retry "$RABBIT_IMAGE" + sudo docker run --restart=always -d "$RABBIT_IMAGE" - pull_with_retry grafana/grafana:11 - sudo docker run --restart=always -d grafana/grafana:11 + GRAFANA_IMAGE="grafana/grafana:11" + pull_with_retry "$GRAFANA_IMAGE" + sudo docker run --restart=always -d "$GRAFANA_IMAGE" - pull_with_retry jenkins/jenkins:2.462 - sudo docker run --restart=always -d jenkins/jenkins:2.462 + JENKINS_IMAGE="jenkins/jenkins:2.462" + pull_with_retry "$JENKINS_IMAGE" + sudo docker run --restart=always -d "$JENKINS_IMAGE" - pull_with_retry nginx:1.27 - sudo docker run --restart=always -d nginx:1.27 + NGINX_IMAGE="nginx:1.27" + pull_with_retry "$NGINX_IMAGE" + sudo docker run --restart=always -d "$NGINX_IMAGE" - pull_with_retry postgres:17 - sudo docker run --restart=always -d -e POSTGRES_HOST_AUTH_METHOD=trust postgres:17 + POSTGRES_IMAGE="postgres:16" + pull_with_retry "$POSTGRES_IMAGE" + sudo docker run --restart=always -d -e POSTGRES_HOST_AUTH_METHOD=trust "$POSTGRES_IMAGE" # NOTE: adjust this accordingly with the commands above if needed STARTED_CONTAINERS=6