実現したいこと
- CodeCommitのリポジトリ(hoge-repo)のmasterブランチの更新をトリガーに
masterブランチのリソースからDockerイメージを作成しECRの対象リポジトリに格納したい - hoge-repoはgolangのアプリを持っているので,イメージ作成時にアプリのビルドも行う
環境
- Golang 1.13.5
- Docker 18
- AWS 東京リージョン
やったこと
CodeBuild構築
-
プロジェクト名は任意の名前
-
送信元
送信元はCodeCommitの対象リポジトリを選択
今回はmasterマージをトリガーにするのでリファレンスタイプはブランチ
対象ブランチはmasterを指定
-
環境
Build環境は特に制限がなかったのでaws/codebuild/amazonlinux2-x86_64-standard:2.0
を選択
残りの環境設定はデフォルト -
Buildspec
Buildspecファイルを使用するを選択
buildspec.yamlは後ほど -
アーティファクト
今回はDockerイメージのpushまでで,実際にEKSでコンテナの立ち上げまで行わないので
アーティファクトはなしを選択 -
ログ
ログの監視も今回は行わない
CodeBuildの権限追加
今回はCodeCommitからソースをダウンロードし,ECRにイメージプッシュするため
CodeBuildのサービスロールに以下ポリシーを付与
AmazonEC2ContainerRegistryFullAccess
buildspec.yml作成
codebuildでデフォルト設定にしたので hoge-repoのルートディレクトリにbuildspec.ymlを配置
hoge-repo
|
|-- buildspec.yml
|-- Makefile
|-- Dockerfile
|-- main.go
...
buildspec.yaml
version: 0.2
phases:
install:
runtime-versions:
docker: 18
commands:
# ECRにイメージプッシュするためにログインする
- $(aws ecr get-login --no-include-email --region ap-northeast-1)
pre_build:
commands:
# go test -v -cover ./...
- make test
build:
commands:
# go build -v .
- make build
post_build:
commands:
# docker tag \code-commit-repo-name\:latest \erc-repo-name\:latest
# docker push \erc-repo-name\:latest
- make push-image
CodePipeline構築
CodePipelineの新規作成
-
パイプラインの設定
パイプライン名は任意の値を入力し,残りはデフォルト -
ソースステージ
ソースプロバイダにAWS CodeCommitのhoge-repo masterブランチを選択
検索はAmazon CloudWatch Eventsを選択 -
ビルドステージ
AWS CodeBuildの先ほど作成したプロジェクトを選択
今回環境変数は使用しないので残りはそのまま -
デプロイステージ
実際にコンテナを立ち上げないのでデプロイステージはスキップする
完成
ここまでの設定でCodeCommitのmasterブランチの更新をトリガーに
GoアプリがビルドされたDockerイメージを作成し,ECRにプッシュする構成ができた.
この後
Pipeline実行する毎に goモジュール(外部ライブラリ)をダウンロードするのはイケてない(5分ぐらいかかる)
一度ダウンロードしたモジュールはキャッシュしておきたい(この後盛大にハマる)
ハマった記事