GitLab 5.3から7.13へのアップグレード作業ログ

# About

少し前に、社内のGitLabを5.3から7.13にアップグレードしたので、その際の作業ログを残しておきます。
今後、同じような作業(というか苦行)をする人のお役に立てれば。。

なお、作業時点での最新版は7.13でしたが、現在は8.Xです。今後作業する場合は、適宜読み替えて下さい。

# アップグレード前の状況

* 3.Xの時代から何度かアップグレードしながら利用していて、現在は5.3で運用中
* OSはUbuntu

# アップグレード計画

新環境はOmnibus版で運用したかったため、アップグレード計画を以下のように立てました。

* 新規サーバにGitLab 7.13を新環境として構築し、現環境のデータをマイグレーションしてインポートする。
* マイグレーションは、新規サーバにマイグレーション専用の環境を用意し、公式ガイドに従って下記3ステップで行う。
   1. MySQLからPostgreSQLにコンバート
      * 最新GitLabでは、MySQLのサポートがPro版のみorz
   2.  [5.3 -> 5.4](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/5.3-to-5.4.md)
   3.  [5.4 -> 6.0](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/5.4-to-6.0.md)
   4.  [From 6.x or 7.x to 7.13](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/6.x-or-7.x-to-7.13.md)
* 最後にDNSを新環境に切り替えて移行を行う

この流れを可視化すると、次のようになります。

<img width="649" alt="gitlab.png" src="https://qiita-image-store.s3.amazonaws.com/0/1489/e639eae4-6f5b-f9f1-6e09-c81787125c34.png">


# 作業ログ

## 1. 新環境の構築

