CodeBuildでjavaのソースコードをビルドする


はじめに

CodeBuildを使ってjavaのソースコードをビルドします。

構成

作業

基本的にはコンソール操作ですがソースの準備部分でコマンドも記載しています。コマンドを使わなくても同じ状況になれば大丈夫です。

S3バケットの作成

まず、バケットを2つ用意します。

  • ソースコード用:codebuild-[regionID]-[accountID]-input-bucket
  • ビルド出力用:codebuild-[regionID]-[accountID]-output-bucket

S3バケット名はユニークでないといけないため[regionID][accountID]というルールを設けています。

ソースコードの準備

CodeBuildでビルドするためのソースコードを作成します。
空のディレクトリを用意し、その配下に以下のようなディレクトリ構造を作成します。

ディレクトリ作成
$ mkdir work
$ cd work
$ mkdir -p src/main/java
$ mkdir -p src/test/java
ディレクトリ構造
(root directory name)
    `-- src
         |-- main
         |     `-- java
         `-- test
               `-- java

また、src/main/java配下にMessageUtil.javaというファイルを作成します。

javaファイル作成
$ vim ./src/main/java/MessageUtil.java
MessageUtil.java
public class MessageUtil {
  private String message;

  public MessageUtil(String message) {
    this.message = message;
  }

  public String printMessage() {
    System.out.println(message);
    return message;
  }

  public String salutationMessage() {
    message = "Hi!" + message;
    System.out.println(message);
    return message;
  }
}

次に、src/test/java配下にTestMessageUtil.javaというファイルを作成します。

javaファイル作成
$ vim ./src/test/java/TestMessageUtil.java
TestMessageUtil.java
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;

public class TestMessageUtil {

  String message = "Robert";    
  MessageUtil messageUtil = new MessageUtil(message);

  @Test
  public void testPrintMessage() {      
    System.out.println("Inside testPrintMessage()");     
    assertEquals(message,messageUtil.printMessage());
  }

  @Test
  public void testSalutationMessage() {
    System.out.println("Inside testSalutationMessage()");
    message = "Hi!" + "Robert";
    assertEquals(message,messageUtil.salutationMessage());
  }
}

次に、作業ルートディレクトリにpom.xmlというファイルを作成します。

xmlファイル作成
$ vim pom.xml
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>messageUtil</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>
  <name>Message Utility Java Sample App</name>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>   
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
      </plugin>
    </plugins>
  </build>
</project>

最終的に以下のような構造になります。

ディレクトリ構造
(root directory name)
    |-- pom.xml
    `-- src
         |-- main
         |     `-- java
         |           `-- MessageUtil.java
         `-- test
               `-- java
                     `-- TestMessageUtil.java

buildspecファイルの作成

buildspecはCodeBuildでどのような処理を行うかを記載したレシピになります。

buildspec作成
$ vim buildspec.yml
buildspec.yml
version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto11
  pre_build:
    commands:
      - echo Nothing to do in the pre_build phase...
  build:
    commands:
      - echo Build started on `date`
      - mvn install
  post_build:
    commands:
      - echo Build completed on `date`
artifacts:
  files:
    - target/messageUtil-1.0.jar

ここまでの構造は以下になります。

ディレクトリ構造
(root directory name)
    |-- pom.xml
    |-- buildspec.yml
    `-- src
         |-- main
         |     `-- java
         |           `-- MessageUtil.java
         `-- test
               `-- java
                     `-- TestMessageUtil.java

ソースコードと buildspec ファイルのアップロード

ここまでで用意したものをzipファイルにします。

$ zip -r MessageUtil.java *

zipファイル内の構造は以下になっている必要があります。

MessageUtil.zip
MessageUtil.zip
    |-- pom.xml
    |-- buildspec.yml
    `-- src
         |-- main
         |     `-- java
         |           `-- MessageUtil.java
         `-- test
               `-- java
                     `-- TestMessageUtil.java

zipファイルにしたら最初に作成したinputバケット(codebuild-[regionID]-[accountID]-input-bucket)へアップロードします。

ビルドプロジェクトの作成

CodeBuildでビルドを実行するためのビルドプロジェクトを作成します。

まず、[ビルドプロジェクト] → [ビルドプロジェクトを作成する]をクリックします。

・プロジェクトの設定
次に、プロジェクトの設定プロジェクト名にビルドプロジェクトの名前(ここではcodebuild-demo-project)を入力します。

項目
プロジェクト名 codebuild-demo-project

・ソース
ソースプロバイダAmazonS3を選択し、バケットcodebuild-[regionID]-[accountID]-input-bucketを選択、S3オブジェクトキーまたはS3フォルダMessageUtil.zipを入力します。

項目
ソースプロバイダ Amazon S3
バケット codebuild-[regionID]-[accountID]-input-bucket
S3オブジェクトキーまたはS3フォルダ MessageUtil.zip

・環境
環境イメージマネージド型イメージを選択し、オペレーティングシステムAmazonLinux2を選択、ランタイムStandardイメージaws/codebuild/amazonlinux2-x86_64-standard:3.0を選択します。
サービスロールでは新しいサービスロールを選択したままで、ロール名もそのままにします。

項目
環境イメージ マネージド型イメージ
オペレーティングシステム AmazonLinux2
ランタイム Standard
イメージ aws/codebuild/amazonlinux2-x86_64-standard:3.0
ランタイム Standard
サービスロール 新しいサービスロール
ロール名 自動入力されたもの

・Buildspec
buildspecファイルを使用するを選択したままにします。

項目
buildspec buildspecファイルを使用する

・アーティファクト
タイプAmazon S3にし、バケット名codebuild-[regionID]-[accountID]-output-bucketを選択します。

項目
タイプ Amazon S3
バケット名 codebuild-[regionID]-[accountID]-output-bucket

以下は実際の入力例です。

入力が完了したら[ビルドプロジェクトの作成]をクリックします。

ビルドの実行

先ほど用意したビルドプロジェクトでビルドを実行します。
[ビルドプロジェクト] → [ビルドの開始]をクリックします。

確認

ビルドが完了すると、出力先に指定したcodebuild-[regionID]-[accountID]-output-bucketにjarファイルが出力されます。

おわりに

CodeBuildを利用することで今まで必要だったビルドサーバーのサーバーレス化が行えます。
サーバー費用の削減だけでなく、運用コストも大幅に削減できるのでとても助かるサービスだなと感じました。