お金をかけずにサーバーの勉強をしよう

Jenkinsインストール

2024年5月6日

メニューへ戻る

CI/CD(Continuous Integration / Continuous Delivery)するぞ!
(プログラマじゃないけど)

サーバーエンジニアのお仕事には本番環境の設計や運用がありますが、開発チーム用のサーバー環境のお守りも大切な仕事です。

昔は本番環境と寸分違わぬ開発環境を作っておけば良かったのですが、最近はプログラムの作成開始から本番環境への反映までを自動化するのが流行っており、
CI/CD(Continuous Integration / Continuous Delivery)という言葉で語られている環境が求められるようになってきました。

CI/CD環境は一連の作業を部分的に自動化する手法が段々と繋がってきて、今や本番環境への反映(Delivery)まで自動で行うことができるようになっています。

ここでは CI/CD界でも名を馳せていて、かつ(最初に)日本人が作ったツールを導入してみたいと思います。

これがそれ。
Jenkins

どこかで目にしたことはあるんじゃないかと思います。

ここでは簡単な Javaのプロジェクトを作成して、

Lubuntu(ローカル開発環境)
 → GitBucket(ソース管理)
   → Jenkins(プロジェクトビルド・テスト)

という開発からテストまでの自動化の流れを実体験したいと思います。

前提となる、Ubuntu Server 24.04のインストールは「Ubuntu 24.04 Server インストール」に、GitBucketのインストールは「GitBucket インストール」にそれぞれ書いています。


0.snap版 Jenkins

先に私が環境構築の際に四苦八苦して結局結果を得られなかった事を書いておきます。

具体的には、Ubuntu 24.04環境に snap版 Jenkinsを導入したけど待ち受るポート番号を変えられませんでした、という話になります。

必要ない人はこの段は読み飛ばして「1.環境」まで飛んで頂いて問題ありません。

Jenkinsのダウンロードページがこちら。
Download and deploy

ここによると 2024年5月6日現在で LTS版の最新バージョンは 2.440.3、
「Weekly releases」って超最新版が 2.456です。

Ubuntuでのパッケージインストールはご存知の通り、aptと snapの 2種類を常に意識しますが、調べたところ aptリポジトリには Jenkinsがありませんでした。

それで snapの Jenkinsのパッケージの情報を取ってみました。

subro@Lubuntu2404:~$ snap info jenkins
name:      jenkins
summary:   Jenkins automation server -  Build great things at any scale
publisher: Snapcrafters✪
store-url: https://snapcraft.io/jenkins
contact:   https://github.com/snapcrafters/jenkins/issues
license:   Apache-2.0
description: |
  Jenkins is the leading open-source automation server. Built with Java, it provides over 1000
  plugins to support automating virtually anything, so that humans can actually spend their time
  doing things machines cannot.

  **Authors**

  This snap is maintained by the Snapcrafters community, and is not necessarily endorsed or
  officially maintained by the upstream developers.
snap-id: TKjv5xnnKfr2MgxFRoWWNqHuQCJOrIU4
channels:
  latest/stable:    2.456 2024-05-01 (4661) 198MB classic
  latest/candidate: 2.456 2024-05-01 (4661) 198MB classic
  latest/beta:      ↑
  latest/edge:      ↑

個人的には LTS版を使いたいのですが、Ubuntu 24.04の最新状態で snapパッケージは 5月1日にできた 2.456が LTSとなってるんですよね。
(というより今の所 2.456しかパッケージがない)

ちょっと微妙な気もしますが「Jenkinsのホームページの記載の変更が遅れてるのだろう」と勝手に納得して、こちらを使うことにします。

以下のようなセットになります。

Jenkinsは Javaでできていますが、当パッケージは OpenJDK 17を内包しているので、Javaランタイムのインストールは不要です。

snapパッケージをインストールします。

subro@UbuntuServer2404-1:~$ sudo snap install jenkins --classic
jenkins 2.456 from Snapcrafters✪ installed

インストールできました。

インストールにより systemd用のサービスユニットファイルもできていますが、名前が「snap.jenkins.jenkins.service」となっていますのでご注意ください。

もう立ち上がっているはずなので状態を見てみます。

