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 集成,因此您可以使用它们的集成而不是您的脚本来正确集成。不知道支持不支持

A​​WS 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