有界 HTTP 客户端

使用 https://nativify.javavirtualenvironment.com/api/v1 和 /builds 路由。提交 POST /builds 不具备幂等性,并可能消耗 NCU;不要把它放进自动重试包装器。只持久化一次返回的 task ID,然后轮询 GET /builds/{id},直到总 deadline。

只重试状态为 429、502、503 或 504 的轮询 GET 失败。Retry-After 是整数秒或 HTTP-date 时都要遵守,否则使用有界的 fallback backoff。仅将 SUCCESS 视为可下载的成功,将 FAILED 和 CANCELLED 视为终态失败,任何未记录的状态都立即失败。绝不能无限轮询未知状态。

只在 SUCCESS 后下载,并计入同一个总 deadline。先把响应写到目标目录中的临时文件,验证命令结果,再原子重命名为最终输出。失败时删除临时文件,避免把部分 JAR 误认为发布产物。

bash
remaining=$((deadline - SECONDS))
((remaining > 0)) || { echo "deadline exceeded before download" >&2; exit 1; }
temp_output="${OUTPUT_JAR}.part.$"
trap 'rm -f "$temp_output"' EXIT
curl --fail-with-body --silent --show-error --max-time "$remaining" \
  --output "$temp_output" "$download_url"
mv -f "$temp_output" "$OUTPUT_JAR"
trap - EXIT