gem install rmagick に失敗したときの対処

CentOS 6.3 で bundler で依存パッケージのインストール時に失敗した。エラー内容は下記。

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

        /usr/local/rbenv/versions/1.9.3-p286/bin/ruby extconf.rb 
checking for Ruby version >= 1.8.5... yes
extconf.rb:128: Use RbConfig instead of obsolete and deprecated Config.
checking for gcc... yes
checking for Magick-config... no
Can't install RMagick 2.13.1. Can't find Magick-config in /usr/local/rbenv/versions/1.9.3-p286/bin:/usr/local/rbenv/libexec:/usr/local/rbenv/shims:/usr/local/rbenv/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/usr/local/rbenv/versions/1.9.3-p286/bin/ruby


Gem files will remain installed in /usr/local/rbenv/versions/1.9.3-p286/lib/ruby/gems/1.9.1/gems/rmagick-2.13.1 for inspection.
Results logged to /usr/local/rbenv/versions/1.9.3-p286/lib/ruby/gems/1.9.1/gems/rmagick-2.13.1/ext/RMagick/gem_make.out
An error occurred while installing rmagick (2.13.1), and Bundler cannot continue.
Make sure that `gem install rmagick -v '2.13.1'` succeeds before bundling.

どうやら ImageMagick-devel がないことが原因らしい。下記でインストール。

# yum install ImageMagick-devel

そしてまた gem install なり bundle install なりを実行すると、インストールが成功する。

Jenkins のステータスを BuildReactor で監視する

Chrome のエクステンションで便利なのがあるので、使い方メモ。
BuildReactor - Chrome Web Store

Jenkins の設定

まず、よくわからないけど日本語にローカライズされてて動かなかった箇所があったので、Jenkins の設定を変更する。

# vim /var/lib/jenkins/config.xml

で、"すべて" とかかれているところは全部 "All" に変更

:%s/すべて/All/g

あと、各ユーザーのコンフィグもこうなってるっぽいので、それらもすべて変更

# vim /var/lib/jenkins/users/[ユーザー名]/config.xml

同じように

:%s/すべて/All/g

それで Jenkins の再起動

# /etc/init.d/jenkins restart

下記の URL にアクセスして、xml が返ってきたらOK。
http://[Jenkinsのホスト]/jenkins/view/All/cc.xml

BuildReactor のインストール/設定

Chrome で、下記のエクステンションをインストールする。
BuildReactor - Chrome Web Store
インストールしたら、下の図のようなアイコンが出てくるので、そいつをクリック、スパナみたいなアイコンクリックしてオプション画面を開く。

それから左にある Add ボタンをクリックすると下記のようになる。

ここで Jenkins を選択して、下部にプロジェクト名を入力する。mocha-test として入力したけど、多分ホスト名の方がいいかもしれない。
そして Add すると、下記の詳細設定画面になる。

URL に http://[Jenkinsのホスト]/jenkins、
アカウントを入力(認証有の場合)して、Show ボタンをクリックすると、Job一覧が出てくる。監視する Job を選択して、Save をクリックすると、監視が始まる。

動作確認

せっかくなので前回までに作った mocha-test で確認する。テストが失敗するように変更。
# test/calc.test.js

13 行目
- assert.equal(result, 4);
+ assert.equal(result, 3);

んで push

# git add test/*
# git commit -m "modify calc.test.js to fail"
# git push -u origin master

そうすると、監視インターバルが60secなので、1分位するとChromeの通知がポップアップする。
んで、また修正。
# test/calc.test.js

13 行目
- assert.equal(result, 3);
+ assert.equal(result, 4);

んで push

# git add test/*
# git commit -m "fix test to pass"
# git push -u origin master

インターバルが来ると、ビルドが直ったよ!っていう通知が来る。

GitLab の push をトリガーに Jenkins を回す

前回まで作ってた GitLab と Jenkins の連携方法のメモ。GitLab に push すると、そのプロジェクトをビルドしてメールでテスト結果を報告するようなサンプルを作る。

GitLab のリポジトリ作成

まずは CI まわしたいプロジェクトのリポジトリを作成する。このへんは普通の github とやりかたは変わらないので割愛する。今回は Node.js で mocha のテストプロジェクトをやってみたいので、「mocha-test」というプロジェクト名にした。

Jenkins の設定

Jenkins からそのプロジェクトを参照できるようにする。Jenkins は jenkins ユーザーで稼働しているため、そのままの設定だとリポジトリが見れない。GitLab 構築の際に apache ユーザーを admin にしたように、jenkins ユーザーも admin に設定する。まずは jenkins ユーザーの ssh key を生成する。

