Build 代码生成执行在生成失败后继续,而不是停止
我正在使用git、codebuild和elastic beanstalk构建一个CI/CD管道 在代码构建执行期间,当由于测试用例的语法错误而导致构建失败时,我看到代码构建进展到下一阶段,并最终继续生成工件 我的理解是,如果构建失败,执行应该停止。这是正确的行为吗 请参阅下面的buildspecBuild 代码生成执行在生成失败后继续,而不是停止,build,continuous-integration,continuous-deployment,aws-codepipeline,aws-codebuild,Build,Continuous Integration,Continuous Deployment,Aws Codepipeline,Aws Codebuild,我正在使用git、codebuild和elastic beanstalk构建一个CI/CD管道 在代码构建执行期间,当由于测试用例的语法错误而导致构建失败时,我看到代码构建进展到下一阶段,并最终继续生成工件 我的理解是,如果构建失败,执行应该停止。这是正确的行为吗 请参阅下面的buildspec 版本:0.2 阶段: 安装: 命令: -echo正在安装package.json。。 -npm安装 -安装摩卡咖啡。。。 -npm安装-g摩卡 预构建: 命令: -echo正在安装源NPM占位符依赖项。
版本:0.2
阶段:
安装:
命令:
-echo正在安装package.json。。
-npm安装
-安装摩卡咖啡。。。
-npm安装-g摩卡
预构建:
命令:
-echo正在安装源NPM占位符依赖项。。。
建造:
命令:
-echo生成已于`日期'开始`
-echo编译Node.js代码
-摩卡模块/**/tests/*.js
后期构建:
命令:
-echo生成于`日期'完成`
人工产品:
文件夹:
-模块/*
-节点单元/*
-package.json
-配置/*
-server.js
CodeBuild通过退出代码检测生成失败。您应该确保测试执行在失败时返回非零退出代码
(无论构建的成功与否,
上传工件的成功与否都是如此)。这样您就可以检索调试信息/工件
如果您想在
POST\u BUILD
中执行不同的操作,这取决于BUILD
的成功与否,您可以测试,如果BUILD
成功,则设置为1
,如果失败,则设置为0
。将执行POST\u BUILD阶段并生成工件。如果需要,post_构建可以正确关闭构建环境,并且即使构建失败,工件也可能有用。例如,额外日志、中间文件等
我建议只对构建结果不可知的命令使用post_build,并正确地取消构建环境的初始化。否则,您可以排除该步骤。CodeBuild使用环境变量CodeBuild\u BUILD\u来显示构建过程是否正常 我现在发现的最好的方法是在install secion中创建一个小脚本,然后始终像这样使用:
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\u BUILD部分中使用变量CODEBUILD\u BUILD\u successing
。当且仅当生成部分成功完成时,才能使后期生成部分运行。以下是如何实现这一目标的示例:
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
- 或者在运行一组命令/bash文件时
#/bin/bash set-e # ... 命令
build:
on-failure: ABORT
我尝试使用相同的逻辑,但是当我的测试失败时,代码构建成功仍然等于1。您是否在失败时手动更新此环境变量?您的测试用例是否返回非零返回代码?这基本上是它自动改变的要求。是的,它失败了,退出代码为2。现在,我正在手动更改代码构建。它可以工作,但是如果出口自动注册会更好。我尝试使用相同的逻辑,但是当我的测试失败时,CODEBUILD\u BUILD\u Successing仍然等于1。失败时是否手动更新此环境变量?@DakotaHipp确保用于执行测试的
buildspec.yml
命令在失败时返回非零退出代码CODEBUILD\u BUILD\u Successing
仅供参考,手动更改它不会影响生成结果。测试失败时,我被迫手动更改code\u BUILD\u Successing变量,然后,在后面的步骤中,我将使用类似于另一个答案的if语句检查该变量。我在post_build部分添加了一行,并让post_build失败。代码构建日志可以在构建部分为您提供失败的详细信息<代码>后期生成:命令:-测试“$CODEBUILD\u BUILD\u successing”=“1”