読者です 読者をやめる 読者になる 読者になる

interprism's blog

インタープリズム株式会社の開発者ブログです。

Gitlabを6.2.4から8.6.6へアップグレードした

こんにちわ hirano です。

先日、社内の Gitlab 6.2.4 を Gitlab 8.6.6 へアップグレードしました。その時の記録です。

目次

  1. 背景
  2. アップグレード前の環境
  3. Gitlab 6.2.4 から 7.14 へアップグレード
  4. Gitlab 7.14 にした時の環境
  5. Gitlab 7.14 から 8.6.6 へアップグレード
  6. Gitlab 8.6.6 にした時の環境
  7. まとめ

背景

interprismでは社内ソースの管理にgitとsubversionを使っており、 gitは社内サーバーにGitlabをインストールして使っています。

Gitlabは6.2.4を使っているのですが、最新版と比べると当然ながら機能が劣っており、 特に以下の点が嗚呼、あったらいいのにです。

  • Internal Project が使えない
    • 仕方がないのでALLというグループを作って全員を入れて代用してる
  • Merge Requestを作成する際にソースの差分が見られない
    • MR作っちゃってから確認して修正とか
  • Git LFS が使えない
    • どうにもならない

ということで一念発起してアップグレードすることにしました。

なお、最近では Omnibus Package が用意されており sudo apt-get install gitlab-ce でほぼインストール完了なのですが、当時はそんな便利なものはなく、

を個別にインストールしてああだこうだと設定をこねくり回して使えるようになったので、今回も地道にアップグレードにチャレンジします。

Omnibus Package への移行方法を知っていたら教えてほしい・・。

アップグレード前の環境

プロダクト バージョン
OS Ubuntu 12
Git 1.8.4.1
Ruby 2.0.0p353
MySQL 5.5.47
Redis 2.2.12
nginx 1.1.19
Gitlab 6.2.4

見ての通り色々と古いです。

Gitlab 6.2.4 から Gitlab 7.14 へアップグレード

色々とググったところ、6系から8系へ一気にアップグレードする手順は見つからず、6系から7系の手順があったので、それを元に実施していきます。

gitlab.com

1. サーバーを停止

sudo service gitlab stop

2. バックアップ

今回はVMのスナップショットでバックアップしているのでこのプロセスはやってませんが、個別にやるならこちら

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

3. Rubyを最新版にバージョンアップ

apt-get で入れられなかったのでソースからインストールします。

sudo apt-get install build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl
mkdir /tmp/ruby && cd /tmp/ruby
curl --progress http://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.0.tar.gz | tar xz
cd ruby-2.3.0
./configure --disable-install-rdoc
make
sudo make install

途中で

rake's executable "rake" conflicts with /usr/local/bin/rake
Overwrite the executable? [yN]

と聞かれるので y で上書き。

bundler をインストール

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

4. Gitを最新版にアップグレード

Gitの最新版をインストールします。こちらもソースからインストールします。

mkdir /tmp/git
cd /tmp/git
sudo apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev build-essential
#curl https://github.com/git/git/archive/v2.8.1.tar.gz をやるとリダイレクト先が表示されるので以下のようにしてダウンロード
curl --progress https://codeload.github.com/git/git/tar.gz/v2.8.1 | tar xz
cd git-2.8.1
make prefix=/usr/local all doc info
sudo make prefix=/usr/local install install-doc install-html install-info

doc周りでエラーが出ましたがとりあえず無視して進みます。 (結果的に問題ありませんでした)

5. 最新の gitlab のソースを fetch して7系の最新にチェンジ(checkout)

cd /home/git/gitlab
sudo -u git -H git fetch
sudo -u git -H git checkout -- db/schema.rb
sudo -u git -H git checkout 7-14-stable

6. 追加パッケージをインストール

sudo apt-get install logrotate
sudo apt-get install pkg-config cmake
sudo apt-get install libkrb5-dev
sudo apt-get install nodejs

7. Redis関係の設定

