CodeDeploy Bitbucket - 如何在 CodeDeploy 失败时使 Bitbucket 失败
CodeDeploy Bitbucket - How to Fail Bitbucket on CodeDeploy Failure
我有一个成功的 bitbucket 管道调用 aws CodeDeploy,但我想知道我是否可以添加一个步骤来检查并等待 CodeDeploy 成功,否则管道失败。这是否可以通过循环通过 CodeDeploy 调用的脚本来继续监视 CodeDeploy 推送的状态?知道那会是什么 CodeDeploy 调用吗?
bitbucket-pipline.yml
image: pitech/gradle-awscli
pipelines:
branches:
develop:
- step:
caches:
- gradle
script:
- gradle build bootRepackage
- mkdir tmp; cp appspec.yml tmp; cp build/libs/thejar*.jar tmp/the.jar; cp -r scripts/ ./tmp/
- pip install awscli --upgrade --user
- aws deploy push --s3-location s3://thebucket/the-deploy.zip --application-name my-staging-app --ignore-hidden-files --source tmp
- aws deploy create-deployment --application-name server-staging --s3-location bucket=staging-codedeploy,key=the-deploy.zip,bundleType=zip --deployment-group-name the-staging --deployment-config-name CodeDeployDefault.AllAtOnce --file-exists-behavior=OVERWRITE
appspec.yml
version: 0.0
os: linux
files:
- source: thejar.jar
destination: /home/ec2-user/the-server/
permissions:
- object: /
pattern: "**"
owner: ec2-user
group: ec2-user
hooks:
ApplicationStop:
- location: scripts/server_stop.sh
timeout: 60
runas: ec2-user
ApplicationStart:
- location: scripts/server_start.sh
timeout: 60
runas: ec2-user
ValidateService:
- location: scripts/server_validate.sh
timeout: 120
runas: ec2-user
不幸的是,Bitbucket 似乎没有在等待 ValidateService 完成,所以我需要在 Bitbucket 中进行确认,然后再将构建标记为成功。
aws deploy create-deployment
是一个异步调用,BitBucket 不知道它需要知道你的部署是否成功。将脚本添加到您的 CodeDeploy 应用程序不会影响 BitBucket 了解您的部署。
您有一个(也许两个)选项来解决这个问题。
#1 包含等待部署完成的脚本
您需要将脚本添加到 BitBucket 管道以检查部署状态以完成。您可以使用 SNS 通知,或直接轮询 CodeDeploy 服务。
伪代码看起来像这样:
loop
check_if_deployment_complete
if false, wait and retry
if true && deployment successful, return 0 (success)
if true && deployment failed, return non-zero (failure)
您可以使用 AWS CLI 或您喜欢的脚本语言。将其添加到 bitbucket-pipline.yml
脚本的末尾。确保在对 CodeDeploy 的调用之间使用等待时间来检查状态。
#2(可能)直接使用 BitBucket AWS CodeDeploy 集成
BitBucket 直接与 AWS CodeDeploy 集成,因此您可以使用它们的集成而不是您的脚本来正确集成。不知道支持不支持
AWS CLI 已经有一个 deployment-successful
方法,它每 15 秒检查一次部署状态。您只需要将 create-deployment
的输出通过管道传输到 deployment-successful
.
在您的具体情况下,它应该如下所示:
image: pitech/gradle-awscli
pipelines:
branches:
develop:
- step:
caches:
- gradle
script:
- gradle build bootRepackage
- mkdir tmp; cp appspec.yml tmp; cp build/libs/thejar*.jar tmp/the.jar; cp -r scripts/ ./tmp/
- pip install awscli --upgrade --user
- aws deploy push --s3-location s3://thebucket/the-deploy.zip --application-name my-staging-app --ignore-hidden-files --source tmp
- aws deploy create-deployment --application-name server-staging --s3-location bucket=staging-codedeploy,key=the-deploy.zip,bundleType=zip --deployment-group-name the-staging --deployment-config-name CodeDeployDefault.AllAtOnce --file-exists-behavior=OVERWRITE > deployment.json
- aws deploy wait deployment-successful --cli-input-json file://deployment.json
我有一个成功的 bitbucket 管道调用 aws CodeDeploy,但我想知道我是否可以添加一个步骤来检查并等待 CodeDeploy 成功,否则管道失败。这是否可以通过循环通过 CodeDeploy 调用的脚本来继续监视 CodeDeploy 推送的状态?知道那会是什么 CodeDeploy 调用吗?
bitbucket-pipline.yml
image: pitech/gradle-awscli
pipelines:
branches:
develop:
- step:
caches:
- gradle
script:
- gradle build bootRepackage
- mkdir tmp; cp appspec.yml tmp; cp build/libs/thejar*.jar tmp/the.jar; cp -r scripts/ ./tmp/
- pip install awscli --upgrade --user
- aws deploy push --s3-location s3://thebucket/the-deploy.zip --application-name my-staging-app --ignore-hidden-files --source tmp
- aws deploy create-deployment --application-name server-staging --s3-location bucket=staging-codedeploy,key=the-deploy.zip,bundleType=zip --deployment-group-name the-staging --deployment-config-name CodeDeployDefault.AllAtOnce --file-exists-behavior=OVERWRITE
appspec.yml
version: 0.0
os: linux
files:
- source: thejar.jar
destination: /home/ec2-user/the-server/
permissions:
- object: /
pattern: "**"
owner: ec2-user
group: ec2-user
hooks:
ApplicationStop:
- location: scripts/server_stop.sh
timeout: 60
runas: ec2-user
ApplicationStart:
- location: scripts/server_start.sh
timeout: 60
runas: ec2-user
ValidateService:
- location: scripts/server_validate.sh
timeout: 120
runas: ec2-user
不幸的是,Bitbucket 似乎没有在等待 ValidateService 完成,所以我需要在 Bitbucket 中进行确认,然后再将构建标记为成功。
aws deploy create-deployment
是一个异步调用,BitBucket 不知道它需要知道你的部署是否成功。将脚本添加到您的 CodeDeploy 应用程序不会影响 BitBucket 了解您的部署。
您有一个(也许两个)选项来解决这个问题。
#1 包含等待部署完成的脚本
您需要将脚本添加到 BitBucket 管道以检查部署状态以完成。您可以使用 SNS 通知,或直接轮询 CodeDeploy 服务。
伪代码看起来像这样:
loop
check_if_deployment_complete
if false, wait and retry
if true && deployment successful, return 0 (success)
if true && deployment failed, return non-zero (failure)
您可以使用 AWS CLI 或您喜欢的脚本语言。将其添加到 bitbucket-pipline.yml
脚本的末尾。确保在对 CodeDeploy 的调用之间使用等待时间来检查状态。
#2(可能)直接使用 BitBucket AWS CodeDeploy 集成
BitBucket 直接与 AWS CodeDeploy 集成,因此您可以使用它们的集成而不是您的脚本来正确集成。不知道支持不支持
AWS CLI 已经有一个 deployment-successful
方法,它每 15 秒检查一次部署状态。您只需要将 create-deployment
的输出通过管道传输到 deployment-successful
.
在您的具体情况下,它应该如下所示:
image: pitech/gradle-awscli
pipelines:
branches:
develop:
- step:
caches:
- gradle
script:
- gradle build bootRepackage
- mkdir tmp; cp appspec.yml tmp; cp build/libs/thejar*.jar tmp/the.jar; cp -r scripts/ ./tmp/
- pip install awscli --upgrade --user
- aws deploy push --s3-location s3://thebucket/the-deploy.zip --application-name my-staging-app --ignore-hidden-files --source tmp
- aws deploy create-deployment --application-name server-staging --s3-location bucket=staging-codedeploy,key=the-deploy.zip,bundleType=zip --deployment-group-name the-staging --deployment-config-name CodeDeployDefault.AllAtOnce --file-exists-behavior=OVERWRITE > deployment.json
- aws deploy wait deployment-successful --cli-input-json file://deployment.json