kakakakakku blog

Weekly Tech Blog: Keep on Learning!

リモートモブプログラミングで Git Handover をシュッと実現する「mob」コマンド

「モブプログラミング」を採用すると「全員で同じタスクに取り組む (WIP 1)」ため,複雑な Git ブランチ戦略は必要なくなる.例えば master ブランチと develop ブランチだけで運用することもできる.今回紹介する mob コマンドを使うと,モブセッションで繰り返し行なう「ドライバー(タイピスト)交代」をシュッと実現できる.特に「リモートモブプログラミング」だと GitHub に git push をしてドライバーを交代する(Git Handover と言う)ため,mob コマンドを使うと便利!

mob.sh

インストール

mob コマンドは brew コマンドで簡単にインストールできる.そこそこ頻繁にリリースされているため,定期的に brew upgrade をしておくと良さそう.今回の記事を書いてる間にも v0.0.13v0.0.17 にバージョンアップしていた.

$ brew install remotemobprogramming/brew/mob
$ mob version
v0.0.13

$ brew upgrade remotemobprogramming/brew/mob
$ mob version
v0.0.17

なお mob コマンドは GitHub で OSS になっている.Go で実装されている!

github.com

mob : 基本コマンド

基本的に以下の「基本コマンド 3個」を使えば OK!簡単にワークフローを図解した(GitHub は例として).

  • mob start ... 「モブセッション」を開始する
  • mob next ... 次のドライバーに Git Handover をする
  • mob done ... 「モブセッション」を終了する

f:id:kakku22:20200531164129p:plain

1. mob start

「モブセッション」を開始するときに mob start を実行する.Git リポジトリに remote 設定をしておく必要があるため,リポジトリを clone しておく.mob start を実行すると,自動的に mob-session ブランチが作られて git push まで実行される.

(master) $ mob start
 ✓ git fetch --prune
 ✓ git pull --ff-only
 > create mob-session from master
 ✓ git checkout master
 ✓ git merge origin/master --ff-only
 ✓ git branch mob-session
 ✓ git checkout mob-session
 ✓ git push --no-verify --set-upstream origin mob-session
 > you are mob programming

(mob-session) $ 

2. mob next

開発を進めて,ドライバーを交代するときに mob next を実行する.すると,自動的に git addgit commitgit push が実行される.コミットメッセージはデフォルトだと mob next [ci-skip] となる.最後に master ブランチに切り替わる.

(mob-session) $ mob next
 ✓ git add --all
 ✓ git commit --message "mob next [ci-skip]" --no-verify
 ✓ git push --no-verify origin mob-session
 ✓ git checkout master

(master) $ 

3. mob start

ドライバーを交代したら,もう1度 mob start を実行する.すると,自動的に mob-session ブランチに切り替わり,開発を進められる.モブセッションでは,基本的に mob startmob next を繰り返す.

(master) $ mob start 10
 ✓ git fetch --prune
 ✓ git pull --ff-only
 > rejoining mob session
 ✓ git branch -D mob-session
 ✓ git checkout mob-session
 ✓ git branch --set-upstream-to=origin/mob-session mob-session
 ✓ 10 minutes timer started (finishes at approx. 11:00)
 > you are mob programming
xxxxxxx 5 minutes ago <kakakakakku>

(mob-session) $ 

なお mob start 10 のように引数 minutes を指定すると,自動的にタイマーが起動する.指定した時間が経過すると,Mac の場合は AppleScript (osascript) を使って通知されるようになっている.さらに say コマンドを使って mob next と読み上げてくれる.例えば Mobster など,モブプログラミングに特化したタイマーアプリを使うこともできるけど,mob コマンドに同梱されているのは便利だと思う.

f:id:kakku22:20200531170258p:plain

4. mob done

「モブセッション」を終了するときに mob done を実行する.挙動としては mob-session ブランチを git push をして,さらに master ブランチに git merge までしてくれる.最後に 👉 git commit -m 'describe the changes' と表示されている通り,最終的な git commit はドライバーが行なう.個人的に使うなら mob done は使わずにプルリクエストを作る運用にするかなぁー.

(mob-session) $ mob done
 ✓ git fetch origin --prune
 ✓ git add --all
 ✓ git commit --message "mob next [ci-skip]" --no-verify
 ✓ git push --no-verify origin mob-session
 ✓ git checkout master
 ✓ git merge origin/master --ff-only
 ✓ git merge --squash --ff mob-session
 ✓ git branch -D mob-session
 ✓ git push --no-verify origin --delete mob-session
 👉 git commit -m 'describe the changes'
 
 (master) $ git commit -m'Well done 👍'

 (master) $ git push

Tips 1 : 環境変数を使う

mob config を実行すると,mob コマンドの挙動を決めている環境変数の値を確認できる.

$ mob config
MOB_BASE_BRANCH=master
MOB_WIP_BRANCH=mob-session
MOB_REMOTE_NAME=origin
MOB_WIP_COMMIT_MESSAGE=mob next [ci-skip]
MOB_VOICE_COMMAND=say
MOB_NEXT_STAY=false
MOB_START_INCLUDE_UNCOMMITTED_CHANGES=false
MOB_DEBUG=false

export で上書きできるため,例えば MOB_WIP_BRANCH を設定すれば mob-session 以外のブランチ名も使える.MOB_WIP_COMMIT_MESSAGE を設定すれば mob next [ci-skip] 以外のコミットメッセージも使える. direnv などを使って全員同じ環境変数を export できるようにしておくと良さそう.

$ export MOB_WIP_BRANCH=wip
$ export MOB_WIP_COMMIT_MESSAGE=mob next

(master) $ mob start
overriding MOB_WIP_BRANCH=wip
overriding MOB_WIP_COMMIT_MESSAGE=mob
 ✓ git fetch --prune
 ✓ git pull --ff-only
 > create wip from master
 ✓ git checkout master
 ✓ git merge origin/master --ff-only
 ✓ git branch wip
 ✓ git checkout wip
 ✓ git push --no-verify --set-upstream origin wip
 > you are mob programming

(wip) $ 

Tips 2 : Zoom で画面共有をする

mob share もしくは mob start 10 share のように share を付けると,Zoom で画面共有を設定するダイアログを表示できる.

$ mob share
$ mob start 10 share

f:id:kakku22:20200531172248p:plain

なお share を使う場合は Zoom で「画面共有を開始/停止 (Shift + Command + S)」「グローバルショートカット」を有効化しておく.

f:id:kakku22:20200531172445p:plain

とは言え,今回使った mob コマンド v0.0.17share に対応しているけど,次にリリースされる v0.0.18 では mob share は削除されてしまう.そして mob start 10 shareDEPRECATED になり,将来的に削除されてしまう.実際に使う場面はなさそう.詳しくは GitHub の Releases を見てもらえればと!

まとめ

mob コマンドを使うと Git Handover をシュッと実現できる.特に「リモートモブプログラミング」をするときに便利!

関連記事

慣れた開発環境を使うことを優先し,個人的に Git Handover はリモートモブプログラミングじゃなくても使っていた.詳しくは2年前に公開した資料に載せてある.合わせて読んでもらえると良さそう!

kakakakakku.hatenablog.com

f:id:kakku22:20200531172758p:plain