Close

使用 Bitbucket 部署 ImageLabeller

Warren Marusiak 头像
Warren Marusiak

高级技术传播者

为了演示如何使用 Jira Software 和各种互联工具开发、部署和管理应用,我们的团队创建了 ImageLabeller,这是一款基于 AWS 构建的简单演示应用,它使用机器学习将标签应用于图像。

本页面介绍如何使用 Bitbucket 部署 ImageLabeller。在您开始之前,我们建议阅读 ImageLabeller 架构AWS SageMaker 设置页面,以了解背景信息。

先决条件

如果您尚未为 Bitbucket 帐户配置 SSH,请按照这些说明进行操作

使用 ImageLabeller 代码的面向公众的 GitHub 存储库

https://github.com/AtlassianOpenDevOpsGuides

Bitbucket 管道演示视频

为 AWS S3 基础架构创建存储库

标准的开发人员循环通常是让开发人员从 Jira 中接取任务,将其移至正在进行的工作中,然后完成开发工作。Jira 事务 ID 是将开发工作与 Jira 事务联系起来的关键。它是两个系统之间的核心集成组件。

从 Jira 中,创建一个新事务,将 AWS S3 基础架构存储库添加到 Bitbucket。记下事务 ID。本例中为 IM-5。

显示将 AWS S3 基础架构存储库添加到 Bitbucket 的 Jira 事务的屏幕截图

转到“Bitbucket > 创建 > 存储库”。

在 Bitbucket 中创建存储库

选择相应“工作区”和“项目”。将“默认分支名称”设置为主线。单击“创建存储库”以继续。

在 Bitbucket 中创建新存储库的弹出窗口

在您的终端中,转到您的 s3_infra 存储库并运行以下命令,将您的 AWS CloudFormation template.yml 文件推送到 Bitbucket。

git add --all
git commit -m "IM-5 add s3_infra repository to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/s3_infra.git
git branch -m mainline
git push -u origin mainline

启用 Bitbucket Pipelines

转到“存储库设置 > 设置 > 启用管道”。

在 Bitbucket 中启用管道

添加 AWS 访问密钥存储库变量

转到“存储库变量”,输入您的 AWS 访问密钥 ID,并单击“添加”。然后输入您的 AWS 秘密访问密钥并单击“添加”。

Bitbucket 中的存储库变量

设置部署环境

单击“部署”。

Bitbucket 中的部署设置屏幕

单击“添加环境”以添加新环境。在本示例中,US-WEST-1 中有一个测试环境,US-EAST-2 中有一个暂存环境,US-WEST-2、US-EAST-1 和 CA-CENTRAL-1 中有三个生产环境。

在 Bitbucket 中添加部署环境

用于部署到 AWS 的 bitbucket-pipelines.yml

在您的终端中转到 s3_infra 存储库,创建一个以您的 Jira 事务 ID 命名的分支。

git checkout -b IM-5

使用以下 yaml 创建一个 bitbucket-pipelines.yml 文件。这为您的测试、暂存和生产环境定义了部署工作流程。

