JenkinsでGithubのプライベートリポジトリのRailsをCI

Chefを使ってJenkinsを入れて〜といったところから始める。

Jenkinsのインストール

公式に置かれているJenkinsのcookbookを使うと簡単だった。

run_listでjenkins::serverを指定すればOK。
jenkinsだけ指定しても何も動かないので少し考え込んでしまった。
(2014/03/27追記: 今はv2.0系になっているのでjenkins::masterかもしれない)

nodes/jenkins.json
{
  "run_list": [
    "recipe[jenkins::server]"
  ],
  "jenkins": {
    "mirror": "http://mirrors.esast.com/"
  }
}

ミラーの指定はしてもしなくても良い。

これを適用するだけですでに8080のポートで起動していて管理画面にアクセス可能となる。

http://jenkins.example.com:8080

アクセスできない場合はiptablesの設定なども確認。

プラグイン

管理画面から以下の二つだけ入れる。

  • git
  • rbenv

ちなみに上記のCookbookを使ってプラグインの設定もできるが、管理画面との整合性がとれなくなるのでイマイチ。

例えば以下のように。

{
  "run_list": [
    "recipe[jenkins::server]"
  ],
  "jenkins": {
    "mirror": "http://mirrors.esast.com/"
    "server": {
      "plugins": ['git', 'rbenv']
    }
  }
}

これでプラグインが入るのだが管理画面からは入っていないように見える。
プラグインによって追加される入力項目なども表示されない。

と言うわけで無理せず単純にインストールだけした後、管理画面でポチポチやったほうがいい気がする。
とりわけ自分のようなJenkins初心者においては。

Githubのプライベートリポジトリの設定

次にJenkinsからプライベートリポジトリにアクセスするための設定を。

Jenkinsの鍵

構築したサーバーの/var/lib/jenkins/.ssh以下に秘密鍵と公開鍵が置かれている。
これはjenkins::serverによるJenkinsのインストール時に生成された物で、使い回しの鍵ではないのでそのまま使っても大丈夫。

自分で作った鍵を使いたい場合は上書きする形で同じ場所に設置すると良い。

Deploy keysの設定

GithubのリポジトリのSettingsからDeploy Keysを開いて、Add deploy key。
TitleはJenkinsとでも入れて、Keyには/var/lib/jenkins/.ssh/id_rsa.pubの内容を貼り付ければOK。

新規ジョブの作成

Jenkinsの管理画面に戻って新規ジョブを作成する。

プロジェクト名

適当に入力。リポジトリ名そのままとかでいいかも。

ソースコード管理 >> Git >> Repository URL

以下のようにhttpsではなくsshのURLの方を入れる。

git@github.com:akahigeg/hogehoge.git

設定が問題なくできていれば入力後にフォームからフォーカスを外すと赤いエラーメッセージが消える。
エラーメッセージが残る場合はまずはメッセージをよく読むことだが、自分の経験では以下のようなケースがあった。

1. gitがインストールされていない
2. Githubでdeploy keysの設定がきちんとできていない
3. known_hostsにgithub.comが登録されていない

1と2に関してはサーバーの状態や設定を再確認。

3に関してはサーバーにログインしてsudo等でjenkinsユーザーになり一度githubにssh接続するのが早い。
が、自動化したければChefで割と簡単に対応することもできる。

ssh_known_hostsというCookbookを入れると ssh_known_hosts_entryというリソースが使えるようになるので、適当にCookbookを作ってレシピに以下のように書き、

ssh_known_hosts_entry 'github.com'

これを適用すればOK。

ビルド環境 >> rbenv build wrapper >> The Ruby version

任意のRubyのバージョンを入れる。

2.0.0-p247

rbenvプラグインはすぐれもので、rbenvのインストールから何からすべてやってくれる。
ほかにRakeプラグインやRubyプラグインもあるがrbenvがあれば不要である。

ビルド >> シェルの実行 >> シェルスクリプト

テストを実行するコマンドを書く。
bundle installとrake db:migrateでテストの準備も忘れずに。

bundle install
bundle exec rake db:migrate
bundle exec rake 

これでジョブの設定は完了。

データベース作成

ビルド実行前に作成しておく。

ビルドの実行

左サイドメニューのビルド実行をクリックして待つ。
成功すればよし。失敗した場合はエラーメッセージを見て対処する。

ひとまずこれにて終了。

とは行かなかった

認証をかける

今はURLを叩けば誰でもJenkinsさんを見られる状況。
プライベートリポジトリを扱っている以上、このまま放置するのはマズい。

というわけで認証をかける必要がある。

そのやり方についてはとりあえず以下が分かりやすかった。

さくらVPSでJenkinsをセットアップし、認証を行うまで | ひたすらメモするだけのブログ

ここまではがんばって一息にやってしまいましょう。

git push hook

リポジトリが更新されたら都度ビルドが走るようにしてこそ真のCI。
ということで以下のようにGithubにpushされた時点でJenkinsさんを走らせたいのだが

Jenkinsの使い勝手をよくするための見直し6点 | Developers.IO

ひとまず。これは宿題とする。