首页 > 解决方案 > 在 bash 中完成多个代码构建时如何显示和停止执行?

问题描述

我正在创建一个在 AWS Codebuild 中启动多个构建的脚本。除了运行它,我希望当每个构建完成(达到 COMPLETED 阶段)并读取字符串“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

# Takes the final phase of codebuild deployment, which is COMPLETED
function getStatus {
    for ids in $BUILD_PROJECT
    do            
        id=$(aws codebuild list-builds-for-project --project-name "${ids}-${ENVIRONMENT}" | jq -r '.ids[0]')
        aws codebuild batch-get-builds --ids "$id" | jq -r '.builds[].phases[] | select (.phaseType=="COMPLETED") | .phaseType'
    done
}

for project in $BUILD_PROJECT
do
    echo "----------------------------------------------------"
    echo "Deploying: ${project}-${ENVIRONMENT}"
    echo "----------------------------------------------------"
    aws codebuild start-build --project-name "${project}-${ENVIRONMENT}"

    while [[ $(getStatus) != "COMPLETED" ]]
    do
        if [[ $(getStatus) == "COMPLETED" ]]
        then
            echo $(getStatus)
            exit 0
        else
            echo "Deploying ${project}-${ENVIRONMENT}..."
            getStatus
        fi
    done 
done

我想看到类似的输出:

----------------------------------------------------
Deploying: lambda1-us2-stage
----------------------------------------------------
----------------------------------------------------
Deploying: lambda2-us2-stage
----------------------------------------------------
----------------------------------------------------
Deploying: lambda3-us2-stage
----------------------------------------------------
Deploying lambda1-us2-stage...
Deploying lambda2-us2-stage...
Deploying lambda3-us2-stage...
Deploying lambda1-us2-stage...
Deploying lambda2-us2-stage...
Deploying lambda3-us2-stage...
lambda1-us2-stage COMPLETED
lambda2-us2-stage COMPLETED
lambda3-us2-stage COMPLETED

在所有 3 完成后,结束脚本。

当前输出为:

----------------------------------------------------
Deploying: lambda1-us2-stage
----------------------------------------------------
Deploying lambda1-us2-stage...
COMPLETED
COMPLETED
Deploying lambda1-us2-stage...
COMPLETED
COMPLETED
Deploying lambda1-us2-stage...
COMPLETED
COMPLETED
Deploying lambda1-us2-stage...
COMPLETED
COMPLETED

所以它迭代到无穷大,只部署了 1 个 lambda,其他的则没有。

标签: bashamazon-web-servicesscriptingaws-codebuild

解决方案


我可以通过添加一个新函数 showStatus 并将 getStatus 转换为数组来解决这个问题。这边走:

#!/bin/bash
# Deploy the Layers and Lambdas

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

# Takes the final phase of every codebuild deployment, which is COMPLETED
function getStatus {   
    for ids in $BUILD_PROJECT
    do  
        id=$(aws codebuild list-builds-for-project --project-name "${ids}-${ENVIRONMENT}" | jq -r '.ids[0]')
        aws codebuild batch-get-builds --ids "$id" | jq -r '.builds[].phases[] | select (.phaseType=="COMPLETED") | .phaseType'
    done
}

# Check if the deployment is finished and print COMPLETED, if not, print a progress until COMPLETED
function showStatus {
    while [[ ${#PROJECT_STATUS[@]} != ${#COUNT_PROJECT[@]} ]]
    do
        PROJECT_STATUS=($(getStatus))
        COUNT_PROJECT=($BUILD_PROJECT)

        if [[ ${#PROJECT_STATUS[@]} == ${#COUNT_PROJECT[@]} ]]
        then
            #This will display something like: Completed... 4/4 - And it will display the final status for each lambda, taken from .phaseType
            echo "Completed ${#PROJECT_STATUS[@]}/${#COUNT_PROJECT[@]}"
            echo $(getStatus)
            exit 0
        else
            #This will display something like: Deploying... 1/4
            echo "Deploying... Completed ${#PROJECT_STATUS[@]}/${#COUNT_PROJECT[@]}"
        fi
    done
}

# This will show which build is running and start the build
for project in $BUILD_PROJECT
do
    echo "----------------------------------------------------"
    echo "Deploying: ${project}-${ENVIRONMENT}"
    echo "----------------------------------------------------"
    aws codebuild start-build --project-name "${project}-${ENVIRONMENT}"
done

PROJECT_STATUS=($(getStatus))
COUNT_PROJECT=($BUILD_PROJECT)

showStatus

推荐阅读