definitions:
  steps:
    - step: &deploy-test-usw1
        name: Deploy Test us-west-1
        script:
        - pipe: atlassian/aws-cloudformation-deploy:0.10.0
          variables:
            AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
            AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
            AWS_DEFAULT_REGION: 'us-west-1'
            STACK_NAME: 'OpenDevOpsS3Infra'
            CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
            WAIT: 'true'
            TEMPLATE: 'template.yml'
    - step: &deploy-staging-use2
        name: Deploy Staging us-east-2
        script:
        - pipe: atlassian/aws-cloudformation-deploy:0.10.0
          variables:
            AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
            AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
            AWS_DEFAULT_REGION: 'us-east-2'
            STACK_NAME: 'OpenDevOpsS3Infra'
            CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
            WAIT: 'true'
            TEMPLATE: 'template.yml'
    - step: &deploy-production-usw2
        name: Deploy Production us-west-2
        script:
        - pipe: atlassian/aws-cloudformation-deploy:0.10.0
          variables:
            AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
            AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
            AWS_DEFAULT_REGION: 'us-west-2'
            STACK_NAME: 'OpenDevOpsS3Infra'
            CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
            WAIT: 'true'
            TEMPLATE: 'template.yml'
    - step: &deploy-production-use1
        name: Deploy Production us-east-1
        script:
        - pipe: atlassian/aws-cloudformation-deploy:0.10.0
          variables:
            AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
            AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
            AWS_DEFAULT_REGION: 'us-east-1'
            STACK_NAME: 'OpenDevOpsS3Infra'
            CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
            WAIT: 'true'
            TEMPLATE: 'template.yml'
    - step: &deploy-production-cac1
        name: Deploy Production ca-central-1
        script:
        - pipe: atlassian/aws-cloudformation-deploy:0.10.0
          variables:
            AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
            AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
            AWS_DEFAULT_REGION: 'ca-central-1'
            STACK_NAME: 'OpenDevOpsS3Infra'
            CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
            WAIT: 'true'
            TEMPLATE: 'template.yml'
pipelines:
  default:
    - step:
        <<: *deploy-test-usw1
        deployment: Test us-west-1
    - step:
        <<: *deploy-staging-use2
        deployment: Staging us-east-2
  branches:
    mainline:
      - step:
          <<: *deploy-production-usw2
          deployment: Production us-west-2
      - step:
          <<: *deploy-production-use1
          deployment: Production us-east-1
      - step:
          <<: *deploy-production-cac1
          deployment: Production ca-central-1

了解 bitbucket-pipelines.yml 文件

定义和步骤

定义部分中定义一组步骤。每个步骤都有一个在 bitbucket-pipelines.yml 文件中引用的别别名(显示在 Bitbucket 部署屏幕中的名称)和一个脚本脚本是一个或多个命令的集合。

definitions:
  steps:
    - step: &deploy-test-usw1
        name: Deploy Test us-west-1
        script:
        - pipe: atlassian/aws-cloudformation-deploy:0.10.0
          variables:
            AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
            AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
            AWS_DEFAULT_REGION: 'us-west-1'
            STACK_NAME: 'OpenDevOpsS3Infra'
            CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
            WAIT: 'true'
            TEMPLATE: 'template.yml'

Pipes

此步骤使用 atlassian/aws-cloudformation-deploy 管道来部署 s3_infra template.yml 文件中定义的 AWS S3 存储桶。

- pipe: atlassian/aws-cloudformation-deploy:0.10.0

可用的管道集可在此处找到。atlassian/aws-cloudformation-deploy 管道的文档可在此处找到。

Pipelines

管道运行一组步骤。默认管道是针对管道下未明确命名的分支运行的一组步骤。此默认管道运行部署到测试和暂存环境的步骤。

pipelines:
  default:
    - step:
        <<: *deploy-test-usw1
        deployment: Test us-west-1
    - step:
        <<: *deploy-staging-use2
        deployment: Staging us-east-2

部署可实现 Jira 和 Bitbucket 之间的集成。

deployment: Test us-west-1

您可以定义一组针对分支下的特定命名分支运行的步骤。以下代码段为主线分支定义了一组步骤。

branches:
    mainline:
      - step:
          <<: *deploy-production-usw2
          deployment: Production us-west-2
      - step:
          <<: *deploy-production-use1
          deployment: Production us-east-1
      - step:
          <<: *deploy-production-cac1
          deployment: Production ca-central-1

阅读参考文章,了解有关该主题的更多信息。

推送到功能分支

从命令行运行以下命令,将您的变更推送到 s3_infra 存储库的 IM-5 分支。在提交消息中包含 Jira 事务 ID 和分支名称,以使 Jira Bitbucket 集成能够跟踪您的项目中正在发生的情况。

git add --all
git commit -m "IM-5 add bitbucket-pipelines.yml"
git push -u origin IM-5

单击“管道”,然后单击“IM-5”以查看正在运行的管道。

