非常に大規模なプロジェクト/チームの継続的な統合はどのように拡張できますか?


7

従来、CIシステムは、統合ブランチ内のコードの品質のみを監視し、回帰が発生したときに通知します。修理には人間の介入が必要です。

同じブランチで作業する開発者の数が増えると、破損/閉塞のリスクが高まります。最終的には、破損が修正されるまでに平均して新しい破損が現れるポイントに到達します。ブランチの進行は実質的に無視できます。

後でマージされる別々の統合ブランチでそれぞれ作業する複数のチームに分割すること役立つかもしれませんが、関連するチャーン/ノイズ/技術部門を追加しながら、必要な統合を後で遅らせるだけなので、プロジェクトの期間を大幅に延長します個々のブランチのマージによる部分的な統合。また、各ブランチのCIセットアップ、それぞれ独自のビルド/ QAリソースなどにより、コストも増加します。また、全体的な品質が必ずしも向上するとは限りません。

スケーラビリティは、せいぜい、疑わしいものです。

このような大規模なプロジェクトを実際にスケーリングする方法はありますか?


1
私にとって、この質問は、「なぜこれが質問なのか」と私に思わせる他の多くの質問と同じです。それは悪い質問ではありませんが、むしろ私が出身している世界(メインフレーム、私はあなたが今知っているに違いない...)である何かは、もはや本当に質問ではありません。それは、私たちが少なくとも10年ほど前から行っていることであり、IMOは魅力のように機能します。それ以外の場合は、銀行システムを継続させることが可能でしょうか。メインフレームのメガネでそれを見て答えを投稿するのが理にかなっているのかどうかはわかりません。どう思いますか?
Pierre.Vriens

1
ここでのプロジェクトの規模とは、実行中のシステムへの変更のサイズと速度を意味します。必ずしもシステム自体のサイズではありません(たとえば、プロジェクトがシステム全体を書き直したり構築したりする場合に重要になります)ゼロから)。また、コンテキストは単一のブランチであり、機能ブランチで一度に数日/数週間/数か月間切り離すことは、継続的な統合ではありません。それはあなたの場所では起こらないと言っているのではなく、メインフレームのコンテキスト自体が大規模な継続的な統合を意味するものではないとだけ言っています。同じブランチへの1日あたり数百のコミットを考えてください。
Dan Cornilescu 2017年

この質問には、さらに多くの質問が残ります-この状況でどのように終わったのですか?多くの開発者が同じブランチで作業しているのはなぜですか?機能ブランチに独自のQA環境が必要なのはなぜですか?ビルドを壊す変更が統合ブランチにプッシュされているのはなぜですか?また、CIスケーリングではなく問題が解決されていないのはなぜですか?彼らはローカルでテストしていませんか?彼らがそれにマージする前に上流からマージしないのですか?
エイドリアン

1
@エイドリアンブランチは悪です-彼らは統合地獄を彼らにもたらします-リスクがあり、遅く、高価です。特に大規模なチームの場合。ブランチは簡単に分岐しすぎて、マージを実行不可能にする可能性があります。CIの利点を調べます。分岐とは、孤立して作業することを意味します。これらの利点をすべて取り消し、補完的な欠点を取り戻します。はい、ブランチはswを何十年も首尾よく出荷するために使用されてきました-代替はありませんでした。しかし、今はCIがあります。それでも多くの人がまだブランチを使用しています-彼らは慣れ親しんでおり、もはや痛みを感じたり、それを無視したりすることすらありません。または、スケーラビリティの問題にぶつかります。
Dan Cornilescu 2017

CIはブランチとはまったく異なる問題を解決し、正しく使用されれば、ブランチはCIに対して機能し、CIに対しては機能しません。ブランチを使用しなくても統合の地獄は避けられません。それはさらに悪化します。同じブランチで作業している全員がプッシュするたびにマージする必要があります。
エイドリアン

回答:


5

