Close

Gitlab で ImageLabeller をデプロイする

Warren Marusiak の顔写真
Warren Marusiak

シニア テクニカル エバンジェリスト

当社のチームは Jira Software とさまざまな接続ツールを使用してアプリケーションを開発、デプロイ、管理する方法を説明するために、機械学習を使用してイメージにラベルを添付する AWS 上に構築されたシンプルなデモ アプリケーションである ImageLabeller を作成しました。

このページでは、GitLab で ImageLabeller をデプロイする方法について説明します。はじめに、ImageLabeller アーキテクチャ ページと AWS SageMaker のセットアップ ページをお読みの上、背景を確認することをお勧めします。

前提条件

Gitlab グループがまだ作成されていない場合は、この Gitlab ガイドのステップに従って最初からグループを作成してください。

ImageLabeller のコードで公開されている GitHub リポジトリ

https://github.com/AtlassianOpenDevOpsGuides

Jira Gitlab 統合のデモ ビデオ

Jira と Gitlab を統合する

Jira から [ボード]、[アプリ]、[Gitlab] の順にクリックします。

GitLab に移動するための Jira Software のドロップダウン メニューのスクリーンショット

[Get it now (今すぐ入手する)] をクリックします。

Jira Software の GitLab アプリ モーダル

[アプリ]、[アプリを管理] の順にクリックします。

Jira Software の GitLab アプリ モーダルとドロップダウン メニュー

Jira 向け Gitlab を展開します。

Jira Software の [アプリの管理] 画面で GitLab を拡張する

[名前スペースを追加] をクリックします。

GitLab Jira Software の構成に名前空間を追加する画面

既存の名前スペースを選択して [リンク] をクリックします。このガイドは、すでに既存の Gitlab アカウントと Gitlab グループを持っていることを前提としています。

Jira Software の GitLab 名前スペースをリンクする

Gitlab に SSH キーを追加する

画面の右上にあるプロファイル アイコン、[設定] の順にクリックします。

GitLab のドロップダウン メニューを使用して設定に移動する

[SSH Keys] をクリックして、指示に従って新しい SSH キーを生成する既存の SSH キーを使用します

AWS S3 インフラストラクチャ リポジトリを作成する

通常、標準開発者ループでは開発者は Jira からタスクを取り出して、それを進行中の作業に移動して開発作業を行います。Jira 課題 ID は、開発作業を Jira 課題に結びつけるキーです。これは、2 つのシステム間の中核となる統合コンポーネントです。

Jira に移動して、AWS S3 インフラストラクチャ リポジトリを Gitlab に追加するための新しい課題を作成します。課題 ID を書き留めます。この例では「IM-5」です。

Jira Software でのボードの新しい課題の作成

Gitlab に移動して [新規プロジェクト] をクリックします。

GitLab で「新規プロジェクト」の作成に移動

[空白のプロジェクトを作成] をクリックします。

GitLab での新規プロジェクトの作成

[プロジェクト名] を追加して [プロジェクト URL] から適切なグループを選択します。[プロジェクトを作成] をクリックして続行します。

新規プロジェクトの作成: GitLab の詳細画面

ターミナルで 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] の順にクリックします。下にスクロールして [変数] を展開します。[変数を追加] をクリックします。

GitLab の CI/CD 設定ページ

2 つの変数を作成します。1 つは AWS アクセス キー ID、もう 1 つは AWS シークレット アクセス キー用です。

「変数を追加」モーダルで、GitLab に AWS キーを追加する

変数を保護して、保護されたブランチで実行されているパイプラインとタグでのみ使用されるようにします。AWS アクセス キーに関連付けられた IAM ユーザーに、AdministratorAccess を付与します。個々の AWS アクセス ポリシーを選択することで、よりきめ細かなアクセス コントロールを使用できます。

GitLab の CI/CD 設定ページの「変数」セクションにリストされている AWS キー

保護された変数にアクセスするための保護されたブランチを設定する

[設定]、[リポジトリ] の順にクリックします。下にスクロールして [保護されたブランチ] を展開します。

Jira 課題 ID のプレフィックスと * を入力します。

Jira 課題 ID は、この例では IM-5 と IM-6 と同様で、プレフィックスは IM- です。

IM-* と入力して [保護] をクリックします。

GitLab での保護されたブランチの設定

メインラインと、IM-* が保護されたブランチとして表示されます。

デプロイ環境を設定する

[デプロイ]、[環境] の順にクリックします。[新しい環境] をクリックして、新しい環境を追加します。この例では、US-WEST-1、US-EAST-2 にテスト環境、US-WEST-2、US-EAST-1、CA-CENTRAL-1 に本番環境があります。

GitLab でのデプロイ環境の設定

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] の順にクリックして、パイプラインの実行を確認します。

GitLab の CI/CD パイプラインの画面

実行中のパイプラインのパイプライン ID をクリックします。

GitLab で実行中のパイプラインのパイプライン ID

ジョブをクリックして、詳細を表示します。

GitLab で実行中のパイプラインのジョブ詳細を示す画面

マージ リクエストを作成する

マージ リクエストを作成するには [マージ リクエスト]、[マージ リクエストを作成] の順にクリックします。

GitLab のマージ リクエスト画面

フィーチャー ブランチをソース ブランチとして選択して [ブランチを比較して続行] をクリックします。

GitLab でのソース ブランチとターゲット ブランチの比較

担当者レビュアーを選択します。

GitLab でのマージ リクエストのレビュアーの選択

[マージ リクエストを作成] をクリックします。

GitLab での「マージ リクエストを作成」ボタンの選択

コードの変更を確認して [承認] をクリックします。

