#chiroito ’s blog

Java を中心とした趣味の技術について

Terraform を使って Cloud上に OpenJDK の開発環境を整えてみた

OpenJDK のビルドやテストは時間が非常に掛かるので、クラウド上で大量の CPU リソースを使って短時間化できないかを試してみました。

今回作った環境に自分で書いたパッチを置いて Terraform を実行すると、あとはクラウド上で大量のリソースを使ってビルドとテストが終わるようになりました。試しに 48 vCPU の環境を作ったところ、ビルドは4~5分、fastdebug での Tier1 のテストは40分程度で完了しました。

ソースコードはこちら(sandbox/Terraform/developOpenJDK at master · chiroito/sandbox · GitHub

クラウドを使うと言えど毎回この全行程を実行するのは時間(=料金)がかかるので、できる限り再利用したいと思います。 今回は、再利用できる部分と毎回処理する部分に分けて環境を構築してみました。再利用できる部分は環境構築時に作成して Block Storage として保管しておきます。Block Storage は 2 つ作ってあり、1つはOSや作業スクリプトなど一回作ったらしばらく変らない部分を Boot イメージとして作成し、もう1つは、OpenJDK のソースコードなどわりと頻繁に変る部分を作業用のボリュームとして作成しました。

今回は Terraform を使って Oracle Cloud 上に環境を構築していきます。OpenJDK 関連の作業はシェル化してあるので他のクラウドサービス上でも環境構築できると思います。

f:id:chiroito:20190106155351p:plain

OpenJDK の環境を整えてテストを流すために必要な作業は以下のようになります。

  1. ビルドやテストに必要なパッケージのインストール
  2. OpenJDK ソースコードのダウンロード
  3. テストツールであるJTREG ソースコードのダウンロード
  4. 自分で書いたパッチを適用
  5. OpenJDK と JTREG のビルド
  6. JTREG を使って OpenJDK のテストを実行

今回は、再利用できる部分として1~3 を済ませた Block Storage を作成し、テスト実行時に 4 以降の作業をするようにします。1~3の部分はダウンロード時間がほとんどを占めるため、CPU の量が少ないインスタンスを使えます。

OpenJDK のスクリプト

  1. ビルドやテストに必要なパッケージのインストール
  2. OpenJDK ソースコードのダウンロード
  3. テストツールであるJTREG ソースコードのダウンロード
SRC_BASE_PATH=${1}
sudo yum groupinstall -y "Development Tools"
sudo yum install -y freetype-devel cups-devel libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel alsa-lib-devel libffi-devel autoconf java-1.8.0-openjdk-devel fontconfig-devel java-11-openjdk-devel mercurial
mkdir -p ${SRC_BASE_PATH}
cd ${SRC_BASE_PATH}
hg clone http://hg.openjdk.java.net/jdk/jdk
hg clone http://hg.openjdk.java.net/code-tools/jtreg

4 . 自分で書いたパッチを適用

5 . OpenJDK と JTREG のビルド

SRC_BASE_PATH=${1}
cd ${SRC_BASE_PATH}/jtreg
hg pull -u
bash make/build-all.sh /usr/lib/jvm/java-1.8.0

cd ${SRC_BASE_PATH}/jdk
hg pull -u
patch -p1 < /home/opc/myPatch
bash configure --enable-debug --with-native-debug-symbols=internal --with-boot-jdk=/usr/lib/jvm/java-11 --with-jtreg=${SRC_BASE_PATH}/jtreg/build/images/jtreg
time make images

6 . JTREG を使って OpenJDK のテストを実行

SRC_BASE_PATH=${1}
cd ${SRC_BASE_PATH}/jdk
time make test-tier1

Terraform のスクリプト

環境構築時に実行されて、以後再利用される処理

resource "null_resource" "preparing_task" {
  depends_on = ["oci_core_instance.prepare_instance", "oci_core_volume_attachment.prepare_volume_attach"]
  connection {
    agent       = false
    timeout     = "300m"
    host        = "${oci_core_instance.prepare_instance.public_ip}"
    user        = "opc"
    private_key = "${file("${var.ssh_private_key}")}"
  }
  provisioner "file" {
    source = "script"
    destination = "/home/opc/"
  }
  provisioner "remote-exec" {
    inline = [ <<EOS
sh /home/opc/script/prepareForOpenJDK.sh /src
EOS
    ]
  }
}

ビルドとテストのたびに実行される処理

resource "null_resource" "build_and_test_task" {
  depends_on = ["oci_core_instance.worker_instance", "oci_core_volume_attachment.worker_volume_attach"]
  connection {
    agent       = false
    timeout     = "120m"
    host        = "${oci_core_instance.worker_instance.public_ip}"
    user        = "opc"
    private_key = "${file("${var.ssh_private_key}")}"
  }
  provisioner "file" {
    source = "script"
    destination = "/home/opc/"
  }
  provisioner "file" {
    source = "userdata/myPatch"
    destination = "/home/opc/"
  }
  provisioner "remote-exec" {
    inline = [ <<EOS
sh /home/opc/script/buildOpenJDK.sh /src
sh /home/opc/script/testOpenJDK.sh /src
EOS
    ]
  }
}

全体のソースコードはこちら(sandbox/Terraform/developOpenJDK at master · chiroito/sandbox · GitHub