# sudo -H -u jenkins ssh-keygen -q -N '' -t rsa -f /var/lib/jenkins/.ssh/id_rsa

生成したキーを gitolite に読み込ませる。

# cd /home/git
# cp /var/lib/jenkins/.ssh/id_rsa.pub jenkins.pub
# chown git:git jenkins.pub
# chmod 444 jenkins.pub
# sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; gitolite setup -pk /home/git/jenkins.pub"

ここまでがうまく行っていれば、/home/git/.ssh/authorized_keys に jenkins の行が追加されているはず。
そしてまだ admin 権限は設定されていないので、まだプロジェクトはクローン出来ない。
次は gitolite-admin の設定をする。

# cd /tmp
# sudo -u apache git clone git@localhost:gitolite-admin.git  # 前回までの記事で apache に admin権限を渡しているので、apache で clone する。他のユーザーに管理者権限を渡している場合はそのユーザーで実行すること。
# cd gitolite-admin/

この中の設定ファイルを編集
# vim conf/gitolite.conf

repo    gitolite-admin
  RW+                            = apache
repo    testing
  RW+                            = @all
repo    @all
  RW+                            = apache

こんな感じになっているものに、jenkins を追加。(多分repo @allに追加するだけでいいと思うけど、一応gitolite-adminにも追加)

repo    gitolite-admin
  RW+                            = apache jenkins
repo    testing
  RW+                            = @all
repo    @all
  RW+                            = apache jenkins

んで、変更をコミットする。

# git add conf/gitolite.conf
# git commit -m "add jenkins to admin user"
# sudo -u apache git push -u origin master
用がすんだら、clone したものを消しておく
# cd ../
# rm -rf gitolite-admin

これで jenkins ユーザーに管理者権限がついているはずなので、チェックする。

# cd /tmp
# sudo -u jenkins git clone git@localhost:gitolite-admin.git
もし localhost じゃなくて、ドメイン名をつけていたらそれでアクセスできるかをチェックすること。(known_hosts に追加する必要があるため)

成功したらディレクトリを消しておく
# rm -rf gitolite-admin

Jenkins の設定

Jenkins で CI したいジョブを作成する。

ホーム画面で新規ジョブ作成をクリック。

次にジョブ名を入力して、フリースタイル・プロジェクトのビルドを選択。今回ジョブ名は「mocha-test」とした。

ソースコード管理システムに Git を選択し、リポジトリの情報を入力する。

ビルドのトリガには「SCMのポーリング」を選択する。スケジュールにはなにも記入する必要はない。

ビルドするときに実行するシェルスクリプトを設定する。入力するシェルスクリプトは下記。

export PATH=/usr/local/bin:$PATH
npm install -d
$WORKSPACE/node_modules/mocha/bin/mocha --reporter tap > mocha-test-results.txt


ビルド処理後にメール通知したいので、E-mail通知の設定もしておく。
すべて記入が終わったら、一番下の「保存」または「適用」をクリックして保存する。

Git の Hook の設定

ここまで設定が完了したら、プロジェクトが空の状態でビルドが開始されるか確認する。具体的には、下記のリクエストを実行するとビルドが開始されるはず。

http://[Jenkins のホスト名]/jenkins/git/notifyCommit?url=git@localhost:mocha-test.git

パラメタの url は、上記で設定したGitのリポジトリと同じ値を入力すること。
ブラウザでも curl でも良いのでリクエストを実行した後に、Jenkins のページをリロードするとビルドが開始または実行が終了しているはず。そして設定したメールアドレスにもメールが届いているはずなので、ビルドが正常に実行されたことを確認しておく。(この時点ではビルドは実行はされるが失敗になるはず)



上記のコマンドが正常に動いているようであれば、このコマンドをGitLabのHookに登録する。

# cd /home/git/repositories/mocha-test.git/hooks
# rm post-receive  # デフォルトのものはシンボリックリンクなので削除
# cp /home/git/.gitolite/hooks/common/post-receive . # 元の実ファイルをコピーして編集
# vim post-receive

下記のように一行加える。

#!/usr/bin/env bash

# This file was placed here by GitLab. It makes sure that your pushed commits
# will be processed properly.

----------------ここの一行を加える----------------------
curl http://[Jenkinsのホスト名]/jenkins/git/notifyCommit?url=git@localhost:mocha-test.git
------------------------------------------------------

