こんにちわ hirano です。
先日、社内の Gitlab 6.2.4 を Gitlab 8.6.6 へアップグレードしました。その時の記録です。
目次
- 背景
- アップグレード前の環境
- Gitlab 6.2.4 から 7.14 へアップグレード
- Gitlab 7.14 にした時の環境
- Gitlab 7.14 から 8.6.6 へアップグレード
- Gitlab 8.6.6 にした時の環境
- まとめ
背景
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系の手順があったので、それを元に実施していきます。
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/ にアクセスすると以下の画面が出たので、喜び勇んでログインしようとしました。
ユーザー認証自体は通っているようなのですが、どうやってもログイン画面に戻ってきてしまってログイン出来ないので、ログ( 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 の設定が怪しそうということで調べてみたところ以下の記事が見つかりました。
これによると以下の設定を入れればいいよとあります。
<% 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系へのアップグレードです。ここを参考に作業していきます。
基本的な手順は 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.
ということなので、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-entries
と hash-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
そして、ついに成功。
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週間以上が経過しましたが、快調に動作しておりアップグレードは成功したと言えそうです。