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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 12:54:03