while read oldrev newrev ref
do
  # For every branch or tag that was pushed, create a Resque job in redis.
  pwd=`pwd`
  reponame=`basename "$pwd" | sed s/\.git$//`
  env redis-cli rpush "resque:queue:post_receive" "{\"class\":\"PostReceive\",\"args\":[\"$reponame\",\"$oldrev\",\"$newrev\",\"$ref\",\"$GL_USER\"]}" > /dev/null 2>&1
done

んで、パーミッションを整える

# chmod 770 post-receive
# chown git:git post-receive

あとは git clone してチェックする。

挙動の確認

まずはローカルにプロジェクトをクローンする。

# git clone git@[Jenkins のホスト名]:mocha-test.git

前回の Node のテストを持ってくる。こんな感じのヤツ。

mochatest
 |- lib
 |    |- calc.js
 |
 |- test
 |    |- calc.test.js
 |
 |- package.json
# cd mocha-test
# mkdir lib
# mkdir test

それぞれのファイルを作成する。
# vim lib/calc.js

function add(x, y) {
  return x+y;
}

// このへんはおまじない
if (typeof exports !== 'undefined') {
  exports.add = add;
}

# vim test/calc.test.js

var calc = require('../lib/calc');
var assert = require("assert")

describe('calc', function() {
  describe('.add', function() {
    it('should return sum of 2 arguments', function() {
      var result = calc.add(1, 2);
      assert.equal(result, 3);
    });

    it('error', function() {
      var result = calc.add(1, 3);
      assert.equal(result, 3);
    });
  });
});

# vim package.json

{
  "name": "mocha-test",
  "version": "0.0.1",
  "devDependencies": {
    "mocha": "0.7.0"
  }
}

これで git push してJenkinsのビルドが動くかを確認する。

# git add .
# git commit -m "Initial commit"
# git push -u origin master

これで Jenkins のページをリロードして、ビルドが開始/完了していたら成功。新しくメールも着ているか確認する。
これだけだとちょっと気持ち悪いので、テストを変更してビルド成功するようにする。テストを書き換える。
# vim test/calc.test.js

13 行目
- assert.equal(result, 3);
+ assert.equal(result, 4);

んでコミット/プッシュ。

# git add test/*
# git commit -m "fix test to pass"
# git push -u origin master

これでまた push トリガーでビルドが走る。そして、テストがOKになってステータスが変わるはず。



とりあえずこんな感じ。

Node.js (v0.8.14-release)を CentOS 6.3 にインストール

Github の master からソースコンパイルする方法。

とりあえずソースを clone する。

# cd /usr/local/src
# git clone https://github.com/joyent/node.git
# cd node

stable ビルドじゃないといろいろインストールできないっぽいので、stable ブランチに切り替える。現時点では v0.8.14-release らしい。なんでmasterが前衛的なビルドなんだろうね

# git branch -r # リモートブランチを一覧する
  origin/HEAD -> origin/master
  origin/bettercla
  origin/blog
  origin/crypto-buffers
  origin/cryptopad
  origin/debugProcess
  origin/domains
  origin/domains-wip
  origin/domains2
  origin/domains3
  origin/downloadbutton
  origin/events-monomorphic
  origin/eventsource
  origin/fix/2746
  origin/for-tomasz
  origin/isolates
  origin/issue2061
  origin/json-api-docs
  origin/master
  origin/max-tick-warning
  origin/openssl-asm
  origin/openssl-exports
  origin/openssl-fix
  origin/pathfix
  origin/perf-reg
  origin/pointer_bindings
  origin/reload
  origin/reviewme
  origin/smartos-compile-fno-strict-aliasing
  origin/speed
  origin/streams2
  origin/upgrade-gyp
  origin/v0.2
  origin/v0.4
  origin/v0.6
  origin/v0.7.10-fix
  origin/v0.7.4-release
  origin/v0.8
  origin/v0.8.10-release
  origin/v0.8.11-release
  origin/v0.8.12-release
  origin/v0.8.13-fix
  origin/v0.8.13-release
  origin/v0.8.14-release
  origin/v0.8.7-release
  origin/v0.8.8-release
  origin/v0.8.9-release
  origin/v0.9.1-release
  origin/v0.9.2-release
  origin/v0.9.3-release
  origin/v8-3.13.7.1
  origin/v8-trunk
  origin/v8upgrade
  origin/wip
  origin/writev
  origin/writev2

# git checkout -b origin/v0.8.14-release
# git branch  # ブランチ確認
  master
* origin/v0.8.14-release

コンパイルする。

# ./configure
# make
# make install

これだけ。サーバーがしょぼいとmakeで30分ぐらいかかる・・・
デフォルトだとパスはこんな感じになる

