-
Notifications
You must be signed in to change notification settings - Fork 0
fix(ci): surface refresh-baselines HTTP error body and status code #161
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -14,8 +14,18 @@ jobs: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SECRET: ${{ secrets.REFRESH_SECRET }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| curl -s -f -X POST \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| response=$(mktemp) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| http_code=$(curl -sS -X POST \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -o "${response}" \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -w "%{http_code}" \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "${FUNCTION_URL}/refresh-baselines" \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -H "Authorization: Bearer ${ANON_KEY}" \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -H "x-refresh-secret: ${SECRET}" \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -H "Content-Type: application/json" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -H "Content-Type: application/json") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: cat -n .github/workflows/refresh-baselines.ymlRepository: mmmprod/claude-eta Length of output: 1177 🌐 Web query:
💡 Result: Best practices for handling curl timeouts in GitHub Actions workflows: 1. Use curl's built-in timeout flags: - --connect-timeout SECONDS: Limits connection time (e.g., 10s for connect, recommended 5-30s based on network). - --max-time SECONDS: Total operation timeout (e.g., 60s for APIs, longer for large downloads). Example: - name: Fetch data run: curl --connect-timeout 10 --max-time 60 --retry 3 --retry-delay 5 https://example.com/api/data 2. Add retries with exponential backoff using --retry and --retry-delay. 3. Set step-level timeouts with timeout-minutes: - name: Curl step timeout-minutes: 5 run: curl ... 4. Set job-level timeouts: jobs: fetch: timeout-minutes: 30 steps: - run: curl ... 5. For large downloads or slow networks, increase --max-time and use job timeouts. Default job timeout is 360 minutes. 6. Use dedicated curl actions like indiesdev/curl@v1 which support timeout and retries natively: - uses: indiesdev/curl@v1 with: url: https://example.com timeout: 30000 # ms retries: 3 curl has no timeout by default, so always specify. Test values based on expected response times + network variability. Monitor logs for timeout error 28. Citations:
Ajoutez des timeouts explicites à Sans Patch proposé- http_code=$(curl -sS -X POST \
+ http_code=$(curl -sS -X POST \
+ --connect-timeout 10 \
+ --max-time 60 \
-o "${response}" \
-w "%{http_code}" \
"${FUNCTION_URL}/refresh-baselines" \
-H "Authorization: Bearer ${ANON_KEY}" \
-H "x-refresh-secret: ${SECRET}" \
-H "Content-Type: application/json")📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "HTTP ${http_code}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "Response body:" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cat "${response}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if [ "${http_code}" -ge 400 ]; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "Response body:" | |
| cat "${response}" | |
| echo | |
| if [ "${http_code}" -ge 400 ]; then | |
| if [ "${http_code}" -ge 400 ]; then | |
| echo "Response body:" | |
| cat "${response}" | |
| echo |
Copilot
AI
Apr 19, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If curl fails before producing an HTTP code (e.g., DNS/TLS error), http_code may be empty/non-numeric and [ "${http_code}" -ge 400 ] will error with “integer expression expected”. Guard for a numeric code (or treat empty as failure) so the step fails with a clearer message.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
# First, let's locate and examine the workflow file
find . -name "refresh-baselines.yml" -type fRepository: mmmprod/claude-eta
Length of output: 103
🏁 Script executed:
# Check the full context of the workflow file
if [ -f ".github/workflows/refresh-baselines.yml" ]; then
cat -n ".github/workflows/refresh-baselines.yml"
fiRepository: mmmprod/claude-eta
Length of output: 1177
🏁 Script executed:
# Verify the shell syntax of the proposed patch by checking if it's valid bash
python3 << 'EOF'
import subprocess
import tempfile
# Test the proposed patch logic
test_script = '''#!/bin/bash
set -e
response=$(mktemp)
trap 'rm -f "${response}"' EXIT
set +e
http_code=$(curl -sS -X POST \
-o "${response}" \
-w "%{http_code}" \
"http://httpbin.org/status/200" \
-H "Content-Type: application/json")
curl_exit=$?
set -e
echo "HTTP ${http_code}"
echo "Response body:"
cat "${response}"
echo
if [ "${curl_exit}" -ne 0 ]; then
echo "curl transport error: exit ${curl_exit}"
exit "${curl_exit}"
fi
if [ "${http_code}" -ge 400 ]; then
exit 1
fi
'''
# Check if bash can parse it
result = subprocess.run(['bash', '-n'], input=test_script.encode(), capture_output=True)
if result.returncode == 0:
print("✓ Proposed patch syntax is valid")
else:
print("✗ Syntax error in proposed patch:")
print(result.stderr.decode())
EOFRepository: mmmprod/claude-eta
Length of output: 94
Gérez explicitement les erreurs de transport curl pour préserver les diagnostics.
Si curl rencontre une erreur de transport (DNS, TLS, timeout), le script s'arrête immédiatement avant d'afficher les logs. Cela élimine les diagnostics que ce PR vise à exposer.
Patch proposé
- response=$(mktemp)
- http_code=$(curl -sS -X POST \
+ response=$(mktemp)
+ trap 'rm -f "${response}"' EXIT
+ set +e
+ http_code=$(curl -sS -X POST \
-o "${response}" \
-w "%{http_code}" \
"${FUNCTION_URL}/refresh-baselines" \
-H "Authorization: Bearer ${ANON_KEY}" \
-H "x-refresh-secret: ${SECRET}" \
-H "Content-Type: application/json")
+ curl_exit=$?
+ set -e
echo "HTTP ${http_code}"
echo "Response body:"
cat "${response}"
echo
+ if [ "${curl_exit}" -ne 0 ]; then
+ echo "curl transport error: exit ${curl_exit}"
+ exit "${curl_exit}"
+ fi
if [ "${http_code}" -ge 400 ]; then
exit 1
fi📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| response=$(mktemp) | |
| http_code=$(curl -sS -X POST \ | |
| -o "${response}" \ | |
| -w "%{http_code}" \ | |
| "${FUNCTION_URL}/refresh-baselines" \ | |
| -H "Authorization: Bearer ${ANON_KEY}" \ | |
| -H "x-refresh-secret: ${SECRET}" \ | |
| -H "Content-Type: application/json" | |
| -H "Content-Type: application/json") | |
| echo "HTTP ${http_code}" | |
| echo "Response body:" | |
| cat "${response}" | |
| echo | |
| if [ "${http_code}" -ge 400 ]; then | |
| exit 1 | |
| fi | |
| response=$(mktemp) | |
| trap 'rm -f "${response}"' EXIT | |
| set +e | |
| http_code=$(curl -sS -X POST \ | |
| -o "${response}" \ | |
| -w "%{http_code}" \ | |
| "${FUNCTION_URL}/refresh-baselines" \ | |
| -H "Authorization: Bearer ${ANON_KEY}" \ | |
| -H "x-refresh-secret: ${SECRET}" \ | |
| -H "Content-Type: application/json") | |
| curl_exit=$? | |
| set -e | |
| echo "HTTP ${http_code}" | |
| echo "Response body:" | |
| cat "${response}" | |
| echo | |
| if [ "${curl_exit}" -ne 0 ]; then | |
| echo "curl transport error: exit ${curl_exit}" | |
| exit "${curl_exit}" | |
| fi | |
| if [ "${http_code}" -ge 400 ]; then | |
| exit 1 | |
| fi |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.github/workflows/refresh-baselines.yml around lines 17 - 31, Le script
actuel appelle curl into http_code=$(curl -sS -X POST -o "${response}" -w
"%{http_code}" ...) but n'expose pas les erreurs de transport (DNS/TLS/timeout)
si curl échoue; modifiez l'appel pour capturer aussi la sortie d'erreur de curl
(rediriger stderr vers un second fichier temporaire), ne pas laisser le shell
aborter prématurément, puis vérifier le code de sortie de curl ($?) après
l'appel; si curl a échoué, afficher "Response body:" et le contenu de
"${response}" ainsi que le fichier d'erreur stderr, puis exit 1; conservez
l'utilisation de "${FUNCTION_URL}", "${ANON_KEY}", "${SECRET}" et la variable
http_code pour les réponses HTTP valides.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
mktempresponse file is never removed. Add atrap(e.g., onEXIT) torm -f "$response"so repeated scheduled runs don’t accumulate temp files on the runner (and to keep logs/behavior consistent if the script exits early).