個人/仲間で作ったアプリのソースコードを管理したり、サンプルアプリ的なものを作ってそのコードを公開したりしようとすると、GitHub は非常に便利です。私も色々な形で使っています。

ただ、GitHub でソースコードを管理すると基本は誰からもソースコードが見れるように公開する形になります。GitHub でプライベート管理をすることは可能ですが、その場合は有償アカウントに切り替える必要があります。業務で使うケースでは(少なくとも開発中は)ソースコードを公開したくない、というケースも珍しくないと思うので、ソースコードをどうやってプライベート管理するか、という問題が生じます。自分も最近ありました。

自分の場合は自分で SubversionGitLab 環境を構築して使っています(両方使っています)。この中の GitLab は GitHub 互換のリポジトリ管理や問題トラッキングの環境を(Community Edition であれば)無料のオープンソースで構築することができるようになります。GitHub 互換なので、git コマンドを使ってソースコードをコミットしてプッシュして・・・という GitHub と同じ管理ができます。git コマンドに慣れた人には非常に便利です。 というわけで、この GitLab 環境を CentOS 上に構築する手順をまとめてみました。

【あらかじめ用意しておくもの】

SSH 鍵のペア。作成方法はこちらを参照:



【導入&設定手順】

GitLab の導入自体は用意されたインストールパッケージを実行するだけなので非常に簡単です。まずは Community Edition のダウンロードページへ行き、自分の環境にあった最新版 GitLab Community Edition のパッケージを選んで導入することになります:
https://packages.gitlab.com/gitlab/gitlab-ce
2015122401
 ↑ラズベリーパイ向けのもパッケージもあるのか・・・


ちなみに、2015/Dec/24 時点では 8.3.0 が最新バージョンでした。このバージョンではオートマージ機能が追加されているようです:
https://about.gitlab.com/2015/12/22/gitlab-8-3-released/


例えば自分の場合であれば 64bit 版の CentOS 6 を使っているので、"el6" と書かれた最新版の rpm パッケージの箇所をクリックすると、以下の様な導入のインストラクションが表示されます。ここに書かれている通りに CentOS 環境からコマンドを実行してインストールします:
2015122402


モジュールインストール後に、環境設定が必要です。具体的には GitLab に自分自身の URL を認識させる必要があります。root 権限で /etc/gitlab/gitlab.rb ファイルを編集し、external_url に自分自身の IP アドレス(以下 'XXX.XXX.XXX.XXX')を設定して保存します:
# vi /etc/gitlab/gitlab.rb
: : external_url 'http://XXX.XXX.XXX.XXX' # 'http://gitlab.example.com' から自分の IP アドレスに書き換え : :

これだけで動かすこともできます。が、この状態で使うと色々不都合が生じることもあります。以下はそのためのオプショナルな設定を加える場合についていくつか紹介します。

まずはこのまま使うとユーザー追加時にメール認証(新規に追加したユーザーにメールが送られて、そのメール内のリンクをクリックしたら本登録)が必要になります。そのためにはメールサーバーとその設定/管理を・・・ ということになりますが、プライベートリポジトリ目的だけで使うのであれば、メール認証(というかメールサーバー管理)が面倒なので、その手順をスキップさせることもできます(その場合は /opt/gitlab/embedded/service/gitlab-rails/app/models/user.rb ファイルをカスタマイズして、ユーザーの登録と同時にメール認証が済んでいるかのように振る舞わせることになります)。テキストエディタで同ファイルを開いて、"class User" で始まる行以降に default_value_for で始まる行が数行続いているはずですが、その最後に以下の一行を追加してください:
# vi /opt/gitlab/embedded/service/gitlab-rails/app/models/user.rb
: : class User < ActiveRecord::Base : : default_value_for :admin, false : : default_value_for :confirmed_at, Time.now # この一行を追加 : : : :

