先日slackにて、こんな会話がありました。
先輩:「GitLabのバージョン上げたいけど、設定が面倒くさいな~」
自分:「それdockerなら簡単にできますよ」
先輩:「お~、それじゃあお願いしていいかな?」
自分:「はい、よろこんで!」
というわけで、今回は7.12.2から8.3.0へのバージョンアップになります。
ただ、新規にGitLab on dockerを行う場合も、この方法で作成できます。
環境
ホストのCentOSにVirtualBoxでUbuntuを作成し、その中にdockerを入れています。
- HostOS: CentOS release 6.5
- GuestOS: Ubuntu 14.04 LTS
- docker version: 1.9.1
GitLabバージョンアップの注意点
7.12.2のバックアップデータを直接8.3.0でリストアしようとしても、互換性の問題があるため、上手くいきません。
そこで次のような手順でバージョンをあげます。
7.12.2 => 7.14.3 => 8.1.4 => 8.2.0 => 8.3.0-1
詳細な情報はUpgrade fails from 7.8.1 to 8.2.0 #504が参考になります。
作業
今回もsameersbn/docker-gitlabにお世話になりたいと思います。
docker pull
先に必要なdockerイメージをpullしておきます。
※新規にGitLabを作成する場合はsameersbn/gitlabは8.3.0-1のみでOKです。(2015/12/28現在)
$ sudo docker pull [REPOSITORY]:[TAG]
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
sameersbn/gitlab 8.3.0-1 daeb1d65a71d 3 days ago 682.3 MB
sameersbn/gitlab 8.2.0 4f8184d55f41 5 weeks ago 675.3 MB
sameersbn/redis latest f69db76d2fa8 5 weeks ago 196.5 MB
sameersbn/postgresql 9.4-8 81c68746a367 5 weeks ago 231.2 MB
sameersbn/gitlab 8.1.4 f819f70c97f3 6 weeks ago 678.9 MB
sameersbn/gitlab 7.14.3 43e1dcc0390f 3 months ago 631.6 MB
sameersbn/gitlab 7.12.2 31072a65dc42 5 months ago 627.5 MB
docker-compose.yml
docker-gitlab/docker-compose.ymlにあるように、次のようなymlファイルを用意します。
※今回新規にGitLabを作成する場合は、sameersbn/gitlab:7.12.2の部分をsameersbn/gitlab:8.3.0-1に変更して下さい。
postgresql:
restart: always
image: sameersbn/postgresql:9.4-8
environment:
- DB_USER=xxxx
- DB_PASS=xxxx
- DB_NAME=xxxx
volumes:
- /home/vagrant/docker-gitlab/gitlab-data/postgresql:/var/lib/postgresql
gitlab:
restart: always
image: sameersbn/gitlab:7.12.2
links:
- redis:redisio
- postgresql:postgresql
ports:
- "xxxx:80"
- "xxxx:22"
environment:
- TZ=Asia/Tokyo
- GITLAB_TIMEZONE=Tokyo
- GITLAB_SECRETS_DB_KEY_BASE=xxxxxxxxxxxxxxxxxxxxxxxxx
- GITLAB_HOST=xxx.xxx.xxx.xxx
- GITLAB_PORT=xxxx
- GITLAB_SSH_PORT=xxxx
- GITLAB_NOTIFY_ON_BROKEN_BUILDS=true
- GITLAB_NOTIFY_PUSHER=false
- GITLAB_EMAIL=xxxx@gmail.com
- GITLAB_EMAIL_REPLY_TO=xxxx@gmail.com
- GITLAB_INCOMING_EMAIL_ADDRESS=xxxx@gmail.com
- GITLAB_BACKUP_SCHEDULE=daily
- GITLAB_BACKUP_EXPIRY=604800
- GITLAB_BACKUP_TIME=01:00
- SMTP_ENABLED=true
- SMTP_DOMAIN=www.gmail.com
- SMTP_HOST=smtp.gmail.com
- SMTP_PORT=587
- SMTP_USER=xxxx@gmail.com
- SMTP_PASS=xxxxxxxx
- SMTP_STARTTLS=true
- SMTP_TLS=false
- SMTP_AUTHENTICATION=login
volumes:
- /home/vagrant/docker-gitlab/gitlab-data/gitlab:/home/git/data
redis:
restart: always
image: sameersbn/redis:latest
volumes:
- /home/vagrant/docker-gitlab/gitlab-data/redis:/var/lib/redis
詳細な説明はsameersbn/docker-gitlab#configurationをご覧下さい。
ここでは個人的にあった方が良いと思われる設定のみを記述しています。
※内部公開用です。
コンテナ操作
新規にGitLabを作成する場合は、「起動」までを行うことで、動作を確認できます。
docker-compose.ymlで設定した。GITLAB_HOST:GITLAB_PORTへアクセスして下さい。
起動
$ sudo docker-compose up -d
$ sudo docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------------------------------------
dockergitlab_gitlab_1 /sbin/entrypoint.sh app:start Up 0.0.0.0:xxxx->22/tcp, 443/tcp, 0.0.0.0:xxxx->80/tcp
dockergitlab_postgresql_1 /sbin/entrypoint.sh Up 5432/tcp
dockergitlab_redis_1 /sbin/entrypoint.sh Up 6379/tcp
上記のdocker-compose.ymlで起動した場合は、volumesに記述してあるように、下記のディレクトリができているはずです。
- docker-gitlab/gitlab-data/postgresql
- docker-gitlab/gitlab-data/gitlab
- docker-gitlab/gitlab-data/redis
コンテナ起動後は、GitLabが起動しているかログを確認すると良いです。
※下記は8.2.0の例です。
$ sudo docker exec -it dockergitlab_gitlab_1 tail -n 20 /var/log/gitlab/gitlab/sidekiq.log
バックアップファイルの配置
GitLabは標準機能として、バックアップファイルを作成することができます。そのバックアップファイルを起動時に作成されたgitlab-data/gitlab/backups/へ配置して下さい。
$ cp -a backup/xxxxxxxx_gitlab_backup.tar gitlab-data/gitlab/backups/
バックアップからのリストア
今回は元々使用していたGitLabサーバー(7.12.2)で作成したバックアップファイルをdockerで起動したGitLabサーバー(7.12.2)でリストアします。
コンテナに入り、リストアコマンドを実行します。
$ sudo docker exec -it dockergitlab_gitlab_1 bash
root@4e2a404f9d38:/home/git/gitlab# /sbin/entrypoint.sh app:rake gitlab:backup:restore
root@4e2a404f9d38:/home/git/gitlab# exit
docker-compose.ymlで設定した。GITLAB_HOST:GITLAB_PORTへアクセスすれば、復元されていることの確認ができます。
バックアップファイルの作成
起動していたGitlabコンテナを停止し、バックアップファイルを作成します。
$ sudo docker stop dockergitlab_gitlab_1
$ sudo docker rm dockergitlab_gitlab_1
backupには次のようなシェルを作ってしまうと楽かもしれません。
以降はGITLAB_VERSIONを変更するのみで良いからです。
#!/bin/bash
GITLAB_VERSION="7.12.2"
docker run --name gitlab -it --rm \
--link dockergitlab_redis_1:redisio \
--link dockergitlab_postgresql_1:postgresql \
-p xxxx:22 -p xxxx:80 \
--env TZ=Asia/Tokyo \
--env GITLAB_TIMEZONE=Tokyo \
--env GITLAB_SECRETS_DB_KEY_BASE=xxxxxxxxx \
--env GITLAB_HOST=xxx.xxx.xxx.xxx \
--env GITLAB_PORT=xxxx \
--env GITLAB_SSH_PORT=xxxx \
sameersbn/gitlab:${GITLAB_VERSION} \
app:rake gitlab:backup:create
7.12.2のバックアップを作成しています。(本来であれば不要かと思いますが、dockerコンテナで作成し直しています。)
「バックアップからのリストア」を繰り返す
docker-compose.ymlのバージョンを修正し、backup.shのバージョンも修正します。ここからは前述したことの繰り返しになります。
7.12.2 => 7.14.3 => 8.1.4 => 8.2.0 => 8.3.0-1の順にバージョンを上げて下さい。
$ vim docker-compose.yml
$ sudo docker-compose up -d
後方互換性が保たれている場合は、GitLabコンテナを起動するだけで、リストアが可能です。必ず7.12.2 => 7.14.3 => 8.1.4 => 8.2.0 => 8.3.0-1の順を守って下さい。
※GITLAB_HOST:GITLAB_PORTへアクセスし、動作を確認後、コンテナを停止しましょう。早過ぎると、データの移行が完全にできていない場合があります。
$ sudo docker stop dockergitlab_gitlab_1
$ sudo docker rm dockergitlab_gitlab_1
$ vim backup.sh
$ sudo sh backup.sh
最新版GitLabの動作確認
ここまで終わったら、動作を確認してみましょう。
GITLAB_HOST:GITLAB_PORTへアクセスし、バージョンを確認してみます。
8.3.0になったみたいですね。
おわりに
とても簡単にGitLabのバージョンを上げることができました。
dockerだと、やり直しも簡単にできるので、とりあえず試してみる…という気持ちで触ってみると良いと思います。
Let's play docker!