SlideShare une entreprise Scribd logo
1  sur  20
トランクベース開発を活用して
爆速に開発した話
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

Contenu connexe

Tendances

Tendances (20)

Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容
 
ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。
 
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
 
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 

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

[TL08] 50 分で Bot 開発者になれる!~実践的ノウハウと、 Azure や Office 365 を組み合わせたアーキテクチャの伝授~
[TL08] 50 分で Bot 開発者になれる!~実践的ノウハウと、 Azure や Office 365 を組み合わせたアーキテクチャの伝授~[TL08] 50 分で Bot 開発者になれる!~実践的ノウハウと、 Azure や Office 365 を組み合わせたアーキテクチャの伝授~
[TL08] 50 分で Bot 開発者になれる!~実践的ノウハウと、 Azure や Office 365 を組み合わせたアーキテクチャの伝授~
de:code 2017
 
XPages開発におけるGit/GitHubの利用
XPages開発におけるGit/GitHubの利用XPages開発におけるGit/GitHubの利用
XPages開発におけるGit/GitHubの利用
賢次 海老原
 

Similaire à トランクベース開発を活用して爆速に開発した話 (20)

Git Flowを運用するために
Git Flowを運用するためにGit Flowを運用するために
Git Flowを運用するために
 
新人Git/Github研修公開用スライド(その2)
新人Git/Github研修公開用スライド(その2)新人Git/Github研修公開用スライド(その2)
新人Git/Github研修公開用スライド(その2)
 
Visual Studio App CenterでGitHubのIssue発行を自動化しよう
Visual Studio App CenterでGitHubのIssue発行を自動化しようVisual Studio App CenterでGitHubのIssue発行を自動化しよう
Visual Studio App CenterでGitHubのIssue発行を自動化しよう
 
Visual Studio App Centerで始めるCI/CD(iOS)
Visual Studio App Centerで始めるCI/CD(iOS)Visual Studio App Centerで始めるCI/CD(iOS)
Visual Studio App Centerで始めるCI/CD(iOS)
 
Gitの使い方
Gitの使い方Gitの使い方
Gitの使い方
 
Bot Framework v4 開発 Tips 2018-11
Bot Framework v4  開発 Tips 2018-11Bot Framework v4  開発 Tips 2018-11
Bot Framework v4 開発 Tips 2018-11
 
Visual Studio App CenterでGitHubのPull Requestを効率よく対応しよう
Visual Studio App CenterでGitHubのPull Requestを効率よく対応しようVisual Studio App CenterでGitHubのPull Requestを効率よく対応しよう
Visual Studio App CenterでGitHubのPull Requestを効率よく対応しよう
 
Git道場を開催してきた
Git道場を開催してきたGit道場を開催してきた
Git道場を開催してきた
 
Build insider offline session チームでのgit
Build insider offline session チームでのgitBuild insider offline session チームでのgit
Build insider offline session チームでのgit
 
Azure PipelinesをサーバサイドのCI/CDに活用
Azure PipelinesをサーバサイドのCI/CDに活用Azure PipelinesをサーバサイドのCI/CDに活用
Azure PipelinesをサーバサイドのCI/CDに活用
 
日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む
日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む
日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む
 
[TL08] 50 分で Bot 開発者になれる!~実践的ノウハウと、 Azure や Office 365 を組み合わせたアーキテクチャの伝授~
[TL08] 50 分で Bot 開発者になれる!~実践的ノウハウと、 Azure や Office 365 を組み合わせたアーキテクチャの伝授~[TL08] 50 分で Bot 開発者になれる!~実践的ノウハウと、 Azure や Office 365 を組み合わせたアーキテクチャの伝授~
[TL08] 50 分で Bot 開発者になれる!~実践的ノウハウと、 Azure や Office 365 を組み合わせたアーキテクチャの伝授~
 
GitHub ActionsでiOSのCIを実現しよう
GitHub ActionsでiOSのCIを実現しようGitHub ActionsでiOSのCIを実現しよう
GitHub ActionsでiOSのCIを実現しよう
 
XPages開発におけるGit/GitHubの利用
XPages開発におけるGit/GitHubの利用XPages開発におけるGit/GitHubの利用
XPages開発におけるGit/GitHubの利用
 
Visual Studio App Centerで始めるCI/CD(Android)
Visual Studio App Centerで始めるCI/CD(Android)Visual Studio App Centerで始めるCI/CD(Android)
Visual Studio App Centerで始めるCI/CD(Android)
 
Metahub for github
Metahub for githubMetahub for github
Metahub for github
 
[TL12] "炎上案件ストッパー"はかく語りき 「プロジェクトの成果をあげるために意識した一つの事」
[TL12] "炎上案件ストッパー"はかく語りき 「プロジェクトの成果をあげるために意識した一つの事」[TL12] "炎上案件ストッパー"はかく語りき 「プロジェクトの成果をあげるために意識した一つの事」
[TL12] "炎上案件ストッパー"はかく語りき 「プロジェクトの成果をあげるために意識した一つの事」
 
de:code 2017 [TL12] "炎上案件ストッパー"はかく語りき 「プロジェクトの成果をあげるために意識した一つの事」
de:code 2017 [TL12] "炎上案件ストッパー"はかく語りき 「プロジェクトの成果をあげるために意識した一つの事」de:code 2017 [TL12] "炎上案件ストッパー"はかく語りき 「プロジェクトの成果をあげるために意識した一つの事」
de:code 2017 [TL12] "炎上案件ストッパー"はかく語りき 「プロジェクトの成果をあげるために意識した一つの事」
 
Visual Studio App Centerで始めるCI/CD
Visual Studio App Centerで始めるCI/CDVisual Studio App Centerで始めるCI/CD
Visual Studio App Centerで始めるCI/CD
 
Implementation Approach of Artifical Intelligence
Implementation Approach of Artifical IntelligenceImplementation Approach of Artifical Intelligence
Implementation Approach of Artifical Intelligence
 

Plus de Tier_IV

Plus de Tier_IV (12)

自動運転技術を活用した運転技能教習システムのご紹介
自動運転技術を活用した運転技能教習システムのご紹介自動運転技術を活用した運転技能教習システムのご紹介
自動運転技術を活用した運転技能教習システムのご紹介
 
自動運転技術を活用した運転技能教習システムの開発
自動運転技術を活用した運転技能教習システムの開発自動運転技術を活用した運転技能教習システムの開発
自動運転技術を活用した運転技能教習システムの開発
 
自動運転業界のSRE活動
自動運転業界のSRE活動自動運転業界のSRE活動
自動運転業界のSRE活動
 
自動運転の会社でなぜデータ基盤が必要なのか?そこで今やっていること
自動運転の会社でなぜデータ基盤が必要なのか?そこで今やっていること自動運転の会社でなぜデータ基盤が必要なのか?そこで今やっていること
自動運転の会社でなぜデータ基盤が必要なのか?そこで今やっていること
 
AWS X-Rayを使ったマイクロサービスのトレーサビリティ向上
AWS X-Rayを使ったマイクロサービスのトレーサビリティ向上AWS X-Rayを使ったマイクロサービスのトレーサビリティ向上
AWS X-Rayを使ったマイクロサービスのトレーサビリティ向上
 
Unity x 自動運転シミュレーション、自動運転におけるGame Engineの役割
Unity x 自動運転シミュレーション、自動運転におけるGame Engineの役割Unity x 自動運転シミュレーション、自動運転におけるGame Engineの役割
Unity x 自動運転シミュレーション、自動運転におけるGame Engineの役割
 
Tier Ⅳ Tech Meetup #2 - 自動運転を作るのはCloudシステムの集合体?? 活用技術を大解剖 -
Tier Ⅳ Tech Meetup #2 - 自動運転を作るのはCloudシステムの集合体?? 活用技術を大解剖 -Tier Ⅳ Tech Meetup #2 - 自動運転を作るのはCloudシステムの集合体?? 活用技術を大解剖 -
Tier Ⅳ Tech Meetup #2 - 自動運転を作るのはCloudシステムの集合体?? 活用技術を大解剖 -
 
Tier Ⅳ Tech Meetup #1 - 世界初オープンソースの自動運転ソフトウェア「Autoware」ができること & 開発秘話 -
Tier Ⅳ Tech Meetup #1 - 世界初オープンソースの自動運転ソフトウェア「Autoware」ができること & 開発秘話 -Tier Ⅳ Tech Meetup #1 - 世界初オープンソースの自動運転ソフトウェア「Autoware」ができること & 開発秘話 -
Tier Ⅳ Tech Meetup #1 - 世界初オープンソースの自動運転ソフトウェア「Autoware」ができること & 開発秘話 -
 
Unity x 自動運転シミュレーション、自動運転におけるGame Engineの役割
Unity x 自動運転シミュレーション、自動運転におけるGame Engineの役割Unity x 自動運転シミュレーション、自動運転におけるGame Engineの役割
Unity x 自動運転シミュレーション、自動運転におけるGame Engineの役割
 
Autoware Architecture Proposal
Autoware Architecture ProposalAutoware Architecture Proposal
Autoware Architecture Proposal
 
Self-Driving System with IoT
Self-Driving System with IoTSelf-Driving System with IoT
Self-Driving System with IoT
 
Mobilitydev2019 10 31_slideshare
Mobilitydev2019 10 31_slideshareMobilitydev2019 10 31_slideshare
Mobilitydev2019 10 31_slideshare
 

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

Notes de l'éditeur

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