記事
チュートリアル
インタラクティブ ガイド
Gitlab で ImageLabeller をデプロイする
Warren Marusiak
シニア テクニカル エバンジェリスト
当社のチームは Jira Software とさまざまな接続ツールを使用してアプリケーションを開発、デプロイ、管理する方法を説明するために、機械学習を使用してイメージにラベルを添付する AWS 上に構築されたシンプルなデモ アプリケーションである ImageLabeller を作成しました。
このページでは、GitLab で ImageLabeller をデプロイする方法について説明します。はじめに、ImageLabeller アーキテクチャ ページと AWS SageMaker のセットアップ ページをお読みの上、背景を確認することをお勧めします。
前提条件
Gitlab グループがまだ作成されていない場合は、この Gitlab ガイドのステップに従って最初からグループを作成してください。
ImageLabeller のコードで公開されている GitHub リポジトリ
Jira Gitlab 統合のデモ ビデオ
Jira と Gitlab を統合する
Jira から [ボード]、[アプリ]、[Gitlab] の順にクリックします。
[Get it now (今すぐ入手する)] をクリックします。
[アプリ]、[アプリを管理] の順にクリックします。
Jira 向け Gitlab を展開します。
[名前スペースを追加] をクリックします。
既存の名前スペースを選択して [リンク] をクリックします。このガイドは、すでに既存の Gitlab アカウントと Gitlab グループを持っていることを前提としています。
Gitlab に SSH キーを追加する
画面の右上にあるプロファイル アイコン、[設定] の順にクリックします。
[SSH Keys] をクリックして、指示に従って新しい SSH キーを生成するか既存の SSH キーを使用します。
AWS S3 インフラストラクチャ リポジトリを作成する
通常、標準開発者ループでは開発者は Jira からタスクを取り出して、それを進行中の作業に移動して開発作業を行います。Jira 課題 ID は、開発作業を Jira 課題に結びつけるキーです。これは、2 つのシステム間の中核となる統合コンポーネントです。
Jira に移動して、AWS S3 インフラストラクチャ リポジトリを Gitlab に追加するための新しい課題を作成します。課題 ID を書き留めます。この例では「IM-5」です。
Gitlab に移動して [新規プロジェクト] をクリックします。
[空白のプロジェクトを作成] をクリックします。
[プロジェクト名] を追加して [プロジェクト URL] から適切なグループを選択します。[プロジェクトを作成] をクリックして続行します。
ターミナルで s3_infra リポジトリに移動して、次のコマンドを実行して AWS CloudFormation template.yml ファイルを Gitlab にプッシュします。
git add --all
git commit -m "IM-5 add s3_infra repository to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/s3_infra.git
git branch -m mainline
git push -u origin mainline
AWS アクセス キーを追加する
[設定]、[CI/CD] の順にクリックします。下にスクロールして [変数] を展開します。[変数を追加] をクリックします。
2 つの変数を作成します。1 つは AWS アクセス キー ID、もう 1 つは AWS シークレット アクセス キー用です。
変数を保護して、保護されたブランチで実行されているパイプラインとタグでのみ使用されるようにします。AWS アクセス キーに関連付けられた IAM ユーザーに、AdministratorAccess を付与します。個々の AWS アクセス ポリシーを選択することで、よりきめ細かなアクセス コントロールを使用できます。
保護された変数にアクセスするための保護されたブランチを設定する
[設定]、[リポジトリ] の順にクリックします。下にスクロールして [保護されたブランチ] を展開します。
Jira 課題 ID のプレフィックスと * を入力します。
Jira 課題 ID は、この例では IM-5 と IM-6 と同様で、プレフィックスは IM- です。
IM-* と入力して [保護] をクリックします。
メインラインと、IM-* が保護されたブランチとして表示されます。
デプロイ環境を設定する
[デプロイ]、[環境] の順にクリックします。[新しい環境] をクリックして、新しい環境を追加します。この例では、US-WEST-1、US-EAST-2 にテスト環境、US-WEST-2、US-EAST-1、CA-CENTRAL-1 に本番環境があります。
AWS にデプロイするための .gitlab-ci.yml
ターミナルの s3_infra リポジトリに移動して、Jira 課題 ID にちなんだ名前のブランチを作成します。
git checkout -b IM-5
次の yaml で .gitlab-ci.yml ファイルを作成します。これによって、テスト、ステージング、本番環境のデプロイ ワークフローが定義されます。
stages:
- merge-request
- test-us-west-1
- test-us-east-2
- production-us-west-2
- production-us-east-1
- production-ca-central-1
merge-request-pipeline-job:
stage: merge-request
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- echo "This pipeline always succeeds and enables merges during merge requests"
- echo true
deploy-test-us-west-1:
stage: test-us-west-1
environment: test-us-west-1
rules:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- aws cloudformation deploy --region us-west-1 --template-file template.yml --stack-name OpenDevOpsS3Infra
deploy-test-us-east-2:
stage: test-us-east-2
environment: test-us-east-2
rules:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- aws cloudformation deploy --region us-east-2 --template-file template.yml --stack-name OpenDevOpsS3Infra
deploy-production-us-west-2:
stage: production-us-west-2
environment: production-us-west-2
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- aws cloudformation deploy --region us-west-2 --template-file template.yml --stack-name OpenDevOpsS3Infra
deploy-production-us-east-1:
stage: production-us-east-1
environment: production-us-east-1
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- aws cloudformation deploy --region us-east-1 --template-file template.yml --stack-name OpenDevOpsS3Infra
deploy-production-ca-central-1:
stage: production-ca-central-1
environment: production-ca-central-1
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- aws cloudformation deploy --region ca-central-1 --template-file template.yml --stack-name OpenDevOpsS3Infra
.gitlab-ci.yml ファイルを理解する
ステージ
ステージ ブロックを追加して、Gitlab パイプラインの実行順序を定義します。ステージは、ステージブロックで定義されている順序で実行されます。ステージに関連付けられたジョブは、並行して実行されます。
stages:
- merge-request
- test-us-west-1
- test-us-east-2
- production-us-west-2
- production-us-east-1
- production-ca-central-1
ジョブ
ジョブはステージと環境に関連付けられます。ルールは特定のジョブを実行するかどうかを制御します。この例のルールは、パイプライン ブランチがデフォルト ブランチではないかどうか、パイプラインがマージ リクエストの一部として自動で実行されていないかどうかをチェックします。
ジョブごとに異なるイメージを指定できます。ジョブ スクリプトに必要なツールを使用して、イメージを設定できます。script セクションでは、ジョブの実行時に実行される一連のステップを定義します。
deploy-test-us-west-1:
stage: test-us-west-1
environment: test-us-west-1
rules:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- aws cloudformation deploy --region us-west-1 --template-file template.yml --stack-name OpenDevOpsS3Infra
リクエスト パイプラインをマージする
マージ リクエストが承認されると、パイプラインは Gitlab によって自動で実行されます。ルールを追加することで、このパイプラインのジョブを作成できます。この例では、ジョブは常に成功します。
merge-request-pipeline-job:
stage: merge-request
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- echo "This pipeline always succeeds and enables merges during merge requests"
- echo true
フィーチャー ブランチにプッシュ
コマンド ラインから次のコマンドを実行して、s3_infra リポジトリの IM-5 ブランチに変更をプッシュします。Jira 課題 ID とブランチ名をコミット メッセージに含めて、プロジェクトで何が起こっているかを Jira Gitlab 統合で追跡できるようにします。
git add --all
git commit -m "IM-5 add .gitlab-ci.yml to s3_infra"
git push -u origin IM-5
[CI/CD]、[Pipelines] の順にクリックして、パイプラインの実行を確認します。
実行中のパイプラインのパイプライン ID をクリックします。
ジョブをクリックして、詳細を表示します。
マージ リクエストを作成する
マージ リクエストを作成するには [マージ リクエスト]、[マージ リクエストを作成] の順にクリックします。
フィーチャー ブランチをソース ブランチとして選択して [ブランチを比較して続行] をクリックします。
担当者とレビュアーを選択します。
[マージ リクエストを作成] をクリックします。
コードの変更を確認して [承認] をクリックします。
[CI/CI]、[Pipelines] の順にクリックして、マージ リクエスト パイプラインの実行を確認します。
パイプライン ID をクリックします。merge-request-pipeline-job だけが実行されていることにご注意ください。
[マージ リクエスト] をクリックしてマージ リクエストに戻り、アクティブなマージ リクエスト、[マージ] の順にクリックします。これによって、別のパイプラインが開始されます。
[CI/CD]、[Pipelines] の順にクリックします。パイプライン ID をクリックします。
SystemTests のリポジトリを作成する
Jira に移動して、Gitlab に SystemTests リポジトリを追加するための Jira 課題を作成します。Jira 課題 ID を書き留めます。この例では「IM-7」です。
[プロジェクト名] を追加して [プロジェクト URL] から適切なグループを選択します。[プロジェクトを作成] をクリックして続行します。
ターミナルで SystemTests リポジトリに移動して、次のコマンドを実行してコードを Gitlab にプッシュします。
git add --all
git commit -m "IM-7 add SystemTests repository to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/systemtests.git
git branch -m mainline
git push -u origin mainline
SystemTests リポジトリに .gitlab-ci.yml ファイルは必要ありません。他のパイプラインを実行するためのテストを提供するため、独自のパイプラインはありません。SystemTests のリモート URL を書き留めておきましょう。SubmitImage、GetImageLabel、InvokeLabeller CI/CD パイプラインは、テスト ステップ中に SystemTests リポジトリのクローンを作成します。後続のリポジトリの gitlab-ci.yml を正しい URL で更新する必要があります。
デプロイ トークンを追加する
他のパイプラインの実行中にこのリポジトリを複製するには、デプロイ トークンを追加する必要があります。[設定]、[リポジトリ] の順にクリックします。下にスクロールして [デプロイ トークン] を展開します。
名前を入力して [read_repository] を選択し、[デプロイ トークンを作成] をクリックします。
デプロイ トークンのユーザー名は自動生成されます。デプロイ トークンのパスワードは作成時に 1 回だけ提供されます。シークレット管理ツールに追加して、後で参照できるようにしてください。このガイドの後半では、デプロイ トークンのユーザー名は gitlab_deploy_token として、デプロイ トークンのパスワードは gitlab_deploy_password として参照されます。
SubmitImage AWS Lambda 用のリポジトリを作成する
Jira に移動して、SubmitImage AWS Lambda リポジトリを Gitlab に追加するための新しい課題を作成します。課題 ID を書き留めます。この例では「IM-8」です。
Gitlab に移動して [新規プロジェクト]、[空白のプロジェクトを作成] の順にクリックします。[プロジェクト名] を追加して [プロジェクト URL] から適切なグループを選択します。[プロジェクトを作成] をクリックして続行します。
ターミナルで SubmitImage リポジトリに移動して、次のコマンドを実行してコードを Gitlab にプッシュします。
git add --all
git commit -m "IM-8 add SubmitImage to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/submitimage.git
git branch -m mainline
git push -u origin mainline
AWS アクセス キーを追加、保護されたブランチを設定、デプロイ環境をセットアップする必要があります。
次に、SystemTests リポジトリからデプロイ キーを追加して、SubmitImage Gitlab パイプラインをダウンロードして SystemTests を実行できるようにします。
最後に、AWS アカウント ID を CI/CD 変数として追加します。
AWS にデプロイするための .gitlab-ci.yml
ターミナルの SubmitImage リポジトリに移動して、Jira 課題 ID にちなんだ名前のブランチを作成します。
git checkout -b IM-8
次の yaml で .gitlab-ci.yml ファイルを作成します。これによって、テスト環境、ステージング環境、本番環境のデプロイ ワークフローが定義されます。SystemTests を SystemTests リポジトリにするには、git クローン行を更新する必要があります。
stages:
- merge-request
- run-unit-tests
#US-WEST-1
- deploy-us-west-1
- test-us-west-1
#US-EAST-2
- deploy-us-east-2
- test-us-east-2
#US-WEST-2
- deploy-us-west-2
- test-us-west-2
#US-EAST-1
- deploy-us-east-1
- test-us-east-1
#CA-CENTRAL-1
- deploy-ca-central-1
- test-ca-central-1
merge-request-pipeline-job:
stage: merge-request
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- echo "This pipeline always succeeds and enables merge"
- echo true
run-unit-tests:
stage: run-unit-tests
image: golang:buster
rules:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
script:
- cd submitImage
- go test ./opendevopslambda/...
#US-WEST-1
deploy-us-west-1:
stage: deploy-us-west-1
environment: test-us-west-1
image: python:latest
rules:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
before_script:
- pip3 install awscli --upgrade
- pip3 install aws-sam-cli --upgrade
- wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
- rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- sam build
- sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
- sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset
#test-us-west-1:
# stage: test-us-west-1
# environment: test-us-west-1
# image: golang:buster
# rules:
# - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
# script:
# - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
# - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
# - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
# - cd systemtests
# - go test -v ./... -aws_region=us-west-1
#US-EAST-2
deploy-us-east-2:
stage: deploy-us-east-2
environment: test-us-east-2
image: python:latest
rules:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
before_script:
- pip3 install awscli --upgrade
- pip3 install aws-sam-cli --upgrade
- wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
- rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- sam build
- sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
- sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-2 --no-fail-on-empty-changeset
#test-us-east-2:
# stage: test-us-east-2
# environment: test-us-east-2
# image: golang:buster
# rules:
# - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
# script:
# - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
# - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
# - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
# - cd systemtests
# - go test -v ./... -aws_region=us-east-2
#US-WEST-2
deploy-us-west-2:
stage: deploy-us-west-2
environment: production-us-west-2
image: python:latest
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
before_script:
- pip3 install awscli --upgrade
- pip3 install aws-sam-cli --upgrade
- wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
- rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- sam build
- sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
- sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-2 --no-fail-on-empty-changeset
#test-us-west-2:
# stage: test-us-west-2
# environment: production-us-west-2
# image: golang:buster
# rules:
# - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
# script:
# - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
# - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
# - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
# - cd systemtests
# - go test -v ./... -aws_region=us-west-2
#US-EAST-1
deploy-us-east-1:
stage: deploy-us-east-1
environment: production-us-east-1
image: python:latest
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
before_script:
- pip3 install awscli --upgrade
- pip3 install aws-sam-cli --upgrade
- wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
- rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- sam build
- sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
- sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-1 --no-fail-on-empty-changeset
#test-us-east-1:
# stage: test-us-east-1
# environment: production-us-east-1
# image: golang:buster
# rules:
# - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
# script:
# - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
# - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
# - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
# - cd systemtests
# - go test -v ./... -aws_region=us-east-1
#CA-CENTRAL-1
deploy-central-1:
stage: deploy-ca-central-1
environment: production-ca-central-1
image: python:latest
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
before_script:
- pip3 install awscli --upgrade
- pip3 install aws-sam-cli --upgrade
- wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
- rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- sam build
- sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
- sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region ca-central-1 --no-fail-on-empty-changeset
#test-central-1:
# stage: test-ca-central-1
# environment: production-ca-central-1
# image: golang:buster
# rules:
# - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
# script:
# - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
# - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
# - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
# - cd systemtests
# - go test -v ./... -aws_region=ca-central-1
統合テストの実行は、現時点でコメント アウトされています。システム テストは、アプリ全体がデプロイされた場合にのみ合格します。リポジトリの統合テスト ステップのコメントを解除して、ImageLabeller のすべてのコンポーネントがデプロイされたら、もう一度プッシュしてデプロイ パイプラインを実行します。SystemTests を SystemTests リポジトリにするには、git クローン行を更新する必要があります。
.gitlab-ci.yml ファイルを理解する
このステップでは、SubmitImage リポジトリの一部であるユニット テストを実行します。
unit-test-us-west-1:
stage: unit-test-us-west-1
environment: test-us-west-1
image: golang:buster
rules:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
script:
- cd submitImage
- go test ./opendevopslambda/...
このステップでは、AWS SAM を使用して SubmitImage AWS Lambda をデプロイします。before_script セクションにご注目ください。script セクションの前にこのステップを実行して、依存関係のインストールや各種ツールのセットアップに使用できます。
deploy-us-west-1:
stage: deploy-us-west-1
environment: test-us-west-1
image: python:latest
rules:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
before_script:
- pip3 install awscli --upgrade
- pip3 install aws-sam-cli --upgrade
- wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
- rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- sam build
- sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
- sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset
このステップでは、SystemTests リポジトリで統合テストをダウンロードし、実行します。SystemTests を SystemTests リポジトリにするには、git クローン行を更新する必要があります。
test-us-west-1:
stage: test-us-west-1
environment: test-us-west-1
image: golang:buster
rules:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-west-1
前に作成したデプロイ トークンは、git clone 行で参照されます。
- git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
フィーチャー ブランチにプッシュ
コマンド ラインから次のコマンドを実行して、SubmitImage リポジトリの IM-8 ブランチに変更をプッシュします。Jira 課題 ID とブランチ名をコミット メッセージに含めて、プロジェクトで何が起こっているかを Jira Gitlab 統合で追跡できるようにします。
git add --all
git commit -m "IM-8 add .gitlab-ci.yml to SubmitImage"
git push -u origin IM-8
[CI/CD]、[Pipelines] の順にクリックして、パイプラインの実行を確認します。
マージ リクエストを作成する
GitLab がテスト環境にデプロイした後、本番環境にデプロイするためのマージ リクエストを作成します。IM-8 ブランチを選択します。
[CI/CD]、[Pipelines] の順にクリックして、実行中のマージ リクエスト パイプラインを確認します。
マージ リクエスト パイプラインの完了後、変更をメインラインにマージします。[CI/CD]、[Pipelines] の順にクリックして、実行中の本番パイプラインを確認します。
InvokeLabeller AWS Lambda のリポジトリを作成する
Jira に移動して、InvokeLabeller AWS Lambda リポジトリを Gitlab に追加するための新しい課題を作成します。課題 ID を書き留めます。この例では「IM-10」です。
Gitlab に移動して [新規プロジェクト]、[空白のプロジェクトを作成] の順にクリックします。[プロジェクト名] を追加して [プロジェクト URL] から適切なグループを選択します。[プロジェクトを作成] をクリックして続行します。
ターミナルで InvokeLabeller リポジトリに移動して、次のコマンドを実行してコードを Gitlab にプッシュします。
git add --all
git commit -m "IM-10 add InvokeLabeller to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/invokelabeller.git
git branch -m mainline
git push -u origin mainline
AWS アクセス キーを追加、保護されたブランチを設定、デプロイ環境をセットアップする必要があります。
次に、SystemTests リポジトリからデプロイ キーを追加して、InvokeLabeller Gitlab パイプラインをダウンロードして SystemTests を実行できるようにします。
最後に、AWS アカウント ID を CI/CD 変数として追加します。
AWS にデプロイするための .gitlab-ci.yml
ターミナルの InvokeLabeller リポジトリに移動して、Jira 課題 ID にちなんだ名前のブランチを作成します。
git checkout -b IM-10
次の yaml で .gitlab-ci.yml ファイルを作成します。これによって、テスト環境、ステージング環境、本番環境のデプロイ ワークフローが定義されます。SystemTests を SystemTests リポジトリにするには、git クローン行を更新する必要があります。
stages:
- merge-request
- run-unit-tests
#US-WEST-1
- deploy-us-west-1
- test-us-west-1
#US-EAST-2
- deploy-us-east-2
- test-us-east-2
#US-WEST-2
- deploy-us-west-2
- test-us-west-2
#US-EAST-1
- deploy-us-east-1
- test-us-east-1
#CA-CENTRAL-1
- deploy-ca-central-1
- test-ca-central-1
merge-request-pipeline-job:
stage: merge-request
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- echo "This pipeline always succeeds and enables merge"
- echo true
run-unit-tests:
stage: run-unit-tests
image: python:3.8-buster
rules:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
before_script:
- pip3 install pytest
- pip3 install moto
- pip3 install -r tst/requirements.txt --user
script:
- python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml
#US-WEST-1
deploy-us-west-1:
stage: deploy-us-west-1
environment: test-us-west-1
image: python:3.8-buster
rules:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
before_script:
- pip3 install awscli --upgrade
- pip3 install aws-sam-cli --upgrade
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- sam build
- sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
- sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset
#test-us-west-1:
# stage: test-us-west-1
# environment: test-us-west-1
# image: golang:buster
# rules:
# - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
# script:
# - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
# - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
# - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
# - cd systemtests
# - go test -v ./... -aws_region=us-west-1
#US-EAST-2
deploy-us-east-2:
stage: deploy-us-east-2
environment: test-us-east-2
image: python:3.8-buster
rules:
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
before_script:
- pip3 install awscli --upgrade
- pip3 install aws-sam-cli --upgrade
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- sam build
- sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
- sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-2 --no-fail-on-empty-changeset
#test-us-east-2:
# stage: test-us-east-2
# environment: test-us-east-2
# image: golang:buster
# rules:
# - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
# script:
# - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
# - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
# - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
# - cd systemtests
# - go test -v ./... -aws_region=us-east-2
#US-WEST-2
deploy-us-west-2:
stage: deploy-us-west-2
environment: production-us-west-2
image: python:3.8-buster
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
before_script:
- pip3 install awscli --upgrade
- pip3 install aws-sam-cli --upgrade
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- sam build
- sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
- sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-2 --no-fail-on-empty-changeset
#test-us-west-2:
# stage: test-us-west-2
# environment: production-us-west-2
# image: golang:buster
# rules:
# - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
# script:
# - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
# - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
# - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
# - cd systemtests
# - go test -v ./... -aws_region=us-west-2
#US-EAST-1
deploy-us-east-1:
stage: deploy-us-east-1
environment: production-us-east-1
image: python:3.8-buster
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
before_script:
- pip3 install awscli --upgrade
- pip3 install aws-sam-cli --upgrade
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- sam build
- sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
- sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-1 --no-fail-on-empty-changeset
#test-us-east-1:
# stage: test-us-east-1
# environment: production-us-east-1
# image: golang:buster
# rules:
# - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
# script:
# - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
# - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
# - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
# - cd systemtests
# - go test -v ./... -aws_region=us-east-1
#CA-CENTRAL-1
deploy-central-1:
stage: deploy-ca-central-1
environment: production-ca-central-1
image: python:3.8-buster
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
before_script:
- pip3 install awscli --upgrade
- pip3 install aws-sam-cli --upgrade
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
- sam build
- sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
- sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region ca-central-1 --no-fail-on-empty-changeset
#test-central-1:
# stage: test-ca-central-1
# environment: production-ca-central-1
# image: golang:buster
# rules:
# - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
# script:
# - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
# - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
# - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
# - cd systemtests
# - go test -v ./... -aws_region=ca-central-1
統合テストの実行は、現時点でコメント アウトされています。システム テストは、アプリ全体がデプロイされた場合にのみ合格します。リポジトリの統合テスト ステップのコメントを解除して、ImageLabeller のすべてのコンポーネントがデプロイされたら、もう一度プッシュしてデプロイ パイプラインを実行します。SystemTests を SystemTests リポジトリにするには、git クローン行を更新する必要があります。
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 ブランチに変更をプッシュします。Jira 課題 ID とブランチ名をコミット メッセージに含めて、プロジェクトで何が起こっているかを Jira Gitlab 統合で追跡できるようにします。
git add --all
git commit -m "IM-10 add .gitlab-ci.yml to InvokeLabeller"
git push -u origin IM-10
[CI/CD]、[Pipelines] の順にクリックして、パイプラインの実行を確認します。
マージ リクエストを作成する
GitLab がテスト環境にデプロイした後、本番環境にデプロイするためのマージ リクエストを作成します。IM-10 ブランチを選択します。
マージ リクエスト パイプラインの完了後、変更をメインラインにマージします。[CI/CD]、[Pipelines] の順にクリックして、実行中の本番パイプラインを確認します。
おめでとうございます、これで完了です! ImageLabeller をデプロイできました。次のステップでは、Opsgenie で ImageLabeller の監視をセットアップします。
この記事を共有する
次のトピック
おすすめコンテンツ
次のリソースをブックマークして、DevOps チームのタイプに関する詳細や、アトラシアンの DevOps についての継続的な更新をご覧ください。