Subversionコミットメールの文字化けに対処した

svnのコミットログをrubyで取得してメールで通知する、という処理をJenkinsで稼働させていたのだが、ある時から急に文字化けするようになってしまい、その対応に追われたので覚え書。

動作環境は下記の通り。

症状は下記の通り。

  • 日本語のファイル名、コミットログが全て"?"になってしまう。

障害発生のきっかけらしき事象としては、Java7 SDKを更新したことなのだけど、直接的な因果関係が良く分からない。環境変数など、何かの設定がインストールのタイミングで書き換わってしまったようだ。「○★☓△※」のようにデタラメな文字が出力されると文字コードの変換に失敗していると分かるけど、今回は一律に全て"?"という文字が出てくるので、そのような変換以前の問題だと見当をつけて調査を開始した。

  • Jetty起動時のオプションでUTF-8を指定しており、変更無し。
  • 同じJenkinsで稼働させている他の類似ジョブ(Rubyで日本語を扱うもの)は正常で、文字化けが発生しない。
  • Jettyを使わずJenkinsを単体で稼働させている他のマシンへ、同ジョブをコピーして持って行くと文字化けが発生しない。
  • Jenkinsではなく、コンソールから直接Rubyスクリプトを呼び出すと文字化けが発生しない。
  • 下記の情報を見つけたので、ジョブ実行時に環境変数をしたが、効果なし

大抵の場合は環境変数 LC_CTYPE= の設定で対応できます。

オデの日記@WEB系: svnでどんなに頑張っても"can't convert string from 'utf-8' to native encoding"エラーが治らない
  • Rubyスクリプト呼び出し時に、外部エンコーディングを指定したが、効果なし。
  • Rubyスクリプト内で強制的に文字コードを変換してみたが効果なし。
  • コンソールでsvnコマンドを直接叩くと文字化け無し。
  • svnコマンドの実行結果をRubyで直接受け取るのではなく、一旦ファイルに書き出したところ、この時点で既に文字化けしていると判明。

どうやらJavaRubyの問題ではなく、svnコマンドの設定に原因があるらしいと分かって来た。更に調べると、下記の環境変数の設定が、テキストの文字コード変換に絡んでいるらしいと分かった。

文字化けする場合
環境変数 APR_ICONV_PATH の設定が正しいディレクトリを指しているか確認してください。

http://www.asahi-net.or.jp/~iu9m-tcym/svndoc/svn_i18n_vc6.html

Jenkinsのジョブに環境変数APR_ICONV_PATHを設定してみたところ、問題は無事に解決。文字化け無しのコミットログがメールで届くようになった。なお、今まで環境変数の設定が無い状態でも問題なく動作していた理由や、問題の発端となったJavaの更新との因果関係は不明。類似環境を他のPCに構築してみたものの、文字化けの症状は発生せず、このマシン特有の問題だったのかも知れない。