継続的な統合に関連するオーバーヘッドがあります。たとえば、セットアップ、再トレーニング、認識活動、データの問題であることが判明した「バグ」を修正するための停止、懸念プログラミングスタイルの強制的な分離などです。
継続的インテグレーションはどの時点で採算が取れますか?
編集:これらは私の調査結果でした
セットアップは、VSSまたはTFSから読み取るNantを備えたCruiseControl.Netでした。
失敗の原因はいくつかありますが、セットアップとは関係ありません。
調査のコスト:赤信号がコード、データ品質、またはインフラストラクチャなどの別のソースの純粋な論理的不一致によるものかどうかの調査に費やされた時間問題(たとえば、ネットワークの問題、ソース管理からのタイムアウトの読み取り、サードパーティのサーバーのダウンなど)
インフラストラクチャ上の政治コスト:テスト実行の各メソッドに対して「インフラストラクチャ」チェックを実行することを検討しました。ビルドサーバーを置き換える以外に、タイムアウトの解決策はありませんでした。赤いテープが邪魔になり、サーバーの交換はありませんでした。
単体テストの修正にかかるコスト:データ品質の問題による赤信号は、ユニットテストが正しく記述されていないことを示している可能性があります。そのため、データに依存する単体テストが書き直され、不良データによる赤信号の可能性が低減されました。多くの場合、単体テストを正確に実行できるように、必要なデータがテスト環境に挿入されました。データをより堅牢にすることで、このデータに依存しているテストはより堅牢になると言うのは理にかなっています。もちろん、これはうまくいきました!
カバレッジのコスト、つまり、既存のコードの単体テストの記述:単体テストのカバレッジの問題がありました。単体テストのないメソッドは何千もありました。したがって、それらを作成するには相当な工数が必要になります。これはビジネスケースを提供するには難しすぎるため、今後は新しいパブリックメソッドに単体テストを使用することが決定されました。単体テストがなかったものは、「潜在的に赤外線」と呼ばれました。ここでの裏付けとなるポイントは、静的メソッドは、特定の静的メソッドがどのように失敗したかを一意に判別することがどのようにして可能であるかについての重要なポイントであったということです。
ビスポークリリースのコスト:Nantスクリプトはこれまでしか機能しません。たとえば、EPiServer、CMS、または任意のUI指向のデータベース展開用のCMS依存ビルドには、それほど役に立ちません。
これらは、1時間ごとのテスト実行と夜間のQAビルドでビルドサーバーで発生した問題の種類です。私は、ビルドマスターとしてこれらが不要であることを楽しませています。リリース時に、特に1人のバンドと小さなビルドを使用して、これらのタスクを手動で実行できます。したがって、私の経験では、シングルステップビルドはCIの使用を正当化していません。より複雑なマルチステップビルドについてはどうですか?これらは、特にNantスクリプトがないと、構築するのが面倒な場合があります。したがって、1つ作成しても、これらは成功しませんでした。赤信号の問題を解決するためのコストは、メリットを上回っていました。最終的に、開発者は興味を失い、赤信号の有効性に疑問を呈しました。
公平に試してみると、CIは高価であり、仕事を成し遂げるだけでなく、周辺の作業がたくさんあると思います。アラームシステムを導入して維持するよりも、大規模なプロジェクトを混乱させない経験豊富な開発者を採用する方がコスト効率が高くなります。
これらの開発者が去ったとしても、これは事実です。彼が従うプロセスは、要件仕様、設計仕様を記述し、コーディングガイドラインに準拠し、コードを読みやすくするためにコメントするため、優れた開発者が去っても問題はありません。これはすべて見直されています。これが起こらない場合、彼のチームリーダーは彼の仕事をしていないので、彼のマネージャーなどがそれを拾うべきです。
CIが機能するためには、単体テストを作成し、完全なカバレッジを維持し、かなりの規模のシステムのために機能するインフラストラクチャを確保するだけでは不十分です。
一番下の行:ビジネスの観点から、リリース前にできるだけ多くのバグを修正することが望ましいかどうか疑問に思われるかもしれません。 CIには、顧客がUATで特定できるか、保証期間が終了したときにクライアントサービス契約の一部として修正の代金が支払われる可能性がある少数のバグをキャプチャするための多くの作業が含まれます。
CIエンジンの設定は、家に火災警報器を設定するのと同じです。
私の考えでは、利点は多くの開発者とは相関していませんが、大規模なコードベースと相関しています。 CIエンジンは、自分でやりたくない退屈な作業をすべて積極的に実行し、毎回それを実行します。
長い間触れていないリモートモジュールを壊した場合、すぐに通知されます。コンパイルに関してだけでなく、単体テストを設定している場合は関数についても賢明です。
また、CIエンジンにallインストーラーのセットアップなどの退屈な作業を行わせる場合は、手動で行う必要がないことにも注意してください。ソースをチェックインするだけで、完成した製品が標準の場所でビルドされるのを待ちます。 (編集:CIエンジンは明確に定義された環境でも機能し、開発者固有の設定を回避し、再現性を確保します)
これも品質保証の一環です。
編集:上記を書いた後、私はJava用のMavenビルドツールを使用した経験があります。基本的に、これにより、プロジェクト内の完全なCI構成を(pom.xmlで)保持でき、CIのインストールの維持や別のCIエンジンへの移行が非常に簡単になります。
開発者の数ではありませんが、1からn(包括的)に到達するために必要なステップの数です。ここで、1とnは...
1:コードをチェックアウトする
そして
n:インストール可能\展開可能パッケージがある
N <2の場合、あなたたぶんCIは必要ありません
それ以外の場合、CIが必要
更新
調査結果を読んで、間違った方向から、間違った理由でCIにアプローチしたと結論付けることができます。
1人のチームであっても、努力する価値があります。これは、クロスプラットフォームコードを開発していて、変更が両方のプラットフォームで機能することを確認する必要がある場合に特に当てはまります。たとえば、MicrosoftのC++コンパイラはGCCよりも受け入れやすいので、Windowsで開発しているがLinuxもサポートする必要がある場合、Linuxでビルドが中断したときにCIシステムに通知されると非常に役立ちます。
一部のCIシステムはセットアップが非常に簡単であるため、オーバーヘッドはそれほど大きくありません。たとえば、ジェンキンスやハドソンを試してみてください。
あなたが言うように、それを設定して実行し続けるにはオーバーヘッドのコストがあります。
しかし、損益分岐点がどこにあるかという問題は、チームに何人の人がいるのかではなく、プロジェクトの長さの関数です。
そうは言っても、将来のすべてのプロジェクトで使用できるセットアップコストの一部があるため、長期的にはオーバーヘッドコストがゼロに近づく可能性があります。
今週はJenkinsをセットアップして、現在取り組んでいる小さな.NETプロジェクトをビルドします。これをGitソース管理と統合して、すべてのコミットでビルドがトリガーされるようにしました。ユニットテストをビルドに統合しました。静的分析をFxCopおよびStyleCop違反の形で統合しました。
これで、チェックインするたびに、すべてのコードがチェックアウトされ、ビルドされ、すべてのアセンブリでバージョン番号がインクリメントされ、テストされ、FxCopおよびStyleCop違反について分析され、ビルドがアーカイブされ、結果が多数のグラフに記録されます。私はテスト結果と違反の経時的な可視性を持っています。
最初からそれを行うには1時間ほどかかります(これまでに行ったことがない場合は、Googleで1日かかるかもしれません)。すべてのツールが無料で利用できるため、費用はかかりません。
プロジェクトが構築されたときに、無料で成長する高品質のインフラストラクチャがある場合。新しい開発者がプロジェクトに参加した場合、または参加したとき、私は彼らの作業とプロジェクトへの影響について完全な可視性を無料で得ることができます。
したがって、CIが価値がないと思われる唯一のシナリオは、1日ほどかかり、その後再び訪れることのないプロジェクト、または既存の/無料のツールが利用できない言語でのプロジェクトと、それらを取得するコストのいずれかです。仕事に不釣り合いです。
CIは常に価値があります。CIがもたらす安心感により、他の方法よりも速い速度で作業することができます。あなたが持っている問題はユニットテストに関係しているようです。単体テストは非常に高価であることに同意しますが、(多くの点で)それらは私たちが持っている中で最悪の選択肢であると考えています。個人的に、そして私が取り組みがちな種類のシステムの場合、私は実際のケースと(おそらくは)病理学的ケースの組み合わせで動作するシステムレベルのテストによって誓います。単体テストよりも安価で、概念的な世界の到達困難なコーナーである、ドナルドラムズフェルドの「不明な未知数」を利用できます。
変更するたびにプロジェクトのすべての側面を確認できる場合は、CIは必要ありません。
他のすべての場合では、それは正味の勝利です。
オーバーヘッドは最小限です。私は一人の男のプロジェクトにはそれが役に立つだろうと言います。 2つに達すると、それは非常に貴重です。
「ワンステップビルド/検証」があれば、1人のプロジェクトの場合、継続的な統合で大丈夫かもしれませんが、それらの場合、CIをセットアップするためのほとんどの困難な作業を行っているので、それを正式なシステム(CC、Hudson、TeamCityなど)で使用します。
CIがいつ採算を取るのかという問題は、新しいプロジェクトで答えるのが難しい問題です。
既存のプロジェクトでは、はるかに見やすくなっています。サプライチェーンの開発段階で重大なバグを見つけた場合、問題は可能な限り早い段階で存在することがわかります。これを修正するためのコストは、現在最低です。その問題が開発より上の環境に存在する場合、コストは高くなります。
現在、経営陣はバグでリリースすることを決定するかもしれませんが、それはビジネスリスクです。少なくとも今では、深夜の電話/パニックではなく、そのリスク評価を通じて緩和することができます。これは、時間単位の料金で請求された場合、結局は高額になることになります。
コストの面で考慮すべきもう1つのこと。 QA部門はどのようなものですか?手動テストですか? CIに移行すると、開発ボックスに対してこれらのスクリプトを自動化することで、全体的なQAコストを削減できる場合があります。 CIフェーズに関与させることで、プロジェクトをサポートするQA担当者の数を減らすことができる場合があります。
開発者の数ではなく、
a。自動化を使用して節約する時間と頻度。
b。所有しているバージョン/ブランチ/製品の数。
チームの規模に関係なく、常に使用してください。たとえばそれがあなただけの場合、スターバックスでラップトップからコーディングして、自宅のより強力なシステムから作業を続行するのでしょうか。
オーバーヘッドはそれほど悪くありません。
1。はい、継続的インテグレーションの使用を開始するには1つで十分です。