web-dev-qa-db-ja.com

DVCSは継続的な統合を妨げますか?

10人のアジャイル開発者のチームがあるとします。彼らは毎日、ボードからタスクを1つ選び、そのタスクに対していくつかの変更をコミットします(1日の終わりまでに)タスクが完了するまで。すべての開発者がトランクに対して直接チェックインします(Googleスタイル、すべてのコミットはリリース候補であり、機能の切り替えなどを使用します)。

SVNのような集中型CVSを使用している場合、そのうちの1つがコミットするたびに、ビルドサーバーは他の9人の開発者の作業に対して変更を統合してテストします。ビルドサーバーは、ほぼ1日中連続して実行されます。

しかし、gitのようなDCVSを使用している場合、開発者はすべてのローカルコミットを中央リポジトリにプッシュする前に、タスクが完了するまで待機することがあります。それらの変更は、1日の終わりまで統合されません。

このシナリオでは、SVNチームは継続的により頻繁に統合しており、gitチームよりもはるかに速く統合の問題を発見しています。

これは、DVCSが古い集中型ツールよりも継続的なチームに適していることを意味しますか?この遅延プッシュの問題をどのように回避しますか?

34

免責事項:私はアトラシアンで働いています

DVCSは、開発者が定期的に自分のブランチにリモートでプッシュし、CIサーバーが既知のアクティブなブランチを構築するように設定されている限り、継続的インテグレーションを妨げません。

従来、DVCSとCIには2つの問題があります。

  • 統合状態の不確実性-開発者がマスターから定期的にマージしてビルドを実行していない限り、結合された変更の状態はわかりません。開発者がこれを手動で行う必要がある場合、問題を早期に発見するのに十分な頻度で行われない可能性があります。
  • ビルド構成の複製とドリフト-ブランチビルドを作成するためにビルド構成を「マスター」ビルドからコピーする必要がある場合、ブランチの構成コピー元のビルドとすぐに同期しなくなる可能性があります。

Bambooでは、開発者が作成した新しいブランチをビルドサーバーが検出し、マスターのビルド構成に基づいてブランチのビルドを自動的にセットアップする機能を導入しました(マスタービルド構成を変更すると、ブランチ構成も変更されます)変更を反映するため)。

マージストラテジと呼ばれる機能もあり、ブランチビルドの実行前にマスターからの変更でブランチを更新するか、成功したビルドブランチの変更をマスターに自動的にプッシュして、ブランチ間の変更ができるだけ早く一緒にテストされるようにします。

とにかく、もっと詳しく知りたい場合は、私のブログ投稿 "Making Feature Branches効果的な継続的インテグレーション" を参照してください。

26
jdumay

私の小さなチームは1〜2年前にDVCSに切り替え、私の会社の他のメンバーも数か月前に追随しました。私の経験では:

  • 一元化されたVCSを使用する人々は、大規模なプロジェクトを行っているときでも、コミットを保留する傾向があります。これはDVCSに固有の問題ではありません。コミットを行う前に数日待つ変更セットがあります。大きな違いは、この間にある時点で彼らがミスをした場合、またはコンピューターがクラッシュした場合、それを修正するために非常に多くの労力を必要とすることです。
  • 私たちは、各開発者が自分の名前付きブランチで作業し、コードをレビューした人だけが変更をヘッドにマージできるコミットワークフローを使用します。これにより、コミットによって問題が発生する可能性が低くなるため、ビルドサーバーがエラーメッセージを生成したときに、人々は本当に注意を払います。また、頭が固定されるまで、他の開発者が自分のブランチで作業を続けることができることも意味します。
  • DVCSでは、人々はコードをマージする前にプログラミングに多くの時間を費やす傾向がありますを頭に入れます。そのため、ビルドの継続性に少し遅れが生じる傾向があります。しかし、その違いは、DVCSの利点に対抗するには十分ではありません。
14

私は最近、SubversionよりもMercurialを使用した約19のプロジェクトを観察しました(私は Subversionオタク でした)。これは深刻な統合のトラブルと懸念を引き起こしました。

