チュートリアルを通してCodeBuildを理解する #reinvent

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、中山です。

米国時間12/1(木)のキーノートで発表されたCodeBuild。発表当初は北部バージニアリージョンでなぜか上手く表示してくれなかったのですが、お昼頃には使えるようになっていました。早速使ってみたのでレポートします。

使ってみた

やはり新サービスが出てきたらまずはGetting Startedでしょう、ということでCodeBuildのGetting Startedドキュメントに沿ってCodeBuildを使ってみます。このドキュメントではApache Mavenを利用してS3に保存したJavaのソースコードからjarファイルを生成し、アーティファクト用S3バケットに設置するといった内容になっています。では、早速初めてみましょう。

1. S3バケットの用意

事前にアーティファクト保存用/ソースコード保存用バケットをS3に作成しておきます。今回は以下2つのバケット名にしてみました。適宜変更してください。

  • アーティファクト保存用: knakayama-codebuild-demo-output
  • ソースコード保存用: knakayama-codebuild-demo-input

注意点としてCodeBuildを利用するリージョンとこれらバケットのリージョンは合わせておく必要があります。今回は北部バージニアリージョンでCodeBuildを利用するので2つのバケットもそのリージョンで作成します。

# 環境変数の変更
$ export AWS_DEFAULT_REGION=us-east-1
# バケットの作成
$ aws s3 mb s3://knakayama-codebuild-output
make_bucket: knakayama-codebuild-output
$ aws s3 mb s3://knakayama-codebuild-input
make_bucket: knakayama-codebuild-input

2. CodeBuildでビルドするソースコードの用意

続いてソースコードを用意します。まずはコードを設置するディレクトリを作成しておきます。

$ mkdir -p codebuild-demo/src/{main,test}/java
$ cd codebuild-demo

ドキュメントにサンプル用ソースコードがあるのでそれを利用します。

# クラスファイルの作成
$ $EDITOR 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;
  }
}
# テストファイルの作成
$ $EDITOR 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の作成
$ $EDITOR pom.xml
# 以下を貼り付け
;se
<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>
</project>

最終的なディレクトリ構造は以下のようになります。

codebuild-demo/
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── MessageUtil.java
    └── test
        └── java
            └── TestMessageUtil.java

5 directories, 3 files

3. buildspec.yml ファイルの用意

速報エントリでも書きましたが、CodeBuildはビルド時に実行するシェルコマンドを buildspec.yml (ビルドスペック)というYAML形式のファイルに記述します。CircleCIで言えば circle.yml ファイルのことですね。このファイルをソースコードのトップディレクトリに設置しておくことで、CodeBuildがその内容を読み込み実行するという流れです。ただし、このファイルは必ずしも必要ではなくマネジメントコンソールからアドホックに設定することも可能です。

$ $EDITOR buildspec.yml
# 以下を貼り付け
version: 0.1

phases:
  install:
    commands:
      - echo Nothing to do in the install phase...
  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:
  type: zip
  files:
    - target/messageUtil-1.0.jar

設定内容を以下の記述します。より詳細な情報はこちらのドキュメントを参照してください。

設定 意味 備考
version ビルドスペックのバージョン 該当ドキュメントはこちらです。現時点2016/12/1の最新バージョンは0.1です。
phases ビルドの各フェーズでどういったコマンドを実行するか定義する大本のキー 設定可能なフェーズは install / pre_build / build / post_build の4つです。
install インストールフェーズで実行するコマンドを定義 ビルドする前に必要なライブラリなどをここで用意します。
pre_build ビルド前に実行するコマンドを定義 設定ファイルを書き換えたりといったビルド前に実施するちょっとした処理内容を記述する箇所です。
build ビルドする際に実行するコマンドを定義 今回はMavenを利用してビルドしています。
post_build ビルド後に実行するコマンドを定義 例えばGitHubリリースへアップロードするといったビルド後の処理を記述します。
artifacts ビルド後に生成した成果物(アーティファクト)の設置場所 type はzipのみ指定可能。 files でCodeBuildでビルドしたアーティファクトのパスを指定します。ワイルドカードも可能です。

4. S3に保存するためにzipに固めてアップロードする

トップディレクトリで以下のコマンドを実行してください。注意点としてルートディレクトリは含めずに、その中のファイルやディレクトリを含める必要があります。

$ zip -r ../MessageUtil.zip *
  adding: buildspec.yml (deflated 56%)
  adding: pom.xml (deflated 52%)
  adding: src/ (stored 0%)
  adding: src/main/ (stored 0%)
  adding: src/main/java/ (stored 0%)
  adding: src/main/java/MessageUtil.java (deflated 58%)
  adding: src/test/ (stored 0%)
  adding: src/test/java/ (stored 0%)
  adding: src/test/java/TestMessageUtil.java (deflated 60%)

また、今回はソースコードの設置場所がS3なのでzipで固めたファイルをアップロードしておきます。

$ aws s3 cp ../MessageUtil.zip s3://knakayama-codebuild-input
upload: ../MessageUtil.zip to s3://knakayama-codebuild-input/MessageUtil.zip

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

準備が整ったのでいよいよCodeBuildの設定です。マネジメントコンソールからCodeBuildの画面を開きます。

codebuild1

「Get Started」をクリックすると以下のように設定画面が開きます。

codebuild2

各種設定内容は以下のように設定してください。

設定 内容 備考
Project Name test-prj
Source provider S3 ソースコードの設置場所。
Bucket/S3 Object key knakayama-codebuild-input/MessageUtil.zip
Environment image Use an image managed by AWS CodeBuild CodeBuildで起動されるコンテナの指定です。カスタマイズしたものも使えますが、今回はAWSデフォルトのものを利用します。
Operating system Ubuntu
Runtime Java
Version aws/codebuild/java:openjdk-8
Build specification Use the buildspec.yml in the source code root directory
Artifact type Amazon S3
Artifact name buildspec.yml で指定しているため。
Bucket name knakayama-codebuild-output アーティファクトの設置先バケット名。
Role name 新規で作成 CodeBuildが各種AWSリソースにアクセスするためのIAM Roleを指定します。今回はビルドプロジェクトの作成と同時に作成します。

「Continue」を押下すると以下のようにレビュー画面に遷移します。問題ないようだったら「Save」を押下してビルドプロジェクトを保存します。

codebuild3

6. ビルドの実行

いよいよビルドを実行してみましょう!「Build Projects」に先程作成したプロジェクトがあるので、そのラジオボタンをクリックして「Start build」を押下してください。

codebuild4

今回は何も考えずにそのまま「Start build」を押下してみます。

codebuild5

するとビルドが開始します。しばらく待つとステータスが「Succeeded」と表示されビルドに成功したことが確認できます。

codebuild6

この時点でアーティファクト用S3バケットを見てみると、正常にアーティファクトが保存されていることを確認できます。

$ aws s3 ls s3://knakayama-codebuild-output --recursive
2016-12-01 16:41:08       2065 test-prj/target/messageUtil-1.0.jar

まとめ

いかがだったでしょうか。

今回はチュートリアル通してCodeBuildの概要を理解してみました。やはりフルマネージドなので自分で管理する必要がないという点がありがたいですね。また、ビルド時間に依存しますがCircleCIなどの一般的なSaaSよりはコストが安くなると思われます。次回以降はより踏み込んだ内容をお届けできればと思います。

本エントリがみなさんの参考になれば幸いです。