継続的インテグレーションの簡単な説明


32

継続的インテグレーションをどのように定義し、CIサーバーにはどのような特定のコンポーネントが含まれますか?

マーケティング部門の誰かに継続的インテグレーションとは何かを説明したいと思います。彼らはソース管理を理解しています-つまり、Subversionを使用しています。しかし、私は彼らにCIが何であるかを適切に説明したいと思います。ウィキペディアの記事は、それを適切に定義することはありません、Martin Fowler氏の記事は、のみ基本的に「統合」のあいまいな説明に続いてトートロジーである、次のようになります:

継続的インテグレーションは、チームのメンバーが頻繁に作業を統合するソフトウェア開発プラクティスです。通常、各ユーザーは少なくとも毎日統合し、1日に複数の統合を行います。統合エラーを可能な限り迅速に検出するために、各統合は自動ビルド(テストを含む)によって検証されます。

更新:私は彼らにこの画像を送った、私はより簡単なものを見つけることができなかった。

ここに画像の説明を入力してください

更新2:マーケティングチャップからフィードバック(質問が3つあったとき):

私は実際には3つの回答すべてが好きです。理由はさまざまです。それらすべてに感謝するためだけにログインしたい気がします!

明らかに彼はできません-だから彼に代わってありがとう:)

更新3:ウィキペディアの記事を見て、見出しだけを取り上げると非常に良いリストである原則が含まれていることに気付きました。

  1. コードリポジトリを維持する
  2. ビルドを自動化する
  3. ビルドを自己テストする
  4. 誰もが毎日ベースラインにコミットします
  5. (ベースラインへの)すべてのコミットを構築する必要があります
  6. ビルドを高速に保つ
  7. 実稼働環境のクローンでテストする
  8. 最新の成果物を簡単に入手できるようにする
  9. 誰でも最新のビルドの結果を見ることができます
  10. 展開を自動化する

3
oOマーケティング部門はSubversionを使用していますか?「あまりにもローカライズされた」として閉会するように誘惑された... ;
Jeroen

@Jeroen Yep、本当に、ウェブサイト上のファイルのために。サーバー上のSubversionを更新するために「Do it」と書かれたWebページ上の素敵で大きな赤いボタンにしました。:)
icc97

回答:


27

誰かがソフトウェア製品を構成するファイルを変更してからチェックインしようとすると(言い換えれば、変更をメイン製品コードに統合しようとすると)、ソフトウェア製品が引き続き正常にビルドできることを確認する必要があります。

通常、CIサーバーと呼ばれる外部システムがあり、定期的または変更ごとに、バージョン管理からソースファイルを取得し、製品(コンパイル/テスト/パッケージ)のビルドを試みます。CIサーバーがビルドを正常に実行できる場合、変更は正常に統合されています。

ビルドが失敗または成功した場合、CIサーバーもブロードキャストできる必要があるため、Jenkins(現在最も使用されているCIサーバーの1つ)などのシステムには、電子メール/テキストとダッシュボードのようなWebインターフェイスを現在および過去のビルド、コードをチェックインした人、問題が発生した日時などに関する情報の束(上記の画像では、これがフィードバックメカニズムになります)

CIが重要なのは、それが継続的に機能する製品を確保するためです。これは、ソフトウェア製品に取り組んでいるすべての開発者と、QAなどのソフトウェア製品の毎日のリリースにアクセスしたいすべての人々にとって重要です。


1
継続的インテグレーションは、ビルドステータスだけでなく、テストも考慮します。
クエンティンプラデ

1
展開、テストのコンパイル、実行には不十分ですが、バイナリを環境に出荷して、人(または自動化ツール)でもテストできるようにする必要があります。
gbjbaanb

1
質問では簡単な説明が求められたため、CIシステムに含まれる可能性のある多くの(ほとんどの場合、プロジェクト/チーム固有の)詳細は省略しました。
c_maker

これはテスト駆動開発に依存していますか?コンパイルするコードは、常に正しく機能するコードではありませんか?コードの準備ができていないときにテストが失敗しない場合、CIシステムはコードが実際に正常に統合されたかどうかをどのように知るのでしょうか?
mowwwalker

1
@ user828584:私の答えでは、「テスト」はビルドの一部であることを意味します。補足として、TDDは品質をチェックするテストを行うこととは異なります。TDDの副作用として、テストが適切に記述されますが、TDDをまったく実行せずにテストを実行できます。
c_maker

33

あなたのマーケティング部門にとって、CIどのように機能するかは重要ではありませんが、ソフトウェアの新しいリリースにとってCIが意味することです

CIは、理想的には、リリース可能なソフトウェアの新しいバージョンを毎日作成し、顧客に提示または販売する準備を整え、新しい機能、機能、またはバグ修正を追加できることを意味します。これは、新しいバージョンを毎日提供する必要があるという意味ではありませんが、必要に応じて提供できます。

たとえば、ソフトウェアの「2015」バージョン用に正式にリリースされる予定の新しい機能セットがあり、その機能セットの一部がすでにコード化され統合されている場合、マーケティング担当者は現在のバージョンを使用できますCIがなければ、チームは計画外のコードフリーズをチームに依頼する必要がありました。すべてのチームメンバーは、自分が取り組んでいる中途半端な機能を統合する必要がありました。製品、彼らは十分な自動テストの準備ができていない可能性があり、会議で何が起こるかを推測-2015erリリースの「アルファ版」は、特に新しい機能が実証されている場合、クラッシュするリスクがはるかに高くなります。


4
提供する利益の観点からアプローチするための+1。
突く

17