在 Bitbucket 中运行管道

单击管道本身以查看执行的详细信息。管道运行了相应步骤,将 screenshot_s 部署到 us-west-1 中的测试环境和 us-east-2 中的暂存环境。

Bitbucket 中的管道执行详细信息

创建拉取请求

如需创建拉取请求,请单击“拉取请求”,然后单击“创建拉取请求”。

在 Bitbucket 中创建拉取请求

选择您的功能分支作为源分支,勾选“关闭分支”复选框,然后单击“创建拉取请求”。

在 Bitbucket 中创建拉取请求模式。

审查代码变更,然后“批准”并“合并”拉取请求。

在 Bitbucket 中批准和合并拉取请求

单击“合并”打开合并拉取请求屏幕。勾选“转换事务”复选框,并单击“合并”。

在 Bitbucket 中合并拉取请求时勾选“转换事务”复选框

单击“管道”以监控主线管道。

在 Bitbucket 中监控主流水线

IM-5 分支消失。留下了主线分支,并且管道正在运行。单击管道。

Bitbucket 中的主线分支管道屏幕

该管道运行了部署到 us-west-2、us-east-1 和 ca-central-1 中的生产环境的步骤。如果管道失败,可以单击“重新运行”按钮来重新运行管道。

回滚错误的部署

如需回滚部署,请单击“部署”。

Bitbucket 中的部署屏幕

单击要回滚的环境以获取历史部署列表,选择要回滚到的版本,然后单击“重新部署”。

在 Bitbucket 中选择一个环境,然后选择要回滚到的版本

验证变更是否正确,并单击“重新部署”。

在 Bitbucket 中选择“重新部署”之前验证您的变更是否正确

仅重新部署所选的环境。

Bitbucket 中仅显示所选的正在重新部署的环境的管道模式

为 SubmitImage AWS Lambda 创建存储库

转到 Jira 并创建一个 Jira 事务,将 SubmitImage 存储库添加到 Bitbucket。记下 Jira 事务 ID。本例中为 IM-6。

在 Jira Software 中创建一个事务,将 SubmiTimage 存储库添加到 Bitbucket

转到 Bitbucket,并单击“创建”,然后单击“存储库”。

在 Bitbucket 中创建存储库

选择相应“工作区”和“项目”。将“默认分支名称”设置为主线。单击“创建存储库”以继续。

在 Bitbucket 中创建新存储库时的弹出模式

在您的终端中转到您的 SubmitImage 存储库,并运行以下命令以将您的 AWS Lambda 代码推送到 Bitbucket。在提交消息中包含 Jira 事务 ID 和分支名称,以使 Jira Bitbucket 集成能够跟踪您的项目中正在发生的情况。

git add --all
git commit -m "IM-6 add SubmitImage to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/submitimage.git
git branch -m mainline
git push -u origin mainline

启用管道

转到“存储库设置”,单击“设置”,然后单击“启用管道”。

在 Bitbucket 中的“管道”设置中启用管道

添加存储库变量

单击“存储库变量”,以添加您的 AWS 访问密钥 ID、AWS 秘密访问密钥和 AWS 帐户 ID。向与 AWS 访问密钥关联的 IAM 用户授予管理员访问权限。您可以通过选择个别 AWS 访问策略来选择使用更精细的访问控制。

在 Bitbucket 中的“管道”设置中启用管道

添加部署环境

单击“部署”,然后单击“添加环境”以添加新环境。在本示例中,us-west-1 中有一个测试环境,us-east-2 中有一个暂存环境,us-west-2、us-east-1 和 ca-central-1 中有三个生产环境。

Bitbucket 中的部署环境

创建 SSH 密钥

转到 Bitbucket 中的 SubmitImage 存储库,单击“存储库设置”,再单击“SSH 密钥”,然后单击“生成密钥”。

在 Bitbucket 中生成 SSH 密钥

在创建 SystemTests 存储库时,您将需要此 SSH 密钥。

Bitbucket 中的 SSH 密钥详细信息

用于部署到 AWS 的 bitbucket-pipelines.yml

在您的终端中转到 SubmitImage 存储库,创建一个以您的 Jira 事务 ID 命名的分支。

git checkout -b IM-6

使用以下 yaml 创建一个 bitbucket-pipelines.yml 文件。这为您的测试、暂存和生产环境定义 Bitbucket pipeline。您必须更新 git clone 行才能让 SystemTests 成为您的 SystemTests 存储库。

definitions:
  steps:
    -step: &rununittests
        name: run unit tests
        image: golang:buster
        script:
          - cd submitImage
          - go test ./opendevopslambda/...
    -step: &deploy-test-usw1
        name: Deploy Test us-west-1
        image: amazon/aws-sam-cli-build-image-provided
        script:
          - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
          - rm -rf /usr/local/go
          - tar -C /usr/local -xzf go1.16.3.tar.gz
          - export PATH=$PATH:/usr/local/go/bin
          - go version
          - make
          - ls -lah /opt/atlassian/pipelines/agent/build/build/
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-west-1'
              STACK_NAME: 'OpenDevOpsSubmitImage'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-west-1-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'build/template.yaml'
    -step: &integration-test-usw1
      name: Integration test usw1
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-west-1
    -step: &deploy-staging-use2
        name: Deploy Staging us-east-2
        image: amazon/aws-sam-cli-build-image-provided
        script:
          - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
          - rm -rf /usr/local/go
          - tar -C /usr/local -xzf go1.16.3.tar.gz
          - export PATH=$PATH:/usr/local/go/bin
          - go version
          - make
          - ls -lah /opt/atlassian/pipelines/agent/build/build/
          - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
          - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-east-2'
              STACK_NAME: 'OpenDevOpsSubmitImage'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-east-2-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'build/template.yaml'
    -step: &integration-test-use2
      name: Integration test use2
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-east-2
    -step: &deploy-production-usw2
        name: Deploy Production us-west-2
        image: amazon/aws-sam-cli-build-image-provided
        script:
          - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
          - rm -rf /usr/local/go
          - tar -C /usr/local -xzf go1.16.3.tar.gz
          - export PATH=$PATH:/usr/local/go/bin
          - go version
          - make
          - ls -lah /opt/atlassian/pipelines/agent/build/build/
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-west-2'
              STACK_NAME: 'OpenDevOpsSubmitImage'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'build/template.yaml'
    -step: &integration-test-usw2
      name: Integration test usw2
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-west-2
    -step: &deploy-production-use1
        name: Deploy Production us-east-1
        image: amazon/aws-sam-cli-build-image-provided
        script:
          - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
          - rm -rf /usr/local/go
          - tar -C /usr/local -xzf go1.16.3.tar.gz
          - export PATH=$PATH:/usr/local/go/bin
          - go version
          - make
          - ls -lah /opt/atlassian/pipelines/agent/build/build/
          - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
          - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-east-1'
              STACK_NAME: 'OpenDevOpsSubmitImage'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-east-1-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'build/template.yaml'
    -step: &integration-test-use1
      name: Integration test use1
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-east-1
    -step: &deploy-production-cac1
        name: Deploy Production ca-central-1
        image: amazon/aws-sam-cli-build-image-provided
        script:
          - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
          - rm -rf /usr/local/go
          - tar -C /usr/local -xzf go1.16.3.tar.gz
          - export PATH=$PATH:/usr/local/go/bin
          - go version
          - make
          - ls -lah /opt/atlassian/pipelines/agent/build/build/
          - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
          - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'ca-central-1'
              STACK_NAME: 'OpenDevOpsSubmitImage'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'build/template.yaml'
    -step: &integration-test-cac1
      name: Integration test cac1
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=ca-central-1
pipelines:
  default:
    - step: *rununittests
    - step:
        <<: *deploy-test-usw1
        deployment: Test us-west-1