はい、しかしそれはあなたの質問であなたが言及することを可能な限り防ぐことによってです。物事が手に負えなくなる前に同じコードで作業できる開発者は非常に少ないというのはあなたの言う通りです。すべての変更の概要があり、統合が正常に機能し、リグレッションが発生しないことを確認する人または何かが必要です。すべてが1つのリポジトリで発生する場合、これをスケーリングするのは困難です。

作業を開始する前に、後で簡単に、またはほとんど作業せずに物事を統合できるように、機能を分離する必要があります。つまり、機能を独立した部分に分割するか、少なくとも依存関係をできるだけ少なくする必要があります。これをどのように行うかは、開発している製品に大きく依存します。以前は、機能の分離は、さまざまなライブラリを作成することで行われていました。これの欠点は、これらのライブラリを管理するための優れた方法が必要になることです。たとえば、古いバージョンのWindowsには悪質なライブラリ管理システムがあり、悪名高いDLL地獄を引き起こしていました。現在、これを行うための一般的な方法がマイクロサービスです(これになりつつあります)。ただし、これには欠点もあります(通信のオーバーヘッド、監視するサービスが増えるなど)。

機能に基づく分離が困難な場合、別の選択肢として、開発を時間的に分離することができます。複数のチームが多くの異なる機能を同時に処理するのではなく、一度に1つまたはいくつかの機能のみを処理する1つのチームがあります。

作業の分離が不可能な場合は、物事を調整するためのツールとテストが必要になります。自動化された単体テストと統合テストは、ここでは大きな助けになりますが、最終的には、プロジェクトまたはチームが実行可能となる大きさには制限があります。


4

同じブランチで作業する開発者の数が増えると、破損/閉塞のリスクが高まります。最終的に、破損が修正されるまでに平均して新しい破損が現れるポイントに到達します

文の最初の部分はおそらく統計的に正しいのですが、2番目の部分には同意しません。

CIと統合ブランチはGIGO(ガベージインガベージアウト)を無効にすることはできません。開発者に規律がない場合、停止したブランチになりますが、統合ブランチテストは最初のバリアではなく、遅延バリアとしてのみ機能します。

開発者は、適切なコーディング標準、コードレビュー、ローカルユニットテスト、および場合によっては統合前ブランチテストを使用して、衝突の可能性を低くする必要があります。

私は何百人もの貢献者がいるこのようなシステムに毎日取り組んでいますが、驚くべきことに、ハングするのを目にすることはまれです。

十分なデータはありませんが、コストが高いのは本当かもしれませんが、一方で、統合の遅れやバグの代替コストを判断するのは困難です。


0

別のアプローチは、従来とは異なる別のCIシステムに切り替えることです。これは、ブランチの開発がブロックされている間、回帰を検出して回復を待つのではなく、問題のある候補の変更をコミット前に識別して拒否することで、回帰防止できます。私はそのようなシステムをノンブロッキングCIシステムと呼んでいます

ブランチのリグレッションを減らすために、開発者が実行したコミット前の検証要件を引き上げるだけでは、そのような保証には不十分です。それは実際に回帰率の増加を引き起こす可能性があります:より長い検証時間=>単独で同時に検証されるより多くの変更(したがって、お互いを考慮しない)=>機能の競合および干渉のより高いリスク。これについては、「コミット前の検証カバレッジを拡張するとブランチの安定性の神話が増えるはずです」でもう少し詳しく説明します。

もちろん、CIツールは大規模に動作できる必要もあります。そして、そのようなツールが存在します。ブランチの品質レベルの低下を保証しないCIツールはありますか?を参照してください

情報開示:私は上記のリンクに記載されている会社の関連会社です。


「免責事項」を少し作り直してもよろしいですか(気に入らなければ、ロールバックを実行してください)?
Pierre.Vriens

全然、しないでください。
Dan Cornilescu 2017年

1
完了...お使いのバージョンと同等のIMO、SE要件(開示を追加するため)に準拠、およびより適切な(邪魔にならない)フォント。必要に応じて、自由に修正またはロールバックしてください。
Pierre.Vriens
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.