CodeBuild 在构建失败后继续执行而不是停止
CodeBuild execution continues after build fails instead of stopping
我正在使用 git、codebuild 和 elastic beanstalk 构建 CI/CD 管道。
在代码构建执行期间,当构建因测试用例的语法错误而失败时,我看到代码构建进展到下一阶段并最终继续生成工件。
我的理解是如果构建失败,应该停止执行。这是正确的行为吗?
请参阅下面的构建规范。
version: 0.2
phases:
install:
commands:
- echo Installing package.json..
- npm install
- echo Installing Mocha...
- npm install -g mocha
pre_build:
commands:
- echo Installing source NPM placeholder dependencies...
build:
commands:
- echo Build started on `date`
- echo Compiling the Node.js code
- mocha modules/**/tests/*.js
post_build:
commands:
- echo Build completed on `date`
artifacts:
files:
- modules/*
- node_modules/*
- package.json
- config/*
- server.js
CodeBuild 通过退出代码检测构建失败。您应该确保您的测试执行 returns 失败时的非零退出代码。
POST_BUILD
will always run as long as BUILD
was also run(不管BUILD
的成败。)UPLOAD_ARTIFACTS
也是如此。这样您就可以检索调试 information/artifacts.
如果你想根据 BUILD
的成功或失败在 POST_BUILD
中做一些不同的事情,你可以测试 builtin environment variable CODEBUILD_BUILD_SUCCEEDING
,它被设置为 1
如果 BUILD
成功,如果 0
失败。
将执行 post_build 阶段并生成工件。 post_build 有助于在必要时正确关闭构建环境,即使构建失败,工件也可能有用。例如。额外的日志、中间文件等
我建议只对与构建结果无关的命令使用 post_build,并正确取消初始化构建环境。否则你可以排除那一步。
CodeBuild 使用环境变量 CODEBUILD_BUILD_SUCCEEDING 来显示构建过程是否正确。
我现在找到的最好方法是在安装部分创建一个小脚本,然后始终像这样使用它:
phases:
install:
commands:
- echo '#!/bin/bash' > /usr/local/bin/ok; echo 'if [[ "$CODEBUILD_BUILD_SUCCEEDING" == "0" ]]; then exit 1; else exit 0; fi' >> /usr/local/bin/ok; chmod +x /usr/local/bin/ok
post_build:
commands:
- ok && echo Build completed on `date`
post_build 部分是 运行,即使构建部分可能会失败。扩展前面的答案,您可以在 buildspec.yml
文件的 post_build 部分使用变量 CODEBUILD_BUILD_SUCCEEDING
。当且仅当 构建部分成功完成时,您才能将 post_build 部分变为 运行 。以下是如何实现这一目标的示例:
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
- CODEBUILD_RESOLVED_SOURCE_VERSION="${CODEBUILD_RESOLVED_SOURCE_VERSION:-$IMAGE_TAG}"
- IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_URI="$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG"
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t $IMAGE_URI .
post_build:
commands:
- bash -c "if [ /"$CODEBUILD_BUILD_SUCCEEDING/" == /"0/" ]; then exit 1; fi"
- echo Build stage successfully completed on `date`
- docker push $IMAGE_URI
- printf '[{"name":"clair","imageUri":"%s"}]' "$IMAGE_URI" > images.json
artifacts:
files: images.json
我只是想指出,如果您希望在命令失败时停止整个执行,您可以指定 -e
选项:
当运行一个bash文件
- /bin/bash -e ./commands.sh
或当运行一组commands/bash文件
#!/bin/bash
set -e
# ... commands
在构建部分添加这个
build:
on-failure: ABORT
我正在使用 git、codebuild 和 elastic beanstalk 构建 CI/CD 管道。
在代码构建执行期间,当构建因测试用例的语法错误而失败时,我看到代码构建进展到下一阶段并最终继续生成工件。
我的理解是如果构建失败,应该停止执行。这是正确的行为吗?
请参阅下面的构建规范。
version: 0.2
phases:
install:
commands:
- echo Installing package.json..
- npm install
- echo Installing Mocha...
- npm install -g mocha
pre_build:
commands:
- echo Installing source NPM placeholder dependencies...
build:
commands:
- echo Build started on `date`
- echo Compiling the Node.js code
- mocha modules/**/tests/*.js
post_build:
commands:
- echo Build completed on `date`
artifacts:
files:
- modules/*
- node_modules/*
- package.json
- config/*
- server.js
CodeBuild 通过退出代码检测构建失败。您应该确保您的测试执行 returns 失败时的非零退出代码。
POST_BUILD
will always run as long as BUILD
was also run(不管BUILD
的成败。)UPLOAD_ARTIFACTS
也是如此。这样您就可以检索调试 information/artifacts.
如果你想根据 BUILD
的成功或失败在 POST_BUILD
中做一些不同的事情,你可以测试 builtin environment variable CODEBUILD_BUILD_SUCCEEDING
,它被设置为 1
如果 BUILD
成功,如果 0
失败。
将执行 post_build 阶段并生成工件。 post_build 有助于在必要时正确关闭构建环境,即使构建失败,工件也可能有用。例如。额外的日志、中间文件等
我建议只对与构建结果无关的命令使用 post_build,并正确取消初始化构建环境。否则你可以排除那一步。
CodeBuild 使用环境变量 CODEBUILD_BUILD_SUCCEEDING 来显示构建过程是否正确。
我现在找到的最好方法是在安装部分创建一个小脚本,然后始终像这样使用它:
phases:
install:
commands:
- echo '#!/bin/bash' > /usr/local/bin/ok; echo 'if [[ "$CODEBUILD_BUILD_SUCCEEDING" == "0" ]]; then exit 1; else exit 0; fi' >> /usr/local/bin/ok; chmod +x /usr/local/bin/ok
post_build:
commands:
- ok && echo Build completed on `date`
post_build 部分是 运行,即使构建部分可能会失败。扩展前面的答案,您可以在 buildspec.yml
文件的 post_build 部分使用变量 CODEBUILD_BUILD_SUCCEEDING
。当且仅当 构建部分成功完成时,您才能将 post_build 部分变为 运行 。以下是如何实现这一目标的示例:
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
- CODEBUILD_RESOLVED_SOURCE_VERSION="${CODEBUILD_RESOLVED_SOURCE_VERSION:-$IMAGE_TAG}"
- IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_URI="$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG"
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t $IMAGE_URI .
post_build:
commands:
- bash -c "if [ /"$CODEBUILD_BUILD_SUCCEEDING/" == /"0/" ]; then exit 1; fi"
- echo Build stage successfully completed on `date`
- docker push $IMAGE_URI
- printf '[{"name":"clair","imageUri":"%s"}]' "$IMAGE_URI" > images.json
artifacts:
files: images.json
我只是想指出,如果您希望在命令失败时停止整个执行,您可以指定 -e
选项:
当运行一个bash文件
- /bin/bash -e ./commands.sh
或当运行一组commands/bash文件
#!/bin/bash set -e # ... commands
在构建部分添加这个
build:
on-failure: ABORT