テスト環境で継続的な統合に起因する不安定性を回避する方法は?


19

ターゲット環境を頻繁に更新する継続的統合プロセスを使用しているため、「変更」があるたびに「すぐに」変更をテストできます。それはCIの目標の一部ですよね?

ただし、管理者や顧客など、テストサイクルに関係する他の人もいると仮定します。他の人にあなたの今後の変更をレビュー(破壊?)させようとするのは理にかなっていますよね?

しかし、他の人々が真剣にテストしようとしている環境で継続的に変更を提供続けると、次のような複数の問題が発生する可能性があります。

  • they 問題を報告するのに時間を浪費する可能性があり、(詳細な)レポートを保存するまでに、問題を自分で再現することさえできなくなります(たとえば、誤って同じ問題に遭遇し、環境で既に修正しているため)。
  • you 何らかの問題に遭遇した環境はもはや同一ではないため、彼らが報告した問題を再現できない可能性があります(あなた(!!!)が環境をオーバーレイした可能性があります)。

それで、あなたはそのような(イライラする)状況を避けるために何をすることができますか(物事を構成する方法?)

回答:


10

主にいくつかの答えが必ずしも当てはまらない理由を示しているので、これに関する私の経験をお伝えします。

開始するコンテキスト:

  • およそ80のアプリケーションをホストする7つの環境があり、それらのほとんどは、db2-iSeriesのWebサービスまたは共有テーブルを介して相互に依存しています。
  • 良い面も悪い面も、iSeriesはDBのリファレンスシステムです。
  • この最後の点は、それぞれにAS400を起動するとコストがかかりすぎて、とにかくそれを実行するためのハードウェアがないため、隔離された環境でアプリをその依存関係とともに持ち込むという考えを無効にします。

私たちがやっていることは完全な自動化された継続的デリバリーではなく、一般的な運用のために一貫した多くのアプリケーションを立ち上げるためのリリースのスケジュールがあります。これとは別に、各テストチームは、テストしているアプリケーションのQ / A環境の1つでリリースをトリガーし、特定のアプリケーションバージョンをロックして、別のチームリクエストがテストを中断しないようにすることができます。

アプリケーションの依存関係はリリース前にチェックされるため、他のアプリケーションを更新できない場合、または必要な依存関係と一致しない場合、システムは何かをリリースしません。主なアイデアは、誰かに影響が及ばないときに更新を許可することです。テストが計画されていない場合は、以前の環境から流れる必要がありますこの「オンデマンド」メソッドシステムを検証しました)。

短いバージョンでは、環境内のアプリケーションの周りに「セマフォ」システムがあります。チームは、手動テストの間、その依存関係(および推移的な依存関係)でターゲットアプリケーションをロックできる必要があります。
このセマフォの実装は、オートメーションシステムに大きく依存しているため、これについては説明しません。

もちろん、他の人が言ったように、簡単な方法は、上記のセマフォを回避するために、すべての依存関係を持つアプリケーションの新しい環境を作成することです。


この答えは私が慣れ親しんだもの(メインフレーム)のバリエーションで、少なくとも15年ほど(「DevOps」が生まれる前に)すでにこのようなことをしています。ここに自分の答えを追加するのが理にかなっているのか(この答えをさらに拡張するため、たとえば「銀行」のCMN / ZMFでこれを行う方法)、それとも新しい(自己回答の)質問に持っていくのが理にかなっています。どう思いますか?また、私はそのメタフォアの事に興味があり、新しい質問の価値があります(この答えを参照して)?PS:誤字を訂正しても構いませんか?
Pierre.Vriens

編集には問題ありません:)私はそれを一般的なものにしました、それはdevops org IMHOにあまり特有ではありません。再びDevOpsチームは...懸念を共有することで、より良い自動化を設定するに役立つ可能性がある、組織の変化であり、私はプログラム書き込みのようにセマフォこれを呼び出すので、私は質問、それは価値があるとは思わないが、それはあなた次第です
Tensibai

OK、編集が完了しました(通常どおり:ロールバック/必要に応じて改善します)。ところで、キーボードに「s」はありますか?!?!?!それとは別に:週末に考えるべきこと:私の最新のメタ質問をご覧ください... ここでのガーデニングの時間(剪定...)
Pierre.Vriens

8

すべてのテスト実行で確実に再初期化されることなく、常に再利用されるテスト環境について話しているように聞こえます。これにより、このようなテストは信頼できなくなります。同様に、信頼性の観点から、必要に応じて手動テストを行います。

私見では、あなたは、このようなテストを使用すべきではないの内側に効果的に(その領域に少なくとも)あなたの認定プロセスを無効にすると、あなたのCI / CD資格の目的。提供されたソフトウェアバージョンごとに実際にテストXを実行せずに、またはpass得られた結果が(誤検出による)偶然でないことを確信せずに、ソフトウェアがテストXに合格すると、テストの信頼レベルが低下します。偽陰性は信頼性を損なうものではありませんが、不必要な「ノイズ」が発生するため望ましくありません。

CI / CD認定プロセスの外部でこのようなテストを実行することは問題ありません。ただし、このようなテストで失敗した結果は、顧客が発見したバグのように扱うことになります。問題の修正を開発し、修正が機能していることを確認するには、問題を確実に再現する必要があります。そして、テストが信頼できない場合、あなたは本当にそれをすることはできません。

