Ruby
Rails
GitLab

GitLab Development KitをMac OS直で使う

GitLab Development KitをMac OS Nativeで使う

IMG_8556.JPG

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を使っていますのでそれでバージョンをあわせます。

> 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をインストールします。

> 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コマンドが使えるようになりますのでこのコマンドを使って初期化します。

> 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が必須ですので事前にあることを確認し、なければインストールします。

> 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がインストールされていなければなりません。

> 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インストールは罠が多いようです。最終的にはこの手順に基づいてインストールしました。

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をアンインストールし、手動でインストールすることで解決できます。

GDKをインストール

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

> 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

  1. GitLabのnodeパッケージがインストールされていなかったようです。
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作成とシードが実行されます。

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コマンド集

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

Screen Shot 2018-10-11 at 16.37.25.png

感想

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