bash - 在 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
推荐阅读
- r - 如何使用人口普查局的 API 下载 JSON 数据文件
- fortran - 它通过创建一个简单的逻辑表达式来工作。结果是-1, 0,但是逻辑表达式正确吗?
- javascript - 无法通过 ajax 调用将复杂模型传递给控制器
- c++ - 非标准语法 - 使用 & 创建指向成员的指针:指向成员的 C++ 函数指针
- android - UninitializedPropertyAccessException:lateinit 属性设置活动尚未初始化
- android - Nativescript-Vue 和 Axios 工作功能导致“错误:请求失败,状态码 429”
- azure-active-directory - Can I query Azure Active Directory (group membership, etc.) from Power BI?
- python - Twitter API 搜索未返回推文的全文
- java - 嵌套异常是 java.lang.NoClassDefFoundError: org.springframework.boot.env.PropertySourcesLoader
- flutter - 居中并调整 FAB 大小