問題に対処することを計画している場合、理想的には、問題を再現するための自動化された信頼できるテストケースを最初に開発します。修正の開発とその有効性の確認に使用します(テスト結果はFAILからPASSに移行する必要があります)。また、このテストケースをCI / CD認定プロセス内に配置して、必要に応じて将来の再発を防ぐこともできます。これにより、ソフトウェアリリース全体の品質レベルが向上します。


あなたの答えには多くのことを消化する必要があります(すでに完全に理解できているかどうかはわかりません)。しかし、「CI / CD認定プロセスの外側でこのようなテストを実行することについて書いたもの:生産/配信されるものの最終結果は、QAおよびprod環境(CD、自動または手動)に保存されると思います。しかし、それはまた、CIがその出力をそこに提供するべきであると私には思われますが、「外部」は分離または複製または何かのように見えますか?
Pierre.Vriens

参照はCIの検証ループを基準にしています。基本的に、QA環境が存在する理由を疑問視します。そこで行われるテストのほとんどは信頼性が高く、特に継続的な展開コンテキストでCI検証の一部として実行される必要があります。とにかく少なくともその時点まで)。insideoutside
ダンコルニレスク

7

通常のアプローチは、さまざまな環境を作成することです。

DEV-これは開発チームが物事を台無しにする場所です。すべての変更チューニングの作成、新しいバージョンのデプロイなどがあります。CIが完全に統合される場所は次のとおりです。

PREPROD / QA-これは、QA /テスト/検証チームがテストを行う「プレイ」場所です。通常、この環境はテスト中にフリーズします。CIとこの環境の統合は、製品の新しいバージョン、構成などを提供することのみです。

生産-説明する必要があります:)?


わかりました、それは安定性を改善するのに役立つはずです!私の質問は「テスト」環境に関するものであるため、明らかに「本番」をそのように考えるべきではありません。テストに「本番」を使用している人もいますが、「最高のテストは本番でアクティブにすることです。それが機能しない場合は、単にロールバック/バックアウトを実行してください!
Pierre.Vriens

@ Pierre.Vriens、prod IMHOで「遊ぶ」ことは賢明ではありません:)このような環境の分離は意図的です。前の仕事では、5つの異なる環境がありました。...投票サービス
Romeo

1
「私」はそのような演奏が賢明ではないことに同意します。しかし、これを何度も繰り返し続けるカウボーイ(私の「ターム」をこのようなジャッピーに使う)について「あなた」ができること、そして毎月のリリースアクティベーションを回避するためにマネージャーから承認を得るたびに、さらに別のバグ修正によって(たとえば、前日からのバグ修正...新しいバグが導入されたため)。それは現実の世界では起こらないと思いますか?ところで、あなたの答えの「フリーズ」については、「フリーズされた環境のサンプル実装は何ですか?」のような質問を投稿することは理にかなっていると思います。
Pierre.Vriens

@ Pierre.Vriens、私にとっては、そのような質問を投稿することは完全に理にかなっています。通常、これは社内規則によって規制されているが、DevOpsチームは非常にダイナミックな環境を作成し、これが本当の挑戦:)再することができます
ロメオNinov

1
これは私の好みのアプローチ、それは開発者がすぐに統合された環境でその変更をテストできる環境を与えるそのようにですが、QAは、コードが正式にテストする準備ができるまでクリーンに保つ
Taegost

3

CI / CDを実行している場合、展開(CD)の前にいくつかの自動テスト(CI)が行われていることを意味します。テスト環境で多くの問題を発見している場合、それは展開前に実行されているテストに捕らえられていないことを意味します。これは、自動テストが不十分であることを示しています。開発者がテスト環境で欠陥が発生するという問題がある場合、これを防ぐために自動テストスイートを改善する必要があります。これにより、全体的な品質と信頼性も向上し、生産に至るまでずっと続きます。


3

Romeo Ninovの答えに追加するには、環境内で可能な限りアプリケーションを分離する必要があります。これが、dockerが開発/テストで非常に成功した理由の一部です。環境をまったく共有していないというふりをしましょう。

もう1つのオプションは、アプリケーションを実行するサーバーを非常に明確に定義し、環境を構成する他のインフラストラクチャとは別にすることです。すなわち。すべての環境管理または使用可能化機構は、別個の長寿命サーバー上にあります。次に、既知のイメージに基づいて新しい短命のサーバーをフックしてアプリケーションをテストし、ベースイメージに変更が加えられた場合、すべての新しいコンポーネントのすべての場所にそれらの変更を適用する必要があります。つまり、すべてに対して変更をテストします。

appdevチームが他の誰かのアプリケーションを破壊する変更を要求し、それが困難な場合、彼らはコード内で緩和策を内部的に作成し、特定の要件を環境提供とは別に保つ必要があります。


興味深い視点/追加、ただしそこにはいくつかのことがありますが、おそらく洗練/修正したいものがあります:(1)このコンテキストでの「アプリケーション」、あなたは何を意味しますか(例)? (古き良き)メインフレーム環境(3)ここでのこの文脈での「移民」とは何ですか?PS:これらの「もの」(箇条書き)のいずれかについて新しい質問を作成する必要があると思われる場合はお知らせください。
Pierre.Vriens
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.