如何在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
相关产品推荐
相关产品推荐

