UbuntuにRhodeCodeを入れてGitリポジトリを公開する

RhodeCodeというのは、

Githubのような雰囲気のソース共有サーバを構築するオープンソースです。

Githubでやりたい事を、Githubではなく、ローカルで実現したい、といった場合に適していると思います。

リポジトリをフォークしたり、ソースレビューをしたりetc

と言うことで、

RhodeCodeをインストールして見ます。

RhodeCodeはPython製なので、Pythonをインストールします。

sudo apt-get install python-dev python-setuptools

RhodeCodeのデフォルトのソース管理がMarcurialなので、入れておきます。

sudo apt-get install mercurial

Gitクライアントも入れておきます。

sudo apt-get install git

リポジトリ保存用のディレクトリ、プログラムディレクトリなどをあらかじめ作成します。

cd /var

sudo mkdir rhodecode
cd rhodecode
sudo mkdir rhodecode
sudo mkdir repositories

実行ユーザを作成します

sudo adduser rhodecode –disabled-password
sudo chown -R rhodecode:rhodecode /var/rhodecode

RhodeCodeのインストール

sudo easy_install rhodecode

RhodeCodeのセットアップ
以下が参考
http://packages.python.org/RhodeCode/setup.html#setup

RhodeCodeの設定ファイル作成

cd /var/rhodecode/rhodecode
paster make-config RhodeCode production.ini

production.iniファイルを開き、hostに実際のIPアドレスを設定

paster setup-rhodecode production.ini \
–user=admin \
–password=admin \
–email=gendosu@gendosu.jp \
–repos=/var/rhodecode/repositories

RhodeCodeの起動確認

paster serve production.ini

RhodeCode用のinit.dスクリプトを追加

https://secure.rhodecode.org/rhodecode/files/beta/init.d
に登録されている、「rhodecode-daemon2」を参考にする

パス情報などが環境にマッチしないと思うので、その辺を修正する。

修正後のファイルの中身

#!/bin/sh -e
########################################
#### THIS IS A DEBIAN INIT.D SCRIPT ####
########################################

### BEGIN INIT INFO
# Provides: rhodecode
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts instance of rhodecode
# Description: starts instance of rhodecode using start-stop-daemon
### END INIT INFO

APP_NAME=”rhodecode”
APP_PATH=”/var/gendosu/$APP_NAME”

CONF_NAME=”production.ini”

PID_PATH=”$APP_PATH/$APP_NAME.pid”
LOG_PATH=”$APP_PATH/$APP_NAME.log”

PYTHON_PATH=”/usr/local”

RUN_AS=”hoge”

DAEMON=”$PYTHON_PATH/bin/paster”

DAEMON_OPTS=”serve –daemon \
–user=$RUN_AS \
–group=$RUN_AS \
–pid-file=$PID_PATH \
–log-file=$LOG_PATH $APP_PATH/$CONF_NAME”

start() {
echo “Starting $APP_NAME”
PYTHON_EGG_CACHE=”/tmp” start-stop-daemon -d $APP_PATH \
–start –quiet \
–pidfile $PID_PATH \
–user $RUN_AS \
–exec $DAEMON — $DAEMON_OPTS
}

stop() {
echo “Stopping $APP_NAME”
start-stop-daemon -d $APP_PATH \
–stop –quiet \
–pidfile $PID_PATH || echo “$APP_NAME – Not running!”

if [ -f $PID_PATH ]; then
rm $PID_PATH
fi
}

case “$1” in
start)
start
;;
stop)
stop
;;
restart)
echo “Restarting $APP_NAME”
### stop ###
stop
wait
### start ###
start
;;
*)
echo “Usage: $0 {start|stop|restart}”
exit 1
esac

svnのリポジトリを全部gitに移行する

svnのリポジトリをgitで扱う方法として
svn gitというコマンドツールがある

今回はgitをリモートリポジトリにする方法は別途解説するとして

このコマンドを使用して、svnリポジトリをgitに移行してみます。

まずは、gitリポジトリをイニシャライズします。