# Configure redis to use sockets
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.orig
# Disable Redis listening on TCP by setting 'port' to 0
sed 's/^port .*/port 0/' /etc/redis/redis.conf.orig | sudo tee /etc/redis/redis.conf
# Enable Redis socket for default Debian / Ubuntu path
echo 'unixsocket /var/run/redis/redis.sock' | sudo tee -a /etc/redis/redis.conf
# Be sure redis group can write to the socket, enable only if supported (>= redis 2.4.0).
sudo sed -i '/# unixsocketperm/ s/^# unixsocketperm.*/unixsocketperm 0775/' /etc/redis/redis.conf
# Activate the changes to redis.conf
sudo service redis-server restart
# Add git to the redis group
sudo usermod -aG redis git

# Configure Redis connection settings
#$ sudo -u git -H cp config/resque.yml.example config/resque.yml
sudo -H cp config/resque.yml.example config/resque.yml
# Change the Redis socket path if you are not using the default Debian / Ubuntu configuration
#$ sudo -u git -H editor config/resque.yml
#$ sudo -H editor config/resque.yml <-- not needed

# Configure gitlab-shell to use Redis sockets
sudo -H sed -i 's|^  # socket.*|  socket: /var/run/redis/redis.sock|' /home/git/gitlab-shell/config.yml

8. gitlab-shell を更新

cd /home/git/gitlab-shell
sudo -u git -H git fetch
sudo -u git -H git checkout v2.6.5

9. ライブラリのインストールとマイグレーション

cd /home/git/gitlab
sudo -u git -H bundle install --without development test postgres --deployment
sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production
sudo -u git -H bundle exec rake migrate_iids RAILS_ENV=production
sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production
sudo chmod u+rwx,g+rx,o-rwx /home/git/gitlab-satellites
sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab

10. 設定ファイルの更新

/home/git/gitlab/config/gitlab.yml

今回のケースでは認証にLDAPを使用していますが、ほとんど修正せずに動作しました。

ただ、なぜか

gitlab:
  port: 80
  https: true

となっていたので、

gitlab:
  port: 443
  https: true

と修正しました。

/home/git/gitlab-shell/config.yml

こちらも何故かURLが http になっていたので https に変更。

gitlab_url: "http://hostname"
gitlab_url: "https://hostname"

その他

手順の通りに以下のファイルを修正します。

cd /home/git/gitlab
sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb
sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab

11. gitlabを再起動

$ sudo service gitlab restart

無事に再起動が完了しました。

12. 実際に試すが駄目でnginxの追加設定

https://hostname/ にアクセスすると以下の画面が出たので、喜び勇んでログインしようとしました。

f:id:interprism:20160426124427p:plain

ユーザー認証自体は通っているようなのですが、どうやってもログイン画面に戻ってきてしまってログイン出来ないので、ログ( gitlab/log/production.log ) を確認すると

Started POST "/users/auth/ldapmain/callback" for 127.0.0.1 at 2016-04-18 14:28:57 +0900
Processing by 省略
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"[FILTERED]", "username"=>"省略", "password"=>"[FILTERED]"}
Can't verify CSRF token authenticity
Redirected to http://FQDNじゃなくてIPアドレス/
Completed 302 Found in 193ms (ActiveRecord: 22.1ms)
Started GET "/" for 127.0.0.1 at 2016-04-18 14:28:57 +0900
Processing by RootController#show as HTML
Completed 401 Unauthorized in 2ms (ActiveRecord: 0.5ms)
Started GET "/users/sign_in" for 127.0.0.1 at 2016-04-18 14:28:57 +0900

と出力されていました。

と、ここでサーバーの構成を書いておくと以下のようになっています。

reverse proxy - nginx(https) → gitlab - nginx(http) → gitlab - unicorn(8080)

どうも reverse proxy の設定が怪しそうということで調べてみたところ以下の記事が見つかりました。

gitlab.com

これによると以下の設定を入れればいいよとあります。

<% if @https %>
proxy_set_header    X-Forwarded-Ssl     on;
<% end %>
proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
proxy_set_header    X-Forwarded-Proto   $scheme;
proxy_set_header    X-Frame-Options     SAMEORIGIN;

これに proxy_set_header Host $http_host; を追加して、以下の設定に変更。

proxy_set_header X-Forwarded-Ssl on;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto   $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Frame-Options SAMEORIGIN;

