NetBSDにJenkinsをインストールする


JenkinsはMITライセンスのFLOSSです。おもにシェルやGroovyスクリプトでタスクを定義し、その実行を自動化できるソフトウェアです。

本稿ではJenkinsのインストール対象をNetBSD 9.0/amd64とします。

  1. pkgsrcからJenkinsをインストールする
    1. 通常版かLTS版か
    2. インストール
  2. 設定
    1. Tomcatの設定
    2. Jenkinsホームディレクトリの作成
    3. デーモンの設定と起動
  3. httpsに対応するには

pkgsrcからJenkinsをインストールする

通常版かLTS版か

通常版(devel/jenkins)とLTS版(devel/jenkins-lts)いずれかのJenkinsをpkgsrcからインストールできます。通常版のJenkinsは2020年9月時点では週次でリリースされます。いっぽうLTS版は12週間に一度、通常版から選ばれたリリースをもとにテストやパッチのバックポートを経てリリースされます。

どちらを選ぶかは運用方針や好み次第ですが、現実的にはLTS版(devel/jenkins-lts)を選ぶのが良いでしょう。pkgsrc-stableは1年に4回リリースされるため、Jenkins LTS版の更新を追いかけるスケジュールに無理はありません。しかし毎週リリースされる通常版を——裏を返せば年に4回しか更新されないpkgsrc-stableで——選んだとしても、3ヶ月以上前の比較的不安定なリリースを使わされるだけです。また仮にpkgsrc-currentを使っていたとしても、パッケージメンテナが毎週リリースされるJenkinsの更新に追いつけなければ通常版を選ぶ利点はありません。pkgsrcの更新頻度とパッケージメンテナの負担を考慮すれば通常版を選ぶ利点は少なく、消極的な理由ではありますがLTS版を選ぶのが無難という結論になります。

インストール

pkgsrcからインストールしたJenkinsを運用するには次の4つのパッケージが必要になるでしょう。

それぞれのパッケージをmake installでインストールしてください。またpkginを使うのなら以下のようにインストールできます。pkgin searchからJenkins LTS版のバージョンを調べ、次にそのバージョンを明示してpkgin installに渡しています。


pkgin search jenkins
jenkins-2.73         Open source continuous integration server (weekly release)
jenkins-2.60.2       Open source continuous integration server (LTS release)
p5-Digest-JHash-0.10nb3  Perl extension for 32 bit Jenkins Hashing Algorithm

=: package is installed and up-to-date
<: package is installed but newer version is available
>: installed package has a greater version than available package
pkgin install apache apache-tomcat openjdk8 jenkins-2.60.2

設定

Tomcatの設定

Jenkinsパッケージのインストール時やpkg_info -D jenkinsで表示されるメッセージにしたがって/usr/pkg/share/tomcat/conf/server.xmlを編集します。ただし、ContextタグのdocBaseにはjenkins.warへの絶対パスを渡します

したがってConnectorタグの変更はメッセージどおり以下のようにします。


<Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" URIEncoding="UTF-8" />

いっぽうHostタグの中に追加するContextタグは以下のように書きます。


<Context path="/jenkins" docBase="/usr/pkg/share/jenkins/jenkins.war"
    debug="0" reloadable="true">
</Context>

Jenkinsホームディレクトリの作成

標準では/usr/pkg/share/tomcat/.jenkinsがJenkinsのホームディレクトリです。jenkinsパッケージインストール時にはこのディレクトリは自動で作成されないため、手動で作りパーミッションを適切に設定しなければなりません。


mkdir /usr/pkg/share/tomcat/.jenkins
chown tomcat:tomcat /usr/pkg/share/tomcat/.jenkins

Jenkinsのホームディレクトリのパスは変更できます。/usr/pkg/share/tomcat/conf/server.xmlを編集し、Contextタグの中で環境変数JENKINS_HOMEの値を設定してください。当該パスは上記のようにパーミッションの設定を忘れずにおこなってください。以下はJENKINS_HOME/usr/pkg/share/jenkins/homeに設定する例です。


<Context path="/jenkins" docBase="/usr/pkg/share/jenkins/jenkins.war"
         debug="0" reloadable="true">
  <Environment name="JENKINS_HOME" value="/usr/pkg/share/jenkins/home"
               type="java.lang.String"/>
</Context>

デーモンの設定と起動

ApacheとTomcatのRCスクリプトを/etc/rc.dへコピーします。


cp /usr/pkg/share/examples/rc.d/apache /etc/rc.d
cp /usr/pkg/share/examples/rc.d/tomcat /etc/rc.d

JenkinsのバージョンによってはOpenJDK 11はサポートされていません。Jenkinsのバージョンが2.73以下の場合はOpenJDK 8を代わりに使う必要があります。そのため次に示す差分のとおり/etc/rc.d/tomcatを編集します。


--- /etc/rc.d/tomcat    2020-09-22 09:14:25.404229833 +0900
+++ /usr/pkg/share/examples/rc.d/tomcat 2020-07-19 01:00:05.000000000 +0900
@@ -30,7 +30,7 @@

 if [ -z "${JAVA_HOME}" ]
 then
-       JAVA_HOME="/usr/pkg/java/openjdk11"
+       JAVA_HOME="/usr/pkg/java/openjdk8"
        export JAVA_HOME
 fi

システム起動時にデーモンが自動で実行されるよう/etc/rc.confに以下を追加します。


