読者です 読者をやめる 読者になる 読者になる

リア充爆発日記

You don't even know what ria-ju really is.

さくらのVPS+Jenkins+github+rails3

さくらのVPS(CentOS6.3)にはすでにJenkinsとrbenvでruby1.9.3と公開鍵とかの設定ができているので、ここからこれらを繋げる。
ちなみにnginxも入っていて、nginx->jenkinsという流れで繋がるようになっていた。いつやったんだ。

rbenvとかはここでやったんだろうな。
これで動いた!さくらのVPS+github+capistranoでrailsアプリ自動デプロイの設定ファイルを置いておく

あとはいつやったんだっけ・・・。とにかくJenkinsもrbenvもどれも記憶にもないのでその辺は簡単なんだと思う。

で、要はgithubのプライベートリポジトリで管理されている

の2つをさくらのVPSで動かしているJenkinsで継続的なんちゃらをしようということで。

Jenkinsのアップデート

Jenkins ver. 1.493だったんだけど1.496がでてたからアップデートすることにした。つーか、すごくこまめにアップデートがでてるのね。。
http://jenkins-ci.org/changelog

だからかわかんないけど、*nixな環境で"java -jar jenkins.war"で走らせてる人はJenkinsの管理画面から自動アップデートができるらしい。
その他の人はここらへんで確認を。
https://wiki.jenkins-ci.org/display/JENKINS/Automated+Upgrade

で、/manageに行くとダウンロードリンクがでてるのでクリックするとローカルにダウンロードされる。へ?
よくしらべると、本当は「Upgradeボタン」的なものが表示されるらしい。権限の問題かと思ったけど、フルパーミッションのユーザーだったしよくわからん。

しゃーないので手動でjenkins.war落としてきて入れ替えた。
ぼくの環境だと/var/log/jenkins直下にjenkins.warはあったので、ここのやつを最新のと取り替えて再起動したった。

うん。特に問題ない。

ちなみに現状(デフォルトで)インストールされていたプラグインは以下の11個

  • Jenkins Mailer Plugin
  • External Monitor Job Type Plugin
  • LDAP Plugin
  • pam-auth
  • javadoc
  • ant
  • Jenkins CVS Plug-in
  • Jenkins Translation Assistance plugin
  • Maven Integration plugin
  • Jenkins SSH Slaves plugin
  • Jenkins Subversion Plug-in

なんかアンインストールできないっぽいからCVSとか要らないもんもたくさんあるけど放っておく。


とりあえずgithub+railsをやってみる。

事例が多そうだったから。

ゴールはgithubにpushしたらJenkinsがpullってきてrspecで書いたテストを走らせて結果をボクチンに通知する。という流れ。

ここを参考にすることにした。
http://nepalonrails.com/post/14217655627/set-up-jenkins-ci-on-ubuntu-for-painless-rails3-app-ci

プラグインのインストール

Jenkins氏が最新になったところで必要なプラグインを入れていく。
えーと調べたところ、以下のプラグインが必要になるよう。

  • Publish Over SSH Plugin
  • Jenkins SSH plugin
  • GitHub Plugin
  • Git Plugin

上2つは公開鍵認証用のSSHキーがらみので、下2つはGitとgithubのらしい。
で、この4つをManage Pluginsページで選択してインストールしたら、勝手に別のやつも2つほど入ったみたいだった。

紛れがあると嫌なので"install without restart"的なのもあったが、インストールごとに再起動しておいた。

プロジェクトの作成

とりあえずNew Jobからfree-style software projectを作っておく。名前はgithubのプロジェクト名と同じにした。
作り終わると、設定画面に連れて行かれるが離脱。


ユーザーの作成

Configure Global Securityに行って

  • "Jenkins's own user database" をチェック
  • "Allow users to sign up" をチェック
  • "Authorization"の"Project-based Matrix Authorization Strategy"を選択
  • "admin"と"github"の2つのユーザーを作る
    • 管理権限でのアクセスは"admin"というユーザー名じゃないといけないらしい。
  • "admin"ユーザーにはすべての権限を付ける
  • "github"ユーザーにはOverallのReadのみ付ける

と、どういうわけか、ここで追加した"admin"と"github"ユーザーはまだ実際には作られておらず、別途追加しなければいけないっていう。まぁ、確かにパスワードとか入れてないけど。

というわけで、Manage Usersからユーザーを追加する。メールアドレスが必須になっているけど、同じものが使えるから問題ない。

最後に作った2つのユーザーをプロジェクトに追加する。
プロジェクトのConfigureから。

  • "Enable project-based security" にチェック
    • "admin"と"github"を追加。権限はadminは全部、githubはJobのReadとBuildの2つにチェック。
    • そのすぐ下にある"GitHub project" に "git@github.com:/.git" を記入
  • Source Code ManagementのGitをチェック
    • Repository URLに "git@github.com:/.git" を記入
  • Build TriggersのBuild when a change is pushed to GitHub にチェック

で、セーブ。

SSH key

鍵を作る。手元の環境がjenkinsユーザーにシェルが設定されておらず、設定がめんどくさかったので大部分をrootで代行した。

cd /var/lib/jenkins/
mkdir .ssh
chmod 700 .ssh/
chown jenkins:jenkins .ssh/
cd .ssh/
ssh-keygen -t rsa
chown jenkins:jenkins *

で、これでできたid_rsa.pubの中身をgithubのプロジェクトの"Settings"タブにあるDeploy Keysに設定する。上記の手順だとrootで作っているのでid_rsa.pubの中身にrootというのがあったのでこれをjenkinsにしておいた。意味があるかどうかは調べてないけどなんとなく。

で、再度Jenkinsサーバに戻って

cd /var/lib/jenkins/
sudo -u jenkins git clone git@github.com:<user name>/<repo name>.git

でclone成功。

Hookの設定

今度はまたgithubに行って、さっき行ったばかりのプロジェクトのSettingsに行って、Service Hooks > WebHook URLsから以下のURLを追加する。

github:github@your-ci-server.com/github-webhook/

github:githubがさっきJenkinsで追加したgithubユーザーとパスワードらしい。

ってかここの一覧見てたら"Jenkins(GitHub plugin)"とかいうのあったから、これでもいいんじゃね?まぁいいや。

次はJenkinsに行ってManage Jenkins > Configure System の下のほうにいくと"GitHub Web Hook"というのがあってオートとマニュアルがあるのでオートのほうで
ユーザー名とパスワードを入れる。入れて"Test Credential"ボタンを押してVerifiedって出たらOK。

rspecを走らせる設定

ここでとりあえずCentOS上のjenkinsユーザーにログインシェルを設定してログインできるようにし、rbenvとか入れてjenkinsユーザーでrspecを走らせられる環境を作ることにした。

手動でrspecが走るようになったら
プロジェクト > Configure > BuildのExecute Shellのところに

source /var/lib/jenkins/.bashrc
cd /var/lib/jenkins/workspace/project_name/
bundle exec rake db:migrate
bundle exec rake db:test:prepare
bundle exec rspec spec/

こんな感じで。

とりあえず、JenkinsのプロジェクトページからBuild Nowしてみる。。。コケた。
あー。鍵にパスフレーズ設定しちゃったからかな・・・。そらそうだよな。。。

パスフレーズなしにしてリトライ。。。うまくいった。っぽい。

うん。とりあえずうまくいったよう。
最初に設定したゴールだと、通知がくるようにすれば終わりだけど、もう疲れたので今回はこれで終わり。