#    - step: *integration-test-usw1
    - step:
        <<: *deploy-staging-use2
        deployment: Staging us-east-2
#    - step: *integration-test-use2
  branches:
    mainline:
      - step:
          <<: *deploy-production-usw2
          deployment: Production us-west-2
#      - step: *integration-test-usw2
      - step:
          <<: *deploy-production-use1
          deployment: Production us-east-1
#      - step: *integration-test-use1
      - step:
          <<: *deploy-production-cac1
          deployment: Production ca-central-1
#      - step: *integration-test-cac1

集成测试的执行目前已被注释掉。只有在部署整个应用时,系统测试才会通过。取消对存储库中的集成测试步骤的注释,并在部署 ImageLabeller 的所有组件后再次推送以运行部署管道。您必须更新 git clone 行才能让 SystemTests 成为您的 SystemTests 存储库。

了解 bitbucket-pipelines.yml 文件

此步骤从 SubmitImage 代码库运行单元测试。

-step: &rununittests
        name: run unit tests
        image: golang:buster
        script:
          - cd submitImage
          - go test ./opendevopslambda/...

此步骤使用 AWS SAM 将您的 SubmitImage AWS Lambda 部署到 us-west-2。这个 pipe 的文档可以在此处找到。

-step: &deploy-usw2-prod
    name: deploy us-west-2 prod
    image: amazon/aws-sam-cli-build-image-provided
    script:
      - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
      - rm -rf /usr/local/go
      - tar -C /usr/local -xzf go1.16.3.tar.gz
      - export PATH=$PATH:/usr/local/go/bin
      - go version
      - make
      - pipe: atlassian/aws-sam-deploy:1.2.0
        variables:
          AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
          AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
          AWS_DEFAULT_REGION: 'us-west-2'
          STACK_NAME: 'OpenDevOpsSubmitImage'
          CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
          TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
          WAIT: 'true'
          DEBUG: 'true'
          S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}'
          SAM_TEMPLATE: 'build/template.yaml'

此步骤克隆 SystemTests 存储库,并在 us-west-2 中运行集成测试。您必须更新 git clone 行才能让 SystemTests 成为您的 SystemTests 存储库。

-step: &integration-test-usw2
      name: Integration test usw2
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-west-2

推送到功能分支

从命令行运行以下命令,将变更推送到您的 SubmitImage 存储库的 IM-8 分支。

git add --all
git commit -m "IM-6 add bitbucket-pipelines.yml to SubmitImage"
git push -u origin IM-6

单击“管道”,然后单击“IM-6”以查看正在运行的管道。

Bitbucket Cloud 管道的屏幕截图

创建拉取请求

如需创建拉取请求,请单击“拉取请求”,然后单击“创建拉取请求”。完成拉取请求,并单击“管道”以查看生产部署。

Bitbucket Cloud 中的生产部署管道

为 InvokeLabeller AWS Lambda 创建存储库

转到 Jira 并创建一个 Jira 事务,将 InvokeLabeller 存储库添加到 Bitbucket。记下 Jira 事务 ID。本例中为 IM-10。

显示 Jira 看板上的 Jira 事务的屏幕截图

转到 Bitbucket,并单击“创建”,然后单击“存储库”。选择相应“工作区”和“项目”。将“默认分支名称”设置为主线。单击“创建存储库”以继续。

在 Bitbucket 中创建 invokelabeller 存储库

在您的终端中转到您的 InvokeLabeller 存储库,并运行以下命令以将您的 AWS Lambda 代码推送到 Bitbucket。在提交消息中包含 Jira 事务 ID 和分支名称,以使 Jira Bitbucket 集成能够跟踪您的项目中正在发生的情况。

git add --all
git commit -m "IM-10 add InvokeLabeller to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/invokelabeller.git
git branch -m mainline
git push -u origin mainline

启用管道

转到“存储库设置”,单击“设置”,然后单击“启用管道”。

在 Bitbucket 中的设置中启用管道

添加存储库变量

