CircleCIでDockerをビルドしてAWS ECRにPushする
Introduction
こんにちは.
CI/CDやってますか?
最近,ReactでSPA作ってます.
Dockerコンテナで動かしているのですが,ホスティングサービスをどこにしようかなと.
Herokuも考えたのですが,無料枠だと起動に時間がかかるので却下しました.
本サイトがAWSのlightsailで動いているので,そこでDockerコンテナも動かすことにしました.
CIは実現できましたが,CDは面倒くさいのでやってません.
(lightsailでAPI動かして,Hookすればいけますが面倒くさい..)
Dependency
- AWS,github,CircleCIのアカウント作成済み
- ECR作成済み
- aws cliちょっと使える
- githubにリポジトリ作成済み
TRY!!
Connect github and CircleCI
CircleCIにログインして,Githubのリポジトリと紐づけます.
Add Environment Variable in CircleCI
AWSのクレデンシャル情報をCircleCIの環境変数としてセットします.
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_DEFAULT_REGION
- AWS_ACCOUNT_ID
- AWS_RESOURCE_NAME_PREFIX
AWS_ACCOUNT_IDとAWS_RESOURCE_NAME_PREFIXはリポジトリ情報から取得します.
ECRを作成すると下記のようなURLが生成されます.
XXXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/your_resource_name
AWS_ACCOUNT_IDはXXXXXXXXXXXXXの部分,AWS_RESOURCE_NAME_PREFIXはyour_resource_nameを環境変数にセットしてください.
Create .circleci/config
gitのプロジェクトルート直下に,今回の肝である .circleci/config
ファイルを作成してください.
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 |
version: 2 jobs: build: machine: true steps: - checkout - run: name: Setup common environment variables command: | echo 'export ECR_REPOSITORY_NAME="${AWS_RESOURCE_NAME_PREFIX}"' >> $BASH_ENV echo 'export FULL_IMAGE_NAME="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${ECR_REPOSITORY_NAME}:${CIRCLE_SHA1}"' >> $BASH_ENV - run: name: Setup AWS CLI command: | curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip" unzip awscli-bundle.zip sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws - run: name: Build Image command: | docker build -t ${FULL_IMAGE_NAME} . - run: name: Login to AWS ECR command: eval $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email) - run: name: Push Docker Image command: | docker push ${FULL_IMAGE_NAME} |
依存関係,テストは考慮していないのでシンプルになっています.
またbranchでフィルターもかけていないので,masterブランチもdevelopブランチもどちらもビルドするようになっています.
Push SorceCode to github
ではソースコードをpushしましょう.
1 2 |
$ git push origin master |
こんな感じでDockerのビルド,ECRへのデプロイが完了します.