さくらのVPSでjenkins導入してみた


正直jenkinsが何なのかもわかってないですが、やってみます。

### jenkinsってなに

> JenkinsとはJavaで書かれたオープンソース継続的インテグレーションツールである。 このプロジェクトはHudsonからフォークされた。
>- wikipediaより

継続的インテグレーションというやつのツールなのか。

#### 継続的インテグレーションとは

例えば、ある会社で、山崎君と、ジョナサンの2人のエンジニアがいたとします。

この会社ではECサイトを作ってて、山崎はショッピングカート内をひと通り開発してます。
で、ジョナサンは最近は注文処理周りを担当している。

この時、ジョナサンの作ってる注文処理は山崎の作ったショッピングカートの中身を参照してるとする。

###### 事件は起きた

ある日、山崎がショッピングカートを少し修正した。
山崎はしっかりと単体テストもやって、テストがすべて通ることも確認した上でリリースを行った。

しかしその3時間後〜〜

プロデューサー: おいジョナサン、お客さんから注文処理が出来ないって問い合わせが来てるぞ
ジョナサン： え、でも私は特に修正とかしてないですYO
プロデューサー： でも実際できてないみたいだから調べてよ
ジョナサン： ワカリマシタ
ジョナサン： あれ・・なんかショッピングカートの処理が変わってる。そこは注文処理でも使っている所なんだよなぁ・・この修正が原因で注文出来なくなってたのか。

###### ここで継続的インテグレーション

継続的インテグレーションとは、このようなことが起きないように、お互いに影響している部分の結合テストを頻繁に行って、このような事故の早期発見につなげよう。という考えらしい。


#### CIを支援するツール

jenkinsだけ知ってたが、色々あるらしい

#### オープンソース