# which node
/usr/local/bin/node

そして npm も勝手に入る。

# which npm
/usr/local/bin/npm

それからバージョン確認。

# node -v
v0.8.14
# npm -v
1.1.65

JS のテストを BusterJS でやりたかったけど、なんだかうまく動かないので、PhantomJS+Jasmine を入れた。

# npm install -g phantomjs
# npm install -g jasmine-node

そしてバージョンの確認。

# phantomjs -v
1.7.0

jasmine-node はバージョンを出力するオプションがなさそうなので、下記のパッケージファイルを覗いた。

# less /usr/local/lib/node_modules/jasmine-node/package.json
"version": "1.0.26", // こんな感じの行があった

ここまで書いてなんだけど、PhantomJS + Jasmine もうまくいかなかったので、mocha にした。

# npm install mocha -g
# mocha --version
1.6.0

そして mocha も should はうまく動かない。最新のmochaだと動いてなさそうでした。mocha 0.7.0 で動いてそう。should は依然動かず。動いてる人のブログは何をしたら動いてるんだろう。とりあえず assert は上手く出来てるっぽいので、こっちでどうにかすることにした。
こちらを参考にしました。mocha と Jenkins で Node.js の CI 環境を構築する - hakobera's blog
とりあえず、上記を参考にテストが動くかどうかを確認した。下のような構成を組んだ。

mochatest
 |- lib
 |    |- calc.js
 |
 |- test
 |    |- calc.test.js
 |
 |- package.json

calc.js

function add(x, y) {
  return x+y;
}

// このへんはおまじない
if (typeof exports !== 'undefined') {
  exports.add = add;
}

calc.test.js

var calc = require('../lib/calc');
var assert = require("assert")

describe('calc', function() {
  describe('.add', function() {
    it('should return sum of 2 arguments', function() {
      var result = calc.add(1, 2);
      assert.equal(result, 3);
    });

    it('error', function() {
      var result = calc.add(1, 3);
      assert.equal(result, 3);
    });
  });
});

package.json

{
  "name": "myapp",
  "version": "0.0.1",
  "devDependencies": {
    "mocha": "0.7.0"
  }
}

package.json は依存を確認してくれる、Ruby でいうところの Rakefile みたいなもの。上記で mocha が 1.6.0 でインストールされているけど、npm install -d をやると、ルートディレクトリに node_module みたいなディレクトリができて、そこに必要なパッケージがインストールされ、そのディレクトリにいる場合は、そのローカルパッケージが使用されるようになる。
んで、テストは下記のようにする。

# npm install -d
# mocha

  ․․

  ✖ 1 of 2 tests failed:

  1) calc .add error:
     AssertionError: expected {} to equal 4
      at Object.Assertion.equal (/usr/local/src/mocha/node_modules/should/lib/should.js:295:10)
      at Context.<anonymous> (/usr/local/src/mocha/test/calc.test.js:17:21)
      at Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:200:32)
      at Runner.runTest (/usr/local/lib/node_modules/mocha/lib/runner.js:307:10)
      at Runner.runTests.next (/usr/local/lib/node_modules/mocha/lib/runner.js:353:12)
      at next (/usr/local/lib/node_modules/mocha/lib/runner.js:235:14)
      at Runner.hooks (/usr/local/lib/node_modules/mocha/lib/runner.js:244:7)
      at next (/usr/local/lib/node_modules/mocha/lib/runner.js:192:23)
      at Runner.hook (/usr/local/lib/node_modules/mocha/lib/runner.js:212:5)
      at process.startup.processNextTick.process._tickCallback (node.js:244:9)

こんな感じになればOK。1つめのテストは成功し、2つめのテストは失敗。これでテスト側を修正すればすべてクリアになる。
別の記事で jenkins との連携の細かい部分は書くけど、レポートが欲しい場合は、下記のように書いてテストすればOK。

# mocha --reporter tap > mocha-test-results.txt

Jenkins を CentOS 6.3 にインストール

GitLab に引き続き、Jenkins をインストールする。
Jenkins のインストールは非常に簡単なので、GitLab との連携までメモする。

Jenkins のインストール

Jenkins はレポジトリを登録して yum install するだけ。
こちらを参考にしました:さくらVPS(CentOS6.3)へJenkinsをインストールして認証つけてURLを変更する - えんたつの記録

# 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

ちなみに、jenkins は JDK1.6 以上が必要らしいので、入ってなければ yum install java しておく。yum じゃ入らなかったので、oracle から rpm 落としていれてください。

これでインストールは終わりで、下記がインストールされた設定やら環境やら

