@@ -76,4 +76,123 @@ jobs:
7676 with :
7777 name : validation-results
7878 path : output/
79-
79+
80+ - name : Notify abp.io of validation result
81+ if : always()
82+ env :
83+ ABPIO_VALIDATION_API_KEY : ${{ secrets.ABPIO_VALIDATION_API_KEY }}
84+ ABPIO_REPORT_BASE_URL : ${{ secrets.ABPIO_REPORT_BASE_URL }}
85+ DEFAULT_TUTORIAL_URL : ${{ github.event.inputs.tutorial_url || 'https://abp.io/docs/latest/tutorials/book-store?UI=MVC&DB=EF' }}
86+ run : |
87+ SUMMARY_FILE="./output/summary.json"
88+ BASE_URL="${ABPIO_REPORT_BASE_URL:-https://abp.io}"
89+ BASE_URL="${BASE_URL%/}"
90+ RESPONSE_FILE="$(mktemp)"
91+
92+ echo "=========================================="
93+ echo " Tutorial Validation Notification"
94+ echo "=========================================="
95+
96+ if [ ! -f "$SUMMARY_FILE" ]; then
97+ echo "No summary.json found at $SUMMARY_FILE"
98+ ls -la ./output/ 2>/dev/null || echo "Directory not found"
99+ exit 0
100+ fi
101+
102+ if [ -z "$ABPIO_VALIDATION_API_KEY" ]; then
103+ echo "ABPIO_VALIDATION_API_KEY not set, skipping notification"
104+ exit 0
105+ fi
106+
107+ if ! jq empty "$SUMMARY_FILE" >/dev/null 2>&1; then
108+ echo "summary.json is not valid JSON"
109+ cat "$SUMMARY_FILE"
110+ exit 0
111+ fi
112+
113+ OVERALL_STATUS=$(jq -r '.overallStatus // .OverallStatus // empty' "$SUMMARY_FILE")
114+ TUTORIAL_URL=$(jq -r '.tutorialUrl // .TutorialUrl // empty' "$SUMMARY_FILE")
115+ TUTORIAL_NAME=$(jq -r '.tutorialName // .TutorialName // "Unknown Tutorial"' "$SUMMARY_FILE")
116+
117+ if [ -z "$TUTORIAL_URL" ] || [ "$TUTORIAL_URL" = "null" ]; then
118+ TUTORIAL_URL="$DEFAULT_TUTORIAL_URL"
119+ echo "summary.json had no tutorialUrl; using workflow default URL"
120+ fi
121+
122+ if [ -z "$OVERALL_STATUS" ] || [ "$OVERALL_STATUS" = "null" ]; then
123+ echo "summary.json missing overall status field"
124+ exit 0
125+ fi
126+
127+ OS_LOWER=$(echo "$OVERALL_STATUS" | tr '[:upper:]' '[:lower:]')
128+ PASSED=false
129+ if [ "$OS_LOWER" = "passed" ]; then
130+ PASSED=true
131+ fi
132+
133+ echo "Tutorial: $TUTORIAL_NAME"
134+ echo "URL: $TUTORIAL_URL"
135+ echo "Status: $OVERALL_STATUS"
136+ echo "Passed (query): $PASSED"
137+
138+ REPORT_QUERY=$(python3 -c "import sys, urllib.parse; print(urllib.parse.urlencode({'tutorialUrl': sys.argv[1], 'passed': sys.argv[2]}))" "$TUTORIAL_URL" "$PASSED")
139+ REPORT_URL="${BASE_URL}/api/tutorial-validation/report?${REPORT_QUERY}"
140+
141+ MAX_RETRIES=3
142+ RETRY_DELAY=5
143+ SUCCESS=false
144+
145+ for i in $(seq 1 $MAX_RETRIES); do
146+ echo ""
147+ echo "Attempt $i/$MAX_RETRIES: POST ${BASE_URL}/api/tutorial-validation/report"
148+
149+ HTTP_CODE=$(curl -sS \
150+ --connect-timeout 10 \
151+ --max-time 30 \
152+ -o "$RESPONSE_FILE" \
153+ -w "%{http_code}" \
154+ -X POST "$REPORT_URL" \
155+ -H "X-Api-Key: ${ABPIO_VALIDATION_API_KEY}")
156+
157+ if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "201" ]; then
158+ echo "Successfully reported to abp.io (HTTP $HTTP_CODE)"
159+ SUCCESS=true
160+ break
161+ elif [ "$HTTP_CODE" = "401" ]; then
162+ echo "Authentication failed - check ABPIO_VALIDATION_API_KEY"
163+ cat "$RESPONSE_FILE" 2>/dev/null || true
164+ break
165+ elif [ "$HTTP_CODE" = "400" ]; then
166+ echo "Bad request (invalid tutorialUrl or unsupported host?)"
167+ cat "$RESPONSE_FILE" 2>/dev/null || true
168+ break
169+ elif [ "$HTTP_CODE" = "409" ]; then
170+ echo "Report lock contention (HTTP 409)"
171+ cat "$RESPONSE_FILE" 2>/dev/null || true
172+ if [ $i -lt $MAX_RETRIES ]; then
173+ echo "Retrying in ${RETRY_DELAY}s..."
174+ sleep $RETRY_DELAY
175+ fi
176+ else
177+ echo "Attempt $i/$MAX_RETRIES failed (HTTP $HTTP_CODE)"
178+ cat "$RESPONSE_FILE" 2>/dev/null || true
179+ if [ $i -lt $MAX_RETRIES ]; then
180+ echo "Retrying in ${RETRY_DELAY}s..."
181+ sleep $RETRY_DELAY
182+ fi
183+ fi
184+ done
185+
186+ rm -f "$RESPONSE_FILE"
187+
188+ if [ "$SUCCESS" = false ]; then
189+ echo ""
190+ echo "Failed to report to abp.io after $MAX_RETRIES attempts"
191+ echo "Final HTTP Code: $HTTP_CODE"
192+ exit 1
193+ fi
194+
195+ echo ""
196+ echo "=========================================="
197+ echo " Notification Complete"
198+ echo "=========================================="
0 commit comments