apache=YES
tomcat=YES

serviceからApacheとTomcatを動かします。


service apache start
service tomcat start

Webブラウザから、http://IPアドレス:8080/jenkinsへアクセスします。あとは画面どおりにセットアップを完了させてください。

なおJenkinsのバージョンが古い場合、Jenkinsが推奨するプラグインのインストールにすべて失敗する可能性があります。

httpsに対応するには

Jenkins WebフロントエンドへはID/パスワードでログインします。そのためTLSでサーバ・クライアント間の通信を暗号化したい場合もあるでしょう。本稿ではApacheのプロキシでJenkinsへのアクセスを受けて、Apache側でTLS通信することによりJenkinsそのものを設定することなくhttps化する例を紹介します。ここではサーバ証明書はすでに発行されているものとして進めます。

はじめに/usr/pkg/etc/httpd/httpd.confを編集し、次のモジュールを有効にします。これらのモジュールはwww/apache24パッケージですべて提供されているので別途のインストールは必要ありません。

/usr/pkg/etc/httpd/httpd-ssl.confを編集し、秘密鍵(SSLCertificateKeyFile)やサーバ証明書(SSLCertificateFile)、中間CA証明書(SSLCertificateChainFile)、ルートCA証明書(SSLCertificateFile)へのパスを設定します。ルートCAを自己署名で構築したなら、中間CANONとルートCAは同一でしょう。そしてVirtualHostタグの中に以下の設定を追加します。https://IPアドレス/jenkinsへアクセスするとローカルホストの8080番ポートを経由して/jenkinsへ飛ばすようプロキシの設定をしています。


ProxyPass           /jenkins http://localhost:8080/jenkins nocanon
ProxyPassReverse    /jenkins http://localhost:8080/jenkins
ProxyRequests       Off
AllowEncodedSlashes NoDecode
RequestHeader       set X-Forwarded-Proto "https"
RequestHeader       set X-Forwarded-Port  "443"

<Proxy http://localhost:8080/jenkins*>
  Order deny,allow
  Allow from all
</Proxy>

この設定が終わったあと、/usr/pkg/etc/httpd/httpd.confに戻り/usr/pkg/etc/httpd/httpd-ssl.confをインクルードするよう設定します。最終的に、/usr/pkg/etc/httpd/httpd.confには次のような変更が加わります。


--- /usr/pkg/etc/httpd/httpd.conf.orig    2020-08-24 04:54:56.000000000 +0900
+++ /usr/pkg/etc/httpd/httpd.conf       2020-09-22 13:21:21.239037438 +0900
@@ -88,7 +88,7 @@
 #LoadModule cache_module lib/httpd/mod_cache.so
 #LoadModule cache_disk_module lib/httpd/mod_cache_disk.so
 #LoadModule cache_socache_module lib/httpd/mod_cache_socache.so
-#LoadModule socache_shmcb_module lib/httpd/mod_socache_shmcb.so
+LoadModule socache_shmcb_module lib/httpd/mod_socache_shmcb.so
 #LoadModule socache_dbm_module lib/httpd/mod_socache_dbm.so
 #LoadModule socache_memcache_module lib/httpd/mod_socache_memcache.so
 #LoadModule socache_redis_module lib/httpd/mod_socache_redis.so
@@ -127,10 +127,10 @@
 LoadModule setenvif_module lib/httpd/mod_setenvif.so
 LoadModule version_module lib/httpd/mod_version.so
 #LoadModule remoteip_module lib/httpd/mod_remoteip.so
-#LoadModule proxy_module lib/httpd/mod_proxy.so
+LoadModule proxy_module lib/httpd/mod_proxy.so
 #LoadModule proxy_connect_module lib/httpd/mod_proxy_connect.so
 #LoadModule proxy_ftp_module lib/httpd/mod_proxy_ftp.so
-#LoadModule proxy_http_module lib/httpd/mod_proxy_http.so
+LoadModule proxy_http_module lib/httpd/mod_proxy_http.so
 #LoadModule proxy_fcgi_module lib/httpd/mod_proxy_fcgi.so
 #LoadModule proxy_scgi_module lib/httpd/mod_proxy_scgi.so
 #LoadModule proxy_uwsgi_module lib/httpd/mod_proxy_uwsgi.so
@@ -145,7 +145,7 @@
 #LoadModule session_dbd_module lib/httpd/mod_session_dbd.so
 #LoadModule slotmem_shm_module lib/httpd/mod_slotmem_shm.so
 #LoadModule slotmem_plain_module lib/httpd/mod_slotmem_plain.so
-#LoadModule ssl_module lib/httpd/mod_ssl.so
+LoadModule ssl_module lib/httpd/mod_ssl.so
 #LoadModule dialup_module lib/httpd/mod_dialup.so
 #LoadModule http2_module lib/httpd/mod_http2.so
 #LoadModule lbmethod_byrequests_module lib/httpd/mod_lbmethod_byrequests.so
@@ -512,7 +512,7 @@
 </IfModule>

 # Secure (SSL/TLS) connections
-#Include etc/httpd/httpd-ssl.conf
+Include etc/httpd/httpd-ssl.conf
 #
 # Note: The following must must be present to support
 #       starting without SSL on platforms with no /dev/random equivalent

設定後、apacheデーモンを再起動します。Webブラウザからhttps://IPアドレス/jenkinsへアクセスし、https化された状態でJenkins Webフロントエンドが見れることを確認してください。