また、CentOS の環境によっては GitLab が使う git ユーザー(セットアップ時に作成されているはずです)に ssh アクセスが許可されていないこともあります。その解除のためには以下の2ファイルを編集する必要があります。

1つ目は /etc/shadow を編集して、パスワードを設定していないユーザーの SSH アクセスを許可してあげてください:
# vi /etc/shadow
: : git:!!:16793::::::  (こっちから)   ↓ git:*:16793::::::   (こっちに変更) : :

もう1つは /etc/ssh/sshd_config を編集して、SSH を許可するユーザーに git を追加した上で sshd をリロードします:
# vi /etc/ssh/sshd_config
: : AllowUsers xxxx yyyy git  (AllowUsers に git を追加) : :

# service sshd reload

以上の内容は環境依存の箇所もありますが、必要に応じて設定してください。

この状態で GitLab を reconfigure します。reconfigure にはしばらく時間かかりますが、"Runnning handers complete" と表示されれば無事成功、これで設定調整は完了です:
# gitlab-ctl reconfigure
  :
  :
  :
  :
Running handlers:
Running handlers complete
Chef Client finished, 211/281 resources updated in 01 minutes 30 seconds
gitlab Reconfigured!

ここからは作成した GitLab 環境に実際にログインしての作業になります。まずはウェブブラウザで GitLab サーバー(http://XXX.XXX.XXX.XXX/)にアクセスしてみます:
2015122403


初期ページが表示されれば一応動いていることになります。まずは管理ユーザーを有効にするため、ユーザーID(root) と初期パスワード(5iveL!fe)を指定してログインします。パスワードはすぐに変更するのでここでは記憶させる必要はありません:
2015122404


ログインに成功すると、とりあえず初期パスワードを変える必要があります。初期パスワード(5iveL!fe)と、新しい管理者用パスワード(確認のため2回)を指定して、新しいパスワードを登録してください:
2015122405


直後に再度ログイン画面に戻るので、ユーザー ID(root) と新しいパスワードを指定してログインしてください:
2015122406


ログイン後にこんな画面が表示されれば、とりあえず初期設定は完了です:
2015122407



【ユーザー追加手順】

自分1人でソースコード管理をするのであれば、このまま管理者権限で作業を続けてもいいのですが、多くのケースでユーザー管理をすることが多いと思います。そこで作業用のユーザーを登録して、以降はその作業ユーザーによるプロジェクト管理を行っていく内容を紹介します。

ユーザーを新規に登録するには、root で GitLab にログインした状態から、ダッシュボード右上の Admin Area をクリックします:
2015122401


続いて NEW USER ボタンをクリックします:
2015122402


新規に登録するユーザーの名前、ユーザー名(ログインID)、そしてメールアドレスを入力して CREATE USER ボタンでユーザーを作成します(この時点ではパスワードは登録しません):
2015122403


これで一般ユーザーの作成が行われました:
2015122404



メールサーバーが正しく設定されていて、メール認証が有効になっている場合は、指定したメールアドレスにメールが送られ、その本文内のリンクからパスワード設定を含めた本登録を行うことになります。

上記で紹介した手順でメール認証を無効にした場合は、このユーザーの初期パスワードを手動で登録してあげる必要があります。上記画面右上の EDIT ボタンをクリックして、初期パスワードを登録してあげてください:
2015122400


では、改めてこのユーザーでログインしてみます。root で GitLab にログインしている場合はダッシュボード右上の Sign out からログアウトしてください:
2015122406


改めて GitLab サーバーにアクセスして、今度は作成した一般ユーザーの ID とパスワードでログインします:
2015122407


一般ユーザーでログインできることを確認してください:
2015122408


このまま、このユーザー向けの SSH 鍵を登録しましょう。ダッシュボード左メニューから Profile Settings を選択します:
2015122401


続いて SSH Keys をクリックします:
2015122402


登録済み SSH 鍵の一覧が表示される画面ですが、この時点ではまだ何も登録されていないので表示されません。ではあらかじめ用意した SSH 鍵を登録してみます。ADD SSH KEY ボタンをクリックします:
2015122403


テキストエリアが表示されるので、この中に用意した公開鍵の内容をペーストします。また Title 欄に名前を付けて、最後に ADD KEY ボタンをクリックします:
2015122404


このユーザーが使える SSH 鍵が登録できました:
2015122405


同様にして、必要なユーザーと、そのユーザーの SSH 鍵を必要なだけ登録しておきます。


【プロジェクト追加手順】

では一般ユーザーでプロジェクトを追加してみます。ソースコードの管理をするにもまずはそのプロジェクトを作成する必要があります。

GitLab ダッシュボードに一般ユーザーでログインした後に、Project(初期状態でここが選ばれているはずです)の NEW PROJECT ボタンをクリックします:
2015122401


なお、一度プロジェクトを作成した後の二度目以降は画面右上の New Project をクリックしてください:
2015122408


プロジェクトの名前(下図では myhelloworld)や Description を入力後、Visivility Level に Private を指定すると(パブリックではない)プライベートなリポジトリを作ることができます。最後に CREATE PROJECT ボタンをクリックしてプロジェクトを作成します:
2015122402


GitLab 上にプロジェクト myhelloworld が新規に作成できました:
2015122403


画面を下にスクロールすると、この後のコマンド操作方法についての簡単なガイドが紹介されています。必要に応じて参照してください:
2015122404


このプロジェクトに他のユーザーをメンバー登録すると、そのユーザーからもこの Git リポジトリが使えるようになります。プロジェクト画面左の Members を選ぶと、GitLab ユーザーをプロジェクトメンバーに追加する画面に切り替わります:
2015122405


People にカーソルを持って行くと、GitLab 上のユーザー一覧が表示されます。ここから選んで指定することができます:
2015122406


プロジェクトに追加したい人と、その権限を指定し、ADD USERS TO PROJECT ボタンをクリックすると、そのユーザーは指定した権限でプロジェクトメンバーとして追加されます:
2015122407


この図では Administrator ユーザーが Master 権限でプロジェクトに追加されたことが分かります:
2015122408


これを必要なだけ繰り返して、プロジェクトにメンバーを追加します。



【プロジェクトの Git リポジトリを git クライアントから操作する手順】

ではこの myhelloworld プロジェクトの Git リポジトリを実際に使ってみましょう。まずは適当なファイル1つをコミット&プッシュしてみます。

まずは作業マシン上に git クライアントを導入しておきます。作業マシンが CentOS や RedHat であれば以下のコマンドで導入できます:
# yum install git

また、登録した SSH 鍵の秘密鍵ファイル(ファイル名 guestkey とします)を利用ユーザーの ~/.ssh/ 以下に用意しておきます。そして ~/.ssh/config ファイルを以下の内容で作成します:
Host mygitlab-server
        HostName XXX.XXX.XXX.XXX  (GitLab サーバーのIPアドレス)
        IdentityFile ~/.ssh/guestkey  (秘密鍵ファイル)
        User dotnsf  (GitLab サーバーのログインユーザー名)

そして鍵ファイルと config ファイルのパーミッションを 600 に設定します:
$ chmod 600 ~/.ssh/guestkey
$ chmod 600 ~/.ssh/config

では SSH の準備が整ったので、実際に git コマンドを使ってみます。まずは Global 設定で user.name と user.email を設定します:
$ git config --global user.name "K.Kimura"
$ git config --global user.email "xxxx@xxxxx.com"

まだ最初のコミット前なので、ゼロからリポジトリの中身を作る必要があります。というわけで専用のディレクトリを1つ作り、その中にプロジェクトのファイルを追加します。ここではとりあえずホームディレクトリ以下に myhelloworld というサブディレクトリを作り、その中に README.md ファイルを1つ追加しました(ソースコードなどを加える場合も myhelloworld 以下に追加していくことになります):
$ cd 
$ mkdir myhelloworld
$ cd myhelloworld
$ echo '# MyHelloWorld' > README.md

この myhelloworld ディレクトリを git リポジトリとして GitLab サーバーの myhelloworld プロジェクトにコミット&プッシュします(以下は myhelloworld ディレクトリで行います):
$ git init
$ git remote add origin git@mygitlab-server:dotnsf/myhelloworld.git
$ git add .
$ git commit -m 'first commit'
$ git push -u origin master

最後の git push 実行時に「接続を続けますか?」というプロンプトが表示されたら 'yes' と入力してください。また途中でパスフレーズの入力をするよう求められた場合は登録した SSH 鍵ファイルを作成した時に指定したパスフレーズを入力してください。成功するとこのような画面になるはずです:
$ git push -u origin master
The authenticity of host 'XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)' can't be established.
RSA key fingerprint is aa:bb:cc:dd:ee:ff:gg:hh:ii:jj:kk:ll:mm:nn:oo:pp
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'XXX.XXX.XXX.XXX' (RSA) to the list of known hosts.
Enter passphrase for key '/home/linux1/.ssh/guestkey': (SSH 鍵のパスフレーズを入力)
Counting objects: 3, done.
Writing objects: 100% (3/3), 222 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@mygitlab-server:dotnsf/myhelloworld.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
$

この状態で GitLab サーバー上の myhelloworld プロジェクトを見ると、このコミット&プッシュが記録されて、以下のようになるはずです:
2015122401


画面左の Files をクリックすると、現在の Git リポジトリのファイル一覧(まだ README.md しかないので1つだけ)が確認できます。これでプライベート Git リポジトリが作成できました:
2015122402


同じユーザーでも、別ユーザーでもいいのですが、このリポジトリを操作する場合の手順も紹介しておきます。上記のグローバル設定を行うまでは共通です(同一ユーザーで行う場合は myhelloworld ディレクトリごと削除してから以下を行ってください)。その上で GitLab サーバーの myhelloworld リポジトリをクローンします。途中でパスフレーズの入力を求められた場合は同様に SSH 鍵ファイル作成時に指定したパスフレーズを入力してください:
$ cd (作業ディレクトリに移動 指定しない場合はホームディレクトリ)
$ git clone git@mygitlab-server:dotnsf/myhelloworld.git
Initialized empty Git repository in /home/linux1/src/myhelloworld/.git/
Enter passphrase for key '/home/linux1/.ssh/guestkey': (SSH 鍵のパスフレーズを入力)
remote: Counting objects: 3, done.
Receiving objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
$

この時点でカレントディレクトリに myhelloworld というディレクトリが作られ、その中に現在の myhelloworld リポジトリの内容がクローンされているはずです:
$ cd myhelloworld
$ ls -a
.   ..   .git   README.md


この中に以下の内容で index.php ファイルを追加します(名前は何でもいいし、どのような内容でも構いませんが、新規にファイルを作って追加してください):
$ echo '<?php echo "ハローワールド!\n"; ?>' > index.php

追加したファイルを GitLab のリポジトリにコミットしてプッシュします:
$ git add .
$ git commit -m 'index.php added.'
$ git push -u origin master
  (SSH 鍵のパスフレーズを入力してプッシュ)

ここまでの作業が成功すると、GitLab の myhelloworld プロジェクトのファイル一覧はこのようになり、index.php が追加された状態になります:
2015122403


「新規に作成してコミット&プッシュ」も、「クローンして作業してコミット&プッシュ」もできることがわかりました。



GitLab Community Edition を使えば、無料でプライベートな Git リポジトリを作って管理する、ということもできそうです。GitLab Community Edition にはラズベリーパイ用のモジュールも用意されているようなので、余った(?)ラズパイの使いみちとしても良さ気な感じです。