单击“存储库变量”,以添加您的 AWS 访问密钥 ID、AWS 秘密访问密钥和 AWS 帐户 ID。向与 AWS 访问密钥关联的 IAM 用户授予管理员访问权限。您可以通过选择个别 AWS 访问策略来选择使用更精细的访问控制,但详情留给读者。

在 Bitbucket 中添加存储库变量

添加部署环境

单击“部署”,然后单击“添加环境”以添加新环境。在本示例中,us-west-1 中有一个测试环境,us-east-2 中有一个暂存环境,us-west-2、us-east-1 和 ca-central-1 中有三个生产环境。

Bitbucket 中的部署环境

创建 SSH 密钥

转到 Bitbucket 中的 SubmitImage 存储库,单击“存储库设置”,再单击“SSH 密钥”,然后单击“生成密钥”。

Bitbucket Cloud 中的 SSH 密钥详细信息

用于部署到 AWS 的 bitbucket-pipelines.yml

在您的终端中转到 InvokeLabeller 存储库,创建一个以您的 Jira 事务 ID 命名的分支。

git checkout -b IM-10

使用以下 yaml 创建一个 bitbucket-pipelines.yml 文件。这为您的测试、暂存和生产环境定义 Bitbucket pipeline。您必须更新 git clone 行才能让 SystemTests 成为您的 SystemTests 存储库。

definitions:
  steps:
    -step: &rununittests
        name: run unit tests
        image: python:rc-buster
        script:
          - pip3 install pytest
          - pip3 install moto
          - pip3 install -r tst/requirements.txt --user
          - python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml
    -step: &deploy-usw1-test
        name: deploy us-west-1 test
        image: amazon/aws-sam-cli-build-image-python3.8
        script:
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-west-1'
              STACK_NAME: 'OpenDevOpsImageLabeller'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-west-1-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'template.yml'
    -step: &integration-test-usw1
      name: integration test usw1
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-west-1
    -step: &deploy-use2-staging
        name: deploy us-east-2 staging
        image: amazon/aws-sam-cli-build-image-python3.8
        script:
          - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
          - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-east-2'
              STACK_NAME: 'OpenDevOpsImageLabeller'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-2-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-east-2-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'template.yml'
    -step: &integration-test-use2
      name: integration test use2
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-east-2
    -step: &deploy-usw2-prod
        name: deploy us-west-2 prod
        image: amazon/aws-sam-cli-build-image-python3.8
        script:
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-west-2'
              STACK_NAME: 'OpenDevOpsImageLabeller'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'template.yml'
    -step: &integration-test-usw2
      name: integration test usw2
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-west-2
    -step: &deploy-use1-prod
        name: deploy us-east-1 prod
        image: amazon/aws-sam-cli-build-image-python3.8
        script:
          - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
          - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-east-1'
              STACK_NAME: 'OpenDevOpsImageLabeller'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-east-1-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'template.yml'
    -step: &integration-test-use1
      name: integration test use1
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-east-1
    -step: &deploy-cac1-prod
        name: deply ca-central-1 prod
        image: amazon/aws-sam-cli-build-image-python3.8
        script:
          - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
          - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'ca-central-1'
              STACK_NAME: 'OpenDevOpsImageLabeller'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'template.yml'
    -step: &integration-test-cac1
      name: integration test cac1
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=ca-central-1
pipelines:
  default:
    - step: *rununittests
    - step:
        <<: *deploy-usw1-test
        deployment: us-west-1 Test
#    - step: *integration-test-usw1
    - step:
        <<: *deploy-use2-staging
        deployment: us-east-2 Staging
#    - step: *integration-test-use2
  branches:
    mainline:
      - step:
          <<: *deploy-usw2-prod
          deployment: us-west-2 Prod
#      - step: *integration-test-usw2
      - step:
          <<: *deploy-use1-prod
          deployment: us-east-1 Prod
#      - step: *integration-test-use1
      - step:
          <<: *deploy-cac1-prod
          deployment: ca-central-1 Prod
#      - step: *integration-test-cac1