私たちが直面したもう1つの問題は、継続的インテグレーションサーバーです。サーバーに対してコミットの同期が行われたときにのみ、問題(たとえば、失敗したテスト)が通知されました。

Martin Fowler それについて書いた が彼のサイトにあるようです。

とはいえ、私が言及したプロジェクトのいくつかは、少なくとも1日に1回同期を行うことで問題を軽減しました。ですから、あなたの質問に答えるために、DVCS mayは継続的な統合を妨げ、個人主義を高めると思います。ただし、DVCSは直接的な原因ではありません。

開発者は、使用するVCSに関係なく、引き続き担当しています。

13
user2567

推論のベースとなるアイデアは非常に不安定で、柔らかく言えます。 開発者がタスクを完了するまで待つことができるのは、チーム/管理/プロセスの問題です

何らかの方法で「待機」または「急いで」、共有トランクまたは分離ブランチを実行することは、分岐戦略として知られています。また、オンラインで利用可能な学習情報、特定の戦略を選択することは、基本的にVCSが集中化または分散されていることとは何の関係もないことがわかります。

Mercurialのような分散型VCSの場合、簡単に見つけることができます 頻繁なマージに対する強力な推奨事項

まず、頻繁にマージします。これにより、誰にとってもマージが容易になり、競合(互換性のない設計上の決定に起因することが多い)を以前に発見できます...

上記のような推奨事項を検討すると、これらがMercurialの配布とは何の関係もない考慮事項にアピールしていることがすぐにわかります。

次に、集中型VSCであるSubversionの状況を見てみましょう。オンライン情報を調査すると、いわゆるstableトランクunstableトランクと呼ばれる人気の高い戦略の中から、それぞれの頻度に反対の影響がありますマージ。ご存知のように、人々はVCSが集中化されていることに注意を払うことなく物事を行うための1つまたは他の方法を選択します。

  • 集中化されたVCSで大幅に遅延したマージが発生し(ラメ管理でも推奨されます)、Dチームが頻繁にマージするのをチーム/管理者が正しい方法だと思ったときに見ました。 VCSが分散されているか、何らかの方法で決定されているかどうか誰も気にしないことを見てきました。

上記の場合、DVCSは継続的インテグレーションを妨げますか?は正しい答えのように見えますか?(---)はM

VCSが配布されているかどうかは、大きな影響はありません。

10
gnat

私の経験は正反対です、svnを使用しているチームは何日もプッシュしませんでした、彼らが取り組んでいたコードはトランクを手動でのマージに時間を無駄にすることなく、他のすべての人のためにコンパイルしない。その後、スプリントの終わり近くに、全員がコミットし、狂気の融合が起こり、物事は上書きされて失われ、回復する必要があります。 CIシステムが赤くなり、指差しが続く。

Git/Gitoriousでこの問題が発生したことはありません。

Gitを使用すると、都合のいいときに他の人の変更をプルしてマージできます。誰かが何かをチェックしてチェックインしたいのではなく、手動で20分マージする必要があるからです。

Gitを使用すると、他の全員のコミットをプルし、コードをマージしてから、作業中のバージョンを他の全員にプッシュすることで、変更内容に基づいて何をマージする必要があるかを推測する必要がなくなります。

マージリクエストを介したコードレビューのメディエーターとしてGitoriousのようなものを持つことは、多くのブランチと多くの貢献者を管理することを非常に苦痛なくします。

Gitリポジトリ内のすべてのアクティブなブランチを追跡するようにJenkins/Hudsonを設定することも非常に簡単です。 SVNからGitに移行したとき、CIとリポジトリの状態に関するフィードバックがより頻繁に得られました。

10
user7519

この古い質問は新しい質問の複製としてマークされたばかりで、多くの回答が古いアイデアを参照しているため、更新された質問を投稿したいと思いました。

5年前にはあまり一般的ではなかったと思われることの1つは、プルリクエストブランチをマスターにマージする前に、プルリクエストブランチでCIテストを実行することでした。これは、頻繁にマージすることが望ましいものの、every変更をeveryone作るとすぐ、最適ではありません。

