Jenkins + GitHubでRailsAppのCI構築を頑張る
先日の記事ではDocker上にJenkinsとRailsAppを同棲させた…OK?
前の記事Nginxを使ったRailsAppとJenkinsの同棲計画 - それでも気分は高専生の環境を前提としてローカルからGitHubにpushしたのをhookしてJenkinsが勝手にデプロイしてくれる. 所謂CI(Continuous Integration)というやつをやっていきます.
大まかな手順
- Jenkins上でJobを作成
- GitHubからWebHookを設定
以上(大雑把スギィ!)
JenkinsのJob作成
http://x.x.x.x/jenkinsに接続すると「お前本当に管理者かよ」って尋ねられるので, 指定されたpathにあるパスワード的なのを入力(詳細は忘れちゃったので誰か詳しい人情報plz). そのあとユーザ作ったらこんな画面になる.
左端のメニューからManage Jenkins → Manage Plugins → GitHub Pluginを入れる.
Jenkinsトップページに戻って左端のNew Itemを選ぶと新しいJobの作成に入る. 適当な名前をつけてFreestyle project → OKが左下に現れるのでクリック.
- GeneralのGitHub projectにチェックを入れ, GitHubリポジトリのURLを入力.
- Source Code ManagementのGitにチェックを入れ, もう一度リポジトリのURLを入力.
- Branches to Buildには"*/branch_name"を入力.
- Repository browserはAutoでいいや.
- Build Triggersの"Build when a change is pushed to GitHub"にチェックを入れる.
- Poll SCMにチェックを入れ, Scheduleに" */15 * * * * "を入力(15分毎にリポジトリを参照して, pushされていれば6で入力するコマンドを実行). Scheduleに関してはユカイ、ツーカイ、カイハツ環境!(21):「Hudson」改め「Jenkins」で始めるCI(継続的インテグレーション)入門 (3/4) - @ITを参照されたし.
- BuildのExecute shellのCommandにweb hook時に実行するコマンドを入力.
ex.
sudo su app whoami cd /var/app/rails_app sudo git pull sudo bundle install sudo bundle exec puma -d -C config/puma.rb restart
※ 以前まで"sudo bundle exec pumactl -F config/puma.rb restart"としてましたが, jobが働いた時にdaemonizeされないため, いつまでもjobが動きっぱなしになるようなので修正しました(2016/7/7)
っと, 忘れてましたがここで新しいユーザappちゃんを作っておいてください.
useradd app # appユーザの追加 chown -R app /var/run/rails_app # RailsAppの所有者をappユーザに変更 visudo
sudoersの設定に以下を追加.
jenkins ALL=(ALL:ALL) NOPASSWD:ALL app ALL=(ALL:ALL) NOPASSWD:ALL
でappユーザにrbenvだの何だのとRailsAppを動かせるようにしてやらなきゃいけない. ちなみに僕はrbenv入れてrubyを入れて, bundler入れて, bundle installするだけでしょって油断してたら, Failed to build gem native extension · Issue #133 · github/pages-gem · GitHubでめっちゃ詰まってた().
※ appでsudo puma -dを実行するとなぜかpidファイルが生成されない. rootでpuma -dを実行してpumaを起動させる必要性がある. 知っている人がいたら教えて(もしかしたらpidの権限設定が-rw-r--r--. 1 rootになっているのが原因かも)...
※ sudoなしでsuしようとしたらsu: must be run from a terminalって言われて死んだ. ので忘れないように.
実際にJobがうまくいくかを見たい時はBuild Nowで実行する. 実行すると左下にBuild Historyが表示されるのでビルド番号上にマウスを重ねると横に逆三角が表示され, クリックすると下図のようにドロップダウンが表示される. その中のConsole Outputをクリックするとビルド結果のページへ移動する.
WebHookをふっかける
GitHubリポジトリを開き, 画面上部のSettingsタブを開く. 画面左端のOptionsから"Webhooks & Service"を選択. "Add Service"から"Jenkins(GitHub plugin)"を選択. "Jenkins url"にJenkinsサーバのURL(prefix含む)を指定, Activeにチェックを入れて"Add Service"をクリック.
最後に僕もよくわかっていないところも多々あると思うので, 何かご指摘があればどんどんください.
参考サイト
GithubからJenkinsへのServer Hook - Qiita sudo のパスワードを入力なしで使うには - Qiita linux - su in shell script started from ssh works in other terminal - Super User