はじめに
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
というファイルを作成します。
$ vim ./src/main/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
というファイルを作成します。
$ vim ./src/test/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
というファイルを作成します。
$ vim 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でどのような処理を行うかを記載したレシピになります。
$ vim 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
|-- 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を利用することで今まで必要だったビルドサーバーのサーバーレス化が行えます。
サーバー費用の削減だけでなく、運用コストも大幅に削減できるのでとても助かるサービスだなと感じました。