DVCSは、コミットを統合するより階層的なモードを生み出しました。たとえば、私はよく私の隣に座っている開発者と非常に密接にタスクに取り組んでいます。お互いの枝から一日に数回引っ張ります。今日、私たちはプルリクエストにプッシュされた変更を数時間ごとに介して他の開発者と協力しました。

ビルドスクリプトに大幅な変更を加えていました。 Jenkinsは、すべてのPRブランチをマスターとローカルでマージしてテストを実行するため、クリーンビルドを必要とする他の開発者の邪魔をすることなく、そのように自動化されたフィードバックを得ました。 PRをマージして、3人の開発者のグループの外部でマスターして共有する準備ができるまでには、おそらくもう1日かかるでしょう。

ただし、変更がマスターにマージされるのを待つことができない場合は、変更が私たちに依存しているため、開発ブランチをローカルでマージして作業を続行できます。これは、CVCSに慣れている多くの人が見落としていることです。 CVCSでは、変更を共有するonly方法は、変更を中央のリポジトリにマージすることです。そのため、頻繁にマージすることがより重要です。 DVCSには、他のオプションがあります。

4
Karl Bielefeldt

構築サーバーは安価です。知っているすべてのブランチをCIサーバーに取得させるだけです。

Jenkinsは、複数のgitリポジトリをチェックし、単一のジョブでそれらのいずれかから「最新」を取得するサポートを持っています。他のツールでも同様の解決策があると確信しています。

4
ptyx

DVCSは継続的な統合を促進するものだと思います。マージはそれらにそれほど刺激的ではありません。ただし、より多くの訓練が必要です。ローカルコミットに従ってベースからプルし、マージしてから、タスクが完了したら(次のタスクに進む前に)プッシュする必要があります。

3
Michael Brown

私のチームがGitに切り替えたとき、Pushは古いVCSでのコミットとまったく同じように扱われるようにプロセスを明示的にレイアウトし、ローカルコミットは各個人が選択した頻度で、または頻繁に行うことができました。これにより、DVCSを使用しても、集中型VCSを使用しても、CIシステムに違いはありません。

2
Dan Lyons

答えはイエスとノーの両方です。

ここでの違いは、CIで表示される中央リポジトリに直接コミットすることと、CIで表示される中央リポジトリに変更をプッシュすることとの間の違いです。あなたが見つけるかもしれない「問題」は、DVCSユーザーが実際にそのプッシュを定期的に実行しない可能性があることです。

これはDVCSの固有の設計機能だと思います。変更を常に中央サーバーにプッシュするようには設計されていません。そうである場合は、代わりにCVCSを使用することもできます。したがって、答えは開発者の間でより良いワークフローを実施することです。毎晩変更をプッシュするように伝えます。シンプル!

(そして、あなたのSVNユーザーが毎晩コミットしていない場合、彼らに言ってください-それはまったく同じ問題です)。

1
gbjbaanb

Gitは継続的な統合を妨げていません。トランクベースのワークフローはそうです。

直感に反するように聞こえるかもしれませんが、開発者が機能ブランチで作業する場合は、自分のマシンに頻繁に統合するように奨励できます(また、機能をマージに送信する前に統合する必要があります)。対照的に、トランクベースのワークフローでは、コミットが大きいため、統合の頻度が少なくなります。

Googleスタイルのトランクベースのワークフローは、マージが簡単なGitなどのVCSでは逆効果だと私は主張します。代わりに、次のことをお勧めします。

  • 機能を十分に小さく分解して、開発に1〜2日以上かかることはありません。
  • 各機能はプライベートブランチで開発されています。
  • 開発者はプライベートブランチ(git fetch Origin; git merge master)。この方法で作業する場合、私は通常これを1日に何度も行います。
  • 開発者がマージとレビューのためにブランチを送信すると、CIサーバーは自動ビルドを行います。マージは、これがパスしたときにのみ発生します。

つまり、小さなコミット、頻繁な統合、そしてどの機能にどのコミットが属しているかの追跡可能な履歴があります。適切に使用されたブランチは、Gitにとって価値のあるものすべての鍵であるため、ブランチを回避することは大きな間違いです。

0