文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

CentOSにyumでjenkinsをインストールする

CircleCIやTravisCIがメジャーになってきたとはいえ、外部サービスが使えない環境の方々にはまだまだ現役なjenkins。今回はCentOSにyumでjenknsをインストールする手順をまとめてみたいと思います。


f:id:treeapps:20180424102046p:plain

インストール

リポジトリを追加

jenkins用のリポジトリを追加しないとyumでインストールできないので、追加します。

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

yumでインストールする

sudo yum -y install jenkins

インストールすると自動的にjenkinsグループとjenkinsユーザが作成されます。

jenkinsの構成

JENKINS_HOME /var/lib/jenkins
warファイル /usr/lib/jenkins/jenkins.war
設定ファイル /etc/sysconfig/jenkins
起動スクリプト /etc/init.d/jenkins
キャッシュフォルダ /var/cache/jenkins
ログフォルダ /var/log/jenkins

いずれのフォルダも jenkins:jenkins のユーザ:グループとなっています。

jenkinsの設定(設定ファイル)

このままだとtomcat等とポートが被ったりするので、カスタマイズします。

sudo vi /etc/sysconfig/jenkins

以下を変更します。

JENKINS_PORT="8090"
JENKINS_AJP_PORT="8010"
JENKINS_ARGS="--prefix=/jenkins"

中でもJENKINS_ARGSの部分は絶対設定した方がいいです。
初期状態だと、jenkinsのURLは「http://localhost:8090」となってしまいます。
これを「http://localhost:8090/jenkins」とするには↑このようにしておく必要があります。
(但しこれはCentOS専用の設定方法で、Debian等では異なるとのことです)

ProcessTreeKillerを無効にする

ProcessTreeKiller - Jenkins - Jenkins Wiki
ProcessTreeKillerは初期状態では有効になっています。
これが有効になっていると、jenkinsからtomcatを起動した時に、正常起動はするけど、ジョブの終了と共にtomcatのプロセスがダウンしてしまうという現象が起きます。

それを無効にするには /etc/sysconfig/jenkins を以下のように編集します。

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
↓
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.util.ProcessTree.disable=true"

jenkinsのサービスを起動

sudo /etc/init.d/jenkins start

又は

sudo service jenkins start

で起動します。
これで http://localhost:8090/jenkns 等でアクセス可能になります。

jenkinsの自動起動を設定

sudo chkconfig jenkins on

これでOS起動時にjenkinsも起動します。

jenkinsのユーザ・グループを変更したい場合

設定ファイルを修正する
sudo vi /etc/sysconfig/jenkins

例えば以下のようにします。

JENKINS_USER="vagrant"
ユーザ:グループを手動で変更する

「jenkinsの構成」の項で列挙したファイル・フォルダの権限を

sudo chown -R vagrant. XXX」等で一気にユーザとグループを変更してしまいます。

変更後、

sudo /etc/init.d/jenkins restart

などでjenkinsを再起動するとユーザを変更して起動できます。

jenkinsの設定(jenkinsの画面で設定)

svnでエラー

yumでインストールしたjenkinsで、svnで以下のエラーが起きる場合があります。

org.tmatesoft.svn.core.SVNCancelException: svn: E200015: PROPFIND /repos/apps/branches/hoge-project failed
Caused by: org.tmatesoft.svn.core.SVNCancelException: svn: E200015: No credential to try. Authentication failed

jenkins上でsvn checkoutする際に、jenkins:jenkinsのユーザ:グループ権限の場所にチェックアウトしようとします。その時に権限不足で書き込みできないと、上記エラーが発生します。

Jenkinsの位置

Jenkinsの管理 → システムの設定 → Jenkinsの位置 の設定を忘れると、
画面からjenkinsにアクセスする時は「http://localhost:8090/jenkins」なのに、ビルド失敗時等に表示されるジョブのURL等が「http://localhost:8090」となってしまうので、ちゃんと設定しましょう。

jenkinsのアップデート方法

yumでinstallした場合のjenkinsのアップデートですが、以下の手順で行えます。

  1. jenkinsのプロセスをstopする。(sudo service jenkins stop)
  2. /var/lib/jenkins をフォルダごとバックアップしておく。
  3. /var/cache/jenkins/war を削除する。
  4. /usr/lib/jenkins/jenkins.war を削除する。
  5. /usr/lib/jenkins/jenkins.warに新たにjenkins.warという名称で配置する。
  6. jenkinsのプロセスをstartする。(sudo service jenkins start)

これは簡単にシェルスクリプトにする事ができます。

#!/bin/sh
# jenkinsの最新warファイルのURL
jenkinsWarUrl=http://mirrors.jenkins-ci.org/war/latest/jenkins.war
# jenkinsの停止
sudo service jenkins stop
# キャッシュ削除
sudo rm -rf /var/cache/jenkins/*
# 既存のwarを削除
cd /usr/lib/jenkins/
sudo rm -rfv ./jenkins.war
# 最新のjenkinsをDL
sudo wget $jenkinsWarUrl
# jenkinsの起動
sudo service jenkins start

もし古いCentOS5系を使っているなら、標準でserviceコマンドにパスが通っていないので、以下のようにコマンドが無いと言われます。

sudo: service: command not found

こうなった場合、~/.bash_profile のPATH部分を以下のようにし、/sbinにパスを通すと、serviceコマンドが使えるようになります。

PATH=$PATH:/sbin:

おまけ

jenkinsはwarファイルで起動するjavaのwebアプリケーションです。
では service jenkins start で起動する時、どんなサーブレットコンテナで動作しているのでしょう。


多分あれだな。あれ。

[vagrant@localhost jenkins]# ps -ef | grep jenkins | grep -v "grep"
jenkins   3171     1 10 14:09 ?        00:00:50 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=8080 --ajp13Port=8009 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20

プロセスを見ると、こんな感じで java -jar でwarをデーモンプロセスとして起動していますね。
更にjenkinsのログを見ると、以下のような記述があります。

[vagrant@localhost jenkins]# less /var/log/jenkins/jenkins.log
↓
INFO: Beginning extraction from war file
Jun 11, 2014 2:09:35 PM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: jetty-8.y.z-SNAPSHOT


やっぱりな。jetty8がjenkinsに内蔵されている訳ですな。やっぱり組み込みならtomcatよりjettyだよな。