GitBucket 便利ですよね。手軽に動かせるので Docker 版を使ってみています。
それで、Web ブラウザでアクセスした時にファイル編集をすることができることに気がついて使ってみました。
基本的に git clone してからリポジトリのファイルは編集するのですが、README.md ファイルのタイポ程度なら直接リポジトリにあるファイルを編集したくなる時もあるだろうと思って試してみました。
このとき、ファイルへ「日本語」という文字列を追加したところ、「???」という文字列が追加されてしまいました。
ちなみに、英語しか書かれていないファイルへの日本語文字追加は問題が起きて、すでに日本語データを含むファイルへ日本語文字追加をすると問題が起きません。
2022-08-22 追記ここから
「Set UTF-8 as the default commit charset at the online text editor by takezoe · Pull Request #3112 · gitbucket/gitbucket · GitHub」 で修正していただけたようです。手元ではまだ確認していませんが、ありがたいことです。
記事は、記録のため、そのまま残しておきます。
2022-08-22 追記ここまで
使っている Docker Engine – Community は Linux am64 版です。
$ docker version Client: Docker Engine - Community Cloud integration: v1.0.25 Version: 20.10.17 API version: 1.41 Go version: go1.17.11 Git commit: 100c701 Built: Mon Jun 6 23:02:57 2022 OS/Arch: linux/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.17 API version: 1.41 (minimum version 1.12) Go version: go1.17.11 Git commit: a89b842 Built: Mon Jun 6 23:01:03 2022 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.7 GitCommit: 0197261a30bf81f1ee8e6a4dd2dea0ef95d67ccb runc: Version: 1.1.3 GitCommit: v1.1.3-0-g6724737 docker-init: Version: 0.19.0 GitCommit: de40ad0
最初、「Docker 内の Linux 環境が日本語ではないからかなぁ」と思って locale で ja_JP.utf8 となるようにした Docker を用意してみましたが改善しませんでした。この locale の値は ja_JP.UTF-8 とか ja_JP.UTF8 とか、いろいろありそうなのですが、下記で作成した Docker イメージから作る Docker コンテナで locale コマンドを実行すると ja_JP.utf8 と表示されるのですよね… あまり深追いしてませんが、locale コマンド実行時に、そう表示するみたいです。手元で使っている Ubuntu 20.04 だと ja_JP.UTF-8 と表示されるので、どこで違いが出ているのかは気になっています。
RUN apt-get update \ && apt-get install -y locales \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && sed -i -E 's/# (ja_JP.UTF-8)/\1/' /etc/locale.gen \ && locale-gen \ && ln -s /gitbucket /root/.gitbucket
それで、調べていたら、setting default Url Encoding broken in Jetty >= 9.3 · Issue #804 · eclipse/jetty.project · GitHub という問題があることを見つけました。
これが原因なら Tomcat 経由にすると改善するかもしれないと思って tomcat:8.5.81-jdk8-openjdk-buster の Docker イメージをカスタムビルドして locale で ja_JP.utf8 となるようにしたもので GitBucket を動かしてみました。残念ながら、変わりませんでした。GitBucket は Tomcat 経由でも内部的に Jetty を使っているのですかね…
次は GitBucket のソースをダウンロードして sbtscala/scala-sbt:8u332_1.7.1_3.1.3 の Docker イメージでビルドと動作確認をしてみました。なぜかレスポンスの HTML に lang=en がつくので、そこだけ修正したらどうなるか見てみようと思ってやってみました。本質的にはリクエストボディが ja_JP.UTF-8 になっていないからだと思うので、これを直しただけでは改善しないはずだと予想していたのですが、やっぱり改善しませんでした。
ということで、GitBucket 内の Jetty 用設定ファイルを変更することで、対応できないか、と色々と調べていたのですが、scala-sbt の Docker コンテナが重たくなってしまってきびしかったので、一度、別の方法を模索することにしました。
それで、ふと、H2 DB の中身はどうなっているのだろうと思いつきました。文字化けは HTTP 通信で起きている場合と、その先の DB との通信で起きている場合があります。問題が起きているのは Git リポジトリにあるファイル編集時なので、DB は直接は関係ありませんが、そちらはどうなるのか確認してみることは意味がありそうです。
それで、プロジェクトのエクスポートをしてみたのですが、イシューを登録していないと日本語が入りません。ということで、イシューへ日本語を入力してみたところ、なんということでしょう、こちらはきちんと日本語が正しく反映されるではありませんか。エクスポートをした結果の SQL ファイルも確認したところ、正しく日本語データが UTF-8 で記録されています。これは、つまり、Jetty は関係ないということなんでしょうか…
いまひとつ理解できないところもありますが、ここで、もうひとつ Jetty のバージョンが関係しているなら、Jetty の古いバージョンを使っている GitBucket ならどうなのだろうかと思って試してみました。gitbucket/gitbucket:4.35.3 と gitbucket/gitbucket:4.36.1 は大丈夫で、gitbucket/gitbucket:4.37.2 だけ問題が再現しました。一応、Chrome のシークレットウィンドウを、その都度新しく開き直して使ってみています。このあたりの動作確認、最近は色々なところでキャッシュがされたりして、気にしないといけないことが多くて大変です…
ちなみに使っている docker-compose.yml は次の内容で、image だけ変更して起動して、root でログイン後、sample リポジトリを README.md ありで作成して、README.md へ「日本語」を追加してコミットするというのを、起動する度にしています。
version: '3' services: gitbucket: image: gitbucket/gitbucket:4.37.2 #image: gitbucket/gitbucket:4.36.1 #image: gitbucket/gitbucket:4.35.3 ports: - 8080:8080 - 29418:29418 tty: true
ということで、Jetty も影響しているのかもしれませんが、Git リポジトリ操作時に何か問題があるのかもしれません。
ちなみに、file.encoding=UTF-8 も指定してみましたが改善しませんでした。
java -Dfile.encoding=UTF-8 -jar ~/Downloads/gitbucket_4.37.2.war
不思議ですね…