私たちが何をしていたかを知らなければ、CIが何であるかを知ることはできません。3つの部分からなるシステムを想像してください。データを収集してデータベースに入れるUIがあります。データベースからレポートを作成するレポートシステムがあります。また、データベースを監視し、特定の条件が満たされた場合に電子メールアラートを送信するサーバーがあります。

昔は、これは次のように書かれていました。

  1. データベースのスキーマと要件に同意します-すぐに理由がわかるように完璧でなければならないため、これには数週間かかります
  2. 3つの開発者、または3つの独立した開発者チームを3つのピースに割り当てます
  3. 各開発者は自分の作品に取り組み、数週間または数か月間、独自のデータベースコピーを使用して作品をテストします。

この間、開発者はお互いのコードを実行したり、他の人のコードによって作成されたデータベースのバージョンを使用しようとはしませんでした。レポート作成者は、大量のサンプルデータを手で追加するだけです。アラートライターは、レポートイベントをシミュレートしたレコードを手で追加します。そして、GUI作成者はデータベースを見て、GUIが追加した内容を確認します。時間が経つにつれて、開発者は、インデックスを指定しない、フィールド長が短すぎるなど、何らかの方法で仕様が間違っていることに気付き、バージョンでそれを「修正」しました。彼らは他の人に伝えるかもしれません、誰がそれに基づいて行動するかもしれませんが、通常これらのことは後でリストに載るでしょう。

3つの部分すべてが完全にコーディングされ、開発者によってテストされ、場合によってはユーザー(テスト、画面、または電子メールアラートを表示)によってもテストされると、「統合」フェーズになります。これは多くの場合、数か月で予算化されましたが、それでもまだ行き渡っています。dev 1によるそのフィールドの長さの変化はここで発見され、dev 2と3が大きなコード変更とおそらくUI変更も行う必要があります。その余分なインデックスはそれ自身の大混乱をもたらすでしょう。等々。開発者の1人がユーザーからフィールドを追加するように指示された場合、他の2人もフィールドを追加する必要があります。

この段階はひどく痛みを伴い、予測することはほとんど不可能でした。そのため、人々は「もっと頻繁に統合する必要がある」と言い始めました。「最初から一緒に仕事をしなければなりません。」「私たちの1人が変更要求を提起するとき(それが私たちの話し方です)、他の人はそれについて知る必要があります。」一部のチームは、個別に作業を続けながら、以前に統合テストを開始しました。また、一部のチームは、最初からお互いのコードを使用し、常に出力し始めました。そして、それが継続的インテグレーションになりました。

あなたは私がその最初の物語を誇張していると思うかもしれません。ある会社で仕事をしたことがありますが、次の欠陥に悩まされていたコードをチェックインするために連絡先が私をかみ砕きました。

  • 彼が取り組んでいない画面にはまだ何もしないボタンがありました
  • 画面デザインでサインオフしたユーザーはいません(正確な色とフォント、画面の存在、その機能、300ページ仕様にあったボタン)。

それが完了するまでソース管理に物を入れないという彼の意見でした。彼は通常、1年に1つまたは2つのチェックインを行いました。少し哲学的な違いがありました:-)

また、データベースのような共有リソースの周りでチームが切断されると信じるのが難しいと感じた場合、コードに対して同じアプローチが取られたとは本当に信じられません(しかし本当です)。あなたは私が呼び出すことができる関数を書くつもりですか?それは素晴らしい、先に行って、それを行う、私はちょうど私がその間に必要なものをハードコーディングします。数ヶ月後、コードを「統合」してAPIを呼び出します。nullを渡すと爆破し、nullを返すと爆破することを発見します(そして、それは多くのことを行います)。私にとっては、うるう年や他の何千ものものを扱うことはできません。独立して作業し、その後統合フェーズを持つことは正常でした。今では狂気のように聞こえます。


2
SP 2003で構築されたカスタムアプリケーションをSP 2007にアップグレードした同様の話がありました。VSS(はい、VSS :)を使用して、各開発者はファイルの一部をチェックアウトし、1私たちのコード、ブーム、私たちのコードが大きく逸脱してから問題が始まったとき。統合の問題を1か月間修正し、このプロジェクトでは、平日の遠方に住む人々に対応するためにホテルを借りました。その日、私は毎日コードを統合することを学びました:-)
OnesimusUnbound

@OnesimusUnbound VSSからClearcaseにぶつかったことを覚えています。数年後、同じ会社に飲みに戻った後、「Git」と呼ばれるこの新しいソース管理について「他のソース管理システムは何のために必要ですか?」
icc97

1
ありがとう-私は代替が何であったか知らなかったので、私は単に前にCIを理解することがstruggedました
リス・

面白い。私にとって、これはCIとウォーターフォールを比較するようなものです。ただし、CIを使用せずに、これらの問題(反復開発など)を回避する非ウォーターフォール手法を使用できます。
ダンモールディング

@DanMoulding私が機敏で反復的であり、他の誰かがやっていることと統合されていないより大きな部分の私の部分で何でもない場合、私はCIをやっていない。ちなみに、滝とCIができます。すべてを設計し、すべてをコーディングし、必要に応じてすべてをテストします。誰もが他の全員のコード/スキーマ/ファイルレイアウトを常に使用している場合、ウォーターフォールを使用していてもCIです。接続は、CIなしではBDUFで生きて死ぬということです。なぜなら、それが合理的な長さの統合フェーズを持つことのあなたの唯一の希望(そして、それはかすかな希望であることが判明するからです)。CIの採用により、BDUFを手放すことができました。
ケイトグレゴリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.