使用 Bitbucket 部署 ImageLabeller
Warren Marusiak
高级技术传播者
为了演示如何使用 Jira Software 和各种互联工具开发、部署和管理应用,我们的团队创建了 ImageLabeller,这是一款基于 AWS 构建的简单演示应用,它使用机器学习将标签应用于图像。
本页面介绍如何使用 Bitbucket 部署 ImageLabeller。在您开始之前,我们建议阅读 ImageLabeller 架构和 AWS SageMaker 设置页面,以了解背景信息。
先决条件
如果您尚未为 Bitbucket 帐户配置 SSH,请按照这些说明进行操作。
使用 ImageLabeller 代码的面向公众的 GitHub 存储库
Bitbucket 管道演示视频
为 AWS S3 基础架构创建存储库
标准的开发人员循环通常是让开发人员从 Jira 中接取任务,将其移至正在进行的工作中,然后完成开发工作。Jira 事务 ID 是将开发工作与 Jira 事务联系起来的关键。它是两个系统之间的核心集成组件。
从 Jira 中,创建一个新事务,将 AWS S3 基础架构存储库添加到 Bitbucket。记下事务 ID。本例中为 IM-5。
转到“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
转到“存储库设置 > 设置 > 启用管道”。
添加 AWS 访问密钥存储库变量
转到“存储库变量”,输入您的 AWS 访问密钥 ID,并单击“添加”。然后输入您的 AWS 秘密访问密钥并单击“添加”。
设置部署环境
单击“部署”。
单击“添加环境”以添加新环境。在本示例中,US-WEST-1 中有一个测试环境,US-EAST-2 中有一个暂存环境,US-WEST-2、US-EAST-1 和 CA-CENTRAL-1 中有三个生产环境。
用于部署到 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
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”以查看正在运行的管道。
单击管道本身以查看执行的详细信息。管道运行了相应步骤,将 screenshot_s 部署到 us-west-1 中的测试环境和 us-east-2 中的暂存环境。
创建拉取请求
如需创建拉取请求,请单击“拉取请求”,然后单击“创建拉取请求”。
选择您的功能分支作为源分支,勾选“关闭分支”复选框,然后单击“创建拉取请求”。
审查代码变更,然后“批准”并“合并”拉取请求。
单击“合并”打开合并拉取请求屏幕。勾选“转换事务”复选框,并单击“合并”。
单击“管道”以监控主线管道。
IM-5 分支消失。留下了主线分支,并且管道正在运行。单击管道。
该管道运行了部署到 us-west-2、us-east-1 和 ca-central-1 中的生产环境的步骤。如果管道失败,可以单击“重新运行”按钮来重新运行管道。
回滚错误的部署
如需回滚部署,请单击“部署”。
单击要回滚的环境以获取历史部署列表,选择要回滚到的版本,然后单击“重新部署”。
验证变更是否正确,并单击“重新部署”。
仅重新部署所选的环境。
为 SubmitImage AWS Lambda 创建存储库
转到 Jira 并创建一个 Jira 事务,将 SubmitImage 存储库添加到 Bitbucket。记下 Jira 事务 ID。本例中为 IM-6。
转到 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
启用管道
转到“存储库设置”,单击“设置”,然后单击“启用管道”。
添加存储库变量
单击“存储库变量”,以添加您的 AWS 访问密钥 ID、AWS 秘密访问密钥和 AWS 帐户 ID。向与 AWS 访问密钥关联的 IAM 用户授予管理员访问权限。您可以通过选择个别 AWS 访问策略来选择使用更精细的访问控制。
添加部署环境
单击“部署”,然后单击“添加环境”以添加新环境。在本示例中,us-west-1 中有一个测试环境,us-east-2 中有一个暂存环境,us-west-2、us-east-1 和 ca-central-1 中有三个生产环境。
创建 SSH 密钥
转到 Bitbucket 中的 SubmitImage 存储库,单击“存储库设置”,再单击“SSH 密钥”,然后单击“生成密钥”。
在创建 SystemTests 存储库时,您将需要此 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”以查看正在运行的管道。
创建拉取请求
如需创建拉取请求,请单击“拉取请求”,然后单击“创建拉取请求”。完成拉取请求,并单击“管道”以查看生产部署。
为 InvokeLabeller AWS Lambda 创建存储库
转到 Jira 并创建一个 Jira 事务,将 InvokeLabeller 存储库添加到 Bitbucket。记下 Jira 事务 ID。本例中为 IM-10。
转到 Bitbucket,并单击“创建”,然后单击“存储库”。选择相应“工作区”和“项目”。将“默认分支名称”设置为主线。单击“创建存储库”以继续。
在您的终端中转到您的 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
启用管道
转到“存储库设置”,单击“设置”,然后单击“启用管道”。
添加存储库变量
单击“存储库变量”,以添加您的 AWS 访问密钥 ID、AWS 秘密访问密钥和 AWS 帐户 ID。向与 AWS 访问密钥关联的 IAM 用户授予管理员访问权限。您可以通过选择个别 AWS 访问策略来选择使用更精细的访问控制,但详情留给读者。
添加部署环境
单击“部署”,然后单击“添加环境”以添加新环境。在本示例中,us-west-1 中有一个测试环境,us-east-2 中有一个暂存环境,us-west-2、us-east-1 和 ca-central-1 中有三个生产环境。
创建 SSH 密钥
转到 Bitbucket 中的 SubmitImage 存储库,单击“存储库设置”,再单击“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”以查看正在运行的管道。
创建拉取请求
如需创建拉取请求,请单击“拉取请求”,然后单击“创建拉取请求”。完成拉取请求,并单击“管道”以查看生产部署。
为系统测试创建存储库
转到 Jira,并创建一个新的 Jira 事务,将 SystemTests 存储库添加到 Bitbucket。记下事务 ID。本例中为 IM-7。
转到 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 密钥
单击“存储库设置”,然后单击“访问密钥”。
单击“添加密钥”,粘贴从 SubmitImage、GetImageLabel 或 InvokeLabeller 复制的 SSH 密钥,然后单击“添加 SSH 密钥”。
如果您已经做到这一步,恭喜!您刚刚已部署 ImageLabeller。下一步是设置使用 Opsgenie 监控 ImageLabeller。
分享这篇文章
下一个主题
推荐阅读
将这些资源加入书签,以了解 DevOps 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。