CI: retry docker builds on transient registry/network failures.
CI / test (push) Successful in 9m46s
CI / test (push) Successful in 9m46s
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+20
-16
@@ -26,24 +26,28 @@ jobs:
|
|||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- name: Build eventhub image
|
- name: Build eventhub image
|
||||||
uses: docker/build-push-action@v5
|
run: |
|
||||||
with:
|
set -euo pipefail
|
||||||
context: .
|
bash scripts/retry-docker-build.sh 3 30 -- \
|
||||||
file: docker/Dockerfile
|
docker buildx build \
|
||||||
load: true
|
--file docker/Dockerfile \
|
||||||
tags: eventhub:latest
|
--tag eventhub:latest \
|
||||||
provenance: false
|
--load \
|
||||||
sbom: false
|
--provenance=false \
|
||||||
|
--sbom=false \
|
||||||
|
.
|
||||||
|
|
||||||
- name: Build API test image
|
- name: Build API test image
|
||||||
uses: docker/build-push-action@v5
|
run: |
|
||||||
with:
|
set -euo pipefail
|
||||||
context: .
|
bash scripts/retry-docker-build.sh 3 30 -- \
|
||||||
file: docker/ApiTests.Dockerfile
|
docker buildx build \
|
||||||
load: true
|
--file docker/ApiTests.Dockerfile \
|
||||||
tags: eventhub-api-tests:latest
|
--tag eventhub-api-tests:latest \
|
||||||
provenance: false
|
--load \
|
||||||
sbom: false
|
--provenance=false \
|
||||||
|
--sbom=false \
|
||||||
|
.
|
||||||
|
|
||||||
- name: Run API tests (local CT)
|
- name: Run API tests (local CT)
|
||||||
run: docker run --rm eventhub-api-tests:latest
|
run: docker run --rm eventhub-api-tests:latest
|
||||||
|
|||||||
@@ -20,11 +20,12 @@ publish_image() {
|
|||||||
|
|
||||||
if echo "${FILES}" | grep -qE "${path_pattern}"; then
|
if echo "${FILES}" | grep -qE "${path_pattern}"; then
|
||||||
echo "== ${name}: rebuild (matched: ${path_pattern})"
|
echo "== ${name}: rebuild (matched: ${path_pattern})"
|
||||||
docker buildx build -f "${dockerfile}" --push \
|
bash scripts/retry-docker-build.sh 3 30 -- \
|
||||||
-t "${REGISTRY}/${name}:${TAG}" \
|
docker buildx build -f "${dockerfile}" --push \
|
||||||
-t "${REGISTRY}/${name}:ift" \
|
-t "${REGISTRY}/${name}:${TAG}" \
|
||||||
--provenance=false --sbom=false \
|
-t "${REGISTRY}/${name}:ift" \
|
||||||
"${context}"
|
--provenance=false --sbom=false \
|
||||||
|
"${context}"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Retry docker/buildx commands on transient network/registry failures.
|
||||||
|
# Usage: retry-docker-build.sh [max_attempts] [wait_seconds] -- <command...>
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
MAX="${1:-3}"
|
||||||
|
WAIT="${2:-30}"
|
||||||
|
shift 2
|
||||||
|
[[ "${1:-}" == "--" ]] && shift
|
||||||
|
|
||||||
|
if [[ $# -eq 0 ]]; then
|
||||||
|
echo "Usage: $0 [max_attempts] [wait_seconds] -- <command...>" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
attempt=1
|
||||||
|
while true; do
|
||||||
|
echo "== docker build attempt ${attempt}/${MAX}: $*"
|
||||||
|
if "$@"; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
code=$?
|
||||||
|
if (( attempt >= MAX )); then
|
||||||
|
echo "== all ${MAX} attempts failed (last exit ${code})"
|
||||||
|
exit "${code}"
|
||||||
|
fi
|
||||||
|
echo "== attempt ${attempt} failed (exit ${code}), retry in ${WAIT}s..."
|
||||||
|
sleep "${WAIT}"
|
||||||
|
attempt=$((attempt + 1))
|
||||||
|
done
|
||||||
Reference in New Issue
Block a user