タグベースの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を有効にします.と設定ビルド条件
  • ビルドタイプ-シングルビルド
  • イベントタイプ-プッシュとpulltle要求量をマージ
  • 条件-スタートを受信するときにビルドを開始します^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 以前は環境変数を使いました.ここで設定する必要があります
  • あなたのECR地域
  • あなたのECR口座ID
  • 上で作成したECR削除名
  • 我々が構築しているサービスのフォルダ名


  • buildspec rootの使用時buildspec.yml だけでビルドファイルを使用します.

    In case you want to try using individual buildspec file, add path to project-buildspec file in Buildspec name field


  • アーティファクトは、上で作成されたアマゾンS 3とバケツを選びますservice-name パスとして.
  • プロジェクトをビルドし、完了です.次に、2番目のサービスの別の1つを追加します.

    許可
    開始タグと建物の前に最後の一歩.当社のサービスロールは、まだECRにDockerイメージをプッシュする許可を持っていません.それで、我々はそれをIAMに加える必要があります.上記のロールに移動し、管理ポリシー名を付けますAmazonEC2ContainerRegistryPowerUser 我々の役割と完了に!


    タグ付け時間!
    今ではmonorepoにタグを追加し、起源にプッシュする時間です
    ❯ git tag ingest-service/0.1.0
    ❯ git push origin ingest-service/0.1.0
    
    CodeBuildプロジェクトに戻って、それが働くのを見てください!

    建物を完了すると、ECRの新しいDocker画像を見つける!


    結論
    それはそれだけです.私のチームのような単純なビルドパイプラインを探している人にとって、これが役に立つことを願っています.