質問

優れた CI 構築プロセスとは何でしょうか?

当社では CI を使用していますが、デプロイする必要がある複数のサービスに依存関係があり、他のアプリもこれらに依存している可能性がある場合、運用環境へのデプロイは現実的な CI 目標でもあります。

優れた CI ビルド プロセスは、QA まで自動化され、そこから手動で行われる場合、十分に優れていますか?

役に立ちましたか?

解決

まあ、「それは状況による」:)

当社は CI システムを次の目的で使用します。

  1. ビルドと単体テスト
  2. 単一のボックスにデプロイし、統合テストとコード分析を実行します。
  3. ラボ環境に展開する
  4. 製品のようなシステムで受け入れテストを実行する
  5. コードに渡されるビルドをドロップします。本番デプロイメント用にドロップします。

これは、20 台以上のサーバーにデプロイされた約 12 個のサービスとデータベースからなるグリーンフィールド プロジェクト用であり、他の 6 個の「外部」サービスにも依存しています。

現実的な目標として、CI ツールを使用して製品を実稼働環境にデプロイすることが考えられますか?また..."場合によります"

なぜこれをしたいのですか?

  • プロセスがあれば、より速く、より頻繁に変更をロール (およびロールバック) できます。
  • 人的ミスの可能性が減る
  • 運用環境に移行する前にテスト環境で同じデプロイメント戦略をテストし、問題を早期に発見できます。

これに答える前に、いくつかの技術的な事柄に対処する必要があります。

  • あなたのシステムの稼働時間要件は何ですか -- ダウンタイムがあっても許されますか? それとも 24 時間 365 日稼動する必要がありますか?
  • 人間の介入/承認を必要とする変更管理プロセスを導入していますか?
  • 導入が失敗した場合に、コンポーネントが既知の正常な状態にロールバックできるほど、導入は堅牢ですか?
  • あなたのシステムは、1 つまたは複数のコンポーネントのデプロイメントが失敗した場合に備えて、さまざまなバージョンのサービスまたはクライアントを処理できるように設計されていますか (そして、最後に確認された正常な状態に上記のロールバックが行われています)。
  • プロセスには、コンポーネントが依存関係/クライアントのバージョンが混在している場合に処理できない部分的なデプロイメントを処理する賢さが備わっていますか?
  • データベースの展開/アップグレードはどのように行っていますか?
  • 何か問題が発生したときにわかるように監視を実施していますか?

以下に最近の関連リンクをいくつか紹介します。 オートメーション そして 必要なツールを構築する.

結局のところ、システムが複雑になればなるほど、すべてを自動化することは難しくなりますが、それが価値のある目標ではないという意味ではありません。それを実行するには、より多くの努力と意志の力が必要です。すべてを知ることから始めてください。あなたが直面するであろう困難、あなたが説明しなければならない問題(失敗) 意思 インフラ建設の政治的課題(vs.製品の特徴の詳細)。

さて、ここに大きな秘密があります...技術的な課題は難しいですが、不可能ではありません...の 政治的 課題は克服できないかもしれません。開発時間にせよ、サードパーティのソリューションの購入にせよ、これに関するすべての作業にはお金がかかります。それで本当に、1,000 ドル、10,000 ドル、10 万ドル、または 100 万ドルのソリューションを構築できるでしょうか?

どのようなソリューションを選択する場合でも、まず自動化が堅牢であることを確認し、次に完全であることを確認してください...つまり運用環境にデプロイする脆弱なソリューションではなく、テスト環境にデプロイするための可能な限り堅牢なソリューションを用意してください。

他のヒント

CI は展開メカニズムとして意図されたものではありません。それ CI で QA/テスト サーバーへの自動デプロイメントを実行して、ビルドのこれらの側面が機能することを確認するのは良いことですが、Cruise Control や Bamboo などの CI システムをデプロイメント手段として使用するつもりはありません。

CI は、コードベースを定期的に構築して、自動テストの実行、静的分析によるコードベースの検証、およびその他の同様のチェックを自動化するためのものです。

CI ビルドの背後にある考え方を必ず理解してください。CI は継続的インテグレーションの略で、CI ビルドは実際には、開発者がソース管理システムにコードをチェックインするときに (または特定の間隔で) 最新の変更によってコード ベースが破壊されないように実行される使い捨てビルドを目的としています。 (したがって、コードベースへの変更を継続的に統合するという考えがあります)。

そのため、実際のビルド サーバー プロセスに使用されるテクノロジは、ビルド中に実際に起こることと比較するとほとんど無関係です。@pdavisが述べたように、CIビルドはコードベースをコンパイルし、コード分析(FxCop、StyleCop、Lintなど)を実行し、単体テストとコードカバレッジを実行し、コンセプトに影響を与える必要があるその他のカスタム分析を実行する必要があります。ビルドが「成功」したか「失敗」したか。