# Document Root
/var/lib/jenkins
# ログ
/var/log/jenkins
# 設定ファイル
/etc/sysconfig/jenkins
# 起動/停止
/etc/init.d/jenkins (start|stop|restart)

今回は Apache から Jenkins さんを見えるようにしたいので、設定ファイルを書き換える。
# vim /etc/sysconfig/jenkins

JENKINS_ARGS=""
	↓
JENKINS_ARGS="--prefix=/jenkins"

Apache の conf も ProxyPass を記述する。今回はデフォルトの 8080 ポートで Jenkins を起動するので、そのまま 8080 にプロキシする。もし他のサービスで 8080 ポートを利用している場合は、Jenkins の設定ファイルも、apache の conf も適宜書き換えること。
# vim ${APACHE_ROOT}/conf.d/jenkins.conf

<VirtualHost *:80>
    ServerAdmin admin@example.com
    DocumentRoot "/var/lib/jenkins"
    ServerName jenkins.hoge.com
    ServerAlias jenkins.hoge.com
    ErrorLog "/var/log/jenkins/apache-error.log"
    CustomLog "/var/log/jenkins/apache-access.log" common

    ProxyPass /jenkins http://localhost:8080/jenkins retry=5
    ProxyPassReverse /jenkins http://localhost:8080/jenkins
    ProxyRequests Off

    <Proxy http://localhost:8080/jenkins*>
      Order deny,allow
      Allow from all
    </Proxy>
</VirtualHost>

SSLでのアクセスはちなみにこんな感じで書いた。

<VirtualHost *:443>
    ServerAdmin admin@example.com
    DocumentRoot "/var/lib/jenkins"
    ServerName jenkins.hoge.com:443
    ServerAlias jenkins.hoge.com:443
    ErrorLog "/var/log/jenkins/apache-error-ssl.log"
    CustomLog "/var/log/jenkins/apache-access-ssl.log" common

    ProxyPass /jenkins http://localhost:8080/jenkins retry=5
    ProxyPassReverse /jenkins http://localhost:8080/jenkins
    ProxyRequests Off

    <Proxy http://localhost:8080/jenkins*>
      Order deny,allow
      Allow from all
    </Proxy>

    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
    SSLCertificateFile /path/to/hoge.crt
    SSLCertificateKeyFile /path/to/hoge.key
</VirtualHost>

これで、

# /etc/init.d/jenkins start

で Jenkins を起動して、

# /etc/init.d/httpd restart

apache を再起動して、http://jenkinshost/jenkins にアクセスして Jenkins のホームがみえればOK。

Jenkins の設定

まずはデフォルトでは git プラグインが入っていないので git プラグインをインストールする。


上記の図のように、プラグインの管理画面へ遷移して、利用可能タブをクリックする。
するとインストールできるプラグインが一覧されるので、必要なものを入れていく。
もしプラグインが一覧されないようであれば、高度な設定タブをクリックし、一番右下の更新ボタンをクリックする。(おそらく、このへんは時間がたてば Jenkins が自動的にアップデートするかも?)


今回は Git plugin と Gitlab plugin を入れた。Gitlab Plugin いれると 503 になってブラウザでの設定ができなくなったのでいれませんでした。


上記のようにチェックを入れて、下部の再起動せずにインストールをクリック。そうすると自動的にプラグインをインストールしてくれる。
次に、設定。システムの設定画面に移動する。

そして、セキュリティの有効化とCSRF対策にチェックをいれておく。
セキュリティの有効化は、ブラウザアクセスするときにログインが必須になるというもの。最初はユーザーのサインアップを許可し、自分のアカウントを作った後にサインアップの許可を外すといいと思う。

Git の設定。

Git plugin の設定

Jenkins の URL の設定

Eメールの設定

とりあえずインストール作業としてはここまで。長くなったので GitLab との連携は別で書く。

GitLab を CentOS 6.3 にインストール

GitLab とは

GitLab は、GitHub のクローンで、GitHub みたいにパブリックにしたくない場合、自分のサーバーにプライベートサービスとして使うことができるパッケージ。自分で git のリポジトリ立てる場合、管理が大変になってくるので、ブラウザで管理できるのは非常に楽である。

事前準備

ruby

ruby が必要になるので環境をrvmかrbenvかをインストールしておく。前に rbenv の記事は書いてあるので、参考に。
rbenv を CentOS 6.3 にインストール - 俺の成長日記

DB(MySQLPostgreSQL, SQLite3 いずれか)

