diff --git a/eng/pipelines/pr-validation-pipeline.yml b/eng/pipelines/pr-validation-pipeline.yml index 47e68cf3..100af715 100644 --- a/eng/pipelines/pr-validation-pipeline.yml +++ b/eng/pipelines/pr-validation-pipeline.yml @@ -559,7 +559,23 @@ jobs: fi sleep 2 done + + # One last probe: the loop sleeps after its final attempt, so SQL can + # become reachable in that window and would otherwise be missed. + if docker exec sqlserver \ + /opt/mssql-tools18/bin/sqlcmd \ + -S localhost -U SA -P "$DB_PASSWORD" \ + -C -Q "SELECT 1"; then + echo "[sql] SQL Server is ready." + return 0 + fi + + # sqlcmd only reports that the client could not connect. When the + # container itself exited (bad password policy, EULA, OOM, port clash) + # the reason is in the container's own log, so surface it here. echo "[sql] SQL Server did not become ready in time." >&2 + echo "[sql] ---- docker logs sqlserver (last 200 lines) ----" >&2 + docker logs --tail 200 sqlserver >&2 || true return 1 } @@ -768,6 +784,7 @@ jobs: # Wait for SQL Server to be ready echo "Waiting for SQL Server to start..." + sql_ready=false for i in {1..60}; do if docker exec sqlserver-$(distroName) \ /opt/mssql-tools18/bin/sqlcmd \ @@ -776,11 +793,28 @@ jobs: -P "$(DB_PASSWORD)" \ -C -Q "SELECT 1" >/dev/null 2>&1; then echo "SQL Server is ready!" + sql_ready=true break fi echo "Waiting... ($i/60)" sleep 2 done + if [ "$sql_ready" != true ]; then + # the loop sleeps after its final attempt, so probe once more + if docker exec sqlserver-$(distroName) \ + /opt/mssql-tools18/bin/sqlcmd \ + -S localhost \ + -U SA \ + -P "$(DB_PASSWORD)" \ + -C -Q "SELECT 1" >/dev/null 2>&1; then + echo "SQL Server is ready!" + else + echo "SQL Server did not become ready after 60 attempts" + echo "---- docker logs sqlserver-$(distroName) (last 200 lines) ----" + docker logs --tail 200 sqlserver-$(distroName) || true + exit 1 + fi + fi # Create test database docker exec sqlserver-$(distroName) \ @@ -1097,6 +1131,7 @@ jobs: # Wait for SQL Server to be ready echo "Waiting for SQL Server to start..." + sql_ready=false for i in {1..60}; do if docker exec sqlserver-$(distroName)-$(archName) \ /opt/mssql-tools18/bin/sqlcmd \ @@ -1105,11 +1140,28 @@ jobs: -P "$(DB_PASSWORD)" \ -C -Q "SELECT 1" >/dev/null 2>&1; then echo "SQL Server is ready!" + sql_ready=true break fi echo "Waiting... ($i/60)" sleep 2 done + if [ "$sql_ready" != true ]; then + # the loop sleeps after its final attempt, so probe once more + if docker exec sqlserver-$(distroName)-$(archName) \ + /opt/mssql-tools18/bin/sqlcmd \ + -S localhost \ + -U SA \ + -P "$(DB_PASSWORD)" \ + -C -Q "SELECT 1" >/dev/null 2>&1; then + echo "SQL Server is ready!" + else + echo "SQL Server did not become ready after 60 attempts" + echo "---- docker logs sqlserver-$(distroName)-$(archName) (last 200 lines) ----" + docker logs --tail 200 sqlserver-$(distroName)-$(archName) || true + exit 1 + fi + fi # Create test database docker exec sqlserver-$(distroName)-$(archName) \ @@ -1327,6 +1379,7 @@ jobs: # Wait for SQL Server to be ready echo "Waiting for SQL Server to start..." + sql_ready=false for i in {1..60}; do if docker exec sqlserver-rhel9 \ /opt/mssql-tools18/bin/sqlcmd \ @@ -1335,11 +1388,28 @@ jobs: -P "$(DB_PASSWORD)" \ -C -Q "SELECT 1" >/dev/null 2>&1; then echo "SQL Server is ready!" + sql_ready=true break fi echo "Waiting... ($i/60)" sleep 2 done + if [ "$sql_ready" != true ]; then + # the loop sleeps after its final attempt, so probe once more + if docker exec sqlserver-rhel9 \ + /opt/mssql-tools18/bin/sqlcmd \ + -S localhost \ + -U SA \ + -P "$(DB_PASSWORD)" \ + -C -Q "SELECT 1" >/dev/null 2>&1; then + echo "SQL Server is ready!" + else + echo "SQL Server did not become ready after 60 attempts" + echo "---- docker logs sqlserver-rhel9 (last 200 lines) ----" + docker logs --tail 200 sqlserver-rhel9 || true + exit 1 + fi + fi # Create test database docker exec sqlserver-rhel9 \ @@ -1554,6 +1624,7 @@ jobs: # Wait for SQL Server to be ready echo "Waiting for SQL Server to start..." + sql_ready=false for i in {1..60}; do if docker exec sqlserver-rhel9-arm64 \ /opt/mssql-tools18/bin/sqlcmd \ @@ -1562,11 +1633,28 @@ jobs: -P "$(DB_PASSWORD)" \ -C -Q "SELECT 1" >/dev/null 2>&1; then echo "SQL Server is ready!" + sql_ready=true break fi echo "Waiting... ($i/60)" sleep 2 done + if [ "$sql_ready" != true ]; then + # the loop sleeps after its final attempt, so probe once more + if docker exec sqlserver-rhel9-arm64 \ + /opt/mssql-tools18/bin/sqlcmd \ + -S localhost \ + -U SA \ + -P "$(DB_PASSWORD)" \ + -C -Q "SELECT 1" >/dev/null 2>&1; then + echo "SQL Server is ready!" + else + echo "SQL Server did not become ready after 60 attempts" + echo "---- docker logs sqlserver-rhel9-arm64 (last 200 lines) ----" + docker logs --tail 200 sqlserver-rhel9-arm64 || true + exit 1 + fi + fi # Create test database docker exec sqlserver-rhel9-arm64 \ @@ -1785,6 +1873,7 @@ jobs: # Wait for SQL Server to be ready echo "Waiting for SQL Server to start..." + sql_ready=false for i in {1..60}; do if docker exec sqlserver-alpine \ /opt/mssql-tools18/bin/sqlcmd \ @@ -1793,11 +1882,28 @@ jobs: -P "$(DB_PASSWORD)" \ -C -Q "SELECT 1" >/dev/null 2>&1; then echo "SQL Server is ready!" + sql_ready=true break fi echo "Waiting... ($i/60)" sleep 2 done + if [ "$sql_ready" != true ]; then + # the loop sleeps after its final attempt, so probe once more + if docker exec sqlserver-alpine \ + /opt/mssql-tools18/bin/sqlcmd \ + -S localhost \ + -U SA \ + -P "$(DB_PASSWORD)" \ + -C -Q "SELECT 1" >/dev/null 2>&1; then + echo "SQL Server is ready!" + else + echo "SQL Server did not become ready after 60 attempts" + echo "---- docker logs sqlserver-alpine (last 200 lines) ----" + docker logs --tail 200 sqlserver-alpine || true + exit 1 + fi + fi # Create test database docker exec sqlserver-alpine \ @@ -2041,6 +2147,7 @@ jobs: # Wait for SQL Server to be ready echo "Waiting for SQL Server to start..." + sql_ready=false for i in {1..60}; do if docker exec sqlserver-alpine-arm64 \ /opt/mssql-tools18/bin/sqlcmd \ @@ -2049,11 +2156,28 @@ jobs: -P "$(DB_PASSWORD)" \ -C -Q "SELECT 1" >/dev/null 2>&1; then echo "SQL Server is ready!" + sql_ready=true break fi echo "Waiting... ($i/60)" sleep 2 done + if [ "$sql_ready" != true ]; then + # the loop sleeps after its final attempt, so probe once more + if docker exec sqlserver-alpine-arm64 \ + /opt/mssql-tools18/bin/sqlcmd \ + -S localhost \ + -U SA \ + -P "$(DB_PASSWORD)" \ + -C -Q "SELECT 1" >/dev/null 2>&1; then + echo "SQL Server is ready!" + else + echo "SQL Server did not become ready after 60 attempts" + echo "---- docker logs sqlserver-alpine-arm64 (last 200 lines) ----" + docker logs --tail 200 sqlserver-alpine-arm64 || true + exit 1 + fi + fi # Create test database docker exec sqlserver-alpine-arm64 \ @@ -2510,15 +2634,33 @@ jobs: -d mcr.microsoft.com/mssql/server:2022-latest # Wait until SQL Server is ready + sql_ready=false for i in {1..30}; do - docker exec sqlserver \ + if docker exec sqlserver \ /opt/mssql-tools18/bin/sqlcmd \ -S localhost \ -U SA \ -P "$(DB_PASSWORD)" \ - -C -Q "SELECT 1" && break + -C -Q "SELECT 1"; then + sql_ready=true + break + fi sleep 2 done + if [ "$sql_ready" != true ]; then + # the loop sleeps after its final attempt, so probe once more + if ! docker exec sqlserver \ + /opt/mssql-tools18/bin/sqlcmd \ + -S localhost \ + -U SA \ + -P "$(DB_PASSWORD)" \ + -C -Q "SELECT 1"; then + echo "SQL Server did not become ready after 30 attempts" + echo "---- docker logs sqlserver (last 200 lines) ----" + docker logs --tail 200 sqlserver || true + exit 1 + fi + fi displayName: 'Start SQL Server container' env: DB_PASSWORD: $(DB_PASSWORD)