それでも気分は高専生

元高専生が自分のやってきたことを記事として残すためのてきとーなブログ

Jenkins + GitHubでRailsAppのCI構築を頑張る

先日の記事ではDocker上にJenkinsとRailsAppを同棲させた…OK?

前の記事Nginxを使ったRailsAppとJenkinsの同棲計画 - それでも気分は高専生の環境を前提としてローカルからGitHubにpushしたのをhookしてJenkinsが勝手にデプロイしてくれる. 所謂CI(Continuous Integration)というやつをやっていきます.

大まかな手順

  1. Jenkins上でJobを作成
  2. GitHubからWebHookを設定

以上(大雑把スギィ!)

JenkinsのJob作成

http://x.x.x.x/jenkinsに接続すると「お前本当に管理者かよ」って尋ねられるので, 指定されたpathにあるパスワード的なのを入力(詳細は忘れちゃったので誰か詳しい人情報plz). そのあとユーザ作ったらこんな画面になる.

f:id:takahiro0914:20160629211915p:plain

左端のメニューからManage Jenkins → Manage Plugins → GitHub Pluginを入れる.

Jenkinsトップページに戻って左端のNew Itemを選ぶと新しいJobの作成に入る. 適当な名前をつけてFreestyle project → OKが左下に現れるのでクリック.

  1. GeneralのGitHub projectにチェックを入れ, GitHubリポジトリのURLを入力.
  2. Source Code ManagementのGitにチェックを入れ, もう一度リポジトリのURLを入力.
  3. Branches to Buildには"*/branch_name"を入力.
  4. Repository browserはAutoでいいや.
  5. Build Triggersの"Build when a change is pushed to GitHub"にチェックを入れる.
  6. Poll SCMにチェックを入れ, Scheduleに" */15 * * * * "を入力(15分毎にリポジトリを参照して, pushされていれば6で入力するコマンドを実行). Scheduleに関してはユカイ、ツーカイ、カイハツ環境!(21):「Hudson」改め「Jenkins」で始めるCI(継続的インテグレーション)入門 (3/4) - @ITを参照されたし.
  7. 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で実行する. f:id:takahiro0914:20160629232817p:plain 実行すると左下にBuild Historyが表示されるのでビルド番号上にマウスを重ねると横に逆三角が表示され, クリックすると下図のようにドロップダウンが表示される. f:id:takahiro0914:20160629233012p:plain その中のConsole Outputをクリックするとビルド結果のページへ移動する.

WebHookをふっかける

GitHubリポジトリを開き, 画面上部のSettingsタブを開く. f:id:takahiro0914:20160630005127p:plain 画面左端のOptionsから"Webhooks & Service"を選択. f:id:takahiro0914:20160630005234p:plain "Add Service"から"Jenkins(GitHub plugin)"を選択. "Jenkins url"にJenkinsサーバのURL(prefix含む)を指定, Activeにチェックを入れて"Add Service"をクリック. f:id:takahiro0914:20160630005649p:plain

最後に僕もよくわかっていないところも多々あると思うので, 何かご指摘があればどんどんください.

参考サイト

GithubからJenkinsへのServer Hook - Qiita sudo のパスワードを入力なしで使うには - Qiita linux - su in shell script started from ssh works in other terminal - Super User