首页 > 解决方案 > 如何从 codebuild 并行部署多个 shell 脚本?

问题描述

所以目前我有一个代码构建,当我推送到我的存储库时由代码管道触发。

这些文件有一个 .sh 文件、一个 buildspec.yaml 文件和一个包含 1 到 n 个文件夹的文件夹,每个文件夹都有自己的 .sh 文件,然后在文件夹内部署 cloudformation 资源。

deploy.sh
buildspec.yaml
Folder
|
|-- Directory1
|   -- deploy.sh
|   -- template.yaml
|
|-- Directory2
|   -- deploy.sh
|   -- template.yaml
|
|-- Directory3
|   -- deploy.sh
|   -- template.yaml

目前,第一个 .sh 文件只是一个 for 循环,它将 cd 进入每个目录并按顺序运行 .sh 脚本。

我试图使这个过程是并行的而不是顺序的。由于可能有未知数量的子文件夹,它可能是一个漫长的过程,我不希望它等待以前的资源。

有没有人在这方面有建议/经验?我进行了一些搜索,但在我的测试中没有发现任何结论性的东西。

编辑:运行 for 循环的主 bu​​ild.sh 文件

#!/bin/bash
set -e

PROFILE='new-profile'
aws configure --profile $PROFILE set credential_source EcsContainer
REGION=$AWS_REGION

for directory in *; do
    if [ -d ${directory} ]; then
        # Will not run if no directories are available
        chmod +x $directory/deploy.sh
        $directory/deploy.sh -p new-profile &
        # cd $directory
        # echo $directory
        # echo "---------------------------------------------------------------------------------"
        # echo "Start deploying $directory resources..."
        # echo "---------------------------------------------------------------------------------"
        #     chmod +x ./deploy.sh
        #     ./deploy.sh -p new-profile &
        # cd ../
        # echo "---------------------------------------------------------------------------------"
        # echo "End deploying $directory resources..."
        # echo "---------------------------------------------------------------------------------"
    fi
done
wait
echo "finished deployment"

标签: amazon-web-servicesshellaws-codepipelineaws-codebuild

解决方案


在您的主脚本中,只需循环所有 sub-deploy.sh 并在后台运行它们,将 & 添加到字符串的末尾:

$directory/deploy.sh &

在你的主脚本结束时写

wait
echo "all sub-deploy processes are finished"

推荐阅读