如何编写bash脚本监控多个AWS CodeBuild任务完成后自动停止执行
脚本修改方案
问题根源
- 原脚本启动第一个构建任务后就进入了单任务等待循环,后续构建任务根本不会触发启动
- 等待循环里匹配到第一个COMPLETED状态就直接执行
exit 0退出脚本,永远走不到后续任务启动逻辑 getStatus函数每次遍历所有项目取最新构建ID,没有绑定本次启动的构建任务,容易被历史构建干扰- 状态判断逻辑重复调用
getStatus,效率低还会输出多余的COMPLETED字符串
修改后的完整脚本
#!/bin/bash # Deploy the Layers BUILD_PROJECT=$1 ENVIRONMENT=$2 if [ -z "$BUILD_PROJECT" ] then echo "BUILD_PROJECT is empty, exiting...." exit 1 fi if [ -z "$ENVIRONMENT" ] then echo "ENVIRONMENT is empty, exiting...." exit 1 fi # 声明关联数组存储 项目名->本次启动的构建ID declare -A build_ids # 声明关联数组存储 项目名->完成状态 declare -A completed_status # 第一步:先批量启动所有构建任务,记录每个任务的构建ID for project in $BUILD_PROJECT do full_project_name="${project}-${ENVIRONMENT}" echo "----------------------------------------------------" echo "Deploying: ${full_project_name}" echo "----------------------------------------------------" # 启动构建并提取返回的构建ID build_id=$(aws codebuild start-build --project-name "${full_project_name}" | jq -r '.build.id') build_ids["${project}"]=${build_id} completed_status["${project}"]="false" done # 第二步:循环监控所有构建任务状态,直到全部完成 while true do all_completed="true" # 遍历每个项目检查状态 for project in "${!build_ids[@]}" do if [[ ${completed_status[${project}]} == "true" ]] then continue fi full_project_name="${project}-${ENVIRONMENT}" build_id=${build_ids[${project}]} # 查询当前构建是否到COMPLETED阶段 phase=$(aws codebuild batch-get-builds --ids "${build_id}" | jq -r '.builds[].phases[]? | select (.phaseType=="COMPLETED") | .phaseType') if [[ ${phase} == "COMPLETED" ]] then echo "${full_project_name} COMPLETED" completed_status[${project}]="true" else echo "Deploying ${full_project_name}..." all_completed="false" fi done # 所有任务都完成就退出循环 if [[ ${all_completed} == "true" ]] then break fi # 每次查询间隔5秒,避免触发AWS API限流,可自行调整 sleep 5 done
关键修改说明
- 拆分执行逻辑为两个阶段:先批量启动所有构建任务,再统一监控状态,避免启动一个等一个的问题
- 用关联数组记录本次启动的每个构建任务的ID,和任务一一绑定,不会被历史构建干扰
- 新增完成状态标记,已完成的任务不会重复查询,也不会重复输出部署中提示
- 移除了循环里的提前退出逻辑,只有所有任务都标记为完成才会退出脚本
- 新增
sleep间隔,避免频繁调用AWS API触发限流
内容的提问来源于stack exchange,提问作者msaavedra91
相关产品推荐
相关产品推荐

