タグベースのmonorepoのdocker画像をビルド

マイチーム採用monorepo 我々のバックエンドのマイクロサービスのために、私たちはDockerイメージを構築する単純な解決を必要とします.我々が使うのでAmazon Elastic Container Repository (ECR) Docker画像を保存するには、gitタグを使用して、docker imageを起動させることにしましたAWS CodeBuild とECRにプッシュします.
ビルドをトリガーする条件はタグを追加することです
service-name/version-number
そして、それをgithubまたはbitbucketに押してください.AWS CodeBuildはWebhookを受け取り、新しいDockerイメージをversion-number
タグで提供し、それをECRにプッシュします.そして最後にS 3でアーティファクトをビルドします.レポ
最初に、我々はGithubまたはBitbucketの上でmonorepoを必要としますhttps://github.com/teer823/monorepo-aws-docker .
Each projects is just a simple express service with Dockerfile ready to build docker image and include buildspec.yml for AWS CodeBuild to use, however, I also added 2 buildspec file inside buildspec folder to demonstrate that it's possible to separate buildspec.yml file per project as needed.
ビルドYMLファイルはAWS CodeBuildの命令で、フェーズに分離されます.ここでは、各フェーズで私は何です.
PreRankは、タグからタグネスVersionCount番号を作成し、バージョンを作成します.その後、ECRにログインするアーティファクトとしてストアするtxtファイル
名前としてビルドする.ビルドとタグのイメージを入力します.私も追加してください
latest
同様にここでタグを付けてください、そうすることでECRのタグimmutability機能を使うのを防ぎます.ポストは、ECRにイメージを押す
version: 0.2
phases:
pre_build:
commands:
- echo Pre Build Phase...
- export TAG_VERSION_NUMBER=$(echo $CODEBUILD_WEBHOOK_TRIGGER | sed 's/.*\///')
- echo $TAG_VERSION_NUMBER
- >
PACKAGE_VERSION=$(cat $REPO_FOLDER/package.json | grep version | head -1 | awk -F: '{print $2}' | sed 's/[",[:space:]]//g')
- echo $PACKAGE_VERSION > version.txt
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
build:
commands:
- echo Build Phase...
- cd $REPO_FOLDER
- docker build -t $IMAGE_REPO_NAME:$TAG_VERSION_NUMBER -t $IMAGE_REPO_NAME:latest .
- docker tag $IMAGE_REPO_NAME:$TAG_VERSION_NUMBER $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$TAG_VERSION_NUMBER
- docker tag $IMAGE_REPO_NAME:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:latest
post_build:
commands:
- echo Post Build Phase...
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$TAG_VERSION_NUMBER
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:latest
artifacts:
files:
- '$REPO_FOLDER/**/*'
- 'version.txt'
name: '$IMAGE_REPO_NAME-$TAG_VERSION_NUMBER'
discard-paths: no
詳しくはbuildspec.yml
どうぞHERE エーカーズ
私はDockerイメージをECRにプッシュしたいので、事前に各サービスのコンテナリポジトリを事前に作成する必要があります.だけで、プライベートリポジトリを作成し、タグのimmutabilityまたはビルドを有効にしないでください
latest
タグを上書きすることはできません.(または単にビルド仕様を変更し、latest
タグ
AWS 3
我々はCodeBuildをAWS S 3にビルドアーティファクトを保存したいので、事前にバケットを準備する必要があります.バケツをつくりましょう!(デフォルトの設定をデフォルトのままにしておいてください.

AWSコードビルド
今、我々はコードレポ、コンテナレポ、アーティファクトバケットを持って..AWS CodeBuildプロジェクトを作成しましょう.
プロジェクトの設定を選択..

ソースはあなたのgithubまたはbitbucketに接続し、私のgithubアカウントのリポジトリを選択し、monorepoリポジトリを選択します.我々は公共のレポがしないように我々はwebhookに依存する必要があることに注意してください.

プライマリソースwebhookイベントここで重要です.ボックスをチェックすることでWebhookを有効にします.と設定ビルド条件
^refs/tags/service-name/([\w\.-]+)$
, 置換を忘れないでくださいservice-name
したがって.
If you want to use other method to trigger build, here's the place to try and modify build condition according to your usecases.
私は個人的にUbuntuを好むので、あなたのビルドマシンを設定する方法はあなた次第ですが、ここで重要なのは以下です
特権を有効にするフラグを有効にするため、我々は

サービスロールは好みの名前を選択します、私は個人的に同じプロジェクトで役割を再利用するのが好きです.しかし、私たちが後でそれを必要とするので、役割名を覚えておいてください.

あなたが気づいたならば、環境変数
buildspec.yml
以前は環境変数を使いました.ここで設定する必要があります
buildspec rootの使用時
buildspec.yml
だけでビルドファイルを使用します.
In case you want to try using individual buildspec file, add path to project-buildspec file in Buildspec name field
service-name
パスとして.
許可
開始タグと建物の前に最後の一歩.当社のサービスロールは、まだECRにDockerイメージをプッシュする許可を持っていません.それで、我々はそれをIAMに加える必要があります.上記のロールに移動し、管理ポリシー名を付けます
AmazonEC2ContainerRegistryPowerUser
我々の役割と完了に!
タグ付け時間!
今ではmonorepoにタグを追加し、起源にプッシュする時間です
❯ git tag ingest-service/0.1.0
❯ git push origin ingest-service/0.1.0
CodeBuildプロジェクトに戻って、それが働くのを見てください!
建物を完了すると、ECRの新しいDocker画像を見つける!

結論
それはそれだけです.私のチームのような単純なビルドパイプラインを探している人にとって、これが役に立つことを願っています.
Reference
この問題について(タグベースのmonorepoのdocker画像をビルド), 我々は、より多くの情報をここで見つけました https://dev.to/awscommunity-asean/tag-based-monorepo-docker-image-build-on-aws-1bjaテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol