なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

GitHub + Jenkins + α で自動デプロイ環境

動機

 ・Tomcatちゃんは実用的だけど重い…
 ・warファイル作ってデプロイするのがだるい
 ・Javaを書くのがダルいし、将来のためにRubyもやっときたい

環境用意

 ・以前からDTIレンタルサーバを借りてごにょごにょしている(…p2p2ch*1の実験とかで)
 ・OSはCentos 6.5 i686
 ・yumはもちろん使えるようにしておく

Jenkins

 ・Jenkinsをインストールする(下記参照)
  Jenkins を CentOS 6.3 にインストール - 俺の成長日記

# 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 -y jenkins

 ・これによりRH系のLinuxのサービスのごとく # service start jenkins というオペレーションが可能になる

SSL対応

 ・HTTPで通信すると、パケットキャプチャとかすれば丸見えなのでHTTPSで通信するように環境を修正
  これも、先ほどの記事を参考に /etc/httpd/conf.d/**.conf を作成すればよい。
 ・もちろんその前にhttpdとmod_sslyumでインストールしておく
 ・加えて、Proxy のエラー - 作業日記を参考に、設定を追加するとよい

GitHubアカウントとJenkinsアカウントの連携

 ・銀天すばるさんの記事が参考になった
  Jenkins with GitHub OAuth Plugin のセットアップ手順 - 野良C++erの雑記帳
  紹介されているGithub OAuth Pluginを使えばGitHubアカウントでJenkinsにログインできる
 ・プラグインのインストールからGithub OAuth Pluginをインストールして、Jenkinsの設定をちょっと変えるだけです

 ・あと、これはやっておく(あとで使うから)

GitHub Plugin の Web-hook 機能を使う場合には, Github Commiter Authorization Strategy で
「Grant READ permissions for /github-webhook」をチェックする良いです.

Jenkinsのジョブを作成

 ・ここからが難しいがだいたい下記のサイトを参考にすれば実現できる
  Trigger Jenkins builds by pushing to Github | Four Kitchens

 概要を述べると以下のとおり(上記サイトに書いてないこともあるが…)
 ・ソースコード管理の欄にあるGitのリポジトリ指定「Repository URL」は「git@github.com:${User}/${Repository}.git」の形式で指定
 ・そのためにはJenkinsのアカウントでssh-keygenして公開鍵をGitHubに設定する必要がある
 ・設定した公開鍵情報はソースコード管理の「Credentials」に設定する → エラーが出なければOK

 このへんのGitHubの公開鍵設定方法は下記のサイトが詳しい
  How to use GitHub (and Bitbucket)

Jenkinsのシステム設定

 ・Jenkinsの位置には「https://xxx.yyy.zzz.vvv/jenkins/」を設定
 ・GitHub Web Hookは「Manually manage hook URLs」を設定しておく

GitHubにpushした際にビルドとデプロイを実施

 ・自分が作成したリポジトリのSettingsからService Hooks→Jenkins(GitHub Plugin)を選ぶ
  → 対象のURLを設定「https://xxx.yyy.zzz.vvv/jenkins/github-webhook/
  → Activeにして設定
  → Test Hook!

問題解析

 ・ここまでで壁にぶち当たったら以下を参照すると良い
  ・Jenkinsのシステムログ   … 例外が発生していれば、そこから原因がわかる
  ・/var/log/httpd 以下のログ … 先ほどのHookはHTTP POSTでCIサーバに通信が走る。うまくいけば200 OK。

Jenkinsのジョブ起動と同時にRuby on Rails起動

 これがやりたいがためにちょっとしたシェルスクリプトを書いた

ps aux | grep 'rails' | grep -v grep | awk {'print $2'} | xargs -I{} sh -c "sudo kill -INT '{}'"
cd ${WORKSPACE}
sudo -u app GEM_HOME=/home/app/.gem PATH=$GEM_HOME/bin:$GEM_HOME/gems:$PATH ./script/rails server -e production -d

なにをやっているかというと、
 1.すでに起動しているRubyのサーバを落とす
 2.ワークスペースに移動
 3.サーバ起動

まとめ

 ・ここまで紹介した記事で以下のことが可能になる
 ・https://xxx.xxx.xxx.xxx/jenkinsの形式のURLでJenkinsに接続可能
 ・GitHubアカウントでJenkinsにログイン可能
 ・pushしたと同時にビルド&デプロイ*2

*1:p2p2chについてはGitHubリポジトリ参照 https://github.com/windymelt/p2p2ch

*2:まあ今回はRubyなのでビルドは無いけどね