Jenkins環境構築でのメモ

Jenkinsで「githubを監視して、変更があったらrakeを走らせる」というジョブを作成した。
そのとき躓いたところや、ポイントだと思ったところをメモしておく。

おおまかな環境構築の流れは[CentOSにyumでjenkinsをインストールする - 文系プログラマによるTIPSブログ](http://treeapps.hatenablog.com/entry/2014/06/11/233027)を参考にした。

# jenkinsユーザへの変更

jenkinsユーザへ切り替えると、諸々の作業が楽になる。
しかし、yumでインストールしたjenkinsでは、デフォルトで切り替えられないように設定されている。

`/etc/passwd`のjenkinsの行を次のように変更すると、切り替えられるようになる。

```:/etc/passwd
jenkins:x:496:497:Jenkins Continuous Build server:/var/lib/jenkins:/bin/bash
```

（参考：[RSpecをrvm×Jenkinsで実行するまでの試行錯誤をメモ](http://www.absolute-keitarou.net/blog/?p=1287)）


# wget実行時にプロキシに引っかかる
インストールのため、下記を実行。

```
$ 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
$ sudo yum install jenkins
```

1行目を実行したときに、
`proxy URL ftp://ID/PW@proxy.yourdomain.com:port に間違いがあります: HTTPでなければなりません。`
と表示されるエラーが発生した。

[How to Use WGET with a Proxy Server](http://www.putorius.net/2012/09/how-to-use-wget-with-proxy-server.html)を参考にして、`/etc/wgetrc`に

```:/etc/wgetrc
http_proxy=http://proxy.yourdomain.com:port/
proxy_user=userID
proxy_password=password
```

のようにプロキシ情報を追加したところ、エラーが出なくなった。

# 使用するポートを変更する
ポート番号を変えたい場合は、`/etc/sysconfig/jenkins`を次のように書き換える。

```:/etc/sysconfig/jenkins
JENKINS_PORT="変更後ポート番号"
```

ちなみに、そのポート番号が使われているかどうかを調べたいときには

```
$ netstat -tanp
```
というコマンドを使う。

（参考：[管理者必見！ ネットワーク・コマンド集 - netstatコマンドでポートを利用しているプロセスを調べる：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20070124/259606/)）

# githubとの連携

jenkinsインストール時に`~jenkins/.ssh`が自動生成されると書いてあるサイトもあったが
見つからなかったので、自分でssh鍵を生成。

```
$ cd /var/lib/jenkins
$ mkdir .ssh
$ sudo chown jenkins .ssh
$ sudo -u jenkins -H ssh-keygen -t rsa -C jenkins@hoge.com
$ chmod 744 ../.ssh
```

ssh鍵が生成できたら、githubで使用しているユーザのsshに追加する。
（リポジトリに追加すると、複数のリポジトリを扱えなくなってしまう。）

sshで外のサーバへログインするためには、SOCKSプロキシを経由する必要があったので
`connect.c`を拾ってきて`~jenkins/.ssh/config`に下記を加えた。
（connect.cの所在はググるのがいちばん手っ取り早いらしい。）

```:~jenkins/.ssh/config
Host github.com
    User git
    HostName ssh.github.com
    Port 443
    ProxyCommand /usr/bin/connect -S socks.yourdomain.com:port %h %p
    IdentityFile ~jenkins/.ssh/id_rsa
```

環境変数にIDとパスワードを設定すればOK。
(Jenkinsの管理＞システムの設定＞グローバルプロパティ＞環境変数）

| キー | 値 |
|:--|:--|
| SOCKS5_USER | ID |
| SOCKS5_PASSWD | パスワード |

`~jenkins/.ssh/config`もchownで所有者をjenkinsに変更しておく。
下のコマンドで、githubにアクセスして設定ができたか確認できる。

```
$ sudo -u jenkins ssh git@github.com
```

（参考：[Jenkins+GitHubのプライベートリポジトリ - Qiita](http://qiita.com/yuch_i/items/44d224112382b5f1c8eb)
　[GitHubとJenkins連動　自動デプロイ　開発環境設定編 at ITエンジニアmegadreamsの開発日記](http://megadreams14.com/?p=27)）

# githubから取得した最新ファイルを置くディレクトリを指定

デフォルトでは全てworkspace直下に置かれてしまう。
1つのジョブで複数のリポジトリにアクセスしたときなどに困るので、
ディレクトリを指定して取得してくるようにする。

1. ジョブの設定画面＞ソースコード管理＞Gitを選択
1. `Additional Behaviours`という項目で`Check out to a sub-directory`を選択
1. `Local subdirectory for repo`という設定項目が現れるので、ファイルを置きたいディレクトリ名を書く

（参考：[Jenkinsで1つのジョブで複数のGitリポジトリをビルドする方法 - wadahiroの日記](http://wadahiro.hatenablog.com/entry/20120325/1332649690)
　[[#JENKINS-13086] Clone to directory named for repository - Jenkins JIRA](https://issues.jenkins-ci.org/browse/JENKINS-13086)）

# ERROR: Repository not found

上記のエラーが出て、ビルドが失敗していた。
結局はリポジトリ名のタイポが原因だったが、上記のエラーが出た場合には次のことをチェックしてみると良いらしい。

#### スペルミス
githubからコピーしてくるとミスがない。

#### 権限
リポジトリにアクセスする権限があるのかどうか。

#### ssh接続
`ssh -T git@github.com`で確認してみる。

#### 本当に存在するのか
削除されていたり、とか。

（参考：[Error: Repository not found](https://help.github.com/articles/error-repository-not-found/)）

# rakeを実行するジョブ

`~jenkins/.bashrc`に下記を加えて、rvmのPATHを追加しておくだけでOK。

```
[[ -s "(rvmの場所)/scripts/rvm" ]] && source "(rvmの場所)/scripts/rvm"
PATH=$PATH:(rvmの場所)/bin
```

RakeプラグインやRVMプラグインなど様々なプラグインがあるみたいだが、
今回はどちらも使わずに実行できた。

```.sh
#!/bin/bash -xe
cd $WORKSPACE/directory_name
source ~/.bashrc
bundle install --path vendor/bundle --without production development
rake db:drop db:migrate RAILS_ENV=test
rake
```

（参考：[【jenkins】　RVMが正常に動作しない　bundle: command not found](http://app.road.jp.net/?p=1685)）

# pushされたブランチに対してビルドを実行する

Gitプラグインの`$GIT_BRANCH`変数と、`Parameterized Trigger plugin`を使う。

[JenkinsがGithubにpushされたbranchをテストする - Perl日記](http://r9.hateblo.jp/entry/20130522/p1)を参考に、
監視するジョブと処理を行うジョブを分けるとわかりやすくなった。
詳細な設定は上記リンクを参考にすると良い。

要約すると、

1. 監視ジョブの後処理＞Predefined parametersを選択し<br>`branch=${GIT_BRANCH}`を設定して、ブランチ名を下流ジョブ（処理用）に渡す。
1. 下流ジョブではビルドのパラメータ化にチェックを入れて、branchパラメータを受け取る。<br>そして、ソースコード管理＞Git＞Branches to buildを`$branch`に設定すると<br>変更があったブランチに対してビルドを実行できる。

# シェルの途中で失敗したときにジョブを停止する

```.sh
#!/bin/bash -xe
```
または

```.sh
#!/bin/sh -xe
```

のどちらかを書くだけ。
シェルの途中で失敗した場合に、ジョブが停止される。

（参考：[Jenkinsで使うシェルスクリプトは-xeつけた方がよかった - くりにっき](http://sue445.hatenablog.com/entry/2014/05/23/143737)）

#（おまけ）プラグインいろいろ

[Jenkinsに入れているプラグインまとめ（Rails中心） - くりにっき](http://sue445.hatenablog.com/entry/2014/01/08/225128)に、
ジョブ内容に関わらず役立ちそうなプラグインが紹介されている。

[Dependency Graph View Plugin - Jenkins - Jenkins Wiki](https://wiki.jenkins-ci.org/display/JENKINS/Dependency+Graph+View+Plugin)も入れておくと便利そう。