LoginSignup
5
5

More than 1 year has passed since last update.

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

Posted at

はじめに

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

構成

スクリーンショット 2021-05-07 16.42.06.png

作業

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

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)へアップロードします。
スクリーンショット 2021-05-04 17.41.18.png

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

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

まず、[ビルドプロジェクト] → [ビルドプロジェクトを作成する]をクリックします。
スクリーンショット 2021-05-04 17.29.23.png

・プロジェクトの設定
次に、プロジェクトの設定プロジェクト名にビルドプロジェクトの名前(ここでは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

以下は実際の入力例です。
screencapture-ap-northeast-1-console-aws-amazon-codesuite-codebuild-project-new-2021-05-04-17_39_26.png

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

ビルドの実行

先ほど用意したビルドプロジェクトでビルドを実行します。
[ビルドプロジェクト] → [ビルドの開始]をクリックします。
スクリーンショット 2021-05-04 17.40.14.png

確認

ビルドが完了すると、出力先に指定したcodebuild-[regionID]-[accountID]-output-bucketにjarファイルが出力されます。
スクリーンショット 2021-05-04 18.08.24.png

おわりに

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

5
5
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
5
5