ck_fm0211のブログ

書きたいことを書く。

初めてOSSにプルリクエストを出した

OSSにプルリクエストを出したのでそのやり方とか感想とか。
なお出したプルリクエストはこれ。

経緯

業務でS3からBigQueryへ入れる方法を模索していた。
その際に embulk-output-bigquery プラグインを見つけ、使おうかなと思って検証したところ、ジョブの実行プロジェクトとデータロード先のプロジェクトが一致していないと使えないということが判明。
自分のいる環境ではジョブ実行プロジェクトとデータロード先プロジェクトを分けているため、このままでは使えなかった。

結局、業務では別の方式を取ることになったのだけど、プラグインのどこを直せばいいかとかなんとなく見えてたのもあり、せっかくだからとプルリクエストを出してみることにした。

準備

とりあえず「OSS プルリクエスト」とかでググってやり方を調べた。

CONTRIBUTING.mdがあればそれに従えとのことだったが、このリポジトリにはそれがなかった。
なのでとりあえず

  1. Issueを作る
  2. forkしてローカルで開発・テスト
  3. プルリクエストを出す

の流れでやることにした。

Issueを作る

過去のIssueを見ると(当然?)英語で書いてあるのでDeepLを駆使してIssueを作成した。

やりたかったのは実行プロジェクトとデータロード先のプロジェクトをわけること。
「実行プロジェクト」って英語でなんて言えばええんや?と迷い billing project と呼ぶことにした。
これは後に微妙に失敗だったと気づいた。

forkしてローカルで開発・テスト

自分のアカウントにリポジトリをforkしてコードを書き直した。
Rubyは業務でほぼ使ってないし、昔Railsの本を1周したくらいの知識しかないので地味に苦労した。
直すところは明確だったが、環境の作り方とかテストの動かし方で四苦八苦した。
テスト方法はREADME.mdに書いてあったのでそのとおりに進めたのだけど、途中で依存関係のエラーにハマったりと時間がかかった。

テストコードの中身もパッと見でなにやってるかよくわからなかったので、

  1. コード直す
  2. テストコード全部動かす
  3. 落ちたところ見てコード直す
  4. 2-3を繰り返してテストの流れを把握する
  5. 追加したコードに合わせたテストを追記する

の流れで対応した。

ここで一番ハマったのは、どう考えても今回直したものと関係ないところで落ちてるテストがあったこと。
なんだなんだとこねくり回した挙げ句、もしやと思いmasterブランチでテストを実行したところ、何も変えてないのに落ちた。始めからテスト通ってなかった。
なんでやねんと思いつつ、そこは諦めてそれ以外でテストが通ることを確認してプルリクエストを出した。

プルリクエストを出す

ここでもDeepLを頼りに英語を書いた。
今回プルリクエストを出したリポジトリtravisでCIが組まれていたのでその様子を見守る。
どうも前述の依存関係でコケたようなので追加でcommitしておいた。

感想

意外と簡単だった。
OSS活動(とこれを呼んでいいかはわからんけど)は高尚な活動だから自分なんかが手を出してはいけない、という思いがあったりもしたけど、やってみると意外と簡単なもんだなという感想。
今後も機を見てチャレンジしてもいいなと思った。

ただ、今回プルリクエストを出したリポジトリは長期間動いてなさそうなので、マージされることはないかもしれない。

2021-06-28追記 version 0.6.6にマージされた!うれしい。

Appendix: 依存関係の解消

テスト実行をしたとき、以下のようなエラーが出た。

*******************************************************************************************
Running Embulk version (0.9.23) does not match the installed embulk.gem version (0.10.26).

If you use Embulk v0.9.* without Bundler:
   Uninstall embulk.gem from your Gem path.
   An embulk.gem-equivalent should be embedded in your Embulk's core JAR of v0.9.*.

If you use Embulk v0.9.* with Bundler:
   Try updating your Gemfile as below:
     gem 'embulk', '< 0.10'
   Bundler will find the embulk.gem-equivalent embedded in your Embulk's core JAR of v0.9.*.

If you use Embulk v0.10.*:
   Be aware that v0.10.* is an unstable development series. If you are aware of that,
   upgrade it to the latest v0.10.*, and use exactly the same version of embulk.gem.
   In case you use Bundler, your Gemfile should have 'embulk' as below:
     gem 'embulk', '0.10.XX'  # Exactly the same version of your Embulk's core JAR.

If you use Embulk v0.8.* or earlier:
   Update to the latest v0.9.*. v0.8 or earlier are deprecated.
*******************************************************************************************

なんじゃこりゃあという気持ちだったが、落ち着いてググってみると単なる依存関係の問題だった。
Gemfileを以下のように書き換えることで対応ができた。

- gem 'embulk'
+ gem 'embulk', '< 0.10'