トランクベース開発を活用して
爆速に開発した話
Shota Sawada
Mar 31st, 2021
1
Shota SAWADA
Profile
* FMSの開発
* 認証認可基盤の開発
GitHub: @sawadashota
Twitter: @xioota
2
トランクベース開発とは
3
GitFlowのおさらい
4
feature、develop、master(main)ブランチと
役割を持ったブランチが複数あり、
基本的には決まった順序でマージしていく
図は「A successful Git branching model」より引用 https://nvie.com/posts/a-successful-git-branching-model/
トランクベース開発とは
小さな作業単位でtrunk(メインブラ
ンチ)にコミットを積んでいく開発手
法。GitFlowとよく比較される。
5
図は「Trunk Based Development」より引用 https://trunkbaseddevelopment.com/
Philosophy
6
Branches create distance between developers and we do not want that
— Frank Compagner, Guerrilla Games
“
”distance”が大きいほど以下の問題が生じやすい。
* 予期せぬ不具合を引き起こす
* 差分が大きくなりすぎてマージが難しい
* 他の開発者と作業内容が被る
特徴
7
* Remoteブランチは基本的にtrunkと呼ばれる1ブランチ
* Release Ready
* No Code Freeze
* featureブランチは可能な限り小さく、生存期間は極端に短い
Practice
8
* ペアプロ (同期レビュー)
* 同期レビューイベント
* trunkに入れたらすぐにレビュー (非同期レビュー)
DO NOT: Pull Requestを作成してApproveされるまで待ってからMerge (非同期レビュー)
Quick Code Review
* 完成していない機能を環境ごとにOn/Offを切り替えるしくみ
Feature Flags
Metrics
9
* アクティブなブランチ数: 3つ以下が望ましい
* Code Freezeの期間: Code Freezeはないほうが望ましい
* trunkにマージする頻度: 1日1回以上
* Approveにかかる時間: ゼロに近いほどよい
https://cloud.google.com/solutions/devops/devops-tech-trunk-based-development/?hl=ja
トランクベース開発を実践するための前提
10
Trunkにコミットが積まれたら
CIなどでRelease Readyであることを
担保しなくてはならない
OSSには不向き
チームメンバーのスキルに差があったり、
教育的にコードレビューを行っている場合も不向き
MergeにApproveが不要
自動でビルド・テスト
ビルドやテストの時間が短い
trunkに入ったコードのレビュー文化・仕組み
細かくコミットを積んでいくため、
CIに時間がかかってしまう場合は不向き
レビューなしにtrunkにコミットを積んだ場合、
Trunkにコミットが入ったあとに
コードレビューをやっていく文化や仕組みが必要
どのように取り入れたか
11
もともとはGitFlow
12
featureをdevelopにマージする前に
レビューを受ける
* developに入ったら開発環境にデプロイ
* releaseに入ったらQA検証環境にデプロイ
* masterに入ったら本番環境にデプロイ
図は「A successful Git branching model」より引用 https://nvie.com/posts/a-successful-git-branching-model/
トランクベース開発を取り入れるモチベーション
13
レビューを待つのも、
依頼が来たときにすぐにレビューするのも負荷
レビューがスタックして自分が相手の仕事を遅延させ
るのも嫌
レビューを待ちたくなかった PRマージの心理的負荷を下げたかった
不具合が起きたときの影響範囲が大きいため、長い
時間かけて大きくなったブランチをマージするのは
精神的に負荷が高い。
また、巨大PRはレビュアーにも負荷が高い。
トランクベース開発とGitFlowのハイブリッド
14
feature
(short lived)
feature
(short lived)
feature
(short lived)
develop
(trunk)
release main
GitFlow
Trunk Based
ポイント
15
* developブランチをtrunkと見なす
* developからmainにかけては従来どおりGitFlowにすることでチーム横断的な仕組みに適用
チームに閉じた部分にのみトランクベース開発を適用
工夫した点
16
レビューなしでマージして、後からレビューする
レビュー忘れを防止するためにPRが作成されたら
自動で InReview ラベルをつけ、
レビューしたらラベルをはずすか、
コメント確認が必要であることをラベルで表現
作業分担前にペアプロでアーキテクチャや
実装スタイルの認識を合わせる
作業分担前にペアプロで認識合わせ
PRにラベルをつけてレビュー忘れ防止
レイヤで作業分担
コンフリクトを気にしせずに開発するために
レイヤで作業分担
Metrics
17
* アクティブなブランチ数: 3つ以下が望ましい
* Code Freezeの期間: Code Freezeはないほうが望ましい
* trunkにマージする頻度: 1日1回以上
* Approveにかかる時間: ゼロに近いほどよい
https://cloud.google.com/solutions/devops/devops-tech-trunk-based-development/?hl=ja
Metrics
18
* アクティブなブランチ数: 3つ以下が望ましい
=> GitFlow部分を含めた全体で見れば x。トランクベース開発を取り入れた部分で言えば ○
* Code Freezeの期間: Code Freezeはないほうが望ましい
=> GitFlow部分はx。トランクベース開発を取り入れた部分で言えば ○。
* trunkにマージする頻度: 1日1回以上
=> 平均 6 PRs/day
* Approveにかかる時間: ゼロに近いほどよい
=> 判断に悩んだ部分は作業分担後もレビュー待ちPRは例外的にあったものの基本ゼロなので ○
https://cloud.google.com/solutions/devops/devops-tech-trunk-based-development/?hl=ja
Good
指摘を受けるうちにscopeが大きくなったり、
レビューを待つと思うと、「ついでにこれもいれちゃ
おう」となってしまうことがなかった。
また、小さい変更量で修正できるコードベースになり
やすいと感じた。
トランクベース開発と言えるのか
ブランチは1つにし、
trunkに入ったら本番リリースするところまでは
できておらず、これをトランクベース開発と
呼べるかは怪しい・・・
小さいPRをレビューを待たずにマージしていくこと
で、待ち時間や作業を止めてレビューするコンテキス
トスイッチ、コンフリクトしないように意識する必要
がなくなり、結果的に開発速度はあがった。(PR数
は3倍、PRあたりの行数は半減)
PRの肥大化が起こらなかった
開発速度があがった(気がする)
19
Bad
© 2021 Tier IV, Inc. 20