reverse proxy の nginx を再起動したところ、認証が通りメインページにたどり着くことが出来ました。 (このあたり本当であればきっちり理解したいところですが、Gitlabのバージョンアップという大きな目標のため理解しないまま先に進みます)

以下のことをざっくり確認しました。

  • ログイン出来る
  • プロジェクト、グループを作る
  • push や pull が行える

7系へのアップグレードはこれで一旦完了と言えそうです。

Gitlab 7.14 にした時の環境

Gitlab 7.14 へのアップグレードの結果、それぞれのプロダクトのバージョンは以下のようになりました。

プロダクト アップグレード前 Gitlab 7.14時 備考
OS Ubuntu 12 変更なし
Git 1.8.4.1 2.8.1 -
Ruby 2.0.0p353 2.3.0 -
MySQL 5.5.47 変更なし
Redis 2.2.12 変更なし
nginx 1.1.19 変更なし
Gitlab 6.2.4 7.14 -

Gitlab 7.14 から 8.6.6 へアップグレード

今度は7系から8系へのアップグレードです。ここを参考に作業していきます。

gitlab.com

基本的な手順は 6系から7系の時と同じです。

1. サーバーを停止

sudo service gitlab stop

2. バックアップ

今回はVMのスナップショットでバックアップしているのでやっていませんが、個別にやるならこちらを実行。

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

3. 最新の gitlab のソースを fetch して 8.6 系に切り替え

cd /home/git/gitlab
sudo -u git -H git fetch
sudo -u git -H git checkout -- db/schema.rb
sudo -u git -H git checkout 8-6-stable

4. 最新の gitlab-shell のソースを fetch

cd /home/git/gitlab-shell
sudo -u git -H git fetch
sudo -u git -H git checkout v2.7.1

5. Go言語をインストール

$ mkdir /tmp/go
$ cd /tmp/go
$ curl -O --progress https://storage.googleapis.com/golang/go1.6.1.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.6.1.linux-amd64.tar.gz
$ sudo ln -sf /usr/local/go/bin/{go,godoc,gofmt} /usr/local/bin/
$ rm go1.6.1.linux-amd64.tar.gz

6. gitlab-git-http-server をインストール

このステップはGitlab 8.0 か 8.1 にアップグレードする時だけ必要です。 Gitlab 8.2以降にアップグレードする場合は実施不要ですが、実施しても問題はありません。

cd /home/git
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-git-http-server.git
cd gitlab-git-http-server
sudo -u git -H git checkout 0.3.0
sudo -u git -H make

設定ファイルに listen の行があることを確認(コメントアウトされておらず有効であること)

cd /home/git/gitlab
grep ^listen config/unicorn.rb

6. Gitlab-workhorse をインストール

このステップはGitlab 8.2以降にアップグレードする時だけ必要です。 Gitlab 8.0 か 8.1 にアップグレードする場合は実施不要です。

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 0.7.2
sudo -u git -H make
cd /home/git/gitlab
test -e /etc/default/gitlab && \
  sudo sed -i.pre-8.2 's/^\([^=]*\)gitlab_git_http_server/\1gitlab_workhorse/' /etc/default/gitlab

7. 秘密鍵関連をコピー

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. ライブラリインストールとマイグレーション

cd /home/git/gitlab

# MySQL installations (note: the line below states '--without postgres')
sudo -u git -H bundle install --without postgres development test --deployment

# PostgreSQL installations (note: the line below states '--without mysql') 今回はMySQLなので実施せず
#sudo -u git -H bundle install --without mysql development test --deployment

# Run database migrations
sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production

# Clean up assets and cache
sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production

これを実行した際に以下のエラーが発生