* [jenkins](http://jenkins-ci.org/)
* [CruiseControl](http://cruisecontrol.sourceforge.net/)
* [Apache Continuum](http://continuum.apache.org/)

#### クラウドサービス

* [BuildHive](https://buildhive.cloudbees.com/)
* [Travis CI](https://travis-ci.org/)

## どれを使うのが良いのか

CIツールの選定にはいくつかのポイントがあるっぽい。

A. 導入が簡単か

大事ですね。CIツールの為にサーバを用意出来なければクラウドのを使うのも選択肢としてアリだそうです。

B. サポート体制

オープンソースであれば、コミュニティがどれくらい活発化も見ておいた方が良いらしいです。

C. 連携するシステムがサポートしているか

バージョン管理(gitとかsvnとか)、チケット管理(READMINEとかissueとか？)など、導入を考えているチームで使ってるツールと連携出来るかも確認しておいたほうが良いそうです。

## 実際に導入してみる

* 1-1. javaのインストール

私はjavaは入っていたので飛ばしましたが、入ってない場合は、下記でjavaをインストールしてください

```bash
$ yum list \*java-1\*
$ yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel
```

* 1-2. jenkinsのインストール

参考： http://pkg.jenkins-ci.org/redhat/

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

$ yum install jenkins
```

* 1-3. jenkinsの起動

```bash
$ /sbin/service jenkins start
$ curl localhost:8080
```

```
root#service jenkins start
Starting Jenkins                                           [  OK  ]
root#curl localhost:8080
```

OKっぽい。

### 2. Jenkinsの設定

* 2-1. Jenkinsの設定

```
 vi /etc/sysconfig/jenkins
```

```/etc/sysconfig/jenkins
JENKINS_PORT="8010"

JENKINS_ARGS="-prefix=/"
```

このようにPORT番号と、引数(?)を変更しておく

* 2-2. apacheの設定

```
vi /etc/httpd/conf/httpd.conf
```

```/etc/httpd/conf/httpd.conf
<VirtualHost jenkins.(ドメイン名):80>
    ServerAdmin root@localhost
    ServerName jenkins.(ドメイン名)
    <Location />
        ProxyPass http://localhost:8010/
        ProxyPassReverse  http://localhost:8010/
    </Location>
</VirtualHost>
```

* 2-3. jenkinsとapacheを再起動

```
root#service jenkins restart
Shutting down Jenkins                                      [  OK  ]
Starting Jenkins                                           [  OK  ]
root#service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]
```

ちゃんと出来たっぽい。

* 2-4. アクセスしてみる

ブラウザ打ち込む

http://jenkins.(ドメイン):8010

![スクリーンショット 2015-08-16 10.07.18.png](https://qiita-image-store.s3.amazonaws.com/0/23276/1f4c3599-3ede-19f2-bb92-761526138ce9.png "スクリーンショット 2015-08-16 10.07.18.png")

とりあえず、ユーザ名とパスワードがわからなかったので、新規登録してみた。

すると・・・

![スクリーンショット 2015-08-16 10.10.30.png](https://qiita-image-store.s3.amazonaws.com/0/23276/60057b8a-ae56-8a53-67e6-4475059d8bdd.png "スクリーンショット 2015-08-16 10.10.30.png")


くそうっ・・・なんでやねんっ！！！

設定ファイルとかで初期ユーザ名とかあるのか？
わからんん。。ちょっと調べてから後で追記します。

ちなみに、、わかる人いたら教えて下さい＞＜

### 続き

上のアクセス出来ない問題は、以前に自分でアカウントを作っていたみたいで、そのアカウント以外はパーミションが何も割り当てられてなかったのが原因だったみたいです。

### 【本題】githubにPushしたらjenkinsがデプロイする仕組みを作る

流れはこんな感じ。

① 私が開発機からgitにPush
② githubがjenkinsにPushがあったことを通知
③ jenkinsが通知を受け取り、githubに最新のファイルを取りに行く
④ githubがjenkinsに最新のファイルを返す

まず、①は私が勝手にやることなどで無視。
②から行きます。

#### ② jenkinsがgithubから通知を受け取れるようにする

まずはjenkinsのページを開き、「jenkinsの管理」->「プラグインの管理」->「利用可能」タブから、下記のプラグインをインストールする。

* Git Plugin
* GitHub Plugin

##### githubから最新ファイルを取得するジョブを作る

**1. 新規ジョブ作成**

**2. フリースタイルのプロジェクトのビルド**を選択
名前は適当につけておく。
私は`github-test`にした。

**3. 下記のようにジョブを設定して保存**

* ビルドのパラメータ化にチェックを入れる
	* **パラメータの追加**をクリック
		* テキストを選択
		* 名前 -> payload
		* デフォルト値 -> none
		* 説明 -> 空欄でOK
* ソースコードの管理で`git`を選択
	* RepositoryURL -> 自動でデプロイしたいリポジトリのURL
	* Credential 
		* ↓の3-1に`jenkinsユーザのsshキー登録方法`を参照
* **ビルドトリガ**
	* `Build when a change is pushed to GitHub`を選択
* **ビルド**
	* **ビルド手順の追加** -> `シェルの実行`
		* 実行したいシェルを記述

##### 3-1. jenkinsユーザのsshキー登録方法

centOSでは、jenkinsをインストールした時点で勝手にjenkinsユーザが作られている。
確認してみる

```bash
# cat /etc/passwd | grep jenkins
jenkins:x:***:***:Jenkins Continuous Build server:/var/lib/jenkins:/bin/bash # 最初ここがbin/falseになっているので、viなどでbin/bashに修正する
```
jenkinsユーザでログイン。RSA公開鍵を作って、/var/lib/jenkins/.ssh/id_rsa.pubをgithubに登録する。

```bash
# sudo su jenkins
bash-4.1$ ssh-keygen -t rsa
```



#### ③ githubからjenkinsに通知する

これは、githubのwebhookという機能を使います。
webhookというのは、githubのリポジトリになんか変更があったら任意のURLを叩いてくれる機能です。

* githubの対象のリポジトリから、「Setting」をクリック
* Webhooks & Servicesをクリック
* `Services`の`Add service`で「Jenkins (github plugin)」を検索
* `jenkins hook url`を下記のように設定
	* `http://{jekinsのURL}:{jenkinsのポート番号}/job/github-test/buildWithParameters`

これでOK.
githubのServiceの所で、今作ったJenkinsのサービスをクリックすると、右上に「Test Service」というボタンがあるのでクリック！

```
Okay, the test payload is on its way.
```

と出たのでOK！

と、思いきや、jenkins側で見るとビルドできてない・・・
ちょっとここで原因がわからず、立ち往生・・・

jenkinsの設定(`/etc/sysconfig/jenkins`)で、ログを残すように下記設定をしてみたが、アクセスログ(`/var/log/jenkins/access-log`)すら確認出来ない・・
謎い。。

```bash:/etc/sysconfig/jenkins
JENKINS_ENABLE_ACCESS_LOG="yes" # デフォルトはnoだがyesに変更
```

※ 設定ファイル変更後はjenkinsの再起動も忘れずに！

##### 仕方なく・・

chromeからpostmanを使って、githubに登録したjenkinsのURLをPOSTで叩いて見ましたが、結果は「403 で、Authentication required」となっていた。
原因不明です・・・


だれかわかる人いたら教えて下さい。。