「モブプログラミング」を採用すると「全員で同じタスクに取り組む (WIP 1)」ため,複雑な Git ブランチ戦略は必要なくなる.例えば master
ブランチと develop
ブランチだけで運用することもできる.今回紹介する mob
コマンドを使うと,モブセッションで繰り返し行なう「ドライバー(タイピスト)交代」をシュッと実現できる.特に「リモートモブプログラミング」だと GitHub に git push
をしてドライバーを交代する(Git Handover と言う)ため,mob
コマンドを使うと便利!
インストール
mob
コマンドは brew
コマンドで簡単にインストールできる.そこそこ頻繁にリリースされているため,定期的に brew upgrade
をしておくと良さそう.今回の記事を書いてる間にも v0.0.13
➔ v0.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 で実装されている!
mob
: 基本コマンド
基本的に以下の「基本コマンド 3個」を使えば OK!簡単にワークフローを図解した(GitHub は例として).
mob start
... 「モブセッション」を開始するmob next
... 次のドライバーに Git Handover をするmob done
... 「モブセッション」を終了する
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 add
と git commit
と git 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 start
と mob 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
コマンドに同梱されているのは便利だと思う.
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
なお share
を使う場合は Zoom で「画面共有を開始/停止 (Shift + Command + S)」の「グローバルショートカット」を有効化しておく.
とは言え,今回使った mob
コマンド v0.0.17
は share
に対応しているけど,次にリリースされる v0.0.18
では mob share
は削除されてしまう.そして mob start 10 share
も DEPRECATED になり,将来的に削除されてしまう.実際に使う場面はなさそう.詳しくは GitHub の Releases を見てもらえればと!
まとめ
mob
コマンドを使うと Git Handover をシュッと実現できる.特に「リモートモブプログラミング」をするときに便利!
関連記事
慣れた開発環境を使うことを優先し,個人的に Git Handover はリモートモブプログラミングじゃなくても使っていた.詳しくは2年前に公開した資料に載せてある.合わせて読んでもらえると良さそう!