CircleCIやTravisCIがメジャーになってきたとはいえ、外部サービスが使えない環境の方々にはまだまだ現役なjenkins。今回はCentOSにyumでjenknsをインストールする手順をまとめてみたいと思います。
インストール
リポジトリを追加
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のアップデートですが、以下の手順で行えます。
- jenkinsのプロセスをstopする。(sudo service jenkins stop)
- /var/lib/jenkins をフォルダごとバックアップしておく。
- /var/cache/jenkins/war を削除する。
- /usr/lib/jenkins/jenkins.war を削除する。
- /usr/lib/jenkins/jenkins.warに新たにjenkins.warという名称で配置する。
- 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だよな。