GitLab で変更を確認できるマージ リクエスト詳細画面

[CI/CI]、[Pipelines] の順にクリックして、マージ リクエスト パイプラインの実行を確認します。

GitLab の「Pipelines」画面に移動して、実行されたマージ リクエストを確認

パイプライン ID をクリックします。merge-request-pipeline-job だけが実行されていることにご注意ください。

GitLab で merge-request-pipeline-job のみが実行されたことを示す「パイプライン」詳細ページ

[マージ リクエスト] をクリックしてマージ リクエストに戻り、アクティブなマージ リクエスト、[マージ] の順にクリックします。これによって、別のパイプラインが開始されます。

GitLab でのアクティブなマージ リクエストのマージ

[CI/CD]、[Pipelines] の順にクリックします。パイプライン ID をクリックします。

「ブランチ "IM -5" を "mainline" にマージする」と表示されている GitLab のパイプライン詳細ページ

SystemTests のリポジトリを作成する

Jira に移動して、Gitlab に SystemTests リポジトリを追加するための Jira 課題を作成します。Jira 課題 ID を書き留めます。この例では「IM-7」です。

Jira Software で課題を作成して、「SubmitImage AWS Lambda の GitLab リポジトリを追加」

[プロジェクト名] を追加して [プロジェクト URL] から適切なグループを選択します。[プロジェクトを作成] をクリックして続行します。

GitLab での新規プロジェクトの作成時にプロジェクトの詳細を入力

ターミナルで 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 で更新する必要があります。

デプロイ トークンを追加する

他のパイプラインの実行中にこのリポジトリを複製するには、デプロイ トークンを追加する必要があります。[設定]、[リポジトリ] の順にクリックします。下にスクロールして [デプロイ トークン] を展開します。

GitLab の [デプロイ トークン] に「cloneMe」というサンプル名を入力

名前を入力して [read_repository] を選択し、[デプロイ トークンを作成] をクリックします。

GitLab の「デプロイ トークン」設定ページで「read_repository」チェックボックスを選択

デプロイ トークンのユーザー名は自動生成されます。デプロイ トークンのパスワードは作成時に 1 回だけ提供されます。シークレット管理ツールに追加して、後で参照できるようにしてください。このガイドの後半では、デプロイ トークンのユーザー名は gitlab_deploy_token として、デプロイ トークンのパスワードは gitlab_deploy_password として参照されます。

デプロイ トークンのユーザー名とパスワードが表示されている、GitLab のデプロイ トークン画面

SubmitImage AWS Lambda 用のリポジトリを作成する

Jira に移動して、SubmitImage AWS Lambda リポジトリを Gitlab に追加するための新しい課題を作成します。課題 ID を書き留めます。この例では「IM-8」です。

Jira Software の Imagelabeller ボード: "IM-8 で SubmitImage AWS Lambda の GitLab リポジトリを追加する" という課題を強調表示

Gitlab に移動して [新規プロジェクト]、[空白のプロジェクトを作成] の順にクリックします。[プロジェクト名] を追加して [プロジェクト URL] から適切なグループを選択します。[プロジェクトを作成] をクリックして続行します。

Gitlab で新規プロジェクトの「submitimage」を作成したスクリーンショット

ターミナルで 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 変数として追加します。

Gitlab の変数画面のスクリーンショット

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 で実行されるパイプラインのスクリーンショット

マージ リクエストを作成する

GitLab がテスト環境にデプロイした後、本番環境にデプロイするためのマージ リクエストを作成します。IM-8 ブランチを選択します。

Gitlab のマージ リクエストのスクリーンショット

[CI/CD]、[Pipelines] の順にクリックして、実行中のマージ リクエスト パイプラインを確認します。

Gitlab のマージ リクエストを実行するスクリーンショット

マージ リクエスト パイプラインの完了後、変更をメインラインにマージします。[CI/CD]、[Pipelines] の順にクリックして、実行中の本番パイプラインを確認します。

Gitlab で本番パイプラインを実行するスクリーンショット

InvokeLabeller AWS Lambda のリポジトリを作成する

Jira に移動して、InvokeLabeller AWS Lambda リポジトリを Gitlab に追加するための新しい課題を作成します。課題 ID を書き留めます。この例では「IM-10」です。

Gitlab でリポジトリ「invokelabeller」を作成する Jira 課題のスクリーンショット

Gitlab に移動して [新規プロジェクト]、[空白のプロジェクトを作成] の順にクリックします。[プロジェクト名] を追加して [プロジェクト URL] から適切なグループを選択します。[プロジェクトを作成] をクリックして続行します。

Gitlab で新しいプロジェクト「invokelabeller」を作成するスクリーンショット

ターミナルで 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 変数として追加します。

Gitlab の変数ページのスクリーンショット

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 で実行しているパイプラインのスクリーンショット

マージ リクエストを作成する

GitLab がテスト環境にデプロイした後、本番環境にデプロイするためのマージ リクエストを作成します。IM-10 ブランチを選択します。

Gitlab のマージ リクエストを作成しているスクリーンショット

マージ リクエスト パイプラインの完了後、変更をメインラインにマージします。[CI/CD]、[Pipelines] の順にクリックして、実行中の本番パイプラインを確認します。

Gitlab で本番パイプラインを実行するスクリーンショット

おめでとうございます、これで完了です! 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 チームのタイプに関する詳細や、アトラシアンの DevOps についての継続的な更新をご覧ください。

DevOps のイラスト

DevOps コミュニティ

DevOps のイラスト

DevOps ラーニング パス

マップのイラスト

無料で始める

DevOps ニュースレター購読

Thank you for signing up