GitLab開発依存ライブラリからthin gemを排除した

GitLab Advent Calendar 2022 25日目。

[thin](https://github.com/macournoyer/thin)という、"A small and fast Ruby web server" gemがある。`tnir` とも少し字面が似ている。

GitLabの開発が始まって1年ちょっとたったタイミングで当時、初代GitLab CTO（のちのFellowであり、1年ほど前からGitLab Inc.から離れている）dzaporozhetsにより開発用に導入されたgemである。

> dzaporozhets committed on Jan 19, 2013 

- https://github.com/gitlabhq/gitlabhq/commit/54a24608a29d113f0c607027cddd8b6947c6a55c

## 何が問題か

GitLab開発用に作られたCLI `gdk` (GitLab Development Kit) というものがあるが、そこのサブコマンドに `thin` というコマンドがあった。ケースによるが一般的にはライブラリの名前に依存したサブコマンドというのは適切ではないだろう。

また、GitLabのproduction (`RAILS_ENV=production`) ではPuma（そして今から数年前まではUnicorn）を使っていたのに、ローカルでは別のWebサーバを使うことになっていたということも環境差異を生み出す要因であった。

Thinが（GitLabの開発以外のシチュエーションにおいて）どの程度使われていたかは定かではないが、 https://rubygems.org/search?query=gitlab
からも分かる通り、GitLabで使われるgemはGitLab本体の開発のCIプロセスを通じて大量のgemダウンロードがなされることで知られており、 https://rubygems.org/gems/thin のダウンロード数が増大することはthinの利用状況統計が大きく上振れさせてしまうことも問題であった。

## どう解決したか

https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89258 とそこからリンクされる内容なので、詳細はリンクを辿っていただきたい。

https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89258/diffs やdiffだけ見れば単純なので、（gdkサブコマンド問題を）すぐに終わると思っていたが、思いの外、いろいろな意見があったのは新鮮であった。記憶に留めておきたい。

```diff
diff --git a/Gemfile b/Gemfile
index 1064c63a5c38bc43ad2ac5835f3682825a28bb60..10db5310ca5185b1fdd7ff6c661367a098488b58 100644
--- a/Gemfile
+++ b/Gemfile
@@ -354,9 +354,6 @@ group :development do
   # Better errors handler
   gem 'better_errors', '~> 2.9.0'
 
-  # thin instead webrick
-  gem 'thin', '~> 1.8.0'
-
   gem 'sprite-factory', '~> 1.7'
 end
 
diff --git a/Gemfile.lock b/Gemfile.lock
index a124621edeb654d941e980b081d8518da0d01ab3..4eeb168ce13842ef4b8c9cd8870b6214098c92e1 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -257,7 +257,6 @@ GEM
       git
     css_parser (1.11.0)
       addressable
-    daemons (1.3.1)
     danger (8.6.1)
       claide (~> 1.0)
       claide-plugins (>= 0.9.2)
@@ -373,7 +372,6 @@ GEM
       tzinfo
     ethon (0.15.0)
       ffi (>= 1.15.0)
-    eventmachine (1.2.7)
     excon (0.90.0)
     execjs (2.8.1)
     expression_parser (0.9.0)
@@ -1348,10 +1346,6 @@ GEM
     test_file_finder (0.1.4)
       faraday (~> 1.0)
     text (1.3.1)
-    thin (1.8.0)
-      daemons (~> 1.0, >= 1.0.9)
-      eventmachine (~> 1.0, >= 1.0.4)
-      rack (>= 1, < 3)
     thor (1.2.1)
     thrift (0.14.0)
     tilt (2.0.10)
@@ -1744,7 +1738,6 @@ DEPENDENCIES
   terser (= 1.0.2)
   test-prof (~> 1.0.7)
   test_file_finder (~> 0.1.3)
-  thin (~> 1.8.0)
   thrift (>= 0.14.0)
   timecop (~> 0.9.1)
   timfel-krb5-auth (~> 0.8)
diff --git a/doc/development/caching.md b/doc/development/caching.md
index 362e4c4cded6326deab3b42cbc581ba42cfaf032..5ae6484436e47d779f5927ed12dfffb6223be103 100644
--- a/doc/development/caching.md
+++ b/doc/development/caching.md
@@ -118,8 +118,8 @@ Is the cache being added "worthy"? This can be hard to measure, but you can cons
     - `tail -f log/development.log | grep "Rendered "`
 - After you're looking in the right place:
   - Remove or comment out sections of code until you find the cause.
-  - Use `binding.pry` to poke about in live requests. This requires a foreground
-    web process like [Thin](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/pry.md).
+  - Use `binding.pry` to poke about in live requests. This requires a
+    [foreground web process](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/pry.md).
 
 #### Verification
 
```

時間もないので、これで終わりにするが、いつか余裕のあるときに改めて理由を振り返ってみたい。

## 何が嬉しいのか

`thin` は `eventmachine` というgemに依存している。 `eventmachine` gemもインストールをするのに手こずりがちなgemであるらしい。この10年で `mysql2`, `nokogiri`, `charlock_holmes` と同じくらい、困ったよレポートを見聞きした気がする。

`eventmachine` というgemからも離れることができたのは非常に嬉しい話である。

## まとめ

10年来の相棒であった、thin gemをGitLab開発から除外し、その副次的な作用として、eventmachine gemをも除外できて、developer experienceが改善された。


## Resources

- Epic: https://gitlab.com/groups/gitlab-org/-/epics/8183
- 本丸Merge Request: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89258
- `gitlab` が作って内部で利用しているgemの累計ダウンロード数情報: https://rubygems.org/search?query=gitlab
- https://github.com/gitlabhq/gitlabhq/commit/54a24608a29d113f0c607027cddd8b6947c6a55c

## お知らせ

本記事は [GitLab Advent Calendar 2022](https://qiita.com/advent-calendar/2022/gitlab) Day 25でした。