Help us understand the problem. What is going on with this article?

AWS CodePipelineでgoアプリのDockerイメージをECRに格納する

実現したいこと

  1. CodeCommitのリポジトリ(hoge-repo)のmasterブランチの更新をトリガーに
    masterブランチのリソースからDockerイメージを作成しECRの対象リポジトリに格納したい
  2. hoge-repoはgolangのアプリを持っているので,イメージ作成時にアプリのビルドも行う

環境

  • Golang 1.13.5
  • Docker 18
  • AWS 東京リージョン

やったこと

CodeBuild構築

  • プロジェクト名は任意の名前

  • 送信元

    送信元はCodeCommitの対象リポジトリを選択

スクリーンショット 2020-01-10 15.53.22.png

今回はmasterマージをトリガーにするのでリファレンスタイプはブランチ
対象ブランチはmasterを指定

  • 環境

    Build環境は特に制限がなかったのでaws/codebuild/amazonlinux2-x86_64-standard:2.0
    を選択

    残りの環境設定はデフォルト

  • Buildspec
    Buildspecファイルを使用するを選択
    buildspec.yamlは後ほど

  • アーティファクト
    今回はDockerイメージのpushまでで,実際にEKSでコンテナの立ち上げまで行わないので
    アーティファクトはなしを選択

  • ログ
    ログの監視も今回は行わない

CodeBuildの権限追加

今回はCodeCommitからソースをダウンロードし,ECRにイメージプッシュするため
CodeBuildのサービスロールに以下ポリシーを付与
AWSCodeCommitReadOnlyAccess
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分ぐらいかかる)
一度ダウンロードしたモジュールはキャッシュしておきたい(この後盛大にハマる)
ハマった記事

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした