会社で受託開発していて、gitを使った開発フローを考えることになった。
ニアショアに開発をお願いしていて、ニアショアからの受け入れタイミングが何回かあるから、それにあわせてブランチをわけている。
どういうフローで進めているかと、一番最後にやってみて思ったことを書いた。
どういうフローでやっているか
リポジトリの構成
下記モジュールを用意した。
- parent
- core
- entity
- common
- web
- batch
- tools
ニアショアにて開発するモジュールは『common』、『web』、『batch』で、
アーキにて開発するモジュールは『parent』、『core』、『entity』。
ブランチ
ブランチはこんな感じで分けている。
- masterブランチ … リリース可能な状態の資源のみを管理する。結合テスト実施時は、本ブランチから資源をリリースする。
- mainブランチ … masterブランチに対してマージしても問題がないことを検証する。受け入れテスト時に打鍵テストを実施する。
- developブランチ … 開発中に使用する。原則、レビューが済んでいるものを管理する。
- featureブランチ … 1機能単位で切り出し。レビュー前の資源を管理する。
developブランチは納品単位ごとに↓こんな感じで分けてる。
- develop-groupA … 1回目納品分の機能を管理
- develop-groupB … 2回目納品分の機能を管理
- develop-groupC … 3回目納品分の機能を管理
- develop-arch … アーキチーム提供の機能を管理
featureブランチは各業務機能作成者に作ってもらう。
ブランチの流れ
ブランチは↓こんな感じでやってってもらう。
それぞれの役割の人が実際にやること
ニアショア管理者
新しいdevelopブランチが必要となるタイミングで、ブランチ追加依頼を出す。
(アーキチームにてJenkinsへのジョブ追加およびcore等のモジュールのバージョンアップを行う。)
成果物を受け入れ後、ブランチ作成から受け入れまでにあった資源の変更を、現在作業中のdevelopブランチへマージする。
developブランチの資源の品質を確保する。(Jenkinsのジョブが落ちていないこと。コーディング規約違反がないこと。など。)
納品時には、mainブランチに対してpull Requestを出す。
ニアショア開発者
機能単位でfeatureブランチを作成し、資源をfeatureブランチへpushする。
共通コンポーネントは各機能とは異なるfeatureブランチを作成する。
機能作成前には共通コンポーネントのレビューが完了し、developブランチに適用している状態にしておく。
機能作成完了後、developブランチへpull Requestを出す。
ニアショアレビュアー
ニアショア開発者からのpull Requestによるレビュー依頼を受け、レビューする。
レビュー指摘はpull Requestのコメント機能を使用する。
成果物に問題がないことを確認後、pull Requestを承認し、developブランチへ変更を適用する。
対象機能がサンプリングレビュー対象となっている場合は、pull Requestを承認せず、サンプリングレビュー依頼を出す。
受け入れ側ソースレビュー
ニアショアレビュアーからの依頼を受け、ソースコードレビューを行う。
レビュー指摘はpull Requestのコメント機能を使用する。
成果物に問題がないことを確認後、pull Requestを承認し、developブランチへ変更を適用する。
受け入れ担当者
- mainへのpull Requestを受け、資源の内容を確認する。
- 指摘がある場合は、pull Requestのコメント機能を使用して指摘をだす。
- 成果物に問題がないことを確認後、pull Requestを承認し、mainブランチへ変更を適用する。
- mainブランチにてマージによる問題が発生しないことを確認する。
- mainブランチにて受け入れテストを実施する。
- 不具合が発生したら、 不具合・仕様変更が発生したときは別でチケットを起票する。
- masterへ変更をマージする。マージ後、masterブランチのタグを切る。
アーキテクト
グループ切り替えのタイミングで、parentやcoreのバージョンを上げる。
受け入れ完了後、不要となったJenkinsタスクは削除する。
各モジュールのバージョンについて
1:develop-groupA作成から受け入れまで
- parent・core・entity:0.1.0を使用する。緊急リリースがあれば、0.1.1、0.1.2とバージョンアップを行う。
- common:『0.1.0-SNAPSHOT』を指定する。
- web・batch:『0.1.0-SNAPSHOT』を指定する。
develop-groupA受け入れ完了時
- parent・core・entity:受け入れ時のバージョンをそのまま使用する。
- common:『0.1.0』を指定する。
- web・batch:『0.1.0』を指定する。
3:develop-groupB作成から受け入れまで
- parent・core・entity:0.2.0を使用する。緊急リリースがあれば、0.2.1、0.2.2とバージョンアップを行う。
- common:『0.2.0-SNAPSHOT』を指定する。
- web・batch:『0.2.0-SNAPSHOT』を指定する。
4:develop-groupB受け入れ完了時
- parent・core・entity:受け入れ時のバージョンをそのまま使用する。
- common:『0.2.0』を指定する。
- web・batch:『0.2.0』を指定する。
5:develop-groupC作成から受け入れまで
- parent・core・entity:0.3.0を使用する。緊急リリースがあれば、0.3.1、0.3.2とバージョンアップを行う。
- common:『0.3.0-SNAPSHOT』を指定する。
- web・batch:『0.3.0-SNAPSHOT』を指定する。
6:develop-groupC受け入れ完了時
- parent・core・entity:受け入れ時のバージョンをそのまま使用する。
- common:『0.3.0』を指定する。
- web・batch:『0.3.0』を指定する。
実際にやってみて
ダメだったこと
gitのバージョン管理やmavenを使ったバージョニングで、(ニアショアだけでなくチーム全体で)メンバー間での知識の差もあり、こちらの意図がうまくつたわらなかったところがたくさんあった。その結果、こういう場合はどうするのかという質問が多くて、私も相手も不必要なところに時間をかけてしまうことになった。
特に、今回は開発はニアショアで、顔も合わせずに(運用フローをこうしますよ、ってドキュメントだけ用意していて、)開発をすすめる形になってしまい、ニアショアに対しても、受け入れチームに対しても、いっかい、ちゃんと説明する会を設けて、ガッツリ質問を受け付ければよかったなーと思う。
(そういった余裕が開発準備期間になかったのもあるけど。。。)
あと、ちゃんとフローをまわすときに、開発者側の立場からみてどういうふうにやるのがやりやすいか、っていうのをちゃんと聞けばよかった。
(gitとmavenを導入したチームの人や、相談役的なアーキ、チームリーダー、内製チームのリーダーには運用フローをレビューしてもらったけど。)
意見を伺わずにきめて、じゃあこれでやってください。となると、やっぱりわからないときに不満の向き先がこちらにくるので、事前に、「わからん!」→「じゃあどうすればわかりやすいですかね?」ってやりとりをすべきだった。きちんと意見を取り入れたうえで、『勝手に決められたわかりにくいフロー』から『ちゃんと一緒に考えたフロー』にするだけで、意識がかなり変わったと思う。
このへんは私のヒューマニティー高めていく必要ある。
よかったこと
知識を実際の開発に適用できたのはかなり勉強になった。
実際に、運用フロー考えるときも、うちのプロジェクトは受け入れがあるから、受け入れテストはこうやってやって。。。って感じで、受託+ニアショアっていう環境化でのフローを考えることができたのは、かなり良かった。
(だからといって、プロジェクト特性固有の、特段特殊なことをやったつもりもないけど。。。)
次回への知見たまったので、次回は特に↓をちゃんとやりたい。
- 開発が始まるまでに、基本的なgitの使い方とmavenの使い方をメンバーに知ってもらう。
- 運用フローは最初にしっかり説明をして、こういうパターンではこういった対処をするというのを知ってもらう。
- 運用フローを説明したときに、ちゃんと開発者側で何に困りそうか、どうすればもっとよくなるのかを聞く。