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 関連の作業はシェル化してあるので他のクラウドサービス上でも環境構築できると思います。
OpenJDK の環境を整えてテストを流すために必要な作業は以下のようになります。
- ビルドやテストに必要なパッケージのインストール
- OpenJDK ソースコードのダウンロード
- テストツールであるJTREG ソースコードのダウンロード
- 自分で書いたパッチを適用
- OpenJDK と JTREG のビルド
- JTREG を使って OpenJDK のテストを実行
今回は、再利用できる部分として1~3 を済ませた Block Storage を作成し、テスト実行時に 4 以降の作業をするようにします。1~3の部分はダウンロード時間がほとんどを占めるため、CPU の量が少ないインスタンスを使えます。
OpenJDK のスクリプト
- ビルドやテストに必要なパッケージのインストール
- OpenJDK ソースコードのダウンロード
- テストツールである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)