GitLab のアカウント管理に RDB を利用するので、MySQL、PostreSQL、SQLite3 いずれかをインストールしておく。
MySQL のインストールは以前記事に書いてあるので、参考にする。
http://d.hatena.ne.jp/katsuren/20120919/1348067825

Redis

KVS の DB として Redis も利用しているので、これもインストールしておく。
これも以前書いてる。参考:CentOS 6.2 サーバー構築手順 - 俺の成長日記

Apache

今回はApacheを使う。GitLabはRailsで作られているので、Passenger のインストールが必要になる。Apacheコンパイルするときに、mod_proxy を有効にしておく。

Passengerのインストール

rubygems から passenger をインストールしておく。

# gem i passenger
ちなみに i は install の略らしい(ドヤァ)gem install 〜 でも同じ挙動になる。
# rbenv rehash
# passenger-install-apache2-module

成功したら、conf にこれを書いてね、っていうのがでてくるので、${APACHE_ROOT}/conf.d/passenger.conf あたりに指示されたものを書いとく。

The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /usr/local/rbenv/versions/1.9.3-p286/lib/ruby/gems/1.9.1/gems/passenger-3.0.17/ext/apache2/mod_passenger.so
   PassengerRoot /usr/local/rbenv/versions/1.9.3-p286/lib/ruby/gems/1.9.1/gems/passenger-3.0.17
   PassengerRuby /usr/local/rbenv/versions/1.9.3-p286/bin/ruby

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!
pip のインストール
# cd /usr/local/src
# curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py
# python get-pip.py

下記のようなエラーがでたら setuptools が入ってない。

An error occured while trying to run get-pip.py. Make sure you have setuptools or distribute installed.

ので、yum から setuptools を入れる。

# yum install -v python-setuptools
ユーザーの作成

git / gitlab で必要なユーザーを作成しておく。あらかじめ作られている httpd ユーザーは apache とする。今回は httpd 経由で色々操作するので、gitlab ユーザーは作成せず、apache ユーザーに必要な権限を与えていく。

# useradd git
httpd ユーザーを git グループに追加
# usermod -a -G git apache

apachessh キーを作成する

# mkdir -p /home/apache/.ssh
# chmod 700 /home/apache/.ssh
# chmod 700 /home/apache
# chown apache:apache -R /home/apache
# sudo -H -u apache ssh-keygen -q -N '' -t rsa -f /home/apache/.ssh/id_rsa

yum パッケージで httpd をインストールしている場合は、apache ホームディレクトリが /var/www なので、上記ではなくて下記のようになる。

# mkdir -p /var/www/.ssh
# chmod 700 -R /var/www/.ssh
# chown apache:apache -R /var/www
# sudo -H -u apache ssh-keygen -q -N '' -t rsa -f /var/www/.ssh/id_rsa

以降、apache のホームディレクトリ関連は /var/www に置き換えて考えること。


gitolite のインストール

git の管理は、gitolite というアプリケーションで行う。
GitHub - sitaramc/gitolite: Hosting git repositories -- Gitolite allows you to setup git hosting on a central server, with very fine-grained access control and many (many!) more powerful features.

# cd /home/git
# sudo -H -u git git clone https://github.com/sitaramc/gitolite.git
# sudo -u git -H mkdir bin
# sudo -u git sh -c 'echo -e "PATH=\$PATH:/home/git/bin\nexport PATH" >> /home/git/.profile'
# sudo -u git sh -c 'gitolite/install -ln /home/git/bin'

パス無しで操作できるように、apache ユーザーとのキー交換を行う。

# cp /home/apache/.ssh/id_rsa.pub /home/git/apache.pub
# chmod 0444 /home/git/apache.pub
# chown git:git /home/git/apache.pub
# sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; gitolite setup -pk /home/git/apache.pub"
# sudo -u git -H sed -i 's/0077/0007/g' /home/git/.gitolite.rc

それから、なんかこれを編集しないとプロジェクトの追加とかができなかった。

# sudo -u git vim /home/git/.gitolite.rc

// この部分を
GIT_CONFIG_KEYS             =>  '',
// こんな感じに変更
GIT_CONFIG_KEYS             =>  '.*',

パーミッションを変更する。

# chmod -R g+rwX /home/git/repositories/
# chown -R git:git /home/git/repositories/

どうやらリポジトリを直に apache が見ることがあるようで、git のホームディレクトリにグループユーザーの権限も付与しておく。

# chmod g+rx /home/git

ここまできたら、gitolite が動作しているか確認する。ここで、know_hosts に追加してもよいか聞かれるので、yes にしておく。

