GitLabのバージョンを7.9から8.14までアップしてみた

こんにちは ayaran です。

社内開発ではいろんな都合があって[GitHub](https://github.com)とプライベート環境の[GitLab](https://gitlab.com/)の両方を利用しています。もちろんプライベート環境のGitLabなので運用もしているわけです。
今回はGitLabのバージョンアップについて少し書いてみようかと思います。

# GitLabについて
そもそもGitLabってなんだ:interrobang:って人もいそうなので簡単に説明します。

GitLabは[Git](https://git-scm.com/)で管理されたソースコードをWEBでGitリポジトリ管理、課題追跡、コードレビューなどを行うことができる[Ruby on Rails](http://rubyonrails.org/)で作られたオープンソースのアプリケーションです。
社内では、プライベートサーバ上に構築したGitLab Community Editionを利用していますが、有償版のGitLab Enterprise Edition、またGitHubと同様にGitLabが運用している[gitlab.com](https://gitlab.com/)があります。

# バージョンアップする環境
今回バージョンアップする社内のGitLabの環境について簡単に説明します。
GitLabの運用はバージョン`6.0`の頃から運用してきており、数回のバージョンアップを経て現在バージョン`7.9.4`を運用しています。
GitLabはだいたい月1回ペースで新しいバージョンをリリースしており、現在はバージョン`8.14.3`が最新のStable版でバージョン8.15がβ版です。

## 詳細な情報
バージョンアップ前の環境は以下のようになってます。

|項目|バージョン|
|:-:|:-:|
|OS|CentOS6|
|Ruby|2.1.5|
|Git|1.8.3|
|nginx|1.4.7|
|Redis|2.8.19|
|MySQL|5.6.21|

# バージョンアップに必要なこと
GitLabのバージョンアップをするにはGitLabのバージョンに合わせてサーバ環境もバージョンアップする必要があります。
今回バージョン`8.14.3`にあげるわけですが、いくつかアップデートしたり新たにインストールしたりします。

## Ruby :up:
バージョンアップ前の環境だとRuby2.1系を利用していましたが、バージョンアップ後に[Sidekiq](http://sidekiq.org/)という非同期処理を行うgemが起動しなくなってしまうため、Ruby2.2系以降にする必要があります。
今回は、公式手順にあるバージョン`２．３．１`まで上げます。

## Git :up:
GitLabの現在の最新バージョン`8.14.3`にするとGitのバージョンが`2.7.3`以上が必要なため、Gitのバージョンも`1.8.3`から`2.8.4`まで上げます。
ちなみにバージョンをあげなかった場合、WEB上でのGitの操作ができなくなってしまいます。

## Go :new:
GitLab8.0から[gitlab-git-http-server](https://gitlab.com/gitlab-org/gitlab-git-http-server)、GitLab8.2からgitlab-git-http-serverにかわって[gitlab-workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse)を使うようになり、これらをインストールする際に[Go](https://golang.org/)が必要なため、Goを新しくインストールする必要があります。
今回は公式手順にあるバージョン`1.5.3`をインストールしました。

# バージョンアップ方法
GitLabのバージョンアップは、[GitLabのGitリポジトリ](https://github.com/gitlabhq)内に各バージョンごとのドキュメントが用意されていますので、それを参照しながら進めていきます。

## 1. GitLabの停止
動作しているGitLabのサービスを停止します。

```
$ sudo service gitlab stop
```

## 2. バックアップ
まんがいちバージョンアップに失敗した際に切り戻しを行うためにバックアップを取得しておきます。

```
$ cd /home/git/gitlab
$ sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
```

## 3. Ruby、Gitのバージョンアップ
Rubyの導入の仕方によって方法が変わると思いますが、今回の環境ではRPMパッケージングしたRubyを使用しているので、一旦削除したのち、yum installでバージョンアップを行います。
同様に、GitもRPMパッケージングしたもの使用してるためyum updateでバージョンアップを行います。
パッケージングしたRPMはプライベートリポジトリ置いておきます。

```
$ sudo yum remove ruby
$ sudo yum install ruby
$ sudo yum update git
```

また、Rubyのバージョンをあげたのでgemをインストールする際に利用する[bundler](http://bundler.io/)も再度インストールします。

```
$ sudo gem install bundler --no-ri --no-rdoc
``` 

## 4. Goのインストール
GoもRubyとGitと同様にRPMパッケージングしたものをインストールします。

```
$ sudo yum install golang
```

## 5. gitlab-workhorseのインストール
前述しましたが、GitLab8.2以降ではgitlab-workhorseをインストールする必要があります。

```
$ cd /home/git
$ sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-workhorse.git
$ cd gitlab-workhorse
$ sudo -u git -H git checkout v1.0.1
$ sudo -u git -H make
```

## 6. 各ソースコードの更新
GitLabと[GitLab Shell](https://github.com/gitlabhq/gitlab-shell)のソースコードの更新を行います。

```
$ sudo cd /home/git/gitlab
$ sudo -u git -H git fetch --all
$ sudo -u git -H git checkout -- db/schema.rb
$ sudo -u git -H git checkout 8-14-stable
$ cd /home/git/gitlab-shell
$ sudo -u git -H git fetch --all --tags
$ sudo -u git -H git checkout v4.0.0
```

## 7. secrets.ymlの設置
バージョンアップ前のGitLab`7.9.4`ではRailsのバージョンが4.1系でしたが、GitLab`8.14.3`ではRailsのバージョンが4.2系となります。
Railsのバージョンが4.2系になるとsecrets.ymlが必須となり、新たに設置してあげる必要があります。

```
$ cd /home/git/gitlab
$ sudo -u git -H cp config/secrets.yml.example config/secrets.yml
$ sudo -u git -H chmod 0600 config/secrets.yml
```

## 8. Gemのインストール
利用するGemをインストールします。
今回の環境ではMySQLを利用しているので、PostgreSQLを除外するオプションを利用して実行します。

```
$ cd /home/git/gitlab
$ sudo -u git -H bundle install --without postgres development test --deployment
$ sudo -u git -H bundle clean
```

## 9. データベースのマイグレーション
GitLab8.14を動かすためにデータベースに変更をかけていきます。

```
$ sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production
```

## 10. ファイルのコンパイル
GitLabで使うjsやcssをコンパイルします。

```
sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production
```

##　11. gitlab.ymlの変更
細かくバージョンを上げていく場合は、差分を確認して適宜修正していくのですが、さすがにバージョン`7.9.4`から`8.14.3`だと大きく内容が変わっています。
なので、バージョン`8.14.3`のサンプルを参考に環境に合わせた情報に置き換えて、差し替えてしまいました。

## 12. 起動スクリプトの変更
そのままでも動くのは動くのですが、チェックツールを使った時にエラーになってしますので、最新の起動スクリプトに変更します。

```
$ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
```

## 13. nginxの設定変更
新しくgitlab-workhorseを利用するようになったため、nginxの設定も変更する必要があります。

主な変更点は、

```
-upstream gitlab {
-  server unix:/home/git/gitlab/tmp/sockets/gitlab.socket fail_timeout=0;
+upstream gitlab-workhorse {
+  server unix:/home/git/gitlab/tmp/sockets/gitlab-workhorse.socket fail_timeout=0;
```
```
-    proxy_redirect          off;
+    proxy_http_version 1.1;
```
```
+    client_max_body_size 0;
+    gzip off;
```
```
     proxy_set_header    X-Forwarded-Proto   $scheme;
-    proxy_set_header    X-Frame-Options     SAMEORIGIN;

-    proxy_pass http://gitlab;
+    proxy_pass http://gitlab-workhorse;
```

元から公式のコンフィグを利用している場合はそのまま差し替えちゃってもいいかもしれません。


## 14. nginxの再起動とGitLabの起動
すべての変更が終わったので、nginxの再起動と、停止しているGitLabを起動します。

```
$ sudo service nginx restart
$ sudo service gitlab start
```

## 15. 最終チェック
最後にチェックツールを使って確認を行います。

```
$ sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production
$ sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production
```

実行した結果、NGがなければ無事バージンアップ完了です。

![スクリーンショット 2016-12-08 19.18.09.png](https://qiita-image-store.s3.amazonaws.com/0/122536/a574ed00-eb55-e5f7-8cb0-6323365de358.png)

## バージョンアップ後の環境
バージョンアップ後の環境は以下のようになってます。

|項目|バージョン|
|:-:|:-:|
|OS|CentOS6|
|Ruby|2.3.1|
|git|2.8.4|
|go|1.5.3|
|nginx|1.4.7|
|redis|2.8.19|
|MySQL|5.6.21|

# まとめ
公式手順を参考にしながら進めると、あまりハマることはないかと思います。ですが、環境にもよりますが時期によっては上手くバージョンアップできない場合もあります。
こまめにバージョンアップするのがいいんではないかと思いますが、過去にBugを踏んでMargeできなかったり、空のプロジェクトがあるとリストアできなかったりと不具合もあったりするので、検証は十分にしたほうが良いですね。

まだ、検証の段階なので実際の環境をアップデートするのはもう少しかかりそうです。