From 515114fa6944aa95d4d7931bfbb406e61337b47e Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Tue, 27 Jan 2026 09:31:45 +0100 Subject: [PATCH] Improve CI workflow wait logic and reduce duplication (#6496) * Improve Supervisor startup wait logic in CI workflow The 'Wait for Supervisor to come up' step was failing intermittently when the Supervisor API wasn't immediately available. The original script relied on bash's lenient error handling in command substitution, which could fail unpredictably. Changes: - Use curl -f flag to properly handle HTTP errors - Use jq -e for robust JSON validation and exit code handling - Add explicit 5-minute timeout with elapsed time tracking - Reduce log noise by only reporting progress every 15 seconds - Add comprehensive error diagnostics on timeout: * Show last API response received * Dump last 50 lines of Supervisor logs - Show startup time on success for performance monitoring This makes the CI workflow more reliable and easier to debug when the Supervisor fails to start. Co-Authored-By: Claude Sonnet 4.5 * Use YAML anchor to deduplicate wait step in CI workflow The 'Wait for Supervisor to come up' step appears twice in the run_supervisor job - once after starting and once after restarting. Use a YAML anchor to define the step once and reference it on the second occurrence. This reduces duplication by 28 lines and makes future maintenance easier by ensuring both wait steps remain identical. Co-Authored-By: Claude Sonnet 4.5 --------- Co-authored-by: Claude Sonnet 4.5 --- .github/workflows/builder.yml | 38 ++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/.github/workflows/builder.yml b/.github/workflows/builder.yml index 45f72facd..31445051f 100644 --- a/.github/workflows/builder.yml +++ b/.github/workflows/builder.yml @@ -290,15 +290,36 @@ jobs: - name: Start the Supervisor run: docker start hassio_supervisor - - name: Wait for Supervisor to come up + - &wait_for_supervisor + name: Wait for Supervisor to come up run: | SUPERVISOR=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' hassio_supervisor) - ping="error" - while [ "$ping" != "ok" ]; do - ping=$(curl -sSL "http://$SUPERVISOR/supervisor/ping" | jq -r '.result') + echo "Waiting for Supervisor API at http://${SUPERVISOR}/supervisor/ping" + timeout=300 + elapsed=0 + + while [ $elapsed -lt $timeout ]; do + if response=$(curl -sSf "http://${SUPERVISOR}/supervisor/ping" 2>/dev/null); then + if echo "$response" | jq -e '.result == "ok"' >/dev/null 2>&1; then + echo "Supervisor is up! (took ${elapsed}s)" + exit 0 + fi + fi + + if [ $((elapsed % 15)) -eq 0 ]; then + echo "Still waiting... (${elapsed}s/${timeout}s)" + fi + sleep 5 + elapsed=$((elapsed + 5)) done + echo "ERROR: Supervisor failed to start within ${timeout}s" + echo "Last response: $response" + echo "Checking supervisor logs..." + docker logs --tail 50 hassio_supervisor + exit 1 + - name: Check the Supervisor run: | echo "Checking supervisor info" @@ -362,14 +383,7 @@ jobs: exit 1 fi - - name: Wait for Supervisor to come up - run: | - SUPERVISOR=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' hassio_supervisor) - ping="error" - while [ "$ping" != "ok" ]; do - ping=$(curl -sSL "http://$SUPERVISOR/supervisor/ping" | jq -r '.result') - sleep 5 - done + - *wait_for_supervisor - name: Restore SSH add-on from backup run: |