Git
Ubuntu

Giteaのインストール

 以前の記事に書いたように、Mac miniが壊れてしまいました。
 この時の作業で、一番時間がかかったのがデータのコピー作業でした。というのも、今まで作成したアプリ、サンプルなどが整理されないままたくさんあり、その大量のファイルをコピーしているのに時間を取られてしまいました。やっぱり、日頃から整理しないとダメだなと思い、たくさんあるgitリポジトリをうまく管理する方法はないかと調べてみました。
 必要としているのは、リポジトリの一覧を表示し、その中身を簡単に閲覧できるようなものです。要はgithubのようなものになるわけで、そうするとすぐに思いつくのがフリーで取得できるgitlabとなります。ただ、非常に複雑なツールであり、これを今後メンテナンスしていくというのはちょっと大変な気がしました。
 それ以外に似たようなツールはないかと調べてみるとGiteaなるものがあることを知り、Ubuntu Server 16.04にインストールして、試してみました。

バイナリパッケージを用いたインストール

 Giteaにはバイナリパッケージがあり、それを使えば、そのバイナリ一つをダウンロードするだけで作業が完了します。この点がGiteaの最大の特徴でもあります。以下で、その手順を説明します。

ユーザの追加

Giteaを起動するユーザgiteaを新たに追加します。
$ sudo adduser gitea
$ sudo gpasswd -a gitea sudo

mysqlの設定

MySQLにデータベースgiteaを作成します。
$ mysql -u root -p
mysql> DROP DATABASE IF EXISTS gitea;
mysql> CREATE DATABASE IF NOT EXISTS gitea CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> GRANT ALL ON gitea.* to 'gitea'@'localhost' identified by '<パスワード>';

Giteaのインストール

Giteaのバイナリをダウンロードして、binフォルダに格納します。
$ wget -O gitea https://dl.gitea.io/gitea/1.3.2/gitea-1.3.2-linux-amd64
$ chmod +x gitea
$ mkdir bin
$ mv gitea bin/

Giteaのサービス登録

$ sudo vim /etc/systemd/system/gitea.service

gitea.service
[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
#After=mysqld.service
#After=postgresql.service
#After=memcached.service
#After=redis.service
[Service]
# Modify these two values and uncomment them if you have
# repos with lots of files and get an HTTP error 500 because
# of that
###
#LimitMEMLOCK=infinity
#LimitNOFILE=65535
RestartSec=2s
Type=simple
User=gitea
Group=gitea
WorkingDirectory=/home/gitea
ExecStart=/home/gitea/bin/gitea web
Restart=always
Environment=USER=gitea HOME=/home/gitea
[Install]
WantedBy=multi-user.target

Giteaの起動

Giteaを起動します。
$ sudo systemctl start gitea
サーバの起動時にGiteaを自動起動するようにします。
$ sudo systemctl enable gitea

Giteaのセットアップ

 GiteaはHTTPサーバを内蔵していますので、ブラウザで以下のURLにアクセスすればセットアップ画面を表示できます。
http://localhost:3000
セットアップ画面が表示されるので、必要な事項を入力します。ここで入力した内容はcustom/app.iniに書き込まれるので、もし間違った設定をした場合は直接編集すれば問題ないです。
 正しく設定されれば、この状態でリポジトリの作成、HTTP経由によるリポジトリへのアクセスができるはずです。

リポジトリへのSSHでのアクセス

 GiteaはSSHサーバを内蔵しています。つまり、OpenSSHサーバを経由しないでSSHでアクセスできます。この方がコンパクトになるのはわかるのですが、22ポートで起動してしまうと、OpenSSHサーバと衝突していまいます。
 OpenSSHとGiteaのSSHの両方を起動しようとすると、ポート番号を変更しなければなりません。なので、GiteaのSSHのポートを10022に設定することとします。
 custom/app.iniに以下の設定を記述します。

custom/app.ini
DISABLE_SSH      = false
SSH_PORT         = 10022
START_SSH_SERVER = true

Giteaを再起動します。
$ sudo systemctl restart gitea
SSHサーバが正しく起動すれば、gitea.logに以下のような記述が見られるはずです。
SSH server started on :10022.

 次にpublic keyの追加を行います。これには、Web画面より、ユーザの設定を選択し、”SSH/GPGキー”タブを選択します。そして、public keyを追加します。これで、sshを経由して、git clone/pull/pushができるはずです。

Giteaのビルド

 バイナリインストールは簡単ですが、文言の変更をしたいといったちょっとした変更もできないという問題があります。なので、以下ではGiteaのソースからのビルド方法について説明します。

goのインストール

go 1.9.2をダウンロードして、/usr/localに展開します。
$ sudo tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz
~/.profileに以下を追加します。(GOPATHはgoがgo getで取得したソースを格納したり、ビルドした後のバイナリを保管したりする場所として使われます)

~/.profile
export GOPATH=$HOME/go
PATH=$PATH:/usr/local/go/bin
PATH=$PATH:$GOPATH/bin

変更を反映します。
$ source ~/.profile
goが起動することを確認します。
$ go

go-bindataのビルド

Giteaはgoも含めてすべてを一つのバイナリに納めたbindataという形式で配布しています。bindataを作成するためには、go-bindataというパッケージをインストールする必要があります。
$ go get -u github.com/jteeuwen/go-bindata/...
$GOPATH/binにgo-bindataが作成されているはずです。

Giteaのビルド

以下の内容に従って作業を行います。
https://docs.gitea.io/en-us/install-from-source/
giteaのソースコードをダウンロードします。
$ go get -d -u code.gitea.io/gitea
$ cd $GOPATH/src/code.gitea.io/gitea
ブランチを指定します。
$ git branch -a
$ git checkout v1.3
タグを指定します。
$ git tag -l
$ git checkout v1.3.2
ビルドを実行します。
$ TAGS="bindata" make generate build
$GOPATH/src/code.gitea.io/giteaにGiteaのバイナリが作成されます。既存のバイナリと入れ替えれば、ビルドしたGiteaバイナリで起動するようになります。

Giteaの感想

 しばらく使ってみましたが機能に不満はありませんでした。省電力Celeronの非常に非力なサーバで稼働していますが、すべてGoで書かれているだけあって、速度に問題はありません。
 気になるのは、MySQLに独自形式でデータを格納しているので、一度Giteaに移行してしまうと、二度と離れることはできなくなる点と、SSHサーバを10020で立ち上げているのでgitのリモートURLにそのポート番号が入ってしまう点です
 ただ、一番の大きな問題は、既存の、Giteaで作成していないリポジトリを一括して移行する方法がないことです。何かスクリプトが書けないかと調べてみましたが、今のところはできないようです。
 なので、結局Giteaの採用はあきらめてしまいました。