在 bash 中完成多个代码构建时如何显示和停止执行?
How can show and stop the execution when several codebuild are completed in bash?
我正在创建一个脚本,用于在 AWS Codebuild 中启动多个构建。除了 运行 它,我希望当每个构建完成(到达 COMPLETED 阶段)并读取字符串“COMPLETED”时,它会停止。
这是脚本:
#!/bin/bash
# Deploy the Layers
BUILD_PROJECT=
ENVIRONMENT=
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=
ENVIRONMENT=
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
我正在创建一个脚本,用于在 AWS Codebuild 中启动多个构建。除了 运行 它,我希望当每个构建完成(到达 COMPLETED 阶段)并读取字符串“COMPLETED”时,它会停止。
这是脚本:
#!/bin/bash
# Deploy the Layers
BUILD_PROJECT=
ENVIRONMENT=
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=
ENVIRONMENT=
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