記事
チュートリアル
インタラクティブ ガイド
Bitbucket で ImageLabeller をデプロイする
Warren Marusiak
シニア テクニカル エバンジェリスト
当社のチームは Jira Software とさまざまな接続ツールを使用してアプリケーションを開発、デプロイ、管理する方法を説明するために、機械学習を使用してイメージにラベルを添付する AWS 上に構築されたシンプルなデモ アプリケーションである ImageLabeller を作成しました。
このページでは、Bitbucket で ImageLabeller をデプロイする方法について説明します。はじめに、ImageLabeller アーキテクチャ ページと AWS SageMaker のセットアップ ページをお読みの上、背景を確認することをお勧めします。
前提条件
Bitbucket アカウント用に SSH をまだ設定していない場合は、こちらの手順に従ってください。
ImageLabeller のコードで公開されている GitHub リポジトリ
Bitbucket Pipelines のデモ ビデオ
AWS S3 インフラストラクチャ リポジトリを作成する
通常、標準開発者ループでは開発者は Jira からタスクを取り出して、それを進行中の作業に移動して開発作業を完了します。Jira 課題 ID は、開発作業を Jira 課題に結びつけるキーです。これは、2 つのシステム間の中核となる統合コンポーネントです。
Jira から、AWS S3 インフラストラクチャ リポジトリを Bitbucket に追加するための新しい課題を作成します。課題 ID を書き留めます。この例では「IM-5」です。
Bitbucket > [作成] > [リポジトリ] の順に移動します。
適切なワークスペースとプロジェクトを選択します。[Default branch name (デフォルトのブランチ名)] を mainline に設定します。[リポジトリを作成] をクリックして続行します。
ターミナルで 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 アクセス キー リポジトリ変数を追加する
[Repository variables (リポジトリ変数)] に移動して AWS アクセス キー ID を入力、[追加] をクリックします。次に、AWS シークレット アクセス キーを入力して [追加] をクリックします。
デプロイ環境を設定する
[デプロイ] をクリックします。
[環境を追加] をクリックして、新しい環境を追加します。この例では、US-WEST-1 にテスト環境、US-EAST-2 にステージング環境、US-WEST-2、US-EAST-1、CA-CENTRAL-1 に 3 つの本番環境があります。
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 ファイルを理解する
定義とステップ
definitions セクションで一連の steps を定義します。各 step には、bitbucket-pipelines.yml ファイル全体で参照されるエイリアス、Bitbucket デプロイ画面に表示される name と script があります。script は、1 つ以上のコマンドの集合です。
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 のパイプラインは一連のステップで、pipelines で明示的に名前が付けられていないブランチに対して実行されます。この default のパイプラインは、テスト環境とステージング環境にデプロイするステップを実行します。
pipelines:
default:
- step:
<<: *deploy-test-usw1
deployment: Test us-west-1
- step:
<<: *deploy-staging-use2
deployment: Staging us-east-2
deployment によって、Jira と Bitbucket の統合が可能になります。
deployment: Test us-west-1
branches にある、具体的な名前の付いたブランチに対して実行する一連のステップを定義できます。以下のスニペットは、mainline ブランチの一連のステップを定義しています。
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
[Pipelines]、[IM-5] の順にクリックして、実行中のパイプラインを確認します。
パイプライン自体をクリックすると、実行の詳細が表示されます。パイプラインは、us-west-1 のテスト環境と us-east-2 のステージング環境にデプロイする toscreenshot_s のステップを実行しました。
プルリクエストを作成する
プル リクエストを作成するには [プル リクエスト]、[プル リクエストを作成] の順にクリックします。
ソース ブランチとしてのフィーチャー ブランチ、[ブランチのクローズ] チェックボックスの順に選択して [プル リクエストを作成] をクリックします。
コードの変更を確認後、プル リクエストを [承認] して [マージ] します。
[マージ] をクリックすると、プル リクエストのマージ画面が開きます。[課題をトランジション] チェックボックスを選択して [マージ] をクリックします。
[Pipelines] をクリックして、メインライン パイプラインを監視します。
IM-5 ブランチが消えました。mainline ブランチは残っており、パイプラインが実行中です。[Pipelines] をクリックします。
パイプラインは、us-west-2、us-east-1、ca-central-1 の本番環境にデプロイするステップを実行しました。パイプラインが失敗した場合は、[再実行] ボタンをクリックしてパイプラインを再実行できます。
不正なデプロイをロールバックする
デプロイをロールバックするには [デプロイ] をクリックします。
ロールバックする環境をクリックして過去のデプロイ リストを取得し、ロールバック先のバージョンを選択して [再デプロイ] をクリックします。
変更が正しいことを確認して [再デプロイ] をクリックします。
選択した環境のみが再デプロイされます。
SubmitImage AWS Lambda 用のリポジトリを作成する
Jira に移動して、Bitbucket に SubmitImage リポジトリを追加するための Jira 課題を作成します。Jira 課題 ID を書き留めます。この例では「IM-6」です。
Bitbucket に移動して [作成]、[リポジトリ] の順にクリックします。
適切なワークスペースとプロジェクトを選択します。[デフォルトのブランチ名] を mainline に設定します。[リポジトリを作成] をクリックして続行します。
ターミナルで 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 ユーザーに、AdministratorAccess を付与します。個別の AWS アクセス ポリシーを選択することで、よりきめ細かなアクセス コントロールを使用できます。
デプロイ環境を追加
[デプロイ]、[環境を追加] の順にクリックして、新しい環境を追加します。us-west-1 のテスト環境、us-east-2 のステージング環境、us-west-2、us-east-1、ca-central-1 の 3 つの本番環境があります。
SSH キーを作成
Bitbucket の SubmitImage リポジトリに移動して、[リポジトリ設定]、[SSH キー]、[キーを生成] の順にクリックします。
SystemTests リポジトリを作成する際に、この SSH キーが必要になります。
AWS にデプロイする bitbucket-pipelines.yml
ターミナルの SubmitImage リポジトリに移動して、Jira 課題 ID にちなんだ名前のブランチを作成します。
git checkout -b IM-6
次の yaml で bitbucket-pipelines.yml ファイルを作成します。これによって、テスト環境、ステージング環境、本番環境の Bitbucket パイプラインが定義されます。SystemTests を SystemTests リポジトリにするには、git クローン行を更新する必要があります。
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 のすべてのコンポーネントがデプロイされたら、もう一度プッシュしてデプロイ パイプラインを実行します。SystemTests を SystemTests リポジトリにするには、git クローン行を更新する必要があります。
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 にデプロイします。このパイプのドキュメントはここにあります。
-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 で統合テストを実行します。SystemTests を SystemTests リポジトリにするには、git クローン行を更新する必要があります。
-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
[Pipelines]、[IM-6] の順にクリックして、実行中のパイプラインを確認します。
プルリクエストを作成する
プル リクエストを作成するには [プル リクエスト]、[プル リクエストを作成] の順にクリックします。プル リクエストが終了したら [Pipelines] をクリックして本番環境のデプロイを確認します。
InvokeLabeller AWS Lambda のリポジトリを作成する
Jira に移動して、Bitbucket に InvokeLabeller リポジトリを追加するための Jira 課題を作成します。Jira 課題 ID を書き留めます。この例では「IM-10」です。
Bitbucket に移動して [作成]、[リポジトリ] の順にクリックします。適切なワークスペースとプロジェクトを選択します。[デフォルトのブランチ名] を mainline に設定します。[リポジトリを作成] をクリックして続行します。
ターミナルで 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 ユーザーに、AdministratorAccess を付与します。個別の AWS アクセス ポリシーを選択することで、よりきめ細かなアクセス コントロールを使用できますが、詳細は自由に設定できます。
デプロイ環境を追加
[デプロイ]、[環境を追加] の順にクリックして、新しい環境を追加します。us-west-1 のテスト環境、us-east-2 のステージング環境、us-west-2、us-east-1、ca-central-1 の 3 つの本番環境があります。
SSH キーを作成
Bitbucket の SubmitImage リポジトリに移動して、[リポジトリ設定]、[SSH キー]、[キーを生成] の順にクリックします。
AWS にデプロイする bitbucket-pipelines.yml
ターミナルの InvokeLabeller リポジトリに移動して、Jira 課題 ID にちなんだ名前のブランチを作成します。
git checkout -b IM-10
次の yaml で bitbucket-pipelines.yml ファイルを作成します。これによって、テスト環境、ステージング環境、本番環境の Bitbucket パイプラインが定義されます。SystemTests を SystemTests リポジトリにするには、git クローン行を更新する必要があります。
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 のすべてのコンポーネントがデプロイされたら、もう一度プッシュしてデプロイ パイプラインを実行します。SystemTests を SystemTests リポジトリにするには、git クローン行を更新する必要があります。
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
[Pipelines]、[IM-10] の順にクリックして、実行中のパイプラインを確認します。
プルリクエストを作成する
プル リクエストを作成するには [プル リクエスト]、[プル リクエストを作成] の順にクリックします。プル リクエストが終了したら [Pipelines] をクリックして本番環境のデプロイを確認します。
システム テスト用のリポジトリを作成する
Jira に移動して、Bitbucket に SystemTests リポジトリを追加するための新しい課題を作成します。課題 ID を書き留めます。この例では「IM-7」です。
Bitbucket に移動して [作成]、[リポジトリ] の順にクリックします。
適切なワークスペースとプロジェクトを選択します。[デフォルトのブランチ名] を mainline に設定します。[リポジトリを作成] をクリックして続行します。
ターミナルで 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 ファイルは必要ありません。他のパイプラインを実行するためのテストを提供するため、独自のパイプラインはありません。SystemTests のリモート URL を書き留めておきましょう。SubmitImage、GetImageLabel、InvokeLabeller CI/CD パイプラインは、テスト ステップ中に SystemTests リポジトリのクローンを作成します。後続のリポジトリの bitbucket-pipelines.yml を正しい URL で更新する必要があります。
SubmitImage、GetImageLabel、InvokeLabeller から SSH キーを追加する
[リポジトリ設定]、[アクセス キー] の順にクリックします。
[キーを追加] をクリックして、SubmitImage、GetImageLabel、または InvokeLabeller からコピーした SSH キーを貼り付けて [SSH キーを追加] をクリックします。
おめでとうございます、これで完了です! ImageLabeller をデプロイできました。次のステップでは、Opsgenie で ImageLabeller の監視をセットアップします。
この記事を共有する
次のトピック
おすすめコンテンツ
次のリソースをブックマークして、DevOps チームのタイプに関する詳細や、アトラシアンの DevOps についての継続的な更新をご覧ください。