新規サーバにUbuntu 14.04 LTSをセットアップし、[公式ガイド](https://about.gitlab.com/downloads/)に従ってGitLabのOmnibus版をインストールする。

```sh:@新環境
$ sudo apt-get install curl openssh-server ca-certificates
$ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
$ sudo apt-get install gitlab-ce
$ sudo gitlab-ctl reconfigure
```

## 2. マイグレーション環境の構築

新規サーバにUbuntu 14.04 LTSをセットアップし、[公式ガイド](https://github.com/gitlabhq/gitlabhq/blob/5-3-stable/doc/install/installation.md)に従ってGitLab 5.3をインストールする。

依存パッケージをインストールする。

```sh:@マイグレーション環境
# Install dependencies
$ sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl git-core openssh-server redis-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev
$ sudo apt-get install python
$ python --version
```

次にRubyをインストールする。

```sh:@マイグレーション環境
# Ruby
$ sudo apt-get remove ruby1.8
$ mkdir /tmp/ruby && cd /tmp/ruby
$ curl --progress http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p392.tar.gz | tar xz
$ cd ruby-1.9.3-p392
$ ./configure
$ make
$ sudo make install
$ sudo gem install bundler
```

次にgitlab-shellをインストールする。gitlab_urlのURLは各自の環境で読み替えて下さい。

```sh:@マイグレーション環境
# Install gitlab-shell
$ sudo adduser --disabled-login --gecos 'GitLab' git
$ sudo su git
$ cd /home/git
$ git clone https://github.com/gitlabhq/gitlab-shell.git
$ cd gitlab-shell
$ git checkout v1.4.0
$ cp config.yml.example config.yml

$ vim config.yml
# gitlab_urlを編集
# gitlab_url: "http://git-migration.example.com/"

$ ./bin/install
```

次にMySQLをインストールする。

```sh:@マイグレーション環境
# MySQL
$ sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev
$ mysql -u root -p # password=root
mysql> CREATE USER 'gitlab'@'localhost' IDENTIFIED BY 'gitlab';
mysql> CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
mysql> GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'gitlab'@'localhost';
mysql> \q

# Check connectivity
$ sudo -u git -H mysql -u gitlab -p -D gitlabhq_production
```

次にGitLabをインストールする。

```sh:@マイグレーション環境
# GitLab
$ cd /home/git
$ sudo -u git -H git clone https://github.com/gitlabhq/gitlabhq.git gitlab
$ cd /home/git/gitlab
$ sudo -u git -H git checkout 5-3-stable

$ cd /home/git/gitlab
$ sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml
$ sudo -u git -H vim config/gitlab.yml
# hostを編集
# host: git-migration.example.com

$ sudo chown -R git log/
$ sudo chown -R git tmp/
$ sudo chmod -R u+rwX  log/
$ sudo chmod -R u+rwX  tmp/

$ sudo -u git -H mkdir /home/git/gitlab-satellites
$ sudo -u git -H mkdir tmp/pids/
$ sudo -u git -H mkdir tmp/sockets/
$ sudo chmod -R u+rwX  tmp/pids/
$ sudo chmod -R u+rwX  tmp/sockets/

$ sudo -u git -H mkdir public/uploads
$ sudo chmod -R u+rwX  public/uploads
$ sudo -u git -H cp config/puma.rb.example config/puma.rb
$ sudo -u git -H git config --global user.name "GitLab"
$ sudo -u git -H git config --global user.email "gitlab@localhost"

$ sudo -u git cp config/database.yml.mysql config/database.yml
```

次にgemをインストールする。

```sh:@マイグレーション環境
$ cd /home/git/gitlab
$ sudo gem install charlock_holmes --version '0.6.9.4'
$ sudo -u git -H bundle install --deployment --without development test postgres
```

ここで1つ目の地雷を踏む。`Could not find modernizr-2.6.2 in any of the sources`となり、gemのインストールが終わらない。

http://anton0825.hatenablog.com/entry/20140523/1408932429

上記記事を参考に、GemfileとGemfile.lockのmodernizr 2.6.2をmodernizr-rails 2.7.1に修正して再トライ。

```sh:@マイグレーション環境
$ sudo vim Gemfile
  #gem "modernizr",        "2.6.2"
  gem "modernizr-rails",   "2.7.1"
$ sudo vim Gemfile.log
  modernizr-rails (2.7.1)
  modernizr-rails (= 2.7.1)
$ sudo -u git -H bundle install --deployment --without development test postgres
```

とりあえず通ったので、GitLabの設定作業を進める。

```sh:@マイグレーション環境
$ sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production

$ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
$ sudo chmod +x /etc/init.d/gitlab
$ sudo update-rc.d gitlab defaults 21

$ sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production
$ sudo service gitlab start
$ sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production
# 何故かsidekiqが起動していないと怒られたのでsidekiq:startしておく
$ sudo -u git -H bundle exec rake sidekiq:start RAILS_ENV=production
$ sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production
```

最後にNginxをインストールする。

```sh:@マイグレーション環境
# nginx
$ sudo apt-get install nginx
$ sudo cp lib/support/nginx/gitlab /etc/nginx/sites-available/gitlab
$ sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab
$ sudo vim /etc/nginx/sites-available/gitlab
# listen <IPアドレス>:80 default_server;
# server_name localhost;
$ sudo service nginx restart
```

## 3. 現環境のデータをマイグレーション環境にインポート

まず、現環境のデータをダンプする。

```sh:@現環境
# MySQLのダンプ
$ mysqldump -u gitlab -p --default-character-set=utf8 gitlabhq_production > gitlabhq_production.sql
# リポジトリのアーカイブ
$ sudo zip -r /home/git/repositories_migration.zip /home/git/repositories
```

`gitlabhq_production.sql`と`repositories_migration.zip`は、マイグレーション環境の`/home/hoge`配下に転送しておく。

次に、マイグレーション環境でデータをインポートする。

```sh:@マイグレーション環境
# MySQLのインポート
$ mysql -u gitlab -p gitlabhq_production < /home/hoge/gitlabhq_production.sql
# リポジトリの展開
$ unzip /home/hoge/repositories_migration.zip
$ sudo rm -rf /home/git/repositories
$ sudo mv /home/hoge/home/git/repositories /home/git/
$ sudo chown -R git:git /home/git/repositories
$ sudo chmod -R 2775 /home/git/repositories
```

## 4. マイグレーション環境のDBをPostgreSQLにコンバート

PostgreSQLをインストールする。

https://github.com/gitlabhq/gitlabhq/blob/5-3-stable/doc/install/databases.md

```sh:@マイグレーション環境
$ sudo apt-get install -y postgresql libpq-dev
$ sudo -u postgres psql -d template1
template1=# CREATE USER git WITH PASSWORD 'git';
template1=# CREATE DATABASE gitlabhq_production OWNER git;
template1=# \q
$ sudo -u git -H psql -d gitlabhq_production
```

MySQLのデータをPostgreSQLにコンバートする。

https://github.com/gitlabhq/mysql-postgresql-converter

```sh:@マイグレーション環境
$ cd
$ mysqldump --compatible=postgresql --default-character-set=utf8 -r databasename.mysql -u gitlab gitlabhq_production -p
$ git clone https://github.com/gitlabhq/mysql-postgresql-converter.git
$ cp mysql-postgresql-converter/db_converter.py ./
$ cp mysql-postgresql-converter/move_drop_indexes.ed ./
$ python db_converter.py databasename.mysql databasename.psql
$ ed -s databasename.psql < move_drop_indexes.ed
$ sudo -u git -H psql -f databasename.psql -d gitlabhq_production
```

GitLabをPostgreSQL向けに設定する。

```sh:@マイグレーション環境
$ cd /home/git/gitlab
$ sudo -u git -H cp config/database.yml.postgresql config/database.yml
$ sudo -u git -H vim config/database.yml

$ sudo vim .bundle/config
# withoutからpostgresを消す

$ sudo -u git -H bundle install --deployment --without development test mysql
$ sudo /etc/init.d/gitlab restart
```

以上でPostgreSQL化は完了。

## 5. 5.3から5.4へのマイグレーション

[公式ガイド](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/5.3-to-5.4.md)に従って作業する。

```sh:@マイグレーション環境
$ sudo service gitlab stop
$ cd /home/git/gitlab
$ sudo -u git -H git checkout Gemfile Gemfile.lock
$ sudo -u git -H git fetch
$ sudo -u git -H git checkout 5-4-stable

$ cd /home/git/gitlab-shell
$ sudo -u git -H git fetch
$ sudo -u git -H git checkout v1.7.9

$ cd /home/git/gitlab

# 例によってmodernizr関連で怒られるので...
$ sudo vim Gemfile
  #gem "modernizr",        "2.6.2"
  gem "modernizr-rails",   "2.7.1"
$ sudo vim Gemfile.log
  modernizr-rails (2.7.1)
  modernizr-rails (= 2.7.1)

$ sudo -u git -H bundle install --without development test mysql --deployment
$ sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production
$ sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production
```

設定ファイルを新バージョンの仕様に合うように編集しますが、自分の環境では特に変更は必要ありませんでした。

* Make `/home/git/gitlab/config/gitlab.yml` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/5-4-stable/config/gitlab.yml.example but with your settings.
* Make `/home/git/gitlab/config/puma.rb` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/5-4-stable/config/puma.rb.example but with your settings.

起動スクリプトの設置と、インストールの最終チェックを行う。

```sh:@マイグレーション環境
$ sudo rm /etc/init.d/gitlab
$ sudo curl -L --output /etc/init.d/gitlab https://raw.github.com/gitlabhq/gitlabhq/5-4-stable/lib/support/init.d/gitlab
$ sudo chmod +x /etc/init.d/gitlab

$ sudo service gitlab start
$ sudo service nginx restart

$ 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
```

gitlab:checkに怒られたので、指示に従って作業して再チェックする。

```sh:@マイグレーション環境
$ sudo chmod -R ug+rwX,o-rwx /home/git/repositories/
$ sudo chmod -R ug-s /home/git/repositories/
$ find /home/git/repositories/ -type d -print0 | sudo xargs -0 chmod g+s
$ sudo -u git -H bundle exec rake gitlab:satellites:create RAILS_ENV=production

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


## 6. 5.4から6.0へのマイグレーション

[公式ガイド](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/5.4-to-6.0.md)に従って作業する。

```sh:@マイグレーション環境
$ sudo service gitlab stop

$ cd /home/git/gitlab
$ sudo -u git -H git checkout Gemfile Gemfile.lock db/schema.rb
$ sudo -u git -H git fetch
$ sudo -u git -H git checkout 6-0-stable

$ cd /home/git/gitlab-shell
$ sudo -u git -H git fetch
$ sudo -u git -H git checkout v1.7.9

$ sudo apt-get install python-docutils

$ cd /home/git/gitlab

# 例によってmodernizr関連で怒られるので...
$ sudo vim Gemfile
  #gem "modernizr",        "2.6.2"
  gem "modernizr-rails",   "2.7.1"
$ sudo vim Gemfile.log
  modernizr-rails (2.7.1)
  modernizr-rails (= 2.7.1)

$ sudo -u git -H bundle install --without development test mysql --deployment
```

DBのマイグレーション作業を開始。[6.0ではModelに大きな修正が入ったとのこと](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/5.4-to-6.0.md#deprecations)で、マイグレーションには複数のステップが必要になる。

```sh:@マイグレーション環境
$ sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production
$ sudo -u git -H bundle exec rake migrate_groups RAILS_ENV=production
$ sudo -u git -H bundle exec rake migrate_global_projects RAILS_ENV=production
```

`migrate_global_projects`で2回目の地雷を踏む。マイグレーションの進捗状況に**F**の文字が表示されているので、マイグレーションに失敗しているプロジェクトがある模様。

エラーログとデータとソースを確認したところ、失敗の原因を突き止める。
3.X時代から運用していたため、色々と怪しいデータが残っているようだ。。

* プロジェクト名に禁止文字`/()`が使われている
* owner不在？のProjectがあり、ProjectTransferServiceが失敗する

仕方ないので、`lib/tasks/migrate/migrate_global_projects.rake`を修正する。

```sh:lib/tasks/migrate/migrate_global_projects.rake
desc "GITLAB | Migrate Global Projects to Namespaces"
task migrate_global_projects: :environment do
  found = Project.where(namespace_id: nil).count
  if found > 0
    puts "Global namespace is deprecated. We found #{found} projects stored in global namespace".yellow
    puts "You may abort this task and move them to group/user namespaces manually."
    puts "If you want us to move this projects under owner namespaces then continue"
    ask_to_continue
  else
    puts "No global projects found. Proceed with update.".green
  end

  Project.where(namespace_id: nil).find_each(batch_size: 20) do |project|
    begin
      # プロジェクト名の禁止文字を_に置換する
      project.name = project.name.gsub(/(\/|\(|\))/, '_')
      # creatorを明示的に指定する
      project.creator = User.find(1)
      # Transfer先のNamespaceを明示的に指定する
      ProjectTransferService.new.transfer(project, Namespace.find(1))
      print '.'
    rescue => ex
      p ex
      puts ex.message
      print 'F'
    end
  end
end
```

マイグレーション作業を再開。

```sh:@マイグレーション環境
$ sudo -u git -H bundle exec rake migrate_global_projects RAILS_ENV=production
$ sudo -u git -H bundle exec rake migrate_keys RAILS_ENV=production
$ sudo -u git -H bundle exec rake migrate_inline_notes RAILS_ENV=production
$ sudo -u git -H bundle exec rake gitlab:satellites:create RAILS_ENV=production

$ sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production

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

設定ファイルを新バージョンの仕様に合うように編集しますが、自分の環境では特に変更は必要ありませんでした。

* Make `/home/git/gitlab/config/gitlab.yml` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/master/config/gitlab.yml.example but with your settings.
* Make `/home/git/gitlab/config/unicorn.rb` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/master/config/unicorn.rb.example but with your settings.

```sh:@マイグレーション環境
$ sudo -u git -H cp /home/git/gitlab/config/gitlab.yml.example /home/git/gitlab/config/gitlab.yml
$ sudo vim /home/git/gitlab/config/gitlab.yml

$ sudo -u git -H cp /home/git/gitlab/config/unicorn.rb.example /home/git/gitlab/config/unicorn.rb

$ sudo rm /etc/init.d/gitlab
$ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
$ sudo chmod +x /etc/init.d/gitlab

$ sudo service gitlab start
$ sudo service nginx restart

$ 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
```

## 7. 6.0での動作確認

6.0では大きな変更が入っているので、ここで動作確認をしておく。

```:@自分のPC
$ git clone git@git-migration.example.com:user/project.git
git@git-migration.example.com's password:
```

パスワード求められるorz

確認すると`/home/git/.ssh/authorized_keys`が空であったので、現環境から`/home/git/.ssh/authorized_keys`をマイグレーション環境にコピーして再トライ。

```:@自分のPC
$ git clone git@git-migration.example.com:user/project.git
Cloning into 'project'...
Access denied.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

gitlab-shellのログを見てみると、GitLabのAPIアクセスが404になっている模様。

```:/home/git/gitlab-shell/gitlab-shell.log
W, [2015-08-01T14:15:57.909114 #689]  WARN -- : gitlab-shell: Access denied for git command <git-upload-pack 'user/project.git'> by user with key key-106.
E, [2015-08-01T14:18:22.067857 #792] ERROR -- : API call <GET http://git-migration.example.com//api/v3/internal/allowed?key_id=106&action=git-upload-pack&ref=_any&project=user/project> failed: 404 => <<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.4.6 (Ubuntu)</center>
</body>
</html>
>.
W, [2015-08-01T14:18:22.067961 #792]  WARN -- : gitlab-shell: Access denied for git command <git-upload-pack 'user/project.git'> by user with key key-106.
```

nginxのデフォルトVirtualHostが応答しているためと思われるので、nginxの設定ファイルを修正してnginxを再起動。

```:/etc/nginx/sites-available/gitlab
server {
  # 全てのIPでlisten
  listen 80;
  # server_nameを指定
  server_name git-migration.example.com;
  ...
}
```

再トライ。


```sh:自分のPC
$ git clone git@git-migration.example.com:user/project.git
Cloning into 'project'...
remote: Counting objects: 161, done.
remote: Compressing objects: 100% (141/141), done.
remote: Total 161 (delta 63), reused 0 (delta 0)
Receiving objects: 100% (161/161), 125.77 KiB | 0 bytes/s, done.
Resolving deltas: 100% (63/63), done.
Checking connectivity... done.
```

ふう。。。

## 8. 6.0から7.13へのマイグレーション

[公式ガイド](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/6.x-or-7.x-to-7.13.md)に従って作業

```sh:@マイグレーション環境
$ sudo service gitlab stop

$ 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.1/ruby-2.1.6.tar.gz | tar xz
$ cd ruby-2.1.6
$ ./configure --disable-install-rdoc
$ make
$ sudo make install

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

$ cd /home/git/gitlab
$ sudo -u git -H git checkout Gemfile Gemfile.lock db/schema.rb
$ sudo -u git -H git fetch --all
$ sudo -u git -H git checkout -- db/schema.rb

$ sudo -u git -H git checkout 7-13-stable

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

# 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
# Change the Redis socket path if you are not using the default Debian / Ubuntu configuration
$ sudo -u git -H editor config/resque.yml

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


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

$ cd /home/git/gitlab
$ sudo -u git -H bundle install --without development test mysql --deployment
$ sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production
```

migration途中でエラー発生

```
== 20140416074002 AddIndexOnIid: migrating ====================================
Remove Issue duplicates for iid:  and project_id: 340
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

undefined method `shift' for #<Issue::ActiveRecord_Relation:0x007f068ff444e8>/home/git/gitlab/vendor/bundle/ruby/2.1.0/gems/activerecord-4.1.11/lib/active_record/relation/delegation.rb:136:in `method_missing'
```

https://github.com/gitlabhq/gitlabhq/pull/7443

上記リンクを参考に、PRの内容でマイグレーション処理を修正する。

```sh:マイグレーション環境
$ sudo vim db/migrate/20140416074002_add_index_on_iid.rb
# if items.size > 1
if items.is_a?(Array) && items.size > 1
```

マイグレーションを再開。

```sh:マイグレーション環境
$ 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
```

設定ファイルを新バージョンの仕様に合うように編集します。

* Make `/home/git/gitlab/config/gitlab.yml` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-13-stable/config/gitlab.yml.example but with your settings.
* Make `/home/git/gitlab/config/unicorn.rb` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-13-stable/config/unicorn.rb.example but with your settings.
* Make `/home/git/gitlab-shell/config.yml` the same as https://gitlab.com/gitlab-org/gitlab-shell/blob/v2.6.0/config.yml.example but with your settings.

pumaからunicornに変更になったこともあり、いくつか修正が必要。

```sh:マイグレーション環境
$ sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml
$ sudo vim config/gitlab.yml
# host,email_from等を修正

$ sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb

$ sudo -u git -H cp /home/git/gitlab-shell/config.yml.example /home/git/gitlab-shell/config.yml

$ 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

$ sudo cp lib/support/nginx/gitlab /etc/nginx/sites-available/gitlab
$ sudo vim /etc/nginx/sites-available/gitlab
  listen 80;
  server_name git-migration.example.com;

$ sudo service gitlab start
$ sudo service nginx restart

$ 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
```

gitlab:checkに怒られたので、指示に従って作業して再チェック。

```sh:@マイグレーション環境
$ sudo -u git -H /home/git/gitlab-shell//bin/create-hooks
$ sudo -u git -H "/usr/bin/git" config --global core.autocrlf "input"

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

以上で7.13へのマイグレーションは完了。

## 9. マイグレーション環境のデータを新環境に取り込み

[公式ガイド](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/raketasks/backup_restore.md)に従って、データのダンプと取り込みを行う。

まずはマイグレーション環境でダンプを実行。

```sh:@マイグレーション環境
$ cd /home/git/gitlab
$ sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
```

このコマンドで`/home/git/gitlab/tmp/backups/XXXXXXXXXX_gitlab_backup.tar`が生成されるので、新環境に転送する。
(XXXXXXXXXXはタイムスタンプなので、各自の環境で読み替えて下さい。)

新環境でバックアップファイルを指定場所に移動し、リストアコマンドを実行する。

```sh:@新環境
$ sudo mv /home/hoge/XXXXXXXXXX_gitlab_backup.tar /var/opt/gitlab/backups/
$ sudo chown git:git /var/opt/gitlab/backups/XXXXXXXXXX_gitlab_backup.tar
$ sudo gitlab-ctl stop unicorn
$ sudo gitlab-ctl stop sidekiq
$ sudo gitlab-rake gitlab:backup:restore BACKUP=XXXXXXXXXX
$ sudo gitlab-ctl stop
$ sudo gitlab-ctl start
```

以上で、新環境へのデータのインポートは完了です。