継続的インテグレーションで複数のブランチを処理する


85

私は自分の会社でCIのスケーリングの問題に取り組んでいると同時に、CIと複数のブランチに関してどのアプローチを取るべきかを理解しようとしています。stackoverflow、複数の機能ブランチ、継続的インテグレーションにも同様の質問があります。私はより多くの議論を得て、質問のいくつかの分析を提供したいので、私は新しいものを始めました。

これまでのところ、私が取ることができる2つの主要なアプローチ(またはおそらく他のいくつかのアプローチ)があることがわかりました。

したがって、開発者に独自のカスタムブランチ用のCIを提供したい場合は、Jenkins用の特別なツール(APIまたはシェルスクリプトなど)が必要であり、スケーリングを処理する必要があるようです。または、より頻繁にDEVにマージして、カスタムブランチでCIなしで動作するように指示することもできます。どちらを選びますか、それとも他の選択肢がありますか?

回答:


69

CIのスケーリングについて話すときは、メインラインとともにすべての機能ブランチを処理するためのCIサーバーの使用のスケーリングについて実際に話します。ブランチの開発者は、CIジョブに含まれる自動テストのすべての利点を利用できるため、最初はこれは良いアプローチのように見えます。ただし、(発見したように)CIサーバージョブの管理で問題が発生し、さらに重要なことに、実際にはCIを実行していません。はい、CIサーバーを使用していますが、すべての開発者からのコードを継続的に統合しているわけではありません。

実際のCIを実行するということは、すべての開発者が定期的にメインラインにコミットしていることを意味します。言うのは簡単ですが、難しいのはアプリケーションを壊さずにそれを行うことです。継続的デリバリー、特に第13章:コンポーネントと依存関係の管理の「アプリケーションをリリース可能に保つ」セクションを確認することを強くお勧めします。主なポイントは次のとおりです。

  • 完了するまで新しい機能を非表示にします(別名フィーチャートグル)。
  • すべての変更を一連の小さな変更として段階的に行います。各変更はリリース可能です。
  • 抽象化による分岐を使用して、コードベースに大規模な変更を加えます。
  • コンポーネントを使用して、さまざまな速度で変化するアプリケーションの部分を切り離します。

それらは、抽象化による分岐を除いて、かなり自明です。これは、次の意味での単なる空想用語です。

  1. 変更する必要のあるシステムの部分に抽象化を作成します。
  2. システムの残りの部分をリファクタリングして、抽象化レイヤーを使用します。
  3. 完了するまで本番コードパスの一部ではない新しい実装を作成します。
  4. 抽象化レイヤーを更新して、新しい実装に委任します。
  5. 古い実装を削除します。
  6. 適切でなくなった場合は、抽象化レイヤーを削除します。

第14章のブランチ、ストリーム、および継続的インテグレーション」セクションの次の段落:高度なバージョン管理は影響を要約しています。

インクリメンタルアプローチでは、ブランチを作成してガンホーを再構築して新しい機能を開発するよりも、確かに多くの規律と注意、そして実際にはより多くの創造性が必要です。ただし、変更によってアプリケーションが破損するリスクが大幅に軽減され、マージ、破損の修正、およびアプリケーションをデプロイ可能な状態にするための時間を大幅に節約できます。

機能ブランチをあきらめるにはかなりのマインドシフトが必要であり、常に抵抗があります。私の経験では、この抵抗は、開発者がコードをメインラインに安全にコミットできないことに基づいており、これは合理的な懸念事項です。これは通常、上記の手法に関する知識、自信、または経験の欠如、および場合によっては自動テストに対する自信の欠如に起因します。前者は、トレーニングと開発者のサポートで解決できます。後者は対処するのがはるかに難しい問題ですが、分岐は特別な安全性を提供せず、開発者がコードに十分な自信を持てるようになるまで問題を延期するだけです。


4
トム、これは1)リリースと更新の両方が比較的簡単である2)ほとんどの変更が十分に分離されている場合にのみうまく機能します。これはWeb開発者にも当てはまりますが、ボックス化された製品リリースを行う場合は、安定したバージョンを常に安定させておく必要があります。大規模な企業環境では、修正プログラムは非常に高価であるか、不可能ですらあります。
Jevgeni Kabanov 2011

13
実際のCIは統合だけでなく、フィードバックにも関係しています
Anton Arhipov 2011

3
私はこれを答えとして選びました(少なくとも賞金を与えました、それでもどういうわけかそれを正しくマークする必要があるかどうか私に知らせてください)が、これは私の問題の解決策ではないと思います。私はzeroturnaround.com/blog/で
toomasr

1
@Jevgeni Kabanovと@toomasrどちらも、真のCIを実行することは品質を放棄することを意味し、修正をプッシュするのは非常に簡単であるため、Web開発者に対してのみ機能すると想定しているようです。あなたが心配しているのは、リリース直前の危険なコミットだと思います。はい、これは悪いリリースにつながる可能性があり、修正に費用がかかる可能性があります。ただし、リリース直前の機能ブランチでの危険なコミットも同様に悪いものです。違いがあると感じた場合は、理由を教えてください。これに対抗する1つの方法(コミットがメインラインまたは機能ブランチに対するものであった場合)は、継続的デリバリーアプローチを使用することです。
トムハワード