# cd /tmp
# sudo -u apache -H git clone git@localhost:gitolite-admin.git 
git clone に成功したら
# rm -rf gitolite-admin

豆知識。gitolite は変更をすべて git 上で行う。だから、変更を /home/git/.gitolite のディレクトリに対して行っても意味が無いことが多い。上記の gitolite-admin を clone して、その中身を変更、push することで設定が反映される。

GitLab のインストール

必要なパッケージのインストール

# gem i charlock_holmes --version '0.6.8'
# pip install pygments
# gem i bundler
# rbenv rehash

GitLab の公開用のディレクトリを作成して、gitlabhq をダウンロードする。ルートディレクトリは /home/project/gitlab とする。

# mkdir -m 775 -p /home/project/gitlab
# chown apache:apache -R /home/project
# cd /home/project/gitlab
# sudo -H -u apache git clone -b stable https://github.com/gitlabhq/gitlabhq.git .
設定ファイルをコピーする。
# sudo -u apache cp config/gitlab.yml{.example,}

設定ファイルの中身を編集する。(gitlab.yml)

web:
  host: hoge.example.com
  port: 443
  https: true

この部分を適当なドメインに設定する。今回は自分はSSLを使うので、portとhttpsを変更した。

git_host:
  admin_uri: git@localhost:gitolite-admin
  base_path: /home/git/repositories/
  hooks_path: /home/git/.gitolite/hooks/
  gitolite_admin_key: apache
  git_user: git
  upload_pack: true
  receive_pack: true
  host: hoge.example.com
  port: 22

あとはこのgit_hostの項目を変更する。
gitolite_admin_key が gitlab ではなく、今回は apache で設定したので、変更する。
それからhost,portに関してもコメントアウトを外して、適当なドメイン/ポートを設定する。ここに設定したドメインが GitLab に表示される、git@hogehoge:fuga.git のhogehogeの部分に反映される。

そしてデータベースの設定を行う。

データベース設定ファイルは使っている DB のものをコピーする。
MySQL
# sudo -u apache cp config/database.yml{.mysql,}
PostgreSQL
# sudo -u apache cp config/database.yml{.postgres,}
SQLite
# sudo -u apache cp config/database.yml{.sqlite,}
ここでconfig/database.ymlを開いて、適当な値を設定する。

使用するDBに応じたgemをインストールする。

MySQL
# bundle install --without development test sqlite postgres --deployment
PostgreSQL
# bundle install --without development test sqlite mysql --deployment
SQLite
# bundle install --without development test mysql postgres --deployment

DBをセットアップする。

# sudo -u apache -H -i bundle exec rake gitlab:app:setup RAILS_ENV=production

apache ユーザーが非アクティブの場合は、環境変数を毎回追加してあげる必要があった。他に良い方法があれば教えてください。以降、apache が非アクティブな場合で、rbenv を使う必要があれば、 'sh -c "PATH=/usr/local/rbenv:$PATH && 〜" を付けて実行してください。

# sudo -u apache -H sh -c "PATH=/usr/local/rbenv:$PATH && bundle exec rake gitlab:app:setup RAILS_ENV=production"

log, tmp ディレクトリを読み書き可能にしておく。

# chmod 777 -R log
# chmod 777 -R tmp
# chown apache:apache -R log
# chown apache:apache -R tmp

ついでに、vendor の所有者を apache にしておく。

# chown apache:apache -R vendor

hook の設定ファイルをコピーする。

# cp -p /home/project/gitlab/lib/hooks/post-receive /home/git/.gitolite/hooks/common/post-receive
# chown git:git /home/git/.gitolite/hooks/common/post-receive

このままだと git push するときにエラーでるので、編集する。

# vim /home/git/.gitolite/hooks/common/post-receive 

env 〜
っていうコマンドを実行している箇所の、-i オプションを削除する。


ここまでで、環境設定がうまくできているかをチェックする。

# sudo -u apache -i bundle exec rake gitlab:app:status RAILS_ENV=production

ここでチェックが通らない場合は、そのエラー内容を見て適切に対処する。

ここまできたらhttpdを起動する。

# /etc/init.d/httpd start

resque も起動する。

# cd /home/project/gitlab
# sudo -u apache -i ./resque.sh

あとは普通に利用出来るようになってるはずなので、ブラウザから上記のvhostなんかにアクセスする。
初期設定がうまくできていれば
ID: admin@local.host
PW: 5iveL!fe
でアクセスできるはず。
ログインしたあとは、Adminのパスワードを変更して、ユーザー作成して、プロジェクト作ったり ssh キーを登録したりする。

