BLOG.tass.io

さくら+ジェンキンス

2014-03-29

Nginx-Jenkins

前回の続きで、今度はNginxとJenkinsを入れてみた時のメモです。
今回参考にさせて頂いた先生はこちら-> Jenkins氏をさくらVPSに招聘する

1. Nginxのインストールと設定

Apacheはまあosxで使っているので、どうせなら使ったことがないNginxを入れてみます。
リポジトリを足さないといけないかな?と思ったのですが、yum serachしたらnginxがあったのでそのままインストールしました。

# nginxのインストール
$ sudo yum install nginx

途中でGPGキーのインポートしてもいいか聞かれるのでyesを選択。
あとはスルッと入りました。

下記コマンドで起動と今後の起動設定をしておきます。

# nginxさん起動
$ sudo service nginx start

# サーバ再起動したら、nginxさんも自動起動するように設定
$ sudo chkconfig nginx on

これで、普通にブラウザからアクセスすれば、nginxのデフォルトページが表示されるはず。

2. jenkinsのインストールと設定

今度はjenkinsを入れましょう。yumで入れると簡単だし、serviceとして登録もしてくれるみたい。
でもリポジトリを足して、証明書を入れて、java(jreとdevel)を入れて、というところが面倒い。
いやそれを面倒臭がっていたらもう何もできないのですけどね…。

まずは、jenkins先生はjavaで動作するので、そもそもjdkが必要です。
探してみたら最新版openjdk 1.7がありましたので、入れます

# 一応、openjdkのリストを表示させてみる
$ sudo yum search openjdk
(モニョモニョ表示される)

# モニョモニョ表示された中から、最新版を入れる
$ sudo yum install java-1.7.0-openjdk

次にjenkinsさんを入れます。 ただし、デフォルトのyumリポジトリには入っていないので、手動で足してあげる必要があります。

# jenkinsリポジトリを登録
$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo

# jenkinsリポジトリを認証するための鍵を登録
$ sudo rpm --import http://pkg.jenkins-ci.org/redhat-stable/jenkins-ci.org.key

# jenkinsのインストール
$ sudo yum install jenkins

でも、初期状態のJenkinsは誰でもジョブを作って実行できる状態です。ユーザ認証もなにもありません。
いったん起動して、Webの設定画面からセキュリティをかけてしまえばいいのですが、 結局それまで間は第三者がアクセスできてしまうことので怖いです。
その間、本当にノーガードなので…。

最低限のセキュリティはかけた状態で起動したいので、設定ファイルを修正しておきます。
ついでに今回はNginxを使うので、Apacheとの連携をおこなうAJPは無効化しておきます。
あと先ほど前記の通り、デフォルトでは非ログインユーザでもjenkinsの設定を変更したりジョブを自由に作ることができてしまうので、ログインユーザを指定します。
ここでは、admin権限を保つ初期ユーザ「tron」、パスワード「papasward」に設定しています。
(ただし、まだこれだけではセキュリティ設定は有効にはなっていません(後述))

# jenkinsのパスをprefixとして指定してあげる
$ sudo vi /etc/sysconfig/jenkins
>
> (AJPを無効化するために、下記のように書き換え)
> JENKINS_AJP_PORT="8009"
> ↓
> JENKINS_AJP_PORT="-1"
>
> (初期ユーザを設定するために、下記のように書き換え)
> JENKINS_ARGS=""
> ↓
> JENKINS_ARGS="--argumentsRealm.passwd.tron=papasward --argumentsRealm.roles.tron=admin"

これで一応完了です。
起動させてみます。デフォルトは8080番ポートで起動するはずです。

といっても、前回でファイアウォールの設定をしてあるので、まだ外部から8080番ポートにはアクセスできませんけどね。

# jenkinsさん起動
$ sudo service jenkins start

# サーバ再起動したら、jenkinsさんも自動起動するように設定
$ sudo chkconfig jenkins on

セキュリティこわいよう