subro@UbuntuServer2404-1:~$ systemctl status snap.jenkins.jenkins.service
● snap.jenkins.jenkins.service - Service for snap application jenkins.jenkins
     Loaded: loaded (/etc/systemd/system/snap.jenkins.jenkins.service; enabled; preset: enabled)
     Active: active (running) since Fri 2024-05-03 18:30:30 JST; 17min ago
   Main PID: 3217 (launch)
      Tasks: 49 (limit: 9387)
     Memory: 779.9M (peak: 789.7M)
        CPU: 33.377s
     CGroup: /system.slice/snap.jenkins.jenkins.service
             ├─3217 /bin/bash /snap/jenkins/4661/launch
             └─3234 /snap/jenkins/4661/usr/lib/jvm/java-17-openjdk/bin/java -DJENKINS_HOME=/var/snap/jenkins/4661 -Djava.awt.headless=true -jar /snap/jenkins/4661/jenkins.war

 5月 03 18:30:38 UbuntuServer2404-1 jenkins.jenkins[3234]: Please use the following password to proceed to installation:
 5月 03 18:30:38 UbuntuServer2404-1 jenkins.jenkins[3234]: 6cbb8fbf3cd9475583b205e33d8df947
 5月 03 18:30:38 UbuntuServer2404-1 jenkins.jenkins[3234]: This may also be found at: /var/snap/jenkins/4661/secrets/initialAdminPassword
 5月 03 18:30:38 UbuntuServer2404-1 jenkins.jenkins[3234]: *************************************************************
 5月 03 18:30:38 UbuntuServer2404-1 jenkins.jenkins[3234]: *************************************************************
 5月 03 18:30:38 UbuntuServer2404-1 jenkins.jenkins[3234]: *************************************************************
 5月 03 18:31:05 UbuntuServer2404-1 jenkins.jenkins[3234]: 2024-05-03 09:31:05.761+0000 [id=52]        INFO        h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
 5月 03 18:31:05 UbuntuServer2404-1 jenkins.jenkins[3234]: 2024-05-03 09:31:05.762+0000 [id=52]        INFO        hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1
 5月 03 18:31:10 UbuntuServer2404-1 jenkins.jenkins[3234]: 2024-05-03 09:31:10.416+0000 [id=32]        INFO        jenkins.InitReactorRunner$1#onAttained: Completed initialization
 5月 03 18:31:10 UbuntuServer2404-1 jenkins.jenkins[3234]: 2024-05-03 09:31:10.432+0000 [id=25]        INFO        hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running

立ち上がっていました。

[8080/tcp]で待ち受けていますが、当実験環境では GitBucketがこのポートを使う事になってますので、具合が良くありません。
(先に GitBucketが立ち上がっていたら、Jenkinsは起動に失敗したはずです。)

[8081/tcp]で待ち受けるように設定変更したいです。

インターネットで取れた情報では、Jenkinsの待受ポートを変更する方法は以下があるようなんで、以下の両方をやってみましたがダメでした。

1[/etc/default]ファイルに
[JENKINS_PORT]変数を設定しておく。
古いバージョンのやり方で
今は通用しなさそう
2systemdの Jenkins用の
サービスユニットファイルに
Environment="JENKINS_PORT=xxxx"
を設定しておく。
snapパッケージに
反映されなさげ。

ここで snap版 Jenkinsを紐解いてみると、OS起動時に systemd → snapd ときて、実際に実行されているのは [/snap/jenkins/current/launch]スクリプトで以下の内容になっています。

#!/bin/bash

$SNAP/usr/lib/jvm/java-17-openjdk/bin/java -DJENKINS_HOME="$SNAP_DATA" -Djava.awt.headless=true -jar $SNAP/jenkins.war

ここの最後に [--httpPort=8081] と入れてやれれば、できるんです、きっと。

しかし snapはサンドボックス環境で動くもので、snap管理下のファイルをユーザーが直接イジるのを抑止したいという思想があると思われます。

管理対象を snapを通さず直接修正するのは NGなんでしょうし、それに仕組みが良く分からないんですが snap管理下のディレクトリって「リードオンリーでマウント」という形になっていて、[root]ユーザーでもファイルの変更ができないものがありますので。

そして snap版 Jenkinsには [launch]スクリプト以外で実行可能なものに、奇妙なスクリプトが 1つだけ用意されています。
それがこれ。
[/snap/jenkins/current/jenkins-config]

#!/bin/sh -e

err () {
    echo "$1" >&2
}

if [ -z "$SNAP_DATA" ]; then
    err "SNAP_DATA not set."
    exit 1
fi