CI ビルドを環境に自動的にデプロイすることは、実際にはビルド サーバーの制御下にはありません。そうは言っても、特定の条件 (ビルドが正常に完了するなど) を検出したときにデプロイメントを処理するビルド サーバー上で実行される別のプロジェクトをいつでも作成できますが、それは常に完全に独立したものとして実行する必要があります。

仕事で新しいプロジェクトに着手しており、とても楽しみにしています。私たちはまだ初期設計段階にあり、最近論理システム アーキテクチャを完成させたところです。テストおよびステージング環境用に新しいサーバーを注文し、Cruise Control に基づいた継続的インテグレーション (CI) ビルド システムをセットアップしています (http://cruisecontrol.sourceforge.net/) および MSBuild (http://msdn2.microsoft.com/en-us/library/wea2sca5.aspx) これは基本的に ANT の改良版です。Visual Studio 2005 のプロジェクト ファイルとソリューション ファイルはすべて MSBuild 形式になっているようです。Cruise Control は自動的に Visual Source Safe からソースを取得し (Subversion ではありませんが、対処できます)、それをコンパイルして、fxCop を通じて実行します (http://www.gotdotnet.com/Team/FxCop/)、nUnit (http://www.nunit.org/)、nCover (http://ncover.org/site/)、そして最後ですが、シミアン (http://www.redhillconsulting.com.au/products/simian/)。Cruise Control には、さまざまなツールからコンパイルされた結果をすべて表示するための非常に優れた Web サイト インターフェイスがあり、ビルドごとにコードの変更を表示することもできます。また、ビルド履歴内のすべてのビルドを追跡します。私はテスト駆動開発を楽しみにしています。nUnit/nCover と組み合わせたこのタイプのアプローチにより、何も壊していない変更を公開する前にかなり良いアイデアが得られるはずだと思います。プロジェクトが十分に進んだ時点で、ある種の自動ユーザー インターフェイス テストを組み込む計画もあります。ツールによっては、ビルド サーバーにツールをインストールし、Cruise Control から呼び出すだけで済みます。甘い。

優れた CI プロセスは、単体テストを完全またはほぼ完全にカバーします。単体テストはクラスとメソッドをテストします。統合テスト。システムの複数の部分をテストします。CI ビルドをセットアップするときは、単体テストを自動化します。こうすることで、CI ビルドを 1 日に複数回実行できます。2 時間ごとに実行するように設定しています。

1 日に 1 回実行するビルドを長時間実行することもできます。これらは他のサービスを使用し、統合テストを実行できます。

私は ThoughtWorks (Cruise Control の作成者) のプレゼンテーションを見ていましたが、彼らは実際にこの問題に取り組んでいました。彼らの答えは、NO の展開はテストするには複雑すぎるというものです。なぜ?そうしないと、顧客がテスターに​​なってしまうため、まさにそれが望ましくない状況になるからです。

複雑な展開構造がある場合は、視覚化サーバーをセットアップします。通信する必要があるすべてのシステムであるかのように見せかけます。クリーンなイメージにリセットできるため、常に正常な状態で起動できます。

最初の質問に答えると、優れたプロセスとは、リポジトリと開発者間の通信を可能にするプロセスです。リポジトリが悪い状態 (コードがコンパイルされていない、テストが失敗しているなど) にある場合、開発者はそれをできるだけ早く知り、修正できるようにします。

バグの発見が遅くなるほど、修正にかかるコストが高くなります。したがって、バグはできるだけ早く発見される必要があります。これが CI の背後にある動機です。

優れた CI では、できるだけ多くのバグを確実に捕捉する必要があります。アプリケーション全体は、コード (多くの場合複数言語)、データベース スキーマ、展開ファイルなどで構成されます。これらのいずれかのエラーはバグを引き起こす可能性があるため、CI はできるだけ多くのエラーを実行するように努める必要があります。

CI は適切な QA 規律に代わるものではありません。また、CI はプロジェクト初日にはそれほど包括的である必要はありません。最初に基本的なコンパイルと単体テストを行う単純な CI プロセスから始めることができます。QA でさらに多くのクラスのバグを発見したら、CI プロセスを適応させて、今後発生するそれらのバグを捕捉する必要があります。また、静的コード分析チェックを含めることもできるため、コードベース全体で一貫したコーディングと理想的な設計を実装できます。

優れた CI ビルド プロセスは、QA まで自動化され、そこから手動で行われる場合、十分に優れていますか?

「手動」デプロイメントは、デプロイメント エンジニアの役割を持つ人が、デプロイメント後に問題が発生する可能性があるという懸念がある場合に使用されると思います。彼は導入ツールの信頼性と安定性に自信がありません。

この機能は、本番環境に似た環境で自動デプロイメント プロセス テストを行うことで解決できます。また、デプロイメント後にロールバック メカニズムをテストする必要があります。

この機能が十分にテストされると、使用するこのプロセスとツールに自信が持てるようになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top