AWS CodeCommitからCodePipelineでECRへDockerイメージをビルド
概要
AWS CodeCommitにpushしたDockerfileをCodeBuildで、
docker buildして、ECRにDockerImageを保存するまでのハンズオン
目的
AWSの機能でDockerビルドのCI環境を作る
CodeCommit編
CodeCommit リポジトリ作成
SSH設定
Terraformで AWS CodeCommitを作成のSSH設定を参考
git clone
|
|
SSHの設定の細かいところ以外はリポジトリ作成画面に手順が書いてある
Dockerfileを配置
cloneしたディレクトリにalpineのimageにGoのhttpサーバのバイナリをテスト用に置く
|
|
- Dockerfile
FROM alpine:latest
WORKDIR /app
COPY server /app
EXPOSE 80
CMD ["/app/server"]
- server
以前作成したGoのバイナリファイル
Dockerfileアップロード
|
|
CodeCommitのリポジトリにファイルが追加された
ECR編
ECRリポジトリ作成
リポジトリ名がビルドされるDocker Imageの名前になる
CodeBuild編
ビルドプロジェクトを作成するボタンから各種設定を行う
プロジェクト名を入力
“test-dockerbuild"とした
送信元
リポジトリはCodeCommit編で作成したリポジトリを選択
環境
- aws/codebuild/standard:2.0
- 特権付与にチェック!(チェックいれないとdocker buildに失敗する)
Buildspec, アーティファクト
ECRにプッシュしたいので、アーティファクトなし
ログ
保存日数をここでは選択できないので、CloudWatchオプションを外した
buildspec.yml作成
Dockerfileの並びにbuildspec.ymlを作成
|
|
環境変数はあえて使わず、テストために分かりやすく
- runtime-versionsで、dockerを指定する
- docker build -t [ECRのリポジトリ名]:[tag] .
- docker tag [ECRのリポジトリ名]:[tag] [ECRのリポジトリのURIを指定]:[tag]
- docker push [ECRのリポジトリのURIを指定]:[tag]
|
|
buildspec.ymlのアップロード
|
|
補足
この状態でビルドを実行すると、ECRへの権限がなくて失敗する
COMMAND_EXECUTION_ERROR: Error while executing command: $(aws ecr get-login --no-include-email --region ap-northeast-1). Reason: exit status 255
特権付与にチェックを入れ忘れた場合
COMMAND_EXECUTION_ERROR: Error while executing command: docker build -t my_httpserver:latest .. Reason: exit status 1
IAM ポリシーの編集
自動作成されたポリシーを探す
codebuildで検索すれば、先程名付けたプロジェクト名のポリシーが見つかる
ここのスペースに下記を追加する
ドキュメントを読んだ方がわかりやすい
|
|
追加するとECRへの権限を得られる
ビルドの開始
CodeBuildに戻り、動作テストのため手動でビルドを行う
フェーズ詳細から進行を確認できる
ECRからリポジトリを確認すると、ビルドされたイメージが追加されている
CodePipeline
デプロイの設定をスキップする以外は悩むところがない
パイプラインの作成
導入段階をスキップ!
初回は自動実行されるようだ
リポジトリに追加されている
最終確認
git pushしたら自動的にECRにビルド済みのイメージが保存されることを確認する
試しにDockerfileを編集してからpush
> vi Dockerfile
> git add Dockerfile
> git commit -m "portを修正"
> git push -u origin master
CodePipelineを確認すると自動的に処理が走っている
最終的にECRに新しいイメージが追加された
感想
これで簡単なCI環境を構築できた
ECRへ手動でpushするパターンはこちら
参考
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-docker.html