如何解决在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,其他的都没有。
解决方法
我可以通过添加一个新函数 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。