LoginSignup
31
17

More than 5 years have passed since last update.

CodeBuildで独自イメージを使ってビルドする

Last updated at Posted at 2018-04-12

概要

(2019年4月18日 更新)

  • OracleJDKをOpenJDKに変更しました。
  • Gradle5.xだとビルドエラーになる場合があるので、Gradle4.10.3に設定しました。
  • DockerHubにコンテナイメージを配置しました。こちらからどうぞ。

Spring Boot2.xでGradleを使う場合は、Gradle4.x以上が必要となる。
AWSで用意されているJavaのDockerイメージは、Apache Maven 3.3.3、Apache Ant 1.9.6、Gradle 2.7となっているため、gradleをアップデートインストールしないと、ビルドが出来ない。

毎回インストールしても良いのだが、5分ほど時間がかかってしまう。(後述)
そのため、独自のDockerイメージを使ってビルドにチャレンジしてみました。

AWS CodeBuild に用意されている Docker イメージ
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-available.html

AWSのイメージを使ってgradleのバージョンアップをする方法も載せておきます。

phases:
  install:
    commands:
     - echo Entered the install phase...
     - add-apt-repository ppa:cwchien/gradle
     - apt-get update -y
     - apt-get install -y gradle
     - gradle -v

手順

ざっくり書くとこんな感じ。

  1. ビルド用のDockerコンテナイメージを作る
  2. ECRにコンテナイメージをアップロードする
  3. ECRのリポジトリにCodeBuildからアクセス出来るよう権限を設定する
  4. CodeBuildの設定を行う
  5. ビルド実行

コンテナイメージの作成

お好みで良いと思いますが、今回はubuntuイメージを使ってみます。
色々と使い回しができるように、Docker、Maven、Ant、Gitコマンドも使えるように、追加でインストールしておきます。

Dockerfile
FROM ubuntu:latest

# base update
RUN apt-get update && apt-get upgrade -y

# add-apt-repository コマンドの追加
RUN apt-get install -y apt-file
RUN apt-file update
RUN apt-file search add-apt-repository
RUN apt-get install -y software-properties-common

# gradle & java 追加
RUN add-apt-repository ppa:cwchien/gradle
RUN add-apt-repository ppa:webupd8team/java

# インストール
RUN apt-get update && apt-get upgrade -y gradle git maven ant

# OracleJDKのインストール
# RUN echo debconf shared/accepted-oracle-license-v1-1 select true | debconf-set-selections
# RUN echo debconf shared/accepted-oracle-license-v1-1 seen true | debconf-set-selections
# RUN apt-get install -y oracle-java8-installer

# OpenJDKのインストール && 1.8.0の切り替え
RUN apt-get install -y openjdk-8-jdk
RUN update-java-alternatives --set java-1.8.0-openjdk-amd64

# Graldeのダウングレード
RUN apt-get install -y gradle-4.10.3
RUN update-alternatives --set gradle /usr/lib/gradle/4.10.3/bin/gradle

ECRにコンテナイメージをアップロードする

事前にAmazon ECRにリポジトリを作成しておきます。(手順は割愛します)

リポジトリを作成後、コマンド例に従ってECRにPushを行います。

コマンド例

aws ecr get-login --no-include-email --region ap-northeast-1
docker build -t [リポジトリ名] .
docker tag springboot-build:latest xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/[REPOSITORY]:[TAG]
docker push xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/[REPOSITORY]:[TAG]

私の作成済みイメージを使う場合は

aws ecr get-login --no-include-email --region ap-northeast-1
docker pull akikinyan/springboot-build:latest
docker tag akikinyan/springboot-build:latest xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/[REPOSITORY]:[TAG]
docker push xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/[REPOSITORY]:[TAG]

ECRのリポジトリにCodeBuildからアクセス出来るよう権限を設定する

Amazon ECR -> リポジトリの対象となるリポジトリに、アクセス権を設定する。
参考となる手順は、以下にあります。

AWS CodeBuild の Amazon ECR サンプル
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-ecr.html

ポリシードキュメント

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "CodeBuildAccess",
            "Effect": "Allow",
            "Principal": {
                "Service": "codebuild.amazonaws.com"
            },
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability"
            ]
        }
    ]
}

CodeBuildの設定を行う

CodeBuildの「環境: ビルド方法」で、上記で作成したコンテナイメージを利用するように設定します。

設定項目 設定内容
環境イメージ Docker イメージの指定
環境タイプ Linux
カスタムイメージタイプ Amazon ECR
Amazon ECR レポジトリ 作成したリポジトリ名
Amazon ECR イメージ 作成したタグ名
ビルド仕様 ソースコードのルートディレクトリの buildspec.yml を使用
buildspec名 buildspec.yml

ビルド仕様はお好みで良いですが、buildspec.ymlのサンプルを載せておきます。

buildspec.yml
version: 0.2

env:
  variables:
    JAVA_HOME: "/usr/lib/jvm/java-8-oracle"

phases:
  install:
    commands:
      - gradle -v
  build:
    commands:
      - gradle build -x test

artifacts:
  files:
    - ./build/libs/spring-boot-test-1.0.0.jar

ビルド実行

CodeBuildからビルドを指示します。
(簡単なので割愛します)

Q&A

Q. PROVISIONING phaseでClient Errorが出る

A. ECRのアクセス権が設定されていない

Unable to pull customer's container image. ErrorCode: 404 ~~~~
https://stackoverflow.com/questions/45079013/i-got-some-aws-codebuild-error-i-have-no-clue-to-solve-it

31
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
17