10分ではじめるGitBucket


![gitbucket01](https://31.media.tumblr.com/c03e50b04b707d3626eb6614893e2eca/tumblr_n5hi6xGB2h1tbcnimo2_1280.png)

# GitBucketとは

[GitBucket](https://github.com/takezoe/gitbucket)は[たけぞう](http://d.hatena.ne.jp/takezoe/)さんという方が開発されている[GitHub](https://github.com/)のクローンアプリです。
[Scala](http://www.scala-lang.org/)で書かれており、驚くほど簡単に導入することができるのが特徴です。

OSSのGitHubクローンといえば[GitLab](https://www.gitlab.com/)がメジャーですが構築の手順が複雑かつ面倒なため、
使い始める前に構築段階で挫折した経験のある人も多いのではないでしょうか。

対するGitBucketは[warファイル](http://www.atmarkit.co.jp/fjava/javatips/043eclipse016.html)を実行するだけという手軽さです、素敵!!

より詳しいレビューは[このあたり](http://www.softantenna.com/wp/software/git-bucket/)を参照してください。

# 背景

とあるクラウド環境にGitBucketを導入する機会があり、
せっかくなので [vagrant](http://www.vagrantup.com/) + [ansible](http://www.ansible.com/home) で導入を自動化するplaybookを書いてみました。

以下のクラウドプラットフォームで導入検証をしました。

* [AWS](https://aws.amazon.com/jp/)
* [DigitalOcean](https://www.digitalocean.com/?refcode=1253632a31d5)


# したごしらえ

## Case: AWS

vagrantからAWSを利用する設定は下記の記事（導入部まで）を参照してください

* [vagrantではじめるクラウド開発環境（AWS編）](http://qiita.com/msykiino/items/1a8c8157978abff51229)

## Case: DigitalOcean

vagrantから[DigitalOcean](https://www.digitalocean.com/?refcode=1253632a31d5)を利用する設定は下記の記事（導入部まで）を参照してください

* [vagrantではじめるクラウド開発環境（DigitalOcean編）](http://qiita.com/msykiino/items/d45cab7f520a3288862a)


# 導入

したごしらえが済んだら早速、GitBucketの環境を構築してみましょう。

構築するシステムの構成：


* GitBucketのプロセスは起動スクリプト（/etc/rc.d/init.d/gitbucket）で制御する
* GitBucketのプロセスはgitbucketユーザーで起動する
* GitBucketはport:8888にbindする
* WebUIからのアクセスはnginxで受けた後port:8888のGitBucketにReverseProxyする
* sshでのGitリポジトリへのアクセスはport:29418にbindする

## 環境

作業環境は **MacOSX 10.9.2 Mavericks** を使う前提で進めます。
GitBucketは **v1.13** をインストールします。

クラウド側の前提環境は以下のとおりです。

* AWS: Amazon Linux (64bit)
* DigitalOcean: CentOS 6.5 (64bit)

## vagrantのインストール

したごしらえが済んでいれば、
vagrantはインストールはされていると思うのでインストール手順は割愛します。

## vagrantプラグインのインストール

したごしらえが済んでいればプラグインもインストールされていると思いますが、
以下のコマンドからも必要なプラグインはインストールできます。

```
vagrant plugin install dotenv ;
vagrant plugin install vagrant-aws ;
vagrant plugin install vagrant-digitalocean ;
vagrant plugin list ;
```

## リポジトリのクローン

まずはvagrantの設定ファイルをGitHubからクローンします。
以下のコマンドを実行してリポジトリをクローンしてブランチを切り替えます。

```
git clone https://github.com/msykiino/codebox.git vagrant-multi-platforms ;
cd vagrant-multi-platforms ;
git checkout vagrant-multi-platforms ;

cd test-gitbucket ;
```

## .envの設定

続いて **.env** の認証情報を書き換えます。
認証情報は したごしらえ の行程で確認できている前提です。

```
vim ./.env
```

AWSを使う場合は以下の2行を書き換えます。

```
16	AWS_ACCESS_KEY_ID="CHANGE_ME"
17	AWS_SECRET_ACCESS_KEY="CHANGE_ME"
```


DigitalOcean は以下の2行を変更します。

```
30	DO_CLIENT_ID="CHANGE_ME"
31	DO_API_KEY="CHANGE_ME"
```

これでvagrantからクラウドを利用する準備が整いました。

## vagrantの実行

Vagrantfileがあるtest-gitbucketディレクトリで以下のコマンドを実行しましょう。

AWSを使う場合

```
vagrant up --provider=aws --provision
```

DigitalOceanを使う場合

```
vagrant up --provider=digital_ocean --provision
```

インスタンスの起動とプロビジョニングが終わったらIPアドレスを確認します。

```
vagrant ssh-config # HostNameの項目のIPをコピーしてブラウザでアクセス
```

IPアドレスを確認したらブラウザでアクセスしてみましょう。

```
http://IPアドレス/
```

ダミーのSSL証明書でhttpsの設定をしてあります。
おれおれ証明書なので警告画面が表示されますが例外に追加して進みます。
おれおれ証明書でも通信はきちんと暗号化されます。

```
https://IPアドレス/
```

GitBucketのログイン画面が表示されればokです。
GitBucketはJettyで起動します。

![gitbucket02](https://24.media.tumblr.com/0adccd33485459a586763d00faeb817d/tumblr_n5hi6xGB2h1tbcnimo1_1280.png)

ログインアカウントの初期設定

```
Username: root
Password: root
```

rootでログインできたら真っ先にrootアカウントのパスワードを変更します。
パスワードを変更したら **Administrator権限** の個別アカウントを作成します。
一旦ログアウトして、以降は個別アカウントで作業しましょう。


# 補足事項

以下、3点補足します。

## 起動スクリプト

GitBucketの起動スクリプトはGitHubにコミットされています（[こちら](https://github.com/takezoe/gitbucket/blob/master/contrib/redhat/gitbucket.init)）

この起動スクリプトは意図した動作をします。
ただし、GitBucket（javaのプロセス）がroot権限で実行されるため、サンプルのplaybookでは
```gitbucket```という専用ユーザーを作り実効ユーザーを変更しています。

## bindポート

GitBucketはデフォルトで```8080```ポートにbindされますが、
```Jenkins```などのサービスが同ポートにbindされていることもあるため、サンプルのplaybookでは
GitBucketを```8888```ポートにbindするように変更しています。


## https、sshアクセス

httpsで運用する場合は```Base URL```を設定します。
プロトコルさえ```https```にすればNameベースでもIPベースでもだいじょうぶです。

sshでのGitリポジトリへのアクセスを有効にする場合は、
```Enable SSH access to git repository```のチェックボックスを```ON```にします。
```SSH Port```はデフォルトの```29418```のままにしておきます。

AWSで使う場合は、```Security Group```でポート```29418```へのアクセスを許可します。

[DigitalOcean](https://www.digitalocean.com/?refcode=1253632a31d5)で使う場合は、playbook内でiptablesを設定していますので、
デフォルトの```29418```から変更しなければ追加で設定することはなにもありません。

sshでのGitリポジトリへのアクセスを有効にすると```Account settings```画面の
左メニューに```SSH Keys```の項目が現れて ssh公開鍵を登録できるようになります。



![gitbucket03](https://24.media.tumblr.com/294ef90a8426b781a380f97a4d1e5872/tumblr_n5hi6xGB2h1tbcnimo3_1280.png)

## おれおれSSL証明書

おれおれ証明書でも通信の暗号化はできていますが、
gitクライアントがSSL証明書をチェックするため```git clone```した際にエラーになります。
> 
git clone https://xxx.xxx.xxx.xxx/git/msykiino/mytest.git foo
Initialized empty Git repository in /home/ec2-user/foo/.git/
error:  while accessing https://xxx.xxx.xxx.xxx/git/msykiino/mytest.git/info/refs

> 
fatal: HTTP request failed

これを回避するにはログインシェルがbash(sh)であれば以下の環境変数をexportします。

```.bash_profileまたは.bashrc
export GIT_SSL_NO_VERIFY=true
```

または、.gitconfigに以下の設定を追加します（[参考](http://git-scm.com/docs/git-config)）

```.gitconfig
[http]
    sslVerify = false
```


# まとめ

今回はじめてGitBucketを使ってみましたが、とても良いですね。

導入が簡単であることに加えて、Look&FeelがGitHubのそれと非常によく似ているため、
GitHubを使ったことがあれば特に意識することなく使えてしまいます。

* これからGitを使ってみたい人に、
* 政治的・宗教的理由でGitHubが使えない会社に、
* たくさんのプライベートリポジトリを管理したいチームに、
* 社内のGitリポジトリのフロントエンドに、
* 個人で運用しているGitサーバーのフロントエンドに、

これらの用途にとってGitBucketはまさに **ネ申ツール** ではないかと。

GitBucketは一定のサイクルでリリースされているようですので今後、
レビュー機能やHipChat等外部APIとの連携機能が実装されれば（ぼくの希望ですけどｗ）
チーム開発におけるGitBucketの需要はますます高まるとおもいます。

ぇ？GitLab？... そんなのもありましたねぇ...