先ほど初期ユーザ名とパスワードを設定しましたが、実は、はじめのJenkinsさんはこれを参照してくれません・゚・(つД`)・゚・
ブラウザの画面上から、[設定]->[グローバルセキュリティの設定]->[ON]に変更してはじめて、セキュリティ設定が有効になります。
それまでの間は、やっぱりノーガードです…。

ブラウザからアクセスするためには8080番ポートを解放しなきゃいけない、
でも8080番ポートを解放してしまうと、一時的にとはいえ誰でもJenkinsにアクセスできてしまう状態が生まれてしまいます。
こわいです!こわくて心臓とまりそうです>< 第三者に勝手に入られてしまう状態なんて、1msecたりとも許したくありません!

なので、ブラウザからセキュリティ設定画面を開くのは諦めて、ローカルホストからコマンドラインでPOSTリクエストを送ってセキュリティ設定を変更しちゃいます。
Jenkinsのバージョンが変わったらパラメタ変わっちゃうかもしれないけど、まぁ仕方ねえです…。

$ curl -c cookies.txt localhost:8080/jenkins/
$ curl -F 'json={"useSecurity": {"slaveAgentPort": {"value": "", "type": "disable"}, "markupFormatter": {"stapler-class": "hudson.markup.RawHtmlMarkupFormatter", "disableSyntaxHighlighting": false}, "realm": {"value": "3", "stapler-class": "hudson.security.LegacySecurityRealm"}, "authorization": {"value": "0", "stapler-class": "hudson.security.FullControlOnceLoggedInAuthorizationStrategy"}}, "core:apply": "true"}' -b cookies.txt localhost:8080/jenkins/configureSecurity/configure
$ rm cookies.txt

これでセキュリティ設定が有効な状態でJenkinsが起動するようになりました。

# jenkinsさん再起動
$ sudo service jenkins restart

3. Nginxとjenkinsの連携

ここでようやく、httpdとjenkinsを連携させます。
8080番ポートを外部向けに解放するつもりはないので、解放済みの80番ポートからNginxを通じてJenkinsと繋げたいと思います。

ちなみに、サブドメインで連携する場合と、パスで指定する場合で設定方法が異なります。
まだ独自ドメインを設定してまで運用する予定はないので、とりあえずパスを指定する方法でやってみます。
例として、さくらVPSのインスタンスのホスト名が「www12345ab.sakura.ne.jp」の場合です。

# nginxの設定で、"/jenkins"にアクセスがあった場合にはlocalhsot:8080へつなげるよう設定
$ sudo vi /etc/nginx/conf.d/jenkins.conf
> (下記を追記)
server {
    listen 80;
    server_name www12345ab.sakura.ne.jp;
    location /jenkins {
        proxy_pass http://localhost:8080;
    }
}

パスを指定した場合は、jenkins側にも自分がどのパスに設定されたか教えて上げる必要があります。
次にjenkinsの設定ファイルを修正します。

# jenkinsのパスをprefixとして指定してあげる
$ sudo vi /etc/sysconfig/jenkins
> (下記のように書き換え)
> JENKINS_ARGS="--argumentsRealm.passwd.tron=papasward --argumentsRealm.roles.tron=admin"
> ↓
> JENKINS_ARGS="--prefix=/jenkins --argumentsRealm.passwd.tron=papasward --argumentsRealm.roles.tron=admin"

ここまでで設定は完了です。
あとは再起動してあげれば設定が反映されるはずです。

# jenkinsの再起動
$ sudo service jenkins restart

# nginxの再起動
$ sudo service nginx restart

これで、http://www12345ab.sakura.ne.jp/jenkinsでアクセスできるようになったはずです。
さきほど作成したユーザ「tron」でログインして、他に必要な権限の設定やプラグインの導入を行うことになります。

おまけ jenkinsのログ

より細かいログが欲しくなった時は、下記のように設定を修正しましょう

$ sudo vi /etc/sysconfig/jenkins
>
>(デバッグレベルの上昇)
>JENKINS_DEBUG_LEVEL="5"
> ↓
>JENKINS_DEBUG_LEVEL="9"
>
>(アクセスログ出力の有効化)
>JENKINS_ENABLE_ACCESS_LOG="no"
> ↓
>JENKINS_ENABLE_ACCESS_LOG="yes"

設定を変更したら再起動も忘れずに。

# jenkinsの再起動
$ sudo service jenkins restart

アクセスログはこちら

$ sudo tail -f /var/log/jenkins/access_log

通常のログはこちら

$ sudo tail -f /var/log/jenkins/jenkins.log

Michael Kuroneko

Written by Michael Kuroneko. Follow me on twitter, github.