CentOS 7 (on Raspberry Pi)でのrpmパッケージ作成方法 － gitlab-ce


# 前置き
CentOS (on Raspberry Pi)ですが、サードパーティ製のパッケージはあまり用意されておらず、gitlab-ceも当然パッケージはありません。そのため自分でビルドし直すしかないのですが、ソースパッケージもないので、ソースパッケージからビルドするという方法もとれません。ただし、Raspbian用のパッケージが用意されているので、それをalienでいったん展開し、パッケージビルドするという方法でCentOS（armv7hl）用のrpmパッケージを作ることができます。

# 事前準備
パッケージビルドする前に、OSの初期設定、パッケージビルド用必須パッケージのインストールをする必要があります。

## OS初期設定
[CnetOS 7 (Raspberry Pi)上でのrpmパッケージビルド環境の構築](http://qiita.com/k-sh/items/1e4d3ef8d10cc8271963)に記載したパッケージビルド環境の構築を事前に実施している必要があります。

### swap領域の作成
メモリの要件が1GBです。CentOS (on RaspberryPi) ではもともと512MBの領域がswapに取られていますが、新たに1GB追加することにします。

```shell-session
$ sudo dd if=/dev/zero of=/swap bs=1G count=1
$ sudo mkswap /swap
$ sudo swapon /swap
```

/etc/fstabも修正します。

```bash:/etc/fstab
/swap none swap defaults 0 0
```

## パッケージビルド用必須パッケージのインストール
alienをインストールします。alienはNux Dextopに入っています。[CnetOS 7 (Raspberry Pi)上でのrpmパッケージビルド環境の構築](http://qiita.com/k-sh/items/1e4d3ef8d10cc8271963)に書いたように`/etc/yum.repos.d/nux-dextop.repo`の`$basearch`を`x86_64`に変更しておくと`yum`でインストールすることができます。
ただし、alienの依存パッケージのうち以下のパッケージがレポジトリになかったので、自分でビルドする必要があります。

+ perl-Mail-Transport-Dbx
+ perl-File-FcntlLock
+ dpkg

また、perl-Mail-Transport-Dbxをビルドするために必要なパッケージのうち、以下のパッケージがレポジトリになかったので、自分でビルドする必要があります。

+ perl-Test-Pod-Converage

まずは、依存パッケージをビルドするために`~/rpmbuild`がない場合は、以下を実行します。

```shell-session
$ rpmdev-setuptree
```

### perl-Test-Pod-Converageのビルド・インストール
前述のように、perl-Mail-Transport-Dbxをビルドするためには、perl-Test-Pod-Converageをインストールする必要がありますが、パッケージがレポジトリにないのでビルドする必要があります。まずはビルド時の必須パッケージをインストールします。すべて`yum`でインストールできます。

```shell-session
$ sudo yum install perl-ExtUtils-MakeMaker perl-Pod-Coverage perl-Test-Simple perl-Test-Pod
```

ビルドしてインストールします。ソースパッケージは`yumdownloader --source`でダウンロードすることができます。

```shell-session
$ yumdownloader --source perl-Test-Pod-Coverage
$ rpmbuild --rebuild perl-Test-Pod-Coverage-1.08-21.el7.src.rpm
$ cd ~/rpmbuild/RPMS/noarch/
$ sudo yum localinstall perl-Test-Pod-Coverage-1.08-21.el7.noarch.rpm
```

### perl-Mail-Transport-Dbxのビルド・インストール
ソースパッケージは`yumdownloader --source`でダウンロードできます。
（ビルドするときに必要なパッケージは上記ですべてインストール済みです。）

```shell-session
$ cd ~/rpmbuild/SRPMS
$ yumdownloader --source perl-Mail-Transport-Dbx
$ rpmbuild --rebuild perl-Mail-Transport-Dbx-0.07-22.el7.nux.src.rpm
$ cd ~/rpmbuild/RPMS/armv7hl/
$ sudo yum localinstall perl-Mail-Transport-Dbx-0.07-22.el7.armv7hl.rpm
```

### perl-File-FcntlLockのビルド・インストール
こちらも、ソースパッケージは`yumdownloader --source`でダウンロードできます。

```shell-session
$ cd ~/rpmbuild/SRPMS
$ yumdownloader --source perl-File-FcntlLock
$ rpmbuild --rebuild perl-File-FcntlLock-0.12-13.el7.nux.src.rpm
$ cd ~/rpmbuild/RPMS/armv7hl/
$ sudo yum localinstall perl-File-FcntlLock-0.12-13.el7.armv7hl.rpm
```

### dpkgのビルド・インストール
まずはビルド時の必須パッケージをインストールします。すべて`yum`でインストールできます。

```shell-session
$ sudo yum install zlib-devel bzip2-devel libselinux-devel gettext ncurses-devel autoconf automake gettext-devel doxygen flex xz-devel po4a dotconf-devel
```

ソースパッケージを`yumdownloader --source`でダウンロードして、ビルドします。

```shell-session
$ cd ~/rpmbuild/SRPMS
$ yumdownloader --source dpkg
$ rpmbuild --rebuild dpkg-1.16.16-5.el7.src.rpm
$ cd ~/rpmbuild/RPMS/armv7hl/
$ sudo yum localinstall dpkg-1.16.16-5.el7.armv7hl.rpm
```

### alienインストール
上記のパッケージをすべてインストールしたら、`yum`でインストールすることができるようになります。

```shell-session
$ sudo yum install alien
```

また、gitをインストールします。

```shell-session
$ sudo yum install git
```

# gitlab-ceパッケージ作成
## スクリプトの入手
Raspbian用のdebパッケージを入手し、パッケージを変換するスクリプトを作成しました。以下のようにして入手してください。

```shell-session
$ cd ~/rpmbuild
$ git clone https://github.com/k-sh/deb2rpm_gitlab-ce.git
$ cd deb2rpm_gitlab-ce
```

## Raspbian用debパッケージの入手
一番最近ビルドされたRaspbian用のパッケージを入手するには、上記のディレクトリで以下のコマンドを実行します。ただし、ダウンロードするのは、wheezy用パッケージです。jessie用パッケージの場合、/lib/libstdc++.so.6が古いため、使用できません。
※もし、jessieのみで出ているパッケージをインストールしたい場合は、gccを4.9.0以降にアップグレードした上で、download_gitlab-ce_deb.shの`RASPBIAN=wheezy`を`RASPBIAN=jessie`に変更してみてください（未確認）。

```shell-session
$ ./download_gitlab-ce_deb.sh
```

もし、特定のバージョンのgitlab-ceを使用したい場合は、以下のようにします。前方一致するもののうち、（rc版は除く）一番最近ビルドされたパッケージをダウンロードします。
例）8.5.9をダウンロードするとき

```shell-session
$ ./download_gitlab-ce_deb.sh --list
$ ./download_gitlab-ce_deb.sh 8.5.9
```

## debパッケージの展開&rpmbuild
パッケージを入手したら、後はパッケージを変換します。`alien`コマンドで行えるのですが、パッケージのインストール・削除時に行うpreinstallなどがCentOS7 (x86_64)用のパッケージと異なっていました。
そこで、`alien`コマンドでdebパッケージを展開だけ行い、その後、`rpmbuild`コマンドで固め直すスクリプトを作成しました。
例）

```shell-session
$ ./deb2rpm_gitlab-ce.armv7hl.sh gitlab-ce_8.5.9+20160405170751-ce.0_armhf.deb
```

以下のWarningが出ますが、あまり気にしないでください。

```shell-session
Warning: alien is not running as root!
Warning: Ownerships of files in the generated packages will probably be wrong.
```

以上でrpmパッケージは完成です。

## パッケージのインストール
出来たパッケージをインストールします。

```shell-session
$ sudo rpm -ivh gitlab-ce-8.5.9-ce.0.el6.el7.armv7hl.rpm
```

また別のところで`~/rpmbuild`は使うと思うので、退避または削除しておきます。

```shell-session
$ cd ~
$ mv rpmbuild rpmbuild.gitlab-ce
```

# gitlab-ceの初期設定・起動
## 設定ファイルの修正
必要に応じて/etc/gitlab/gitlab.rbを修正します。
例）

+ external_url：gitlabで表示されるurlを設定します。
+ git_data_dir：外付けHDDなどに変更したい場合は、変更します。
+ web_server['external_users'], nginx['enable']：gitlab付属のnginx以外のnginxを使用する場合は変更します（下記参照）。

などなど。

## firewalldの設定
忘れずに、必要に応じて、設定を変更します。説明は割愛します。

## 設定の反映・起動
その後、以下のコマンドを実行すれば、自動的に起動します。

```shell-session
$ sudo gitlab-ctl reconfigure
```

数分待った後、Webブラウザでアクセスしてみると、ログイン画面が出るはずです。
初期のユーザ名・パスワードは以下の通りです。ログイン後は、適宜変更してください。

ユーザ名：__root__
パスワード：__5iveL!fe__

## バージョン対応状況
以下のバージョンでログイン画面が開けることを確認しました。
+ 7.12.2~omnibus.1
+ 7.14.3
+ 8.0.5
+ 8.5.9

一方、以下のバージョンでは500エラーになりました。
+ 8.6.1

以上です。以下、gitlab-ceの設定方法、アンインストール方法について、備忘録のために載せておきます。

# 参考
## gitlab-ceの手動での起動・停止
手動で起動するときは以下のようにして行うことができます。

```shell-session
$ sudo gitlab-ctl start
```

手動で停止するときは以下のようにして行うことができます。

```shell-session
$ sudo gitlab-ctl stop
```

## gitlab-ce付属のnginx以外のnginxを使用する場合
外部のnginxを使用する場合、設定ファイルを変更します。

```diff:/etc/gitlab/gitlab.rb
  :
  #####################
  # GitLab Web server #
  #####################
  ## see: https://gitlab.com/gitlab-org/omnibus-gitlab/tree/master/doc/settings/nginx.md#using-a-non-bundled-web-server
  ## When bundled nginx is disabled we need to add the external webserver user to the GitLab webserver group.

  # web_server['external_users'] = []
+ web_server['external_users'] = ['{nginxのユーザー名}']
  # web_server['username'] = 'gitlab-www'
  # web_server['group'] = 'gitlab-www'
  # web_server['uid'] = nil
  # web_server['gid'] = nil
  # web_server['shell'] = '/bin/false'
  # web_server['home'] = '/var/opt/gitlab/nginx'


  ################
  # GitLab Nginx #
  ################
  ## see: https://gitlab.com/gitlab-org/omnibus-gitlab/tree/master/doc/settings/nginx.md

  # nginx['enable'] = true
+ nginx['enable'] = false
  :
```

## gitlab-ceをアンインストールする場合
残念ながら`rpm -e`だけでは大量のファイルが残ってしまいます。以下のコマンドを実行します。（まだ不足しているかもしれません。）

```shell-session
$ sudo gitlab-ctl stop
$ sudo gitlab-ctl uninstall
$ sudo rpm -e gitlab-ce
$ sudo rm -rf /opt/gitlab
$ sudo rm -rf /etc/gitlab
$ sudo rm -rf /var/log/gitlab
$ sudo rm -rf /var/opt
$ sudo rm -rf /usr/lib/systemd/system/gitlab-runsvdir.service
$ sudo rm -rf /etc/systemd/system/basic.target.wants/gitlab-runsvdir.service
```

さらに以下のユーザ・グループを削除します。

```shell-session
$ sudo userdel gitlab-www
$ sudo usedel git
$ sudo userdel gitlab-redis
$ sudo userdel gitlab-psql
```

## gitlab-ctl reconfigure時のエラーメッセージ確認
`gitlab-ctl reconfigure`した時に、エラーが出なかったか、以下で確認することができます。

```shell-session
$ less /var/log/gitlab/reconfigure/<日時>.log
```

また、以下のコマンドで異常が発生していないか、確認できます。

```shell-session
$ sudo gitlab-rake gitlab:check
```

以上です。