Jenkinsは、ビルド・テスト・静的解析・デプロイなどソフトウェア開発の反復作業を自動化するオープンソースの自動化サーバーです。Javaで実装されたコア(core)と、CLI・Remoting・WAR配布を組み合わせたマルチモジュールMavenプロジェクトとして構成されています。2,000件を超えるプラグインでビルド以外の連携も拡張できます。
リポジトリはMavenのマルチモジュール構成で、core(hudson.model・Extensionなど拡張点)、cli(コマンドラインクライアント)、bom(依存バージョン管理)などに分かれています。core/pom.xmlはjenkins-bomから共通依存(Guava、XStream、Spring Frameworkなど)を継承し、Groovy・Antlr4(ラベル式やcron式のパーサー)・Jelly(画面テンプレート)を使ってビルド設定やUIを構築します。cli/src/main/java/hudson/cli/CLI.javaはWebSocket(Tyrus)やSSH(Mina sshd)経由でJenkinsサーバーに接続し、レスポンスヘッダー「X-Jenkins」の有無で接続先が本物のJenkinsか検証する仕組みになっています。ExtensionPoint・Extensionアノテーションによるプラグイン機構がコアの中心で、PluginManagerやClassicPluginStrategyがプラグインのロードと分離クラスローディングを担います。
- STEP 01
mvnw(または既存Maven)で `mvn -pl war,core,cli -am package` を実行すると、core・cli・war各モジュールが順にコンパイルされ、依存解決にjenkins-bomが使われるのを確認します。
- STEP 02
生成された `war/target/jenkins.war` を `java -jar jenkins.war` で起動すると、初回はセットアップウィザードとインストール用の初期管理者パスワードがコンソールに表示されます。
- STEP 03
ブラウザで `http://localhost:8080` にアクセスすると、Jelly/Staplerベースの管理画面が表示され、推奨プラグインのインストール画面へ進みます。
- STEP 04
`java -jar cli/target/cli-*.jar -s http://localhost:8080/ help` のようにCLIを実行すると、CLI.javaのverifyJenkinsConnectionがX-Jenkinsヘッダーを確認し、対象が本物のJenkinsでない場合はNotTalkingToJenkinsExceptionで終了します。
- STEP 05
`mvn test -pl cli` を実行すると、CLIConnectionFactoryTestやHexDumpTestなどJUnit5ベースの単体テストが走り、Basic/Bearer認証ヘッダー生成やバイナリダンプ表示のロジックが検証されます。
手元には、単体で動くJenkins本体(war)と、そこに接続してジョブ操作やプラグイン管理を行えるCLIクライアントが揃います。coreモジュールのExtensionPoint機構により、2,000件規模のプラグインエコシステムへ接続できる土台が確認できます。
core/pom.xmlやcli/pom.xmlに記載の依存バージョン(Spring Framework 7.0.9、Mina sshd 2.19.0など)はJavaの実行環境やメモリを一定量要求するため、フルビルドにはそれなりのマシンリソースと時間がかかります。
README記載のとおり公式配布はweekly版とLTS版の2系統があり、ソースから直接buildする場合はどちらのブランチ・タグを使うかで挙動が変わる可能性があります。
cli/src/test配下には鍵ファイル(dsa、rsa、ed25519など)が多数含まれており、SSH認証テストのために使われますが、これらは開発・テスト専用の想定で本番鍵として使い回すべきではありません。
CI/CDパイプラインを自前でホストしたいチームや、既存のJenkins環境に対してCLI・API連携ツールを開発したいエンジニアに向いています。core・cli・bomという明確なMavenモジュール分割と、実際に動くJUnitテスト(CLIConnectionFactoryTestなど)がソース上で確認できるため、READMEの説明とコードの実装が一致していると判断できます。ソースツリーの規模と依存管理の緻密さから、個人の小規模自動化よりも組織的なビルドインフラ用途を想定した設計だと読み取れます。