GitLab CEをWindows Subsystem for Linuxで開発したかった

Ruby on Railsの開発をする上で[GitLab](https://about.gitlab.com/)の中身がどうなっているのか色々気になったので、開発環境を構築してみることにしました。

## 環境

- Windows 10 Pro Insider Preview 10.0.17074

## GitLab Development Kit構築

予めGitLab.comで[GitLab Community Edition](https://gitlab.com/gitlab-org/gitlab-ce)をforkしておきます。
[GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit)を使って、このforkしたリポジトリを動かします。

公式ドキュメントの[prepare.md](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/prepare.md#experimental-windows-10-using-the-wsl-windows-subsystem-for-linux)と[set\-up\-gdk\.md](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/set-up-gdk.md)を読めばだいたい分かりますが、細かい所を今回の環境にあわせて変えていきます。

### Rubyのインストール

ドキュメントでは[RVM: Ruby Version Manager](https://rvm.io/)を使っていますが、ここでは[rbenv](https://github.com/rbenv/rbenv)を使って環境構築をします。
またapt-getで降ってくる[rbenv/ruby\-build](https://github.com/rbenv/ruby-build)は古いので、git cloneして使うことでRuby 2.3.6が使えるようになります。

```
$ sudo apt-get update
$ sudo apt-get install rbenv
$ mkdir -p "$(rbenv root)"/plugins
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
$ rbenv install 2.3.6
$ rbenv local 2.3.6
```

### Node.jsのインストール

[tj/n: Node version management](https://github.com/tj/n)を使って最新版をインストールします。

```
$ sudo apt-get install nodejs
$ npm install -g n
$ n latest
```

### Go言語のインストール

こちらもapt-getで降ってくるバージョンは古いので、[最新のバージョンを入れます](https://github.com/golang/go/wiki/Ubuntu)。

```
$ sudo add-apt-repository ppa:gophers/archive
$ sudo apt-get install golang-1.9-go
$ echo 'export PATH=$PATH:/usr/lib/go-1.9/bin' >> ~/.bash_profile
$ source ~/.bash_profile
```


### 他のパッケージ

[Yarnをインストール](https://yarnpkg.com/lang/ja/docs/install/#windows)します。

```
$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$ sudo apt-get update && sudo apt-get install yarn
```

あとは[Experimental Windows 10 using the WSL (Windows Subsystem for Linux)](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/prepare.md#experimental-windows-10-using-the-wsl-windows-subsystem-for-linux)にあるパッケージを`apt-get`で引っ張ってきます。

```
$ sudo apt-get install ruby-dev
$ sudo apt-get install git postgresql postgresql-contrib libpq-dev redis-server libicu-dev cmake g++ libkrb5-dev libre2-dev ed pkg-config
```

### PostgreSQLの起動

postgresユーザを作成して、接続できるようにします。

```
$ sudo service postgresql start
$ sudo passwd postgres
$ su - postgres
$ psql
postgres=# alter role postgres with password 'superstrongpassword';
```

接続できるか確認します。
```
$ psql -h localhost -U postgres
```

接続できたら、database.ymlも設定変更します。

```yml:gitlab/config/database.yml
development:
  adapter: postgresql
  encoding: unicode
  database: gitlabhq_development
  host: localhost
  username: postgres
  password: superstrongpassword
  port: 5432
  pool: 6
```

### redisの起動

Unixドメインソケット経由で接続できるよう設定する必要があります。
が、Windows側とWSL側をまたぐせいなのかうまく行かず、下記の変更をする必要がありました。

/etc/redis/redis.confに以下の設定を記述します。

```/etc/redis/redis.conf
unixsocket /var/run/redis/redis.sock
unixsocketperm 777
```

redisを再起動します。

```
$ sudo service redis-server restart
```

このsocketファイルを読み込むために、とりあえずlib/gdk.rbを下記のように変更します。

```diff:lib/gdk.rb
diff --git a/lib/gdk.rb b/lib/gdk.rb
index 9e67d19..d9c159b 100644
--- a/lib/gdk.rb
+++ b/lib/gdk.rb
@@ -69,7 +69,7 @@ module GDK
     when 'psql'
       exec('psql', '-h', File.join($gdk_root, 'postgresql'), '-p', pg_port.to_s, *ARGV, chdir: $gdk_root)
     when 'redis-cli'
-      exec('redis-cli', '-s', File.join($gdk_root, 'redis/redis.socket'), *ARGV, chdir: $gdk_root)
+      exec('redis-cli', '-s', '/var/run/redis/redis.sock', *ARGV, chdir: $gdk_root)
     when 'help'
       puts File.read(File.join($gdk_root, 'HELP'))
       true
```

また、後のコマンドで生成されるredis.conf, resque.ymlも、こちらのパスに書き換える必要があります。

```gitlab/config/resque.yml
development: unix:/var/run/redis/redis.sock
test: unix:/var/run/redis/redis.sock
```

```redis/redis.conf
port 0
unixsocket /var/run/redis/redis.sock
```

```toml:gitlab-workhorse/config.toml
[redis]
URL = "unix:///var/run/redis/redis.sock"
```

設定がうまく行っているかどうかは`$ gdk redis-cli`で接続検証ができます。

```
$ gdk redis-cli
> ping
PONG
```

### GitLab CE 構築

```
$ gem install gitlab-development-kit
$ gdk init
$ cd gitlab-development-kit
$ gdk install gitlab_repo={{forkしたリポジトリのURL}
```

`$ gdk install` にて、おなじみ`git clone`や`yarn install`、`bundle install`などが走ります。
これがとても長く、たまに途中で失敗します。エラーに再現性は無く、めげずに何回かやると成功しました。

なお本当はbundlerを使って以下のように構築したかったのですが、`gdk install`がうまく行きませんでした。gdk内でもbundlerを使っているためpathの解決とかそのあたりが難しいんだと思いますが、詳しくは調べていません。

```
$ bundle init
$ echo 'gem "gitlab-development-kit"' >> Gemfile
$ bundle install --path vendor/bundle
$ bundle exec gdk init
$ cd gitlab-development-kit
$ bundle exec gdk install gitlab_repo={{forkしたリポジトリのURL}
```

### 設定ファイル変更

gitlab.socketファイルをWSL側に作成するようにします。redisの時と同様です。

```
$ sudo mkdir /var/run/gitlab/
$ sudo chmod 777 /var/run/gitlab/
```

```ruby:gitlab/lib/support/init.d/gitlab
rails_socket="/var/run/gitlab/gitlab.socket"
```

```ruby:gitlab/config/unicorn.rb
listen '/var/run/gitlab/gitlab.socket'
```

### 起動

これでインストールは完了しました。

```
$ gdk run
```

上記コマンドでforemanによるサーバは起動はするのですが、まだ http://localhost:3000 にアクセスしても画面は映りませんでした...

## 参考

- [Findings about the WSL \(\#223\) · Issues · GitLab\.org / GitLab Development Kit · GitLab](https://gitlab.com/gitlab-org/gitlab-development-kit/issues/223)
- [Rails server doesn't boot up due to getsockopt\(2\) error · Issue \#1982 · Microsoft/WSL](https://github.com/Microsoft/WSL/issues/1982)
- [GitLab Development Kit で OSS開発 に参加する for MAC 2017 \- Qiita](https://qiita.com/ogomr/items/cc404bf9373408663b11)