rbenv を CentOS 6.3 にインストール

Rails とか gitlab とか使ってみたかったので、手始めに rbenv をインストールすることにした。そのときのメモ。

rbenv とは

とりあえず説明。ruby をサーバーで利用するときに、バージョンの問題が出てくる。ruby の 1.8系と1.9系でも扱えるパッケージに差がでたりする。それを解決するのが rbenv。同じパッケージ管理ツールに rvm というものもあるが、今回は手軽らしい rbenv をインストールすることにする。ちなみに、rb(ruby)のenv(環境)っていう名前っぽい。恥ずかしながら、この文字の羅列は覚えられなかったけど、意味がわかって間違えなくなった。

インストール

※これらの作業は全部 root でやった。
とりあえず epel と remi レポジトリをいれる。

# cd /usr/local/src/
# rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

remi レポはデフォルトで enabled=0 になっているので、1にする。

# vim /etc/yum.repos.d/remi.repo

んで、適当に tmux と git をインストールする。

# yum -y install tmux git

他、ruby のビルドに必要なパッケージをインストールする。

# yum -y install gcc

rbenv のインストール。

# cd /usr/local/
# git clone https://github.com/sstephenson/rbenv.git
# mkdir rbenv/shims rbenv/versions
# groupadd rbenv
# chgrp -R rbenv rbenv
# chmod -R g+rwxXs rbenv

ruby-build のインストール。

# cd /usr/local/src/
# git clone https://github.com/sstephenson/ruby-build.git
# cd ruby-build
# ./install.sh

環境変数を通す(全ユーザーに適用する)。下記のコードを /etc/profile.d/rbenv.sh に書く。

export RBENV_ROOT="/usr/local/rbenv"
export PATH="/usr/local/rbenv/bin:$PATH"
eval "$(rbenv init -)"

このへんはもっと詳しく書いている人がいるので、もう少し詳しく知りたい人はそちらへ。
全ユーザーで共通のrbenv+ruby-buildを使用する環境を構築する - 一分一秒真剣勝負!
そして visudo で sudo したときでも PATH を引き継ぐようにしておく。

# visudo

こんな感じのブロックを探して

Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

下記の1行を追加する。

Defaults    env_keep += "PATH"



rubyの設定

いったん環境整えたら、再ログインして環境がロードされるか確認しておく。

# which rbenv

とかして、rbenv が使えるようになってればOK。
現在使える ruby は、下記のコマンドで一覧される。

# rbenv versions

今インストールしたばかりなので、もちろん何も出ない。
なので、ruby をインストールする。インストール可能なバージョンの一覧は下記のコマンドを実行する。

# rbenv install -l

2012/10/27 時点では下記が有効になってる。

Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  1.8.7-p302
  1.8.7-p334
  1.8.7-p352
  1.8.7-p357
  1.8.7-p358
  1.8.7-p370
  1.9.1-p378
  1.9.2-p180
  1.9.2-p290
  1.9.2-p318
  1.9.2-p320
  1.9.3-dev
  1.9.3-p0
  1.9.3-p125
  1.9.3-p194
  1.9.3-p286
  1.9.3-preview1
  1.9.3-rc1
  2.0.0-dev
  jruby-1.5.6
  jruby-1.6.3
  jruby-1.6.4
  jruby-1.6.5
  jruby-1.6.5.1
  jruby-1.6.6
  jruby-1.6.7
  jruby-1.6.7.2
  jruby-1.6.8
  jruby-1.7.0
  jruby-1.7.0-preview1
  jruby-1.7.0-preview2
  jruby-1.7.0-rc1
  jruby-1.7.0-rc2
  maglev-1.0.0
  maglev-1.1.0-dev
  rbx-1.2.4
  rbx-2.0.0-dev
  ree-1.8.6-2009.06
  ree-1.8.7-2009.09
  ree-1.8.7-2009.10
  ree-1.8.7-2010.01
  ree-1.8.7-2010.02
  ree-1.8.7-2011.03
  ree-1.8.7-2011.12
  ree-1.8.7-2012.01
  ree-1.8.7-2012.02

この中から stable の一番新しいのをインストールする。今回は 1.9.3-p286。
インストールは下記のコマンドを実行する。

# rbenv install 1.9.3-p286

インストールしたら、デフォルトでこのバージョンを使うように設定する。

# rbenv global 1.9.3-p286
# rbenv rehash

一応 ruby のバージョンを確認する。

# ruby -v
ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-linux]

アップデートとかをする場合には、ruby-build のソースコードを git pull で更新して、install.sh を実行し、rbenv install をして、global で設定する。