当bash中完成了几个代码构建时,如何显示和停止执行



我正在创建一个脚本,用于启动AWS Codebuild中的几个构建。除了运行它之外,我希望当每个构建完成(到达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,其他的则没有。

我可以通过添加一个新函数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

最新更新