GitLab Development KitをMac OS直で使う

# GitLab Development KitをMac OS Nativeで使う

![IMG_8556.JPG](https://qiita-image-store.s3.amazonaws.com/0/260796/da817884-7479-1592-ce8e-74357d0f0c74.jpeg)

GitLabはオープンソースで誰でもコントリビュートできます。そのために以下のGitLab Developer Kitが公開されています。

https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/set-up-gdk.md

Macユーザにはパフォーマンスの観点からVM上ではなくMac OS直にインストールすることが推奨されています。GitLab CEにコントリビュートする想定でインストール手順と落とし穴をまとめました。

## Rubyバージョン

以下のページから必要なRubyバージョンが確認できます。現時点で `2.4.4` となります。

* 2018/11/14時点でRuby `2.5.3` になったことを発覚。

https://gitlab.com/gitlab-org/gitlab-ce/blob/master/.ruby-version


自分は`rbenv`を使っていますのでそれでバージョンをあわせます。

```shell-session
> ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]

> rbenv install 2.4.4
ruby-build: use openssl from homebrew
Downloading ruby-2.4.4.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.4.tar.bz2
Installing ruby-2.4.4...
ruby-build: use readline from homebrew
Installed ruby-2.4.4 to /Users/jb/.rbenv/versions/2.4.4

> rbenv global 2.4.4

> ruby -v
ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-darwin18]
```

## GDK gemをインストール

まずは`gitlab-development-kit`のgemをインストールします。

```shell-session
> gem install gitlab-development-kit
Fetching: gitlab-development-kit-0.2.4.gem (100%)
Successfully installed gitlab-development-kit-0.2.4
Parsing documentation for gitlab-development-kit-0.2.4
Installing ri documentation for gitlab-development-kit-0.2.4
Done installing documentation for gitlab-development-kit after 0 seconds
1 gem installed
```

## GDKを初期化

その後、`gdk`コマンドが使えるようになりますのでこのコマンドを使って初期化します。

```shell_session
> gdk init
Cloning into '/Users/jb/Documents/gitlab-development-kit'...
remote: Enumerating objects: 5237, done.
remote: Counting objects: 100% (5237/5237), done.
remote: Compressing objects: 100% (2346/2346), done.
remote: Total 5237 (delta 3172), reused 4743 (delta 2791)
Receiving objects: 100% (5237/5237), 1.18 MiB | 1.29 MiB/s, done.
Resolving deltas: 100% (3172/3172), done.
Adding /Users/jb/Documents/gitlab-development-kit to trusted_directories in /Users/jb/.gdk.yml
```

初期化といっても、GDKのソースレポジトリをCloneするだけのようです。

## Install GDK

Cloneされたフォルダに移動して`gdk install`を実行するだけですが、いくつかの罠に引っかかりました。

罠特集も公開されています： https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/howto/troubleshooting.md

### Bundlerのgemをインストール

`bundler`のgemが必須ですので事前にあることを確認し、なければインストールします。

```shell-session
> gem install bundler
Fetching: bundler-1.16.6.gem (100%)
Successfully installed bundler-1.16.6
Parsing documentation for bundler-1.16.6
Installing ri documentation for bundler-1.16.6
Done installing documentation for bundler after 7 seconds
1 gem installed
```

### MySQLとmysql2のgemをインストール

GitLabはPostgreSQLのみサポートするようになりましたが何故か`mysql2`のgemが必要です。
もちろんその前にMySQLがインストールされていなければなりません。

```shell-session
> brew install mysql
> xcode-select --install
> gem install mysql2 -v '0.4.10' -V -- --with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include
```

Mac OSでの`mysql2` gemインストールは[罠が多い](https://www.google.co.jp/search?q=mac+os+gem+install+mysql2&oq=mac+os+gem+&aqs=chrome.1.69i57j0l5.5794j1j7&sourceid=chrome&ie=UTF-8)ようです。最終的には[この手順](https://github.com/brianmario/mysql2/issues/805)に基づいてインストールしました。

### charlock_holmesのgemとicu4cの相性問題

GDKをインストールする際、`bundle exec rake gettext:compile`コマンドで失敗しました。

```
bundle exec rake gettext:compile
rake aborted!
LoadError: dlopen(/Users/jb/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/charlock_holmes-0.7.6/lib/charlock_holmes/charlock_holmes.bundle, 9): Library not loaded: /usr/local/opt/icu4c/lib/libicudata.59.1.dylib
```

これは`charlock_holmes`のgemが`icu4c`バージョン59.1を期待していますが、実際にインストールされたのは62.1が原因です。

この問題に遭った場合、`charlock_holmes`をアンインストールし、[手動でインストール](https://tosbourn.com/problems-installing-charlock-holmes/)することで解決できます。

###GDKをインストール

いよいよGDKをインストールすることができます。

```shell-session
> cd gitlab-development-kit/
gitlab-development-kit> gdk install
(in /Users/jb/Documents/gitlab-development-kit)
git clone https://gitlab.com/gitlab-org/gitlab-ce.git gitlab
Cloning into 'gitlab'...
remote: Enumerating objects: 1233017, done.
remote: Counting objects: 100% (1233017/1233017), done.
remote: Compressing objects: 100% (369461/369461), done.
remote: Total 1233017 (delta 936276), reused 1100262 (delta 848605)
Receiving objects: 100% (1233017/1233017), 529.34 MiB | 3.07 MiB/s, done.
Resolving deltas: 100% (936276/936276), done.
...省略...

```

途中でPostgreSQLサーバを起動してくださいというメッセージが表示されます。早めに起動しないと失敗に終わります。

`/usr/local/Cellar/postgresql@9.6/9.6.10/bin/pg_ctl -D /Users/jb/Documents/gitlab-development-kit/postgresql/data -l logfile start`

`gdk install`は失敗しても何度でも実行できますので、他に罠があれば潰して再実行の繰り返しします。

無事成功した場合、以下のメッセージで終わります。

```
*********************************************
************** Setup finished! **************
*********************************************
cat HELP
# GitLab Development Kit cheat sheet

gdk run            # Start everything
gdk run db         # Start enough to run tests
gdk run app        # Start GitLab, needs 'gdk run db'

gdk install gitlab_repo=https://my-fork   # Install everything
gdk update                                # Pull application changes from Git
gdk reconfigure                           # Delete and regenerate all config files created by GDK
gdk psql -d gitlabhq_development          # Postgres console
gdk redis-cli                             # Redis console

# Development admin account: root / 5iveL!fe

For more information about GitLab development see
https://docs.gitlab.com/ce/development/README.html.
*********************************************
if [ "" = "Linux" ]; then \
		sed -i -e 's/docker\.for\.mac\.localhost/localhost/g' /Users/jb/Documents/gitlab-development-kit/prometheus/prometheus.yml; \
	fi
mkdir -p minio/data/lfs-objects
mkdir -p minio/data/artifacts
mkdir -p minio/data/uploads
```

## GDKを起動

### 後からわかった罠

1. PostgreSQLサーバが起動したままですので、まず停止します。

` /usr/local/Cellar/postgresql@9.6/9.6.10/bin/pg_ctl -D /Users/jb/Documents/gitlab-development-kit/postgresql/data stop`

2. GitLabのnodeパッケージがインストールされていなかったようです。

```shell-session
gitlab-development-kit> cd gitlab

g/gitlab> yarn install
yarn install v1.10.1
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 📃  Building fresh packages...
$ node ./scripts/frontend/postinstall.js
success Dependency postinstall check passed.
✨  Done in 12.49s.

g/gitlab> cd ..
```


### GDK起動

`gdk run`コマンドでGitLabを立ち上げます。

```
16:17:43 postgresql.1             | FATAL:  database "gitlabhq_development" does not exist
```

今度はDBが無い問題がでます。DBモードで起動して手動でDBの初期設定を行います。

```
gitlab-development-kit> gdk run db
(in /Users/jb/Documents/gitlab-development-kit)
16:25:08 redis.1                  | started with pid 19917
16:25:08 minio.1                  | started with pid 19918
16:25:08 postgresql.1             | started with pid 19919
16:25:08 webpack.1                | started with pid 19920
16:25:08 registry.1               | started with pid 19921
16:25:08 redis.1                  | 19917:C 11 Oct 16:25:08.113 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
16:25:08 redis.1                  | 19917:C 11 Oct 16:25:08.113 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=19917, just started
16:25:08 redis.1                  | 19917:C 11 Oct 16:25:08.113 # Configuration loaded
16:25:08 redis.1                  | 19917:M 11 Oct 16:25:08.115 * Increased maximum number of open files to 10032 (it was originally set to 256).
16:25:08 redis.1                  | 19917:M 11 Oct 16:25:08.117 * Running mode=standalone, port=0.
16:25:08 redis.1                  | 19917:M 11 Oct 16:25:08.117 # Server initialized
16:25:08 redis.1                  | 19917:M 11 Oct 16:25:08.117 * The server is now ready to accept connections at /Users/jb/Documents/gitlab-development-kit/redis/redis.socket
16:25:08 minio.1                  | Object Storage disabled.
16:25:08 registry.1               | Docker registry disabled.
16:25:08 postgresql.1             | LOG:  database system was shut down at 2018-10-11 16:24:08 JST
16:25:08 postgresql.1             | LOG:  MultiXact member wraparound protections are now enabled
16:25:08 postgresql.1             | LOG:  autovacuum launcher started
16:25:08 postgresql.1             | LOG:  database system is ready to accept connections
16:25:08 webpack.1                | yarn run v1.10.1
16:25:08 webpack.1                | $ nodemon -w 'config/webpack.config.js' --exec 'webpack-dev-server --config config/webpack.config.js'
16:25:09 webpack.1                | [nodemon] 1.18.4
16:25:09 webpack.1                | [nodemon] to restart at any time, enter `rs`
16:25:09 webpack.1                | [nodemon] watching: config/webpack.config.js
16:25:09 webpack.1                | [nodemon] starting `webpack-dev-server --config config/webpack.config.js`
16:25:11 webpack.1                | ℹ ｢wds｣: Project is running at http://localhost:3808/
16:25:11 webpack.1                | ℹ ｢wds｣: webpack output is served from /assets/webpack/
16:25:47 webpack.1                | 150 entries from '/pages' automatically added to webpack output.
16:25:50 webpack.1                | ℹ ｢wdm｣: 
16:25:50 webpack.1                | ℹ ｢wdm｣: Compiled successfully.
```

別のターミナルから以下を実行するとDB作成とシードが実行されます。

```shell-session
gitlab-development-kit> cd gitlab
g/gitlab> rake dev:setup
-- enable_extension("plpgsql")
   -> 0.0206s
-- enable_extension("pg_trgm")
   -> 0.0353s
-- create_table("abuse_reports", {:force=>:cascade})
   -> 0.0112s
-- create_table("appearances", {:force=>:cascade})
   -> 0.0085s
-- create_table("application_setting_terms", {:force=>:cascade})
   -> 0.0072s
-- create_table("application_settings", {:force=>:cascade})
   -> 0.0458s
-- create_table("audit_events", {:force=>:cascade})
   -> 0.0054s
-- add_index("audit_events", ["entity_id", "entity_type"], {:name=>"index_audit_events_on_entity_id_and_entity_type", :using=>:btree})
   -> 0.0085s
-- create_table("award_emoji", {:force=>:cascade})
   -> 0.0077s
...省略...
-- initialize_schema_migrations_table()
   -> 0.0100s
```

**参考**：[開発に役立つrakeコマンド集](https://docs.gitlab.com/ce/development/rake_tasks.html)

再挑戦、今回うまく立ち上がりました。

<img width="1097" alt="Screen Shot 2018-10-11 at 16.37.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/260796/256056f6-2493-e39b-fb40-fa774351f6a6.png">

## 感想

パフォーマンスが良く気持ちよく開発できるとはいえ、自分のマシンに何もインストールしないでコンテナを使いなれている自分としてはあまりキレイではないと思います。
自分のマシンが良いスペックならMinikubeで動かす方が確実だと思いました（MinikubeはMinikubeでの罠もありますが）。