if [ ! -w "$SNAP_DATA" ]; then
    err "Please re-run as root:"
    err "\`cat config.xml | sudo /snap/bin/jenkins.config\`"
    exit 1
fi

if [ -t 0 ]; then
    err "This tool lets you replace the Jenkins configuration file:"
    err "\`cat config.xml | sudo /snap/bin/jenkins.config\`"
    err ""
    err "You will need to restart Jenkins to pick up any changes:"
    err "\`servicectl restart snap.jenkins.jenkins.service\`"
    err ""
    err "You can access Jenkins from your web browser at http://localhost:8080"
    exit 1
else
    if [ -e "$SNAP_DATA/config.xml" ] && [ "-f" != "$1" ]; then
        err "Sorry, Jenkins already has configuration data."
        err ""
        err "If you wish to overwrite it, run:"
        err "\`cat config.xml | sudo /snap/bin/jenkins.config -f\`"
        exit 1
    fi
    cat - > "$SNAP_DATA/config.xml"
fi

どうも Jenknisのホームディレクトリにある [config.xml] を丸々上書きするためのものに見えます。

もしかするとこのスクリプトを使って [config.xml]ファイルを書き換える他に Jenkins起動時の設定を変更する方法が無いのかも知れません。

ちなみに snap版 Jenkinsのホームは [/var/snap/jenkins/current]ディレクトリになっていて、ここにジョブのデータなんかが入ってきますね。

ここにある [config.xml]ファイルが、Jenkinsのグローバル設定ファイルであり、上記スクリプトで上書きできるファイルのようです。
デフォルトの内容は以下の通り。

<?xml version='1.1' encoding='UTF-8'?<
<hudson<
  <disabledAdministrativeMonitors/>
  <version>2.456</version>
  <numExecutors>2</numExecutors>
  <mode>NORMAL</mode>
  <useSecurity>true</useSecurity>
  <authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">
    <denyAnonymousReadAccess>true</denyAnonymousReadAccess>
  </authorizationStrategy>
  <securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
    <disableSignup>true</disableSignup>
    <enableCaptcha>false</enableCaptcha>
  </securityRealm>
  <disableRememberMe>false</disableRememberMe>
  <projectNamingStrategy class="jenkins.model.ProjectNamingStrategy$DefaultProjectNamingStrategy"/>
  <workspaceDir>${JENKINS_HOME}/workspace/${ITEM_FULL_NAME}</workspaceDir>
  <buildsDir>${ITEM_ROOTDIR}/builds</buildsDir>
  <jdks/>
  <viewsTabBar class="hudson.views.DefaultViewsTabBar"/>
  <myViewsTabBar class="hudson.views.DefaultMyViewsTabBar"/>
  <clouds/>
  <scmCheckoutRetryCount>0</scmCheckoutRetryCount>
  <views>
    <hudson.model.AllView>
      <owner class="hudson" reference="../../.."/>
      <name>all</name>
      <filterExecutors>false</filterExecutors>
      <filterQueue>false</filterQueue>
      <properties class="hudson.model.View$PropertyList"/>
    </hudson.model.AllView>
  </views>
  <primaryView>all</primaryView>
  <slaveAgentPort>-1</slaveAgentPort>
  <label></label>
  <crumbIssuer class="hudson.security.csrf.DefaultCrumbIssuer">
    <excludeClientIPFromCrumb>false</excludeClientIPFromCrumb>
  </crumbIssuer>
  <nodeProperties/>
  <globalNodeProperties/>
  <nodeRenameMigrationNeeded>false</nodeRenameMigrationNeeded>


このデフォルトファイルを改変したファイルを用意し、パイプで上記スクリプトに渡してやれば [config.xml]ファイルを上書きできますが、そもそもこのXMLファイルで HTTPポートの番号を変更できるのか、書き方も分かりません
(Jenkins Features Controlled with System Propertiesに [config.xml]ファイルに設定できそうなプロパティの情報があるものの、httpポートに関するプロパティは無いように見えます。)

随分情報を探してみたんですが、どうにも見つけることができませんでした。

snapコマンドで環境変数 [JENKINS_PORT] を Jenkinsに渡せるかも調べましたが、これも分からず。

この時点で snap版の利用は諦めることにしました。

[8080/tcp]で使えば問題ないのでしょうが、他にも変更したい何かが発生した場合、都度面倒が出そうだったので…。

