ビルドやテストを自動化してCI(継続的インテグレーション)を実現するJenkins。バージョンや製品ごとの開発環境の切り分けが難しいという課題があったが、コンテナー管理ツール「Docker」を併用することで解決できる。

ワークスアプリケーションズの秋吉真衣氏(左)と遠藤博樹氏(右)
ワークスアプリケーションズの秋吉真衣氏(左)と遠藤博樹氏(右)

 Jenkinsによる自動ビルド・テストの動作環境として、「Docker」で作成したコンテナーを利用する――。ワークスアプリケーションズの遠藤博樹氏(Advanced Technology and Engineering Division 技術基盤開発グループ)は2014年6月、Jenkinsを使ったそんな新しいCI(継続的インテグレーション)の環境を稼働させた。

 同社はERPパッケージソフト「COMPANY」の開発会社。ユーザー企業がそれぞれ導入時のバージョンをそのまま長年使いたいというニーズに応えるため、いくつものバージョンを保守し続けている。

 ただし過去バージョンの保守は、容易でない。バージョンごとに依存するライブラリや、ビルドに必要なバイナリーファイルが異なるからだ。例えば同一の開発用サーバーで、あるバージョンのソースコードのビルドを実行した後に、それより古いバージョンのビルドを実行すると、ライブラリのバージョンが異なりエラーとなる。

 解決策はいくつかあったが、どれも決め手に欠けた。バージョンごとに、専用のビルド・テスト環境をセットアップした開発用サーバーを用意しておくのは、コスト面の負担が大きい。ライブラリ管理ツールを使い、バージョンに合わせて切り替えるには、構成が複雑すぎる。メインのプログラミング言語はJavaだが、一部のモジュールはNode.js、Python、Rubyなどで書かれている。バイナリーファイルが必要なバージョンもある。

Dockerで専用ビルド環境を作成

 そこで遠藤氏が目を付けたのが、コンテナー管理ツールのDockerだ(図1)。開発用サーバーにDockerを導入。ビルド・テストの実行時に、JenkinsがDockerに指示して各バージョンのビルド・テスト環境用コンテナーを作成する形態にした。

図1●JenkinsとDockerを組み合わせてCIを実行
図1●JenkinsとDockerを組み合わせてCIを実行
ワークスアプリケーションズは複数のバージョンを並行して保守開発する必要があり、効率的なCIを実施するためにDockerを採用した
[画像のクリックで拡大表示]

 同社における具体的な流れは以下の通りだ。開発者がバージョン管理ツール(GitLab)の共有リポジトリーにソースコードをチェックインすると、GitLabはそのことをJenkinsに通知する。JenkinsはGitLabから、ソースコードとDockerの設定ファイル(Dockerfile)をチェックアウトする。JenkinsはDockerfileをDockerに読み込ませて、各バージョンに対応したビルド・テスト環境用コンテナーを作成する。

 そのコンテナーの上でソースコードの自動ビルド・テストを実行する。ビルドツールにはMaven、単体テストツールにはJUnit、画面テストツールにはSeleniumを使う。一連の作業が完了したら、Jenkinsはビルド・テスト結果のレポートを作成し、コンテナーを消去する。自動ビルド・テストのたびに、コンテナーを作り、使い捨てる格好だ。

 遠藤氏は「Dockerに起因する技術的な問題は生じていない。最も苦労したのは、既存環境の設定を読み解いてDockerfileを作成する作業だった。開発者が管理者に断らずJenkinsサーバーに手を入れてしまい、ドキュメントに記録されない、勝手な設定変更をすることが多々あった。今後はDockerfileで環境を定義することにより、勝手な設定変更を心配する必要がなくなる」と語る。

 現在は、製品ごとにJenkinsサーバーを立てて運用している。しかしJenkinsとDockerを組み合わせた使い方なら、異なる製品を同一のJenkinsサーバーで自動ビルド・テストすることも可能だ。そのため「今後はJenkinsサーバーを一本化していきたい」(遠藤氏)という。

この先は日経クロステック Active会員の登録が必要です

日経クロステック Activeは、IT/製造/建設各分野にかかわる企業向け製品・サービスについて、選択や導入を支援する情報サイトです。製品・サービス情報、導入事例などのコンテンツを多数掲載しています。初めてご覧になる際には、会員登録(無料)をお願いいたします。