Jenkins

概要

サーバーアプリケーションに機能を追加するには、開発者がローカルコンピュータで開発を完了し、テストまで行ったうえで、問題がなければユーザーが利用できるよう修正内容をサーバーへ反映する必要がある。ここでサーバーへ反映することをデプロイといい、デプロイのための準備過程をビルドという。

Build とは?

ビルドはサーバーへアップロードできる状態にすることであり、サーバーへアップロードしてユーザーが利用できるようにすることをデプロイという。たとえば Spring Boot アプリケーションを Kubernetes にデプロイする場合、まず Maven や Gradle でビルドして .jar.war を作成し、その後 Docker ビルドで Docker Image を作成する。そして k8s では .yml ファイルに画像バージョンの変更を反映する。

Build を自動化すべき理由

ビルドは 1 日に 1 回行うこともあれば行わないこともあるが、1 週間、1 か月単位で見るとかなり多く行う。これが 1 年になるとかなり多くの時間になる。

たとえば、昔は Java をビルドするときに javac コマンドを直接使用していたが、今は IDEA を利用すれば main() メソッドを実行したときに javac が実行され、その後 java が実行される。このような繰り返しの過程は、ボタン 1 つまたはショートカットで自動化する必要がある。

なぜなら、この作業にも集中力や緊張感などが消耗されるためである。また、ビルドはかなり時間がかかる作業であり、少なくとも 30 秒以上かかる。ビルドを実行してから完了を待つ時間を積み重ねると非常に長い時間になる。

開発者の作業時間を最小化するためには、繰り返し作業をできるだけ自動化する必要がある。

Jenkins 概要

上で説明したように、Jenkins は開発者にとって面倒な開発ソースのビルドを自動化するツールである。

Jenkins
Jenkins 公式サイト

Jenkins は、開発作業の自動化を目的として Java で実装されたオープンソースのサーバーソフトウェア (CI ツール) であり、主に次の 2 つの技術的実現に役立つ。

  • 継続的インテグレーション (CI)
    • ソフトウェア開発プロセス全体の単純作業の自動化。
  • 継続的デリバリー (CD)
    • 継続的インテグレーションで完成したソフトウェアをテスト環境および本番環境へ自動的にデプロイ。

Jenkins 自体は WAR ファイルとして提供され、Apache Tomcat のようなサーブレットコンテナにデプロイして起動できる。また、この WAR ファイルはサーブレットコンテナ機能も含む実行可能形式でビルドされているため、java -jar jenkins.war のように単独で実行することもできる。

Jenkins は AccuRev、CVS、Subversion、Git、Mercurial、Perforce、ClearCase、RTC などの SCM ツールをサポートし、Apache Ant および Apache Maven ベースのプロジェクトだけでなく、任意のシェルスクリプトや Windows バッチコマンドも実行できる。

ビルドはさまざまなトリガーで実行できる。たとえば、バージョン管理システムへのコミット、cron のような仕組みによるスケジューリング、特定のビルド URL へのリクエスト送信で開始できる。また、キュー内の別のビルドが完了したことをトリガーとして次のビルドを実行することもできる。

Jenkins はもともと Sun Microsystems で Hudson という名前で開発された。しかし Oracle が Sun を買収した後、Hudson という名前を商標登録したため Jenkins に改名され、独立したオープンソースプロジェクトとして開発が継続されている。Jenkins の大きな技術的利点の 1 つは拡張可能であることだ。さらにコミュニティは改善要望を非常に歓迎しており、現在 1,200 個以上のプラグインがあり、毎月数百人の開発者が新しいプラグインを作成し公式アップデートセンターで利用できる。

2016 年にはバージョン 2 がリリースされ、継続的デリバリーのためのパイプラインが標準で統合された。Jenkins の開発は活発で、リリースはほぼ毎週行われている。

Jenkins の主な特徴

  • 継続的インテグレーション (CI) および継続的デリバリー (CD)
    • 拡張可能な自動化サーバーであるため、単純な CI サーバーとしても、任意プロジェクトの継続的デリバリーのハブとしても使用できる。
    • Jenkins は Java で開発されたオープンソースの継続的インテグレーションサーバー型ツールである。
    • ソフトウェアのビルド、検証、サーバー設置の一連の流れを自動化できる。
  • 簡単なインストール
    • Jenkins は自己完結した Java ベースのプログラムであり、Windows、Mac OS X、その他 Unix ベース OS 用のパッケージですぐに実行できる。
    • Docker イメージも配布されているため、Docker でそのまま実行できる。
  • 構成しやすい
    • 即時のエラーチェックと組み込みヘルプを含む Web インターフェースを通じて、簡単に設定・構成できる。
  • 多様なプラグイン
    • ビルド環境、ビルド時に変更すべきオプション、開発環境、開発言語はそれぞれ異なる。
    • これらをカバーするために Jenkins は多様なプラグインを提供する。
    • アップデートセンターの 1,800 個以上のプラグインにより、継続的インテグレーションと継続的デリバリーへ多様な機能を統合できる。
    • ジョブ単位で管理でき、プラグインで機能拡張が可能である。
  • 拡張可能
    • プラグインアーキテクチャによって拡張でき、Jenkins でできることに無限の可能性を提供する。
  • ダッシュボード提供
    • さまざまなデプロイ作業の状況を監視できる。
  • デプロイスクリプト実行機能
    • デプロイスクリプトは開発者ローカルでも実行できるが、Jenkins を起動しておけばスケジューリングできる。
  • 分散型
    • 複数のプラットフォームでビルド、テスト、デプロイを迅速に実行できるよう、複数のコンピュータに作業を分散できる。

Jenkins と Hudson

Jenkins プロジェクトはもともと Hudson という名前だったが、Oracle との商標権紛争により Jenkins という名前に変更された。

2004 年、川口耕介は Sun Microsystems の Java 開発者だった。川口は開発作業でビルドを壊すことに疲れ、コードをリポジトリへコミットする前にそのコードが動作するかどうかを知る方法を探していた。そこで、これを可能にする自動化サーバーを Java で開発し、Hudson と名付けた。Hudson は Sun で有名になり、オープンソースとして他企業にも広がった。

2011 年に入ると、Sun を買収した Oracle と独自の Hudson オープンソースコミュニティとの紛争により、Jenkins という新しい名前で分岐することになった。両方の系統は存続したが、Jenkins の方がはるかに活発だった。2014 年に川口は Jenkins ベースの継続的デリバリー製品を提供する CloudBees の CTO になった。

Jenkins の動作環境

前提となる動作環境は次のとおりである。

  • OS
    • Docker
    • Ubuntu / Debian
    • CentOS / Fedora / Red Hat
    • Windows
    • openSUSE
    • FreeBSD
    • macOS
  • ハードウェア最小構成
    • 256 MB RAM
    • 1 GB の空き容量。ただし Jenkins を Docker コンテナで実行する場合は 10 GB 以上を推奨する。
  • ミドルウェア要件
    • Java 8 - JRE または JDK。
    • OpenJDK JDK/JRE 8 - 64 ビット
    • OpenJDK JDK/JRE 11 - 64 ビット
  • 対象ブラウザ
    • Google Chrome
    • Mozilla Firefox
    • Microsoft Edge
    • Apple Safari

Jenkins ライセンス

Jenkins は MIT ライセンスのオープンソースソフトウェアである。MIT ライセンスのソフトウェアは無償で再配布や商用利用などが可能で、他のオープンソースライセンスに比べて制限が非常に緩いライセンスである。

参考