集成测试的执行目前已被注释掉。只有在部署整个应用时,系统测试才会通过。取消对存储库中的集成测试步骤的注释,并在部署 ImageLabeller 的所有组件后再次推送以运行部署管道。您必须更新 git clone 行才能让 SystemTests 成为您的 SystemTests 存储库。

了解 bitbucket-pipelines.yml 文件

此步骤从 InvokeLabeller 代码库运行单元测试。

-step: &rununittests
        name: run unit tests
        image: golang:buster
        script:
          - cd submitImage
          - go test ./opendevopslambda/...

使用 AWS SageMaker 端点更新 src/app.py

打开 InvokeLabeller 的 src/app.py 文件,并查找 query_endpoint。变更 endpoint_name 和客户端 region_name 以匹配您的 AWS SageMaker 记事本。

def query_endpoint(img):
  endpoint_name = 'jumpstart-dft-image-labeller-endpoint'
  client = boto3.client(service_name='runtime.sagemaker', region_name='us-west-1')
  response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/x-image', Body=img)
  model_predictions = json.loads(response['Body'].read())['predictions'][0]
  return model_predictions

推送到功能分支

从命令行运行以下命令,将您的变更推送到您的 InvokeLabeller 存储库的 IM-10 分支。

git add --all
git commit -m "IM-10 add bitbucket-pipelines.yml to InvokeLabeller"
git push -u origin IM-10

单击“管道”,然后单击“IM-10”以查看正在运行的管道。

查看 Bitbucket Cloud 中运行的管道

创建拉取请求

如需创建拉取请求,请单击“拉取请求”,然后单击“创建拉取请求”。完成拉取请求,并单击“管道”以查看生产部署。

在 Bitbucket pipelines 中查看生产部署

为系统测试创建存储库

转到 Jira,并创建一个新的 Jira 事务,将 SystemTests 存储库添加到 Bitbucket。记下事务 ID。本例中为 IM-7。

在 Jira 看板上查看新创建的 Jira 事务

转到 Bitbucket,并单击“创建”,然后单击“存储库”。

在 Bitbucket 中创建存储库

选择相应“工作区”和“项目”。将“默认分支名称”设置为主线。单击“创建存储库”以继续。

在 Bitbucket 中创建新存储库时输入信息

在您的终端中转到您的 SystemTests 存储库,并运行以下命令以将您的代码推送到 Bitbucket。

git add --all
git commit -m "IM-7 add SystemTests repository to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/systemtests.git
git branch -M mainline
git push -u origin mainline

systemTests 存储库不需要 bitbucket-pipelines.yml 文件。它没有自己的管道,因为它为其他管道提供测试使其运行。记下您的 SystemTest 的远程 URL。SubmitImage、GetImageLabel 和 InvokeLabeller CI/CD 管道将在测试步骤中克隆 SystemTests 存储库。您需要使用正确的 URL 更新后续存储库的 bitbucket-pipelines.yml。

从 SubmitImage、GetImageLabel 和 InvokeLabeller 添加 SSH 密钥

单击“存储库设置”,然后单击“访问密钥”。

Bitbucket 中的访问密钥设置页面

单击“添加密钥”,粘贴从 SubmitImage、GetImageLabel 或 InvokeLabeller 复制的 SSH 密钥,然后单击“添加 SSH 密钥”。

在 Bitbucket 中添加 SSH 密钥

如果您已经做到这一步,恭喜!您刚刚已部署 ImageLabeller。下一步是设置使用 Opsgenie 监控 ImageLabeller

Warren Marusiak
Warren Marusiak

Warren is a Canadian developer from Vancouver, BC with over 10 years of experience. He came to Atlassian from AWS in January of 2021.


分享这篇文章

推荐阅读

将这些资源加入书签,以了解 DevOps 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。

Devops 示意图

DevOps 社区

Devops 示意图

DevOps 学习路径

地图插图

免费试用

注册以获取我们的 DevOps 新闻资讯

Thank you for signing up