Java用のユニットテストフレームワークであるJUnitは,Java開発者が使用する最もポピュラーなライブラリのひとつである。JUnitチームは先頃,継続的インテグレーション(CI)にAzure Pipelinesを採用すると発表した。
MicrosoftのOpen Sourceブログの記事では,JUnitのChristian Stein氏が,同チームの独立した3つのCIセットアップをひとつにまとめた経緯について説明している。JUnitはWindows,Linux,MacOS環境で動作する。これまではビルドの生成にJenkins,Travis CI,AppVeyorを使用していたが,統合して簡略化するために,Microsoftのホストするビルドサービスを選択した。
MicrosoftがAzure Pipelinesを一般向けにリリースし,オープンソースプロジェクト用に適当な無償プランが提供されたことから,JUnitチームでは,同サービスがJUnitプロジェクトのビルド,テスト,リリースを単一環境下で実施する上で,必要な技術的要件をすべて満たすものであることをすぐに理解しました。
Azure PipelinesがJUnit 5の公式なCIビルドサービスになったのは,こうした理由によるものです。OpenJDKの最新リリースバージョンや次期OpenJDKの早期アクセスビルドを含む,すべての送信されたプルリクエストのチェックを,主要なオペレーティングシステムであるmacOS,Linux,Windowsの3つに対して実行します。
Azure Pipelinesは,JUnitプロジェクトをビルド(こちらのパイプラインを参照)すると同時に,Sonatypeにストアされたスナップショットリリースの更新も実施する。将来的には,安定バージョンのMaven Centralへのリリースも検討されている。
MicrosoftのAzure Pipelinesは,複数のプログラム言語と並行ジョブをLinux,MacOS,Windows上でサポートする。JUnitなどのオープンソースプロジェクトに対しては,無償で10の並行ジョブを,月間の使用時間の制限なしで提供している。オープンソースプロジェクトを運用していないユーザに対しては,ひとつのジョブを月間1,800分まで無償で提供し,以降は追加ジョブ毎に40ドルが課金される。同等なサービスであるAWS CodePipelieの料金は,パイプライン当たり月額1.00ドルである。GoogleのCloud Buildサービスは1日当たりビルド時間120分を無償で提供し,それ以降は1分当たり0.0034ドルが課金される。
InfoQはMicrosoftのBruno Borges氏にコンタクトを取り,この有力JavaプロジェクトのCIマイグレーションについて詳しく聞いた。
InfoQ: Azure PipelinesがJUnitのビルドに使用されるようになりましたが,リポジトリへのリリースはまだ別に処理されているのでしょうか?
Bruno Borges: 現時点ではビルドとテスト,スナップショットのリリースに使用しています。これらは現在,Sonatypeの公開リポジトリにホストされています。次のステップでは,Maven Centralへの安定版/最終版リリースの公開に使用する予定です。
InfoQ: 確認したいのですが,単一のパイプラインでWindows/Mac/Linuxビルドを処理するということは,ロジックに重複がないということなのでしょうか?
Borges: そのとおりです。パイプライン全体は2つのファイルに定義されています。ひとつにはビルドジョブと,ジョブ間の依存関係を含む条件が定義されていて,もうひとつのファイルにはプロジェクトをビルドするための特別なGradleセットアップが記述sれています。このファイルは任意のプラットフォームで動作するように設定されているので,Gradleのビルド手順は再利用が可能なのです。
InfoQ: ビルドジョブの主要なコンポーネントは何ですか?Azure Pipelinesの組み込み機能を使っているのでしょうか,あるいはスクリプトや独自のアクティビティを呼び出しているのですか?
Borges: 私たちはJUnitチームに対して,可能な限り最小限の変更で現在の設定に移行できるような支援を行いました。それを達成する上では,シェルスクリプトの使用に重きを置きました。彼らのプロジェクトがすでにGradle Wrapperで設定されていたからです。注目すべきなのは,ビルドエージェント(VM)内でプロジェクトをビルドするために,Dockerコンテナの使用がサポートされていることです。これによって,OpenJDK 12がビルドエージェントにインストールされていない場合でも,手動でインストールする必要はなくなりました。Dockerイメージを指定するだけで,OpenJDK 12でJUnitを簡単にテストすることができます。
InfoQ: 現在と比べて,以前はビルドにどれくらいの時間がかかったのですか?現在のソリューションと比較して,コスト的な違いはあるのでしょうか?
Borges: JUnitチームではGradleのビルドスキャンを評価して,パフォーマンスが以前のCIセットアップよりも約2~3倍高速だという結論を出しています。ビルドジョブはさらに,Linux,Windows,Macで並列して実施されるので,プロジェクトのビルド結果の検証が短時間で得られるようになりました。
InfoQ: JUnitチームでは他の部分でもAzureを使用しているのでしょうか,あるいはAzure DevOpsのみですか?
Borges: 他にも有効な分野があるかも知れないので,今後も検討は続けていきます。ですが現時点では,JUnitチームはAzure Pipelinesで十分満足しているので,当面はこのオープンソースでの採用を続けていく予定です。他のオープンソースプロジェクトでAzure Pipelinesを試してみたいところがあれば,最初のガイダンスとして私に連絡頂ければと思います。