diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d327271..1cdcf0b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -330,17 +330,25 @@ jobs: echo "environment status: $status; version: $current; health: $health" if [ "$status" = "Ready" ]; then - if [ "$current" = "$expected" ] && { [ "$health" = "Green" ] || [ "$health" = "Yellow" ]; }; then + if [ "$current" != "$expected" ]; then + echo "Environment became Ready on version $current, not the expected $expected." >&2 + exit 1 + fi + if [ "$health" = "Green" ] || [ "$health" = "Yellow" ]; then echo "Expected application version is Ready and healthy." exit 0 fi - echo "Environment became Ready without activating expected version $expected." >&2 - exit 1 + # The expected version IS active. Elastic Beanstalk reports Ready as + # soon as the rollout finishes, before enhanced health has converged, + # so deciding on the first Ready poll fails a good release on a health + # value that was always going to change. Keep polling; an environment + # that is genuinely unhealthy still fails when the window runs out. + echo "Expected version is active; waiting for health to leave $health." fi sleep 15 done - echo "Expected application version did not become Ready within the deployment window." >&2 + echo "Expected application version did not become Ready and healthy within the deployment window (last seen: status=$status version=$current health=$health)." >&2 exit 1 - name: Post-deploy smoke @@ -612,16 +620,22 @@ jobs: ) echo "environment status: $status; version: $current; health: $health" if [ "$status" = "Ready" ]; then - if [ "$current" = "$prev" ] && { [ "$health" = "Green" ] || [ "$health" = "Yellow" ]; }; then + if [ "$current" != "$prev" ]; then + echo "Rollback reached Ready on version $current, not the previous $prev." >&2 + exit 1 + fi + if [ "$health" = "Green" ] || [ "$health" = "Yellow" ]; then echo "Application version restore complete; previous code is Ready and healthy." exit 0 fi - echo "Rollback reached Ready in an unexpected version/health state." >&2 - exit 1 + # Same convergence gap as the release check above: the previous version + # is back, health has not settled yet, and reporting a failed rollback + # here hides the fact that the restore itself worked. + echo "Previous version is active; waiting for health to leave $health." fi sleep 15 done - echo "Environment did not return to Ready within rollback window." >&2 + echo "Environment did not return to Ready and healthy within the rollback window (last seen: status=$status version=$current health=$health)." >&2 exit 1 deploy-staging: @@ -724,17 +738,25 @@ jobs: echo "environment status: $status; version: $current; health: $health" if [ "$status" = "Ready" ]; then - if [ "$current" = "$expected" ] && { [ "$health" = "Green" ] || [ "$health" = "Yellow" ]; }; then + if [ "$current" != "$expected" ]; then + echo "Environment became Ready on version $current, not the expected $expected." >&2 + exit 1 + fi + if [ "$health" = "Green" ] || [ "$health" = "Yellow" ]; then echo "Expected application version is Ready and healthy." exit 0 fi - echo "Environment became Ready without activating expected version $expected." >&2 - exit 1 + # The expected version IS active. Elastic Beanstalk reports Ready as + # soon as the rollout finishes, before enhanced health has converged, + # so deciding on the first Ready poll fails a good release on a health + # value that was always going to change. Keep polling; an environment + # that is genuinely unhealthy still fails when the window runs out. + echo "Expected version is active; waiting for health to leave $health." fi sleep 15 done - echo "Expected application version did not become Ready within the deployment window." >&2 + echo "Expected application version did not become Ready and healthy within the deployment window (last seen: status=$status version=$current health=$health)." >&2 exit 1 - name: Post-deploy smoke @@ -822,15 +844,21 @@ jobs: ) echo "environment status: $status; version: $current; health: $health" if [ "$status" = "Ready" ]; then - if [ "$current" = "$prev" ] && { [ "$health" = "Green" ] || [ "$health" = "Yellow" ]; }; then + if [ "$current" != "$prev" ]; then + echo "Rollback reached Ready on version $current, not the previous $prev." >&2 + exit 1 + fi + if [ "$health" = "Green" ] || [ "$health" = "Yellow" ]; then echo "Application version restore complete; previous code is Ready and healthy." exit 0 fi - echo "Rollback reached Ready in an unexpected version/health state." >&2 - exit 1 + # Same convergence gap as the release check above: the previous version + # is back, health has not settled yet, and reporting a failed rollback + # here hides the fact that the restore itself worked. + echo "Previous version is active; waiting for health to leave $health." fi sleep 15 done - echo "Environment did not return to Ready within rollback window." >&2 + echo "Environment did not return to Ready and healthy within the rollback window (last seen: status=$status version=$current health=$health)." >&2 exit 1