Tak's Notebook

Kaggle, Machine Learning, Engineering

リモートモブプロのための mob コマンドに送った機能追加の Pull Request がリリースされた

概要

リモートモブプロ用ツール mob に送った PR がマージされ、無事リリースされたので、それについて書く。

mob コマンドとは

オンサイトでのモブプログラミングでは同じ端末を共有してタイピストを交代しながら開発を行うが、これをリモートでする際には git ブランチをスムーズに受け渡しながらタイピストを交代する必要がある。そのためのツールが mob コマンドである。

GitHub - remotemobprogramming/mob: Tool for smooth git handover.

リリースされるまで

Issue を立てる

mob コマンドでは mob start でモブのための一時的なブランチを作成し、リモートにプッシュする。

しかし、コードレポジトリでプッシュ起動によって CI が実行される設定の場合、新たにモブブランチを作成するたびに CI が走ってしまう(作業途中にコミットを行う mob next ではデフォルトでコミットメッセージが mob next [ci-skip] [ci skip] [skip ci] になるので問題ない)。

そこで mob start でリモートにモブブランチが新規作成される時に [ci-skip] をコミットメッセージに含んだ空コミットをすることで CI を動作させないようにする実装を提案した。

github.com

実装する

Issue で一通り実装の方針をディスカッションし(時差の問題で1日1メッセージずつのやりとりだった)、方針が固まった後に実装を開始した。この Issue でのディスカッションを通して、メンテナからレポジトリの管理方針が共有されたり、自分の想定してなかった影響範囲に対するコメントを貰ったりできて、実装に入る前に議論することの重要性を改めて感じた。

ちなみに mob コマンドは Golang で書かれていて、その中で必要な git コマンドを叩いているのだが、モブブランチでの作業を終了し、ベースブランチに変更内容を反映する際のあるオプションの実装方法が興味深かった。

mob done --squash-wip というコマンドでは mob next で生成されたコミットは squash し、それ以外の手動で行われたコミットは squash せずにそのまま利用するという挙動なのだが、この実装方法が git rebase -i で立ち上がる環境変数 GIT_EDITOR を書き換えることで、特定のコミットを squash するという離れ業だった。このへんはだいぶ特殊なやり方のように思えたが、こういう方法あるんだと勉強になった。

setEnvGitEditor(
    mobExecutable()+" squash-wip --git-editor",
    mobExecutable()+" squash-wip --git-sequence-editor",
)
say.Info("rewriting history of '" + currentWipBranch.String() + "': squashing wip commits while keeping manual commits.")
git("rebase", "--interactive", "--keep-empty", mergeBase)
case "sw", "squash-wip":
    if len(parameter) > 1 && parameter[0] == "--git-editor" {
        squashWipGitEditor(parameter[1], configuration)
    } else if len(parameter) > 1 && parameter[0] == "--git-sequence-editor" {
        squashWipGitSequenceEditor(parameter[1], configuration)
    }

レビューを受ける

Issue で大方実装の方針が決まっていたので Pull Request でのレビューはあまり紛糾することはなかった。

ただ、Issue でのやり取りが長くて当初合意していたことを失念し、テストの修正が面倒だったこともあって自分の実装をオプトインのオプションを付けたら、誰もモブセッションで CI を走らせたくないし、不要なコード増えるからやめろとちゃんと指摘された。

github.com

マージ、そしてリリースされる

Pull Request でのレビューは早々に終わり、 依頼されたので拙い英語で CHANGELOG も書いた。

マージされた翌日にはリリースされた。

github.com

感想

自チームでも使用している、スターが 1 万超えの OSSリポジトリに PR がマージされ、リリースされる経験が初めてで嬉しかったので記事として残すことにした。

メンテナがおそらくヨーロッパ地域に在住している方のためか、朝に自分がコメント → 深夜にメンテナがコメントをするという、まるで文通のような Issue のやり取りは少し歯がゆかった記憶がある。

それでも、ディスカッションやレビューを通して、そのリポジトリやメンテナの思想に触れることが、自分自身の勉強にもなって、なかなか楽しい期間だった。