こんにちは ayaran です。
社内開発ではいろんな都合があってGitHubとプライベート環境のGitLabの両方を利用しています。もちろんプライベート環境のGitLabなので運用もしているわけです。
今回はGitLabのバージョンアップについて少し書いてみようかと思います。
GitLabについて
そもそもGitLabってなんだって人もいそうなので簡単に説明します。
GitLabはGitで管理されたソースコードをWEBでGitリポジトリ管理、課題追跡、コードレビューなどを行うことができるRuby on Railsで作られたオープンソースのアプリケーションです。
社内では、プライベートサーバ上に構築したGitLab Community Editionを利用していますが、有償版のGitLab Enterprise Edition、またGitHubと同様にGitLabが運用している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
バージョンアップ前の環境だとRuby2.1系を利用していましたが、バージョンアップ後にSidekiqという非同期処理を行うgemが起動しなくなってしまうため、Ruby2.2系以降にする必要があります。
今回は、公式手順にあるバージョン2.3.1
まで上げます。
Git
GitLabの現在の最新バージョン8.14.3
にするとGitのバージョンが2.7.3
以上が必要なため、Gitのバージョンも1.8.3
から2.8.4
まで上げます。
ちなみにバージョンをあげなかった場合、WEB上でのGitの操作ができなくなってしまいます。
Go
GitLab8.0からgitlab-git-http-server、GitLab8.2からgitlab-git-http-serverにかわってgitlab-workhorseを使うようになり、これらをインストールする際にGoが必要なため、Goを新しくインストールする必要があります。
今回は公式手順にあるバージョン1.5.3
をインストールしました。
バージョンアップ方法
GitLabのバージョンアップは、GitLabのGitリポジトリ内に各バージョンごとのドキュメントが用意されていますので、それを参照しながら進めていきます。
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も再度インストールします。
$ 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のソースコードの更新を行います。
$ 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の設置
バージョンアップ前のGitLab7.9.4
ではRailsのバージョンが4.1系でしたが、GitLab8.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がなければ無事バージンアップ完了です。
バージョンアップ後の環境
バージョンアップ後の環境は以下のようになってます。
項目 | バージョン |
---|---|
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できなかったり、空のプロジェクトがあるとリストアできなかったりと不具合もあったりするので、検証は十分にしたほうが良いですね。
まだ、検証の段階なので実際の環境をアップデートするのはもう少しかかりそうです。