なお、stackoverflowには以下の質問が投げられていましたが、誰からも反応が無いところからしても、手がないのかも知れません。
How do you pass startup options to Jenkins on Ubuntu when it has been installed through snap?

できないことを確信するための調査に随分時間を費やしてしまいました。

ただ、snap版の Jenkinsがダメということではなく、デフォルトのままで使うなら手間が無くて良いと思います。

それにしても…Ubuntuが24.04になっても snapの洗礼を受けて疲れました。


1.環境

利用する OSなどのバージョンはこんな感じで。

ソースプログラム作成Lubuntu 24.04
ソースプログラム履歴管理Ubuntu Server 24.04
GitBucket 4.40.0
プロジェクトビルド・テストUbuntu Server 24.04
Jenkins 2.440.3
 OpenJDK 17もインストール対象)
Javaプログラムのビルドには OpenJDK 21を使います


最終的にはこういう構成にしたいです。
構成
GitBucketのサーバーと Jenkinsのサーバーを分けたかったのですが、検証に使っている VMware Workstation Playerが動いている PCのメモリが足りなくなりそうなので、1つのサーバーで凌ぐことにしました。


2.Jenkinsインストール

snap版の導入は諦め、と言って Ubuntuの aptリポジトリには Jenkinsが無いので、Jenkinsの aptリポジトリからパッケージを導入することになります。

Ubuntuでのインストールの仕方はこちら。
Jenkins Debian Packages

これに従ってインストールします。

Jenkinsの aptリポジトリサーバーを証明する公開鍵をダウンロードします。

subro@UbuntuServer2404-1:~$ sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
    https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
--2024-05-06 11:41:54--  https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
pkg.jenkins.io (pkg.jenkins.io) をDNSに問いあわせています... 2a04:4e42:8c::645, 146.75.114.133
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 3175 (3.1K) [application/pgp-keys]
‘/usr/share/keyrings/jenkins-keyring.asc’ に保存中

/usr/share/keyrings/jenkins-keyring.asc          100%[=====================>]   3.10K  --.-KB/s    in 0s

2024-05-06 11:41:55 (8.84 MB/s) - ‘/usr/share/keyrings/jenkins-keyring.asc’ へ保存完了 [3175/3175]

subro@UbuntuServer2404-1:~$ ls -l /usr/share/keyrings/jenkins-keyring.asc
-rw-r--r-- 1 root root 3175  3月 28  2023 /usr/share/keyrings/jenkins-keyring.asc

ダウンロードできました。

Jenkinsのリポジトリ情報をOSに登録します。

subro@UbuntuServer2404-1:~$ echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
    https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
    /etc/apt/sources.list.d/jenkins.list > /dev/null

subro@UbuntuServer2404-1:~$ cat /etc/apt/sources.list.d/jenkins.list
deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/

登録できました。

新しくリポジトリに登録されたので、パッケージ情報を最新にします。

subro@UbuntuServer2404-1:~$ sudo apt-get update
無視:1 https://pkg.jenkins.io/debian-stable binary/ InRelease
取得:2 https://pkg.jenkins.io/debian-stable binary/ Release [2,044 B]
取得:3 https://pkg.jenkins.io/debian-stable binary/ Release.gpg [833 B]
取得:4 https://pkg.jenkins.io/debian-stable binary/ Packages [26.7 kB]
ヒット:5 http://jp.archive.ubuntu.com/ubuntu noble InRelease
取得:6 http://jp.archive.ubuntu.com/ubuntu noble-updates InRelease [89.7 kB]
ヒット:7 http://security.ubuntu.com/ubuntu noble-security InRelease
ヒット:8 http://jp.archive.ubuntu.com/ubuntu noble-backports InRelease
無視:9 https://download.webmin.com/download/newkey/repository stable InRelease
ヒット:10 https://download.webmin.com/download/newkey/repository stable Release
119 kB を 2秒 で取得しました (54.4 kB/s)
パッケージリストを読み込んでいます... 完了

Jenkinsの前提になってるであろう [fontconfig]・[openjdk-17-jre]パッケージをインストールします。
(これをやると OSの最優先 Javaバージョンが 17になってしまい、GitBucketのために入ってる 21との関係もありますから、後でちょっと調整が必要です。)

subro@UbuntuServer2404-1:~$ sudo apt-get -y install fontconfig openjdk-17-jre
〜〜〜 省略 〜〜〜

インストールできました。

Jenkinsをインストールします。