トランクベース開発を活用して爆速に開発した話

Editor's Notes

  • #4 トランクベース開発とは、という説明をする前に、トランクベース開発とよく比較されるGitFlowのおさらいからいきます
  • #5 GitFlowはfeature、develop、master(main)ブランチと役割を持ったブランチが複数あり、基本的には決まった順序でマージしていくブランチモデルです Developブランチは開発環境の最新として扱い、開発者はdevelopブランチからfeatureブランチを作成する。 Releaseブランチはproductionリリースの準備をするブランチ master/mainブランチは常にRelease readyなブランチ。mainブランチ = 本番環境としている開発現場も多いのではないでしょうか。
  • #7 根底にある考え方として「ブランチは開発者との距離(distance)を作ってしまう」があります distanceが大きいほど様々な問題を引き起こします。 トランクベース開発ではこのdistanceを最小化することを目指しています。
  • #8 バグが見つかったら修正をtrunkに入れていくので、必然的にcherry-pickがない世界
  • #9 Feature Flags 小さい単位でRelease Readyなコミットを積んでいくためのプラクティスです。 Feature開発は完成してからマージするというスタイルだと、PRが大きくなってしまいます。 Featureが完成していなくても、マージし、本番環境などではFeatureをOffにし、開発時には有効にすることで、Featureが未完成でもtrunkにマージすることできます。
  • #10 Google CloudではApproveにかかる時間は「開発の一環として実行されるコードレビューを同期アクティビティとして行う方法を見つけましょう」と書かれているのですが、マージ前のレビューは必須ではないので、非同期レビューの場合は、レビューを待たずにマージするのでもよいと思います。
  • #11 トランクベース開発はすべての開発現場におすすめできるわけではありません。 同期的なレビューかApproveなしにマージするので、OSSには不向きです。 また、メンバー間にスキル差があったり、コードレビューを教育的な観点で行っている場合も不向きです。
  • #12 だいぶ癖の強いブランチモデル・開発プロセスになるので、特に現在GitFlowで開発されているチームは「よし、明日からトランクベース開発をやってみよう」と言って、このやり方をそのまま実践していくのは難しいと思います。 実際、私たちもそうでした。 では、次にどのようにトランクベース開発を取り入れていったのかをお話します。
  • #13 もともとはAuthチームも他のチーム同様にGitFlowで開発していました。 リリースフローや各チームで使っているCloudFormationのテンプレートなどGitFlowを前提としたものになっています。
  • #14 チームメンバーが他のチームと兼任していたりするので、他のチームで活動しているときに「このPRレビューしてくれないと先に進めない」みたいな状況になるのも回避したかった
  • #16 認証認可基盤はすべてサービスに使われているため、壊すとすべてのサービスが動かなくなってしまうため、開発環境といえど壊してはいけないという心理が働く ゆえに、Authチーム的にはdevelopはもともとRelease Readyのコードだったので、相性はよかったと思っている