Gitlab で ImageLabeller をデプロイする

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

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

前提条件

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

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

https://github.com/AtlassianOpenDevOpsGuides

Jira と Gitlab を統合する

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

Jira のアプリ メニューで「Gitlab」がハイライトされたスクリーンショット

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

Jira にある Gitlab アプリの概要のスクリーンショット

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

Jira のドロップダウンで「アプリを管理」がハイライトされたスクリーンショット

Jira 向け Gitlab を展開します。

「Jira 向け Gitlab」を展開したスクリーンショット

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

Jira における Gitlab 設定のスクリーンショット

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

Gitlab リンク名前スペース モーダルのスクリーンショット

Gitlab に SSH キーを追加する

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

Gitlab リポジトリのドロップダウンで「設定」がハイライトされているスクリーンショット

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

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

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

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

Gitlab に s3_infra リポジトリを追加するための Jira 課題を作成するスクリーンショット

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

Gitlab のプロジェクト ダッシュボードのスクリーンショット

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

Gitlab の新しいプロジェクトを作成するオプションのスクリーンショット

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

Gitlab の新しいプロジェクト詳細フォームのスクリーンショット

ターミナルで s3_infra リポジトリに移動して、次のコマンドを実行して AWS CloudFormation template.yml ファイルを Gitlab にプッシュします。

1 2 3 4 5 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 アクセス キーに関連付けられた IAM ユーザーに AdministratorAccess を付与します。個々の AWS アクセス ポリシーを選択することで、よりきめ細かなアクセス コントロールを使用できます。

Gitlab のその他のアクセス制御オプションのスクリーンショット

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

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

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 にちなんだ名前のブランチを作成します。

1 git checkout -b IM-5

次の yaml で .gitlab-ci.yml ファイルを作成します。これによって、テスト、ステージング、本番環境のデプロイ ワークフローが定義されます。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 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 us-east-2 --template-file template.yml --stack-name OpenDevOpsS3Infra

.gitlab-ci.yml ファイルを理解する

ステージ

ステージ ブロックを追加して、Gitlab パイプラインの実行順序を定義します。ステージは、ステージブロックで定義されている順序で実行されます。ステージに関連付けられたジョブは、並行して実行されます。

1 2 3 4 5 6 7 stages: - merge-request - test-us-west-1 - test-us-east-2 - production-us-west-2 - production-us-east-1 - production-ca-central-1

ジョブ

ジョブはステージ環境に関連付けられます。ルールは特定のジョブを実行するかどうかを制御します。この例のルールは、パイプライン ブランチがデフォルト ブランチではないかどうか、パイプラインがマージ リクエストの一部として自動で実行されていないかどうかをチェックします。

ジョブごとに異なるイメージを指定できます。ジョブ スクリプトに必要なツールを使用して、イメージを設定できます。script セクションでは、ジョブの実行時に実行される一連のステップを定義します。

1 2 3 4 5 6 7 8 9 10 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 によって自動で実行されます。ルールを追加することで、このパイプラインのジョブを作成できます。この例では、ジョブは常に成功します。

1 2 3 4 5 6 7 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 統合で追跡できるようにします。

1 2 3 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 で実行中のパイプラインのスクリーンショット

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

Gitlab のパイプライン ID のスクリーンショット

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

Gitlab のパイプライン詳細のスクリーンショット

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

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

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

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

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

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

Gitlab でマージ リクエストの担当者を選択するスクリーンショット

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

Gitlab の完成したマージ リクエスト フォームのスクリーンショット

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

Gitlab でマージ リクエストを確認するスクリーンショット

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

Gitlab で実行されるパイプラインのスクリーンショット

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

Gitlab で実行されるパイプラインのスクリーンショット

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

Gitlab のプル リクエストのスクリーンショット

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

Gitlab のパイプライン ID のスクリーンショット

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

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

Gitlab でリポジトリを作成するための Jira 課題を追加するスクリーンショット

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

Gitlab のプロジェクトの「システム テスト」の作成のスクリーンショット

ターミナルで SystemTests リポジトリに移動して、次のコマンドを実行してコードを Gitlab にプッシュします。

1 2 3 4 5 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 ファイルは不要です。他のパイプラインを実行するためのテストを提供するため、独自のパイプラインはありません。

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

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

Gitlab のトークン デプロイ ページのスクリーンショット

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

Gitlab のデプロイ トークン作成モーダルのスクリーンショット

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

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

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

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

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

ターミナルで SubmitImage リポジトリに移動して、次のコマンドを実行してコードを Gitlab にプッシュします。

1 2 3 4 5 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 にちなんだ名前のブランチを作成します。

1 git checkout -b IM-8

次の yaml で .gitlab-ci.yml ファイルを作成します。これによって、テスト、ステージング、本番環境のデプロイ ワークフローが定義されます。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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 のすべてのコンポーネントがデプロイされたら、もう一度プッシュしてデプロイ パイプラインを実行します。

.gitlab-ci.yml ファイルを理解する

このステップでは、SubmitImage リポジトリの一部であるユニット テストを実行します。

1 2 3 4 5 6 7 8 9 unit-test-us-west-1: stage: unit-test-us-west-1 environment: 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 セクションの前にこのステップを実行して、依存関係のインストールや各種ツールのセットアップに使用できます。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 deploy-us-west-1: stage: deploy-us-west-1 environment: 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 リポジトリにダウンロードして実行します。

1 2 3 4 5 6 7 8 9 10 11 12 test-us-west-1: stage: test-us-west-1 environment: 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 行で参照されます。

1 - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git

フィーチャー ブランチにプッシュ

コマンド ラインから次のコマンドを実行して、SubmitImage リポジトリの IM-8 ブランチに変更をプッシュします。Jira 課題 ID とブランチ名をコミット メッセージに含めて、プロジェクトで何が起こっているかを Jira Gitlab 統合で追跡できるようにします。

1 2 3 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 にプッシュします。

1 2 3 4 5 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 にちなんだ名前のブランチを作成します。

1 git checkout -b IM-10

次の yaml で .gitlab-ci.yml ファイルを作成します。これによって、テスト、ステージング、本番環境のデプロイ ワークフローが定義されます。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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 のすべてのコンポーネントがデプロイされたら、もう一度プッシュしてデプロイ パイプラインを実行します。

フィーチャー ブランチにプッシュ

コマンド ラインから次のコマンドを実行して、InvokeLabeller リポジトリの IM-10 ブランチに変更をプッシュします。Jira 課題 ID とブランチ名をコミット メッセージに含めて、プロジェクトで何が起こっているかを Jira Gitlab 統合で追跡できるようにします。

1 2 3 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 の監視をセットアップします。

 

最終更新日 2021年09月24日)
次でキャッシュ 2:33 AM on Oct 19, 2021 |

その他のヘルプ