subro@UbuntuServer2404-1:~$ sudo apt-get -y install jenkins
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  net-tools
以下のパッケージが新たにインストールされます:
  jenkins net-tools
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 1 個。
91.6 MB 中 0 B のアーカイブを取得する必要があります。
この操作後に追加で 94.4 MB のディスク容量が消費されます。
以前に未選択のパッケージ net-tools を選択しています。
(データベースを読み込んでいます ... 現在 128760 個のファイルとディレクトリがインストールされています。)
.../net-tools_2.10-0.1ubuntu4_amd64.deb を展開する準備をしています ...
net-tools (2.10-0.1ubuntu4) を展開しています...
以前に未選択のパッケージ jenkins を選択しています。
.../jenkins_2.440.3_all.deb を展開する準備をしています ...
jenkins (2.440.3) を展開しています...
net-tools (2.10-0.1ubuntu4) を設定しています ...
jenkins (2.440.3) を設定しています ...
man-db (2.12.0-4build2) のトリガを処理しています ...
Scanning processes...
Scanning linux images...

Running kernel seems to be up-to-date.

No services need to be restarted.

No containers need to be restarted.

No user sessions are running outdated binaries.

No VM guests are running outdated hypervisor (qemu) binaries on this host.

インストールできました。
[net-tools]は使わないで頑張ってきたのにインストールされてしまいましたなぁ…。

実際に使う前に、待ち受けるポートを [8081/tcp]に変えてしまいます。
(既に GitBucketを立ち上げていた人はここでエラーが出ると思いますが、放っておいて良いです。)

いくつかの方法でポート変更ができるようですが、systemdのサービスユニットファイルを変更する方法でやってみます。

今回入れたパッケージでは、systemdの wantsという仕組みを利用して
[/etc/systemd/system/multi-user.target.wants]ディレクトリ経由で、
[/usr/lib/systemd/system/jenkins.service]ファイルを使うようになっていました。

このファイルを以下の通り変更します。

Environment="JENKINS_PORT=8080"
  ↓
Environment="JENKINS_PORT=8081"

サービスユニットファイルを書き換えたので、これをやります。

subro@UbuntuServer2404-1:~$ sudo systemctl daemon-reload

何も出ませんが、良いはず。

Jenkinsを再起動します。

subro@UbuntuServer2404-1:~$ sudo systemctl restart jenkins.service

これも何も出ませんが、再起動しているはずですので確認します。

subro@UbuntuServer2404-1:~$ systemctl status jenkins.service
● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded (/usr/lib/systemd/system/jenkins.service; enabled; preset: enabled)
     Active: active (running) since Mon 2024-05-06 12:28:20 JST; 14s ago
   Main PID: 3825 (java)
      Tasks: 50 (limit: 9387)
     Memory: 2.1G (peak: 2.1G)
        CPU: 29.833s
     CGroup: /system.slice/jenkins.service
             └─3825 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8081

 5月 06 12:26:56 UbuntuServer2404-1 jenkins[3825]: Jenkins initial setup is required. An admin user has been created and a password generated.
 5月 06 12:26:56 UbuntuServer2404-1 jenkins[3825]: Please use the following password to proceed to installation:
 5月 06 12:26:56 UbuntuServer2404-1 jenkins[3825]: 68a3cd6d47794bd0bbc4b776064e6d56
 5月 06 12:26:56 UbuntuServer2404-1 jenkins[3825]: This may also be found at: /var/lib/jenkins/secrets/initialAdminPassword
 5月 06 12:26:56 UbuntuServer2404-1 jenkins[3825]: *************************************************************
 5月 06 12:26:56 UbuntuServer2404-1 jenkins[3825]: *************************************************************
 5月 06 12:26:56 UbuntuServer2404-1 jenkins[3825]: *************************************************************
 5月 06 12:28:20 UbuntuServer2404-1 jenkins[3825]: 2024-05-06 03:28:20.318+0000 [id=42]        INFO        jenkins.InitReactorRunner$1#onAttained: Completed initialization
 5月 06 12:28:20 UbuntuServer2404-1 jenkins[3825]: 2024-05-06 03:28:20.363+0000 [id=34]        INFO        hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running
 5月 06 12:28:20 UbuntuServer2404-1 systemd[1]: Started jenkins.service - Jenkins Continuous Integration Server.

良いjんじゃないでしょうか。

[/usr/bin/java]のバージョンは OpenJDK 17 JREをインストールしたのに、21のままになっていました。
どうやら Java 21で実行されているようですが大丈夫かな?

とりあえず様子見しながら使ってみます。


3.Jenkins初期設定

WEBブラウザでアクセスしてみましょう。
私の環境では [http://UbuntuServer2404-1:8081] になります。

最初にこんな画面になります。
[/var/lib/jenkins/secrets/initialAdminPassword]ファイルに書いてある初期パスワードを入れてContinueを押します。
([jenkins]ユーザーしか参照できません)
Jenkins画面 1

プラグインのインストール選択画面です。
とりあえずお勧めだけ入れましょう。
Install suggested pluginsを押します。
Jenkins画面 2

プラグインのダウンロードとインストール中です。
待ちます。
Jenkins画面 3

管理ユーザーを作れといいますので作ります。
OSのユーザーとは関係なく、Jenkinsのユーザー管理上のユーザーとなります。
一通り入力したら、Save and Continueを押します。
Jenkins画面 4

外に見せる URLを決めます。
変更したポートは正しくなっていますし、このままでSave and Finishを押します。
Jenkins画面 5

Start using Jenkinsを押します。
Jenkins画面 6

こんな画面になりました。
Jenkins画面 7

環境構築としてはこれで完了です。


4.テスト用 Javaプログラム作成

クライアントPCの Lubuntuで Javaのテストプログラムを作りました。

Spring Initializr を使って Mavenプロジェクト [jenkinstest] を作りました。

subro@Lubuntu2404:~/NetBeansProjects$ tree jenkinstest
jenkinstest/
├── HELP.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── org
    │   │       └── subro
    │   │           └── jenkinstest
    │   │               ├── JenkinSushi.java
    │   │               └── JenkinstestApplication.java
    │   └── resources
    │       └── application.properties
    └── test
        └── java
            └── org
                └── subro
                    └── jenkinstest
                        └── JenkinstestApplicationTests.java


やりたいのは作成した [JenkinSushi]クラス([JenkinSushi.java]ファイル)のユニットテストで、JUnitのテストコードを [JenkinstestApplicationTests.java]ファイルに書きました。

[JenkinSushi.java]

package org.subro.jenkinstest;

public class JenkinSushi {

    private String sushi;

    JenkinSushi() {
        this.sushi = "magro";
    }

    public String getSushi() {
        return sushi;
    }

    public void setSushi(String sushi) {
        this.sushi = sushi;
    }

}


[JenkinstestApplicationTests.java]

package org.subro.jenkinstest;

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class JenkinstestApplicationTests {

        JenkinSushi test;

        @BeforeEach
        void beforeJenkinSushi() {
            this.test = new JenkinSushi();
        }

        @Test
        void constructorTest() {
            assertEquals(this.test.getSushi(), "magro");
        }

}

Lubuntu上でのテストは済ませてあります。


5.GitBucketリポジトリ化

手順としては

  1. GitBucketで [jenkinstest]リポジトリを作る。
  2. Lubuntuローカルの [jenkinstest]プロジェクトで git init コマンドで gitの初期化をする。
  3. Lubuntuローカルの [jenkinstest]プロジェクトで git remote add origin コマンドで、リモートリポジトリを登録する。
  4. Lubuntuローカルの [jenkinstest]プロジェクトでコミットした内容を git push コマンドで GitBucketの [jenkinstest]リポジトリに反映させる。

となります。

GitBucket周りは「GitBucket インストール」に書いていますが、git自体の使い方については別途お勉強して頂かないと意味が分からないかも知れません。

その結果、GitBucketではこんなリポジトリ状態になりました。
[jenkintest[リポジトリ

GitBucketには [jenkinstest]リポジトリ管理者の [subro]ユーザがいますが、Jenkinsからもアクセスしますので [jenkins]ユーザーを新規に作り、コラボレーターとして [Developer]扱いにしています。
[jenkinstest]リポジトリのコラボレーター



6.Jenkinsジョブ作成(GitBucket連携設定)

5で作った GitBucketのリポジトリに変更が入ったら、プロジェクトのビルドとテストまでを Jenkinsにやってもらうことにしましょう。

そして、ユニットテストで引っかかったら分かるようにしたいです。

Jenkinsの画面に戻りまして、画面左上の[+ 新規ジョブ作成]をクリックします。
Jenkins画面 8

ジョブ名に適当な名前を入れ、[フリースタイル・プロジェクトのビルド]を選択し、画面下のOKを押します。
Jenkins画面 9

次のような画面になります。
設定項目は色々ありますが、赤枠のところを設定していきます。

[ソースコード管理] で [git] を選択し、GitBucketの [リポジトリ URL] を入れますと GitBucketにログインするための認証情報を求められます。

GitBucketへログインするための IDとパスワードを登録しますが、ここに直接書くのではなく他のジョブで使い回せるようジョブとは別管理の設定となっていて、それを呼び出す形になっています。

+ 追加を押します。
[Jenkins] とメニューが 1項目だけ出ますので、それを選んでください。
Jenkins画面 10

とりあえず [ユーザー名] と [パスワード] だけ設定しておけば OKです。
[ID] は Jenkins内でこの認証情報を区別するための名前です。
追加を押します。
Jenkins画面 11

そうするとさっきの箇所のプルダウンから選べるようになります。
Jenkins画面 12

[ビルド・トリガ] では、ソースプログラムに変更があったのを起点として開始したいので、[SCMをポーリング] を選択します。
[スケジュール] には cronの書式を入れます。
とりあえず [* * * * *](毎分を表す)と入れました。
小うるさいワーニングの [H * * * *] は毎時ですね。
Jenkins画面 13

[jenkinstest]プロジェクトは Mavenで作られているので、[Build Steps] では、[ビルド手順の追加]プルダウンから [Mavenの呼び出し] を選択します。
Jenkins画面 14

[ゴール] には Mavenのゴールとして指定できるものを入れます。
今回はテストまでなので「test」と入れました。 Jenkins画面 15

[ビルド後の処理] で JUnitのテスト結果を拾うようにします。
[ビルド後の処理の追加]プルダウンから [JUnitテスト結果の集計] を選択します。
Jenkins画面 16

[テスト結果XML] は Spring Bootの Mavenプロジェクトの場合は
[target/surefire-reports/*.xml] とします。
画面一番下の保存を押します。
Jenkins画面 17

ジョブができあがりました。
手動でビルドをしてみます。
左にある [ビルド実行] をクリックします。
Jenkins画面 18

ちょっと待つと左下の [ビルド履歴] に新しい行が現れました。
[#x] をクリックするとその回のビルドの詳細情報を得られます。
(いきなり #11になっている所に突っ込んではいけません) Jenkins画面 19

ビルド実行を 3回繰り返した後の絵です。
[テスト結果の推移] に履歴からの実行結果グラフが表示されています。
Jenkins画面 20


7.ソース変更からの自動ビルド&テストの確認

これでソースファイルを更新して、GitBucketにプッシュしてやれば、Jenkinsでは自動的にビルド・テストを行うはずです。

確認のためにソースを修正します。

Lubuntuにてテストコードに [setSushi]メソッドのテストを追加しました。

[JenkinstestApplicationTests.java]

package org.subro.jenkinstest;

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class JenkinstestApplicationTests {

        JenkinSushi test;

        @BeforeEach
        void beforeJenkinSushi() {
            this.test = new JenkinSushi();
        }

        @Test
        void constructorTest() {
            assertEquals(this.test.getSushi(), "magro");
        }

        @Test
        void setSushiTest() {
            test.setSushi("ika");
            assertEquals(this.test.getSushi(), "ika");
        }

}

寿司の内容をイカに変えています。

これで GitBucketにプッシュまでやりまして、GitBucketではこのような画面に。
ソース修正後

このあと Jenkinsの [jenkinstestのリグレッションテスト]ジョブを見てみると、自動的に新しいビルド(#14)が実行された結果、このような画面になっていました。
Jenkins画面 21

これで一通りの連携ができたことが確認できました。


==========
このような感じで、Jenkinsによる Javaのプロジェクトのテストができたわけです。

他にも Dockerコンテナを立ち上げて様々なテスト環境に対応するとか、Seleniumで WEB画面経由でのテストをするとか、色々なものとの繋ぎが得意なツールでもあります。

工夫次第で様々なテストに使える強力なツールであることは間違いないので、クライアントPCで実行している人もいるようですね(Javaがあれば動くので Windowsも可)。


ただ snap版の Jenkinsには参りましたね…。
どうすんのこれ?


第3版が 2018年刊なので、そろそろ第4版が出て欲しいところですね。
日本語書籍はこれしかない模様。