ユカシカド エンジニアブログ

体の栄養状態を把握する検査サービス VitaNoteを開発するエンジニアのブログ

Jenkins と GitLab と rbenvでプライベートなRuby開発環境を構築する

動機

一体何の会社かわからないことで定評のある我が社ですが、わたし寺田は一人開発部としてもくもくと開発を続けております。 チームで開発する時はそれはそれで何かとノウハウがいると思うのですが、1人は1人でモチベーションとペースを維持しつつ開発を継続していくにはコンピュータを使って精神衛生を確保しておくにはCIしかない!と思った次第。

と同時に、今週土曜に開催される西脇.rb & 東灘.rb 合同もくもく会 4thの自習課題の準備でもあります。

Q.なぜ、GitLab CI ではないのか?

A.初めのビルドの時は手動で リポジトリをgit clone しないとけないから。

自分でもおかしいな?と思いながら調査が不足している可能性は大いにあるのですが、GitLab CIはCIに登録する際に初回だけ手動でリポジトリをgit cloneする必要があるようです。

構築環境

サーバ

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.2 LTS
Release:        12.04
Codename:       precise

Jenkins

version 1.517

GitLab

version 5.0

構成

nginx リバースプロキシ <==> Jenkins + GitLab on Ubuntu


1.Jenkinsインストー

最新版インストー

そのまま、apt-get install jenkinsすると1.4系がインストールされてしまうのでこのページの通りインストールする。

Installing Jenkins on Ubuntu

管理者のセットアップ

目的がプライベートな環境構築なのでこれは必須。

Standard Security Setup

2.Jenkinsプラグインインストー

Manage Jenkins > Manage Plugins から

  • git
  • gitlab
  • ruby
  • rbenv

    をインストールしておく。

3.rbenvセットアップ

Jenkinsをインストールすると、jenkinsユーザが作成される。 ホームディレクトリの/var/lib/jenkinsに移動して、rbenvとruby-buildをインストール。 適当にruby( 2.0, 1.9 )とgem( rbenv-rehash,bundler, rails, rspecなど)もインストールしておく。

4.SSHの設定

鍵を作成

$ ssh-keygen -t rsa -C ci@domain -P ""  jenkins_rsa

※ passphraseを空にしないとビルドジョブが失敗する。

ssh

$ vi .ssh/config
Host < gitlab host >
  User git
  Port 22
  Hostname < gitlab host >
  IdentityFile ~/.ssh/jenkins_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes    

5.GitLabでJenkinsユーザーを作成してフックURLを登録

いったんJenkinsを離れてGitLabへログイン。ちなみにこの作業はパブリックなリポジトリであれば、不要です。

  • 5-1. GitLabのAdmin areaでユーザーを作成。その名も"jenkins"としてみた。
  • 5-2. ログアウトして、"jenkins"でログインし直す。5で作成した公開鍵を登録しておく。
  • 5-3. Jenkinsでビルド対象にするリポジトリのオーナーでログイン。
  • 5-4. リポジトリのSettingsからTeamへ"jenkins"をRepoter権限で追加
  • 5-5. 同じくSettingsのHooksで以下のようなURLを登録

    http://< jenkins host >/git/notifyCommit?url=git@< gitlab host >:< repository owner >/< repository name >.git

6.Jenkinsでビルドジョブを作成する

いよいよここまできました。Jenkinsに戻って、New Jobをクリック! 必要な項目を入力するだけですが、ここでのポイントは、

  • 6-1. “Source Code Management” で"Git"を選んで、"Repository URL"にssh://〜で始まるURLを入力する
  • 6-2. “Build Triggers"で"Poll SCM"にチェックする
  • 6-3. "Build"のプルダウンで"Execute shell"を選んでビルドコードを入力

今回は小さなRubyスクリプトリポジトリで試しているので以下のようなコードを登録しました。

bundle install
bundle exec rspec

7.Push!!

これでローカルのリポジトリからpushすると5-5で設定したURLが呼び出され、change foundならばビルドが走ります。やったね!


おまけ GitHub

せっかくだからGitHubにあるプライベートリポジトリでも使いたい。となった時は

CIサーバ側のユーザの設定

github.comへssh接続できるようにしておく。

$ vi .ssh/config
Host github.com
  User git
  Port 22
  Hostname github.com
  IdentityFile ~/.ssh/jenkins_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes

GitHubの設定

  1. 2でGitHubプラグインをインストールする。
  2. JenkinsでGitHub用のユーザーを作成(例えば,、"github")
  3. GitHubの対象リポジトリのdeploy key に4の公開鍵を登録。
  4. 対象リポジトリの"Service Hooks"から"Jenkins (GitHub plugin)"をクリックして以下のようなURLを登録

    < Jenkins上のGitHub用ユーザ名、例えば、"github” >:< そのパスワード >@< jenkins host>/github-webhook/

Jenkinsにジョブを作成して、pushすると同様にビルドが走ります。


参考

まとめ

  • 丸一日費やしてしまった。
  • まだまだ他にいい方法ありそう。
  • コード書かないと。