僕のチームのGitの開発フロー

を考えてみる。

Git Flow

nvie.com

やってみたことある。良いんだけど、僕の環境だと、もうちょっとシンプルにやれそうかなって思った。

Github Flow

scottchacon.com

これはシンプルだな。なんだけど、シンプルすぎてちょっと違うかな。

ということで、ちょうどいいくらいのを考えてみたい

今の僕の開発にとって、ちょうどいいくらいのを考えてみたいなーって。じゃあ、今の僕のやってる開発ってどんなん?ってところから。

チーム

エンジニア5,6人くらい。

Feature, Story, Task

Featureと呼ばれるものがあって、これは2,3ヶ月分の規模で。この単位でリリースする。
Featureは複数のStoryで構成されていて、Storyは4,5日くらいで完了する。から、1 Featureは10から15Storyくらいってことか。
Storyは複数のTaskを持っていて、それぞれのTaskは1,2日で完了する。

f:id:bufferings:20160204234444p:plain

たまに1週間くらいのFeatureを割り込みでさくっとリリースすることもあったりする。

ここで言いたかったのは、Featureというものの感じがgit-flowとかとは違いそうダナーって感じてるってところ。

付箋 + Confluence

他部署とのやりとりにはJIRAを使ったりもするけど、チームのタスク管理は付箋でやってる。Featureの内容とか、残しておきたい情報とかはConfluenceで残してる。Feature Pageと呼ばれるページにそのフィーチャーの仕様が書かれている。

Pair Work

ペア開発してる。ペアプロするときもあれば、別々に作業をすることもあるけど、プルリクエストを出すときは、ペアレビュー済みのものが出される。

Pull Request

AtlassianのStashを使ってる。全ての修正はプルリクエストで別のペアからレビューされる必要がある。

ステージング環境

リリース前にはステージング環境でQAを実施する。

こんなところかな。

フローを考えてみる

という開発状況を踏まえて、フローを考えるとこんな感じになった。

1 masterからfeatureブランチを作成する

f:id:bufferings:20160205001809p:plain

git fetch --prune
git checkout -b feature/weather-news origin/master
git push origin feature/weather-news

Stashのブランチパーミッションを使いたいので、featureブランチ名には"feature/"プレフィックスを付ける。以下のブランチにはpushによる更新ができないように設定する。プルリクエストによる更新のみを受け付ける。

  • master
  • feature/*

2 featureブランチからstoryブランチを作成する

f:id:bufferings:20160205002310p:plain

git fetch --prune
git checkout -b story/weather-news/show-area origin/feature/weather-news
git push origin story/weather-news/show-area 

3 WIPプルリクエストを作成する

f:id:bufferings:20160205003639p:plain

git commit --allow-empty -m "Start story"
git push origin story/weather-news/show-area

事前に以下の内容を考えて書いておく。

  • ストーリーのタイトル(プルリクエストのタイトル )
    • タイトルには作業中って分かるように"[WIP]"と書いておく
  • Feature PageのURL
  • ストーリーの概要
  • DONEの定義
  • このストーリーでやることリスト

4 ローカルではこまめにコミットする

この数年間、何かを調べるときにはコミットログを見ることはあんまりなかった。プルリクエストの方を見る。ので。もう、コミットログは気にしない。自分用メモ的な立ち位置。

5 帰る前にはstoryブランチをリモートにpushする

f:id:bufferings:20160205003654p:plain

次の日体調悪くなっても大丈夫なようにね。ペアの人がやってくれるから。

6 storyが完了したらWIPをはずしてレビュアーを追加する

別のペアにお願いする。

7 レビューが完了したらfeatureブランチにマージ

f:id:bufferings:20160205004022p:plain

マージされたらstoryブランチは削除

8 そんなことを繰り返していく

そうするとこんな感じでfeatureブランチが進んでいく

f:id:bufferings:20160205004524p:plain

9 開発が終わったらステージング環境にデプロイしてQAをする

このブランチ名を指定してステージング環境にデプロイ。QA実施。

10 QAが終わったらmasterに向かってプルリクエストを出す

レビューOKだったらマージ。そしてデプロイする。デプロイするときに自動でタグづけする。featureブランチは役目を終えて削除される。

f:id:bufferings:20160205004713p:plain

まとめると

こんな感じが良さそうかなーって思った。チームに聞いてみよっと。

f:id:bufferings:20160205005339p:plain

HotFixもBugFixもFeatureと同じ流れでやればいいかなーって。あと、全部のブランチを自動でテスト流したいし、テストがOKだったら、そのブランチ用の環境を自動で作ってデプロイしたいなぁ。