Azure DevOps中使用Bash任务时检测构建取消状态的方法
在Azure DevOps Bash脚本中检测构建取消并终止循环
要解决这个问题,你可以利用Azure DevOps的内置环境变量或者捕获系统信号来检测构建是否被取消,从而提前终止循环。以下是两种可行的实现方式:
方法1:检查Azure DevOps内置环境变量
当构建或作业被手动取消时,Azure DevOps会自动将环境变量AGENT_JOBSTATUS设置为Canceled。你可以在循环内直接检查这个变量的值,判断是否需要跳出循环。
修改后的完整循环代码:
total_iterations=600 # 对应10分钟(每秒检查一次) counter=0 while [ $counter -lt $total_iterations ]; do ((counter++)) sleep 1 # 按需调整检查间隔 # 检测构建是否被取消 if [ "$AGENT_JOBSTATUS" = "Canceled" ]; then echo "构建已取消,终止等待循环" break fi # 在这里添加你的作业成功检查逻辑 # 示例:if [ "$(curl -s http://your-status-api)" = "success" ]; then # echo "作业执行成功,终止循环" # break # fi done
方法2:捕获SIGTERM信号
手动取消构建时,Azure DevOps会向运行的Bash脚本发送SIGTERM终止信号。你可以在脚本开头添加信号捕获逻辑,设置一个标记变量,然后在循环内检查该标记。
这种方式响应更快,能避免环境变量更新延迟的问题:
# 初始化取消标记,并捕获SIGTERM信号设置标记 canceled=false trap 'canceled=true' SIGTERM total_iterations=600 counter=0 while [ $counter -lt $total_iterations ] && [ "$canceled" = false ]; do ((counter++)) sleep 1 # 检查是否收到终止信号 if [ "$canceled" = true ]; then echo "捕获到终止信号,终止等待循环" break fi # 在这里添加你的作业成功检查逻辑 done
注意事项
- 两种方法可以结合使用,进一步提升可靠性
- 调整
sleep的时长和total_iterations的值,匹配你的实际等待需求 - 确保脚本在Azure DevOps代理环境中运行,这样才能正确获取到
AGENT_JOBSTATUS变量
内容的提问来源于stack exchange,提问作者Michele
相关产品推荐
相关产品推荐

