You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在on_error钩子中获取fly watch输出并避免构建挂起?

在Concourse的on_error钩子中获取构建输出并上报Slack的解决方案

1. 用timeout限制fly watch运行时间,获取已有日志

fly watch默认会持续监听构建输出,但可以通过timeout命令强制限制它的运行时长,只抓取截止到当前时刻的已有日志,避免无限循环:

# 限制命令运行5秒,可根据实际情况调整时长
timeout 5s fly watch -b ${BUILD_ID} > build_error_logs.txt

执行后,build_error_logs.txt中会保存截止到命令终止时的所有构建日志,不会继续等待新输出。

2. 直接调用Concourse API拉取完整构建日志

相比fly watch,调用Concourse的REST API是更可靠的方式,它会一次性返回构建的完整日志(若构建已失败,则返回全部错误日志),无需持续监听:

# 提前设置环境变量:CONCOURSE_TOKEN(认证令牌)、CONCOURSE_API_URL(Concourse API地址)
curl -H "Authorization: Bearer ${CONCOURSE_TOKEN}" \
  "${CONCOURSE_API_URL}/api/v1/builds/${BUILD_ID}/log" > build_error_logs.txt

这种方式完全不会出现持续监听导致的循环问题,适合在on_error钩子中使用。

3. 优化钩子逻辑,避免任务运行时触发循环

之前使用自定义资源导致挂起,核心原因是on_error触发时原任务仍在运行,此时调用监听类命令会持续占用资源。可以先通过API确认构建状态为失败后,再执行日志拉取和上报:

# 先查询构建状态
BUILD_STATUS=$(curl -s -H "Authorization: Bearer ${CONCOURSE_TOKEN}" \
  "${CONCOURSE_API_URL}/api/v1/builds/${BUILD_ID}" | jq -r '.status')

# 仅当构建已失败时,才拉取日志并上报Slack
if [ "${BUILD_STATUS}" = "failed" ]; then
  curl -H "Authorization: Bearer ${CONCOURSE_TOKEN}" \
    "${CONCOURSE_API_URL}/api/v1/builds/${BUILD_ID}/log" > build_error_logs.txt
  
  # 上报Slack示例(根据实际Webhook调整内容格式)
  curl -X POST -H "Content-Type: application/json" \
    -d "{\"text\": \"构建ID ${BUILD_ID} 失败,关键日志:\n\`\`\`$(cat build_error_logs.txt | tail -30)\`\`\`\"}" \
    ${SLACK_WEBHOOK_URL}
fi

通过状态判断,确保只在构建完全失败后执行后续操作,从根源避免循环挂起问题。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:31:04