1
ああ、ところで、過去4年間、私の主な開発経験は金融機関でした。安定したリリースを用意することが不可欠であり、それを間違えるコスト(修正プログラムをプッシュするために実行する必要のある変更制御プロセスは言うまでもありません)は、それ以上にはなりません。箱入りの製品は私にとってリラックスできる変化になるでしょう。
トムハワード

4

ブランチごとに別々のジョブを設定します。私は以前にこれを行ったことがありますが、Hudson / Jenkinsを正しく設定していれば、管理と設定は難しくありません。複数のジョブを作成する簡単な方法は、同様の要件を持つ既存のジョブからコピーし、必要に応じてそれらを変更することです。各開発者が自分のブランチ用に自分のジョブをセットアップできるようにするかどうかはわかりませんが、1人の人(つまりビルドマネージャー)が管理するのはそれほど手間がかかりません。カスタムブランチが安定したブランチにマージされると、対応するジョブは不要になったときに削除できます。

CIサーバーの負荷が心配な場合は、CIの個別のインスタンスを設定することも、個別のスレーブを設定して、複数のサーバー間で負荷を分散することもできます。Hudson / Jenkinsを実行しているサーバーが適切であることを確認してください。私はApacheTomcatを使用しましたが、ビルドキューを処理するのに十分なメモリと処理能力があることを確認する必要がありました。

CIを使用して何を達成したいのかを明確にしてから、手作業や重複をあまり行わずにCIを実装する方法を見つけることが重要です。ビルド管理プロセス全体を簡素化するのに役立つ、CIサーバーによって実行される他の外部ツールまたはスクリプトを使用しても問題はありません。


このツールの欠如は、この部門にいくつかのプラグイン/製品の余地があることを意味すると思います。自分で書きたくない。
toomasr 2011

1
各ブランチのビルド構成を自動的に作成するJenkinsのユーティリティがあります:entagen.github.com/jenkins-build-per-branch
kolen

3

dev + stableブランチを選択します。それでもカスタムブランチが必要で負荷が心配な場合は、これらのカスタムブランチをクラウドに移動して、開発者が自分で管理できるようにしてください。例:http//cloudbees.com/dev.cb これはKohsukeが現在いる会社です。 。Eclipse Toolingもあるので、Eclipseを使用している場合は、それをdevenvに緊密に統合することができます。


複数のブランチを管理するツールの欠如を、同じ問題を抱えているがクラウド上にあることと交換しますか?これで負荷を管理できるようになりますが、ブランチは管理できませんか?
toomasr 2011

ツールを忘れて、開発者間で管理を分散することを意味しました。「カスタムのパーソナルビルドが必要な場合は、ここにCBアカウントがあります」。メインサーバーのビルドパフォーマンスに影響を与えることなく。それらのAPIは非常に単純ですが、管理ユーティリティの作成はおそらく1〜2週間の問題であり、その後は必要に応じてそこで実行します。人生ではいつものことですが、何か特別なことをしたいのなら、自分でやったほうがいいです。同時に、彼らは急速に成長し、コミュニティに耳を傾けているので、機能リクエストを記入してください。すぐに表示される可能性があります。
アントンサフォノフ2011

ああ、わかった。ブランチの所有者に、チェリーが興味のある仕事を選んで、必要に応じてカスタムブランチ用にセットアップするように伝えます。私はこの考えが好きです。
toomasr 2011

1

実際に本当に問題なのは、機能ブランチを使用したビルドの分離です。私たちの会社には、より大きなディストリビューションの一部である一連の個別のMavenプロジェクトがあります。これらのプロジェクトは異なるチームによって維持されていますが、ディストリビューションごとにすべてのプロジェクトをリリースする必要があります。フィーチャーブランチがプロジェクト間でオーバーラップする可能性があり、ビルドの分離が困難になる場合があります。私たちが試したいくつかの解決策があります:

  • 機能ブランチごとにネクサスに個別のスナップショットリポジトリを作成します
  • 専用スレーブでローカルリポジトリを共有する
  • アップストリームリポジトリでrepository-server-pluginを使用する
  • 1つのプライベートリポジトリですべてを1つのジョブ内に構築する

実際のところ、最後の解決策が最も有望です。他のすべてのソリューションには、何らかの形で欠けています。job-dslプラグインと一緒に使用すると、新しい機能ブランチを簡単にセットアップできます。groovyスクリプトをコピーして貼り付け、ブランチを調整して、シードジョブに新しいジョブを作成させるだけです。シードジョブが管理されていないジョブを削除することを確認してください。次に、さまざまなMavenプロジェクトの機能ブランチで簡単にスケーリングできます。

しかし、トムが上でよく言ったように、機能ブランチの必要性を克服し、開発者にクリーンに統合するように教える方が良いでしょうが、それはより長いプロセスであり、これ以上触れない多くのレガシーシステムパーツでは結果は明確ではありません。

私の2セント

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.