rake aborted!
Redis::CommandError: ERR unknown command 'scan'
/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/redis-3.2.2/lib/redis/client.rb:114:in `call'
/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/redis-3.2.2/lib/redis.rb:2408:in `block in _scan'
/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/redis-3.2.2/lib/redis.rb:57:in `block in synchronize'
/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/redis-3.2.2/lib/redis.rb:57:in `synchronize'
/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/redis-3.2.2/lib/redis.rb:2407:in `_scan'
/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/redis-3.2.2/lib/redis.rb:2428:in `scan'
/home/git/gitlab/lib/tasks/cache.rake:10:in `block (3 levels) in <top (required)>'
/home/git/gitlab/lib/tasks/cache.rake:9:in `loop'
/home/git/gitlab/lib/tasks/cache.rake:9:in `block (2 levels) in <top (required)>'
Tasks: TOP => cache:clear
(See full trace by running task with --trace)

調べたところ、

SCAN was added in 2.8 though.

stackoverflow.com

ということなので、Redisの最新版をインストール

9. Redisの最新版をインストール

の前にTCL 8.6 をインストール

mkdir /tmp/tcl
cd /tmp/tcl
wget http://downloads.sourceforge.net/project/tcl/Tcl/8.6.5/tcl8.6.5-src.tar.gz
tar zxvf tcl8.6.5-src.tar.gz
cd tcl8.6.5
cd unix
./configure
make
make test
sudo make install

Redisの最新版をインストール

mkdir /tmp/redis
cd /tmp/redis
curl -O --progress http://download.redis.io/releases/redis-3.0.7.tar.gz
tar zxvf redis-3.0.7.tar.gz
cd redis-3.0.7
make
make test
sudo make install

READMEを見ると sudo make PREFIX=/some/directory install とすればインストール場所を指定出来るとあるが、なぜか効かなかった。 で、インストールされたのが /usr/local/bin/redis-server で元々入っているのが /usr/bin/redis-server なので、起動スクリプトのバイナリのパスを変更。

sudo vim /etc/init.d/redis-server

vm関連の設定がなくなったので redis.conf を開いて vm- で始まる項目をコメントアウト。 それと hash-max-zipmap-entrieshash-max-zipmap-valueコメントアウト。 不要な設定が残っている状態でredisを起動するとエラーで怒られるので、その設定を消していけばOK。

sudo vim /etc/redis/redis.conf

で、再起動。

sudo service redis-server restart

10. 再度マイグレーション

cd /home/git/gitlab
# Clean up assets and cache
sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production

今度は成功

11. 起動用スクリプトを更新

# Update init.d script
sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab

12. Gitlabの設定を更新

Gitlab 7.14 と Gitlab 8.6 の差分を確認

git diff origin/7-14-stable:config/gitlab.yml.example origin/8-6-stable:config/gitlab.yml.example

関係していそうな以下の点を修正。

+  ## Git LFS
+  lfs:
+    enabled: true
+    # The location where LFS objects are stored (default: shared/lfs-objects).
+    # storage_path: shared/lfs-objects
+
   ## Gravatar

→ 追加

13. Nginx の設定を更新

差分を確認

git diff origin/7-14-stable:lib/support/nginx/gitlab origin/8-6-stable:lib/support/nginx/gitlab
sudo vim /etc/nginx/sites-available/gitlab

以下の内容を編集

-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;
     proxy_set_header    X-Forwarded-Proto   $scheme;
-    proxy_set_header    X-Frame-Options     SAMEORIGIN;

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

14. Gitlab と Nginx を再起動

sudo service gitlab restart
sudo service nginx restart

そして、ついに成功。

f:id:interprism:20160426130149p:plain

Gitlab 8.6.6 にした時の環境

プロダクト アップグレード前 Gitlab 8.6.6時 備考
OS Ubuntu 12 変更なし
Git 1.8.4.1 2.8.1 -
Ruby 2.0.0p353 2.3.0 -
MySQL 5.5.47 変更なし
Redis 2.2.12 3.0.7 -
nginx 1.1.19 変更なし
Gitlab 6.2.4 8.6.6 -
Go言語 なし 1.6.1 新規追加

まとめ

手順は以上です。途中でハマリポイントもいくつかあり、作業完了までとても長かったですが、公式のドキュメントがしっかりしているためほぼ迷うことなく進むことが出来ました。

今回は2年近くバージョンアップを行わなかったため作業が多くなってしまいましたが、今後はこまめにバージョンアップして行ったほうが良いと強く感じました。

なお、バージョンアップしてから1週間以上が経過しましたが、快調に動作しておりアップグレードは成功したと言えそうです。

PAGE TOP