イニシャライズ時に、リモートリポジトリにする前提で移行するので–bareオプションを付けます。
これは、my_prodディレクトリにソースを展開せずに管理情報だけを保持するリポジトリにするオプションです。
[shell]git init –bare my_prod[/shell]

svnへの参照情報をconfigファイルに設定します。

[shell]cd .git
vi config[/shell]
以下の内容を追記
[text][svn-remote "svn"]
url = http://localhost/svn/my_prod
fetch = trunk:refs/heads/master
branches = branches/*:refs/heads/*
tags = tags/*:refs/tags/*[/text]

  • urlというのは、SVNリポジトリのベースになるURLですが、個々のリポジトリ名まで含んで問題ないみたい。
    このURIに/trunkとか/branchesとかをくっつけられる状態であればいいようです。
  • fetchというのは、マスターを指定する部分です。
    が、マルチマスター構成も可能で、ここは複数行書くことが出来ます。
    その際は、refs/heads/sub-musterとかをフェッチ先に指定する様にします。
  • branchesは、ブランチ配下を取り込むという指定です。
    ここの書き方としては「*」をかならず含まなければいけないようです。
    で、ブランチ名によるフィルタリングをして取り込みたいブランチだけを指定することも可能。
    branches/release_*:refs/head/branches/release_*
    という感じに。
  • tagsも同様です。

svnからリポジトリを取得

[shell]git svn fetch[/shell]
これで、http://localhost/svn/my_prodにあるtrunk、branches以下のすべて、tags以下のすべての情報がgitに取り込まれます。

このgitリポジトリをサーバとして公開すれば、svnからgitへの移行が完了となります。

Ubuntu 12でgitoliteを使ってgitリポジトリを公開する

公開リポジトリを作成するまで

gitのインストール
[shell]sudo apt-get install git[/shell]
gitoliteのインストール
[shell]sudo apt-get install gitolite[/shell]
gitolite用アカウントの作成
[shell]sudo adduser –disabled-password gitolite[/shell]
管理者用として公開鍵を作成
[shell]ssh-keygen -t rsa[/shell]
gitoliteアカウントのホームに転送

sudo cp .ssh/id_rsa.pub /home/gitolite/admin.pub

gitoliteアカウントにログインし、gitolite環境をセットアップ
[shell]sudo su – gitolite
gl-setup admin.pub
exit[/shell]
gitolite用の管理リポジトリをcloneする
[shell]git clone gitolite@localhost:gitolite-admin[/shell]
リポジトリを新規作成する

gitolite/conf/gitolite.conf ファイルに以下の内容を追記
[shell]repo hoge
RW+ = admin[/shell]
変更をpushする
[shell]git commit -m "add repo"
git push[/shell]
これで、hogeリポジトリが作成され、adminがアクセス出来るようになる

別のマシンからcloneする場合、ssh-keygenの部分からやれば良い

ユーザの追加は

gitolite-admin/keydirに作成した公開鍵の名前で作成される

win-gendosu.pub

とやれば、

gitolite-admin/conf/gitolite.conf

で設定するユーザは

win-gendosuとなる。

先のhogeにwin-gendosuの権限も付け加えると
[shell]repo hoge
  RW+ = admin win-gendos[/shell]
となる

RVMをセットアップする

Rubyは、リファレンス実装でC言語によるRuby(CRuby)や、Javaでの実装のJRuby、.NETのIronRubyなど、多くの実装があります。

これを一つ一つ環境構築してたら、大変なので

RVMというRubyの管理ツールをインストールしてみます。

これで出来る事は
Rubyのバージョンを切り替える
CRubyからJRubyに切り替える
gemのセットを作って切り替える

など

お手軽に入れるには、Ubuntuなどのユーザ領域にRVMをインストールする

ということで、インストールして見ます。

まずは本家のサイトを見ます。

https://rvm.io/

rvmを実行するには、必ず必要になるコマンド類をインストールします。
[shell]apt-get install git curl patch[/shell]
RVMのインストールスクリプトをダウンロード&実行します
[shell]curl -L https://get.rvm.io | bash -s stable[/shell]
これで、安定版がインストールされました。

ターミナルに再ログイン後

rvmとやって、コマンド一覧が出たら成功です。

rvmで管理出来るRubyの一覧を見てみます。

rvm list known

CRuby 1.9.3を入れてみます。

※CRubyをインストールする時は、Ubuntuの場合だと、必要なパッケージ、コマンド類がありますので、それをあらかじめ入れておきます。
Additional Dependencies:
# For Ruby / Ruby HEAD (MRI, Rubinius, & REE), install the following:
ruby: /usr/bin/apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion pkg-config

rvm install 1.9.3

続いて、1.8.7もインストールして見ます。

rvm install 1.8.7

これで、二つのバージョンがインストールされました。

rvm list

とやると、インストールされているRubyが一覧表示されます。

現在は、デフォルトでカレントが1.9,3になっていると思います。

ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [i686-linux]

ruby 1.8.7を使いたい時は

rvm use 1.8.7

とやれば、切り替えることが出来ます。

ruby -v
ruby 1.8.7 (2012-10-12 patchlevel 371) [i686-linux]

 

gitoliteからcloneする

gitoliteからリポジトリをクローンするには

Linux系の場合
[shell]ssh-keygen -t rsa[/shell]
でキーを作成する

id_rsa.pubを適当な名前でコピーする
例)gendosu-ubuntu.pub

gitoliteのサーバにsftpなどで送り込んで

gitolite-admin/keydirに格納する

gitolite-adminリポジトリをコミットして、プッシュ

これで、gitoliteへ公開鍵を設定完了
[shell]ssh gitolite@サーバ名[/shell]
とやると、gitoliteがメッセージを返してくれるはず

この状態で
[shell]git clone gitolite@[サーバ名]:[リポジトリ名][/shell]
とすると、クローンが作成される

Windows系

環境変数にHOMEという項目を作成して

c:\users\[自分のアカウント名]

を登録する。
要は自分のホームを指定する。

gitを扱う手っ取り早い方法

githubのWindowsクライアントをとりあえずインストールする

ターミナルでgitコマンドが使えるようになるので、そこで
[shell]ssh-keygen -t rsa[/shell]
を実行

c:\users\[自分のアカウント名]\.sshに

id_rsa.pubが出来ていると思うので、適当な名前(クライアントマシン名etc)でコピーする
例)gendosu-win.pub

それをpscpやwinscpなどで、gitoliteのサーバに送り込む

gitolite-admin/keydirに格納する

gitolite-adminをコミット、プッシュする

win側で

c:\users\[自分のアカウント名]\.ssh\configファイルを作成し
以下を追加
[shell]host gitolite
    user gitolite
    hostname 192.168.1.10 #サーバのIPかホスト名
    port 22
    identityfile ~/.ssh/id_rsa[/shell]
コマンドプロンプトで
[shell]ssh gitolite[/shell]
とやると、gitoliteがメッセージを返してくれるはず

gitクローンは
[shell]git clone ssh://gitolite/[リポジトリ名][/shell]
とやる

ActiveRecordのscopeで作成した条件などをSQLとして出力する

[ruby]scope :active, where(‘deleted_at is null’)[/ruby]
というスコープを設定したとして

この条件を含むSQLをコード内で取得したい場合ってありますよね。

SQL書いてでゴニョゴニョしたい場合とか…。

そんな時には
[ruby]Article.active.to_sql[/ruby]
としてやれば、
[sql]select * from articles where deleted_at is null[/sql]
というSQLが取得出来ます。

参考例
[ruby]# === タグ
class Tag < ActiveRecord::Base
scope :have_article, lambda{|sql| where("tags.id in (#{sql})")}
end

# === 記事
class Article < ActiveRecord::Base
scope :active, where(‘deleted_at is null’)
end

# === ルートコントローラー
class TopController < ApplicationController
def index
# ここで、
# select tag_id from articles group by tag_id
# というSQLが取得出来る
 articles_sql = Article.active.group(‘tag_id’).select(‘tag_id’).to_sql

# ここで、
# select * from tags where tags id in (
# select tag_id from articles group by tag_id
# )
# というSQLが内部で生成される
  @tags_have_articles = Tag.have_article(articles_sql)
end
end[/ruby]