GitLab Development KitをMac OS Nativeで使う
GitLabはオープンソースで誰でもコントリビュートできます。そのために以下のGitLab Developer Kitが公開されています。
Macユーザにはパフォーマンスの観点からVM上ではなくMac OS直にインストールすることが推奨されています。GitLab CEにコントリビュートする想定でインストール手順と落とし穴をまとめました。
Rubyバージョン
以下のページから必要なRubyバージョンが確認できます。現時点で 2.4.4
となります。
- 2018/11/14時点でRuby
2.5.3
になったことを発覚。
自分は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を起動
後からわかった罠
- PostgreSQLサーバが起動したままですので、まず停止します。
/usr/local/Cellar/postgresql@9.6/9.6.10/bin/pg_ctl -D /Users/jb/Documents/gitlab-development-kit/postgresql/data stop
- 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
再挑戦、今回うまく立ち上がりました。
感想
パフォーマンスが良く気持ちよく開発できるとはいえ、自分のマシンに何もインストールしないでコンテナを使いなれている自分としてはあまりキレイではないと思います。
自分のマシンが良いスペックならMinikubeで動かす方が確実だと思いました(MinikubeはMinikubeでの罠もありますが)。