最近以下の自分のtweetきっかけで大炎上発生などがありましたが
🤔https://t.co/PVGVv3RY5o
— Kenji Yoshida (@xuwei_k) April 28, 2019
"remove Scala-CoC-incompatible projects"
https://contributors.scala-lang.org/t/coc-compatible-community-builds/3097
それはおいておくとして(えっ)、その流れでtweetした以下
それ( https://t.co/8B35y81DST )言うなら、中の人以外でここまで( https://t.co/QbEEVSzQ95 )やってる人見たことないし(z以外のライブラリ全てに対してやってる)、Scalazが過去実際何度もScala自体のbug発見に役立ったことを知っているし、なんならその理由があるから
— Kenji Yoshida (@xuwei_k) April 29, 2019
などで普段やっていることを、具体的に書いておくかなぁ、という気分になったので書いておきます。 やり方さえわかれば、場合によっては面倒なだけで難しくはない?というパターンも多々あるので、他の人も貢献したかったらやってみましょう。
そもそもcommunity buildが何かを説明しないといけないですが、最新のScalaのSNAPSHOTで、色々な主要なライブラリをビルドしてみて
- Scala本体のバグを見つける
- バグじゃなくてライブラリ側に対応が必要なら、それをはやく知ることができる
みたいな役割でしょうか。
さらにJDK8とJDK11の両方のビルドがあったりします。詳細はJenkinsのjob一覧見てみてください。(ログインしなくても参照はほぼできる)
それらの目的に関しては、そもそも毎回マイルストーンやRCをリリースしているので、ライブラリ側がマイルストーンやRCでビルドしてくれれば、そのタイミングでもわかりますが、そのタイミングよりもっとイテレーション短く、はやくわかるようにする、ということです。
さて、そもそもJenkinsみて頑張る以前にマイルストーンやRCでひたすらビルドすれば良いわけで、それはそれで重要なんですが、そちらの手順の説明は飛ばすとして、今回は表題のことについて説明します。
必要な情報として
- Scala 2.13.xのcommunity buildのJenkins job https://scala-ci.typesafe.com/job/scala-2.13.x-integrate-community-build/
- community buildの設定ファイル(これ書いてる現在、2.12用と2.13用が主要にメンテされているやつ) https://github.com/scala/community-builds/
の2つを見ます。
流れを説明すると
- Jenkinsの最新のログ見て、失敗しているライブラリを探す
- なぜ失敗してるのか考える(コンパイラのバグ?Scala側の仕様変更にライブラリが追従する必要がある?依存ライブラリに破壊的変更があった?ライブラリ側はすでに修正済みだがcommunity buildが古いコミットを参照したまま、など)
- ライブラリ側に変更が必要なら、(すでに重複したpull reqが出ていないか、関連issueが存在してないか確認してから) pull reqする
みたいな感じでしょうか。各手順での詳細な方法やポイントを説明すると
- Jenkinsのビルドのログは、超長いので、一旦ローカルにダウンロードするのを推奨
- ダウンロードは、htmlじゃなくtextでやる。その場合のURLは https://scala-ci.typesafe.com/job/scala-2.13.x-integrate-community-build/lastBuild/consoleText
- Jenkinsのビルドは数時間?かかり、上記だと最後のjobが実行中の場合に、中途半端な未完了のログが取れてしまうので、その場合適当に https://scala-ci.typesafe.com/job/scala-2.13.x-integrate-community-build から、最後の完了した実行を探しつつ https://scala-ci.typesafe.com/job/scala-2.13.x-integrate-community-build/ビルド番号/consoleText からダウンロード
- 最後の方に、失敗したやつと、成功したライブラリの一覧が出てる。今のところ ": FAILED" でgrepすると、失敗したやつ一覧取れる
- どのライブラリ見てみるか考える(ここはだいたい適当に選ぶ)
- ログを "プロジェクト名] [error" でgrepする( [ や ] はエスケープ必要なので注意)
- どこがエラーになってるか、上記で基本的にはわかるはず
- エラーの原因探るというか考えるのは、ちょっと難しいし、色んなパターンがあるので、ここの説明は省略
という感じです。
最初に自分がこういうことやりだしたのがいつからか?はよく覚えてないですが、少なくとも1年以上前からやってる気はするし、これによって気づいて修正pull req出したパターンは、数十回〜百回近くになるかもしれません(記録していたわけではないので、だいぶ適当な記憶にもとづいて言ってますが)
以前、以下のエントリの中でも書きましたが
これはこれで、慣れるまでは謎のスキルが必要ですが、基本的にコンパイラ内部の深い知識が必要になったりはしないので、そういう意味ではハードルが低い可能性がある?というか、Scala言語自体に対する貢献方法は、このように色々あるので、みんなで少しづつ貢献してどんどんScala言語自体がよくなっていくようにしたいですね、というちょっと無理やり平和的な感じで締めくくっておきます。
ゴールデンウイークも、子どもが風邪気味だったりしたので、わりとこれ含めOSS活動して過ごしたりしています。