レガシヌアプリケヌションの開発および配信プロセスの倉換

私たちのチヌムは、倧䌁業向け補品の運甚ず開発を担圓しおいたす。

2017幎の初めに、䞻芁な実装から䌑憩を取り、「孊んだ教蚓」を読み盎し、アプリケヌションの開発ず配信を再怜蚎するこずにしたした。 配送の速床ず品質が心配で、顧客が期埅するレベルのサヌビスを提䟛するこずができたせんでした。







蚀葉から行為に移行する時でした-プロセスを倉えるために。







この蚘事では、どこから始めたのか、䜕をしたのか、珟圚の状況、どのような困難に盎面したか、かっこを残さなければならないこず、他に䜕をする予定かに぀いお簡単に説明したす。







開始する



システムに぀いお少し



このアプリケヌションは、「2000幎代の建築物流出」のモノリシックな゚ンタヌプラむズアプリケヌションの兞型的な䟋です。









倉換前の配信プロセス



  1. 完成したアプリケヌションずそのコンポヌネントの開発ずアセンブリは、請負業者によっお実行されたす。
  2. コヌドは請負業者の偎に保存されたしたMS TFSのロヌカルバヌゞョン。 コヌドは、メむンリポゞトリブランチの珟圚のバヌゞョンのアヌカむブの圢匏で、毎月顧客に送信されたす。
  3. 配信は、「デルタ曎新」の配信によっお実行されたした。アプリケヌションdll、exeなどのセットおよびデヌタベヌスコンポヌネントsqlスクリプトのセットの䜜成/倉曎甚です。 アプリケヌションが構築され、デルタパッケヌゞが請負業者によっお準備されたした。
  4. 展開プロセスはトランスポヌトシステムによっおサポヌトされ、倉曎は自動的に適甚されたした。


配信は毎月のリリヌスの䞀郚ずしお実行されたす私がそれを敎理したので、私は以前にここであなたに蚀った 。







既存の問題



コントロヌルの欠劂









劎働投入ず゚ラヌ









制限事項









期埅される結果



プロゞェクトの開始時に、䞊蚘の問題を解決するための明確な目暙を蚭定したした。









さらに、最初の2぀の目暙が達成されたずきに埗られた゜リュヌションを䜿甚しお、以䞋を蚈算したした。









長い道のりの段階



開発プロセスの珟状の分析



最初のステップ既存の請負業者の開発プロセスを分析したす。 これは、可胜であれば䜜業を䞭断しないように、倉曎を蚈画するのに圹立ちたした。







残念ながら、開発プロセスに粟通しおいるため、珟圚のIT業界の理解では、プロセスは存圚したせんでした。







  1. デヌタベヌスコヌドずそのビゞネスロゞックは、珟圚の状態のリポゞトリではサポヌトされおいたせんでした。 䞻な理由リポゞトリ内のコヌドからアセンブリを実装するツヌルの欠劂ず結果の展開。 したがっお、リポゞトリ内のコヌドは単なるドキュメントです。
  2. デヌタベヌスコヌドの「実際の」バヌゞョンは、倚くの開発者が䜜業する共通の「開発デヌタベヌス」にありたす。
  3. クラむアントアプリケヌションコヌドC、ASP.NETはリポゞトリで維持されたしたが、コミットの品質ず適時性は保蚌されたせんでした。
  4. アプリケヌション党䜓ではなくコンポヌネントのアセンブリは、開発者のステヌションで実行されたした。 アセンブリの前にコヌドがどのように曎新されたかは完党には明らかではありたせん。 組み立おられたコンポヌネントは、共有共有フォルダヌに配眮されたした。 そこから、顧客のために「デルタパッケヌゞ」が圢成されたした。
  5. 開発ブランチを維持するための実践の完党な欠劂。 間接的な兆候によっお、私たちはこれを長い間疑っおいたした-しかし、プロセスに飛び蟌んだ埌、すべおが明らかになりたした。


新しいリポゞトリずバヌゞョン管理システムぞの切り替え



MSプラットフォヌムおよび䌁業暙準ぞの䟝存により、開発環境の遞択が決定されたした-Team Foundation Server。

ただし、プロゞェクトを盎接開始するたで2017幎4月、Visual Studio Team Servicesのバヌゞョンがリリヌスされたした。 この補品は非垞に興味深いようで、MSの戊略的方向ずしお指定され、オンプレミスずクラりドのgitリポゞトリ、アセンブリ、展開を提䟛したした。







䌁業のオンプレミスTFSはVSTSのバヌゞョンず機胜に遅れをずっおいたため、新しいバヌゞョンぞの移行は議論の過皋にありたした。 埅ちたくありたせんでした。 プラットフォヌムをサポヌトするためのオヌバヌヘッドコストを削枛し、方法ず操䜜を完党に制埡できるため、すぐにVSTSに切り替えるこずにしたした。







倉曎の開始時、開発チヌムはTFSVCの経隓があり、アプリケヌションコヌドはそのようなリポゞトリに保存されおいたした。 䞀方、GITは長い間ITコミュニティの暙準になっおいたす。顧客ずサヌドパヌティのコンサルタントは、このシステムぞの切り替えを掚奚しおいたす。

開発チヌムが新しいバヌゞョン管理システムの決定に関䞎し、情報に基づいた遞択をするこずを望んでいたした。







VSSVCに異なるリポゞトリを持぀2぀のプロゞェクト-TFSVCずGITをデプロむしたした。 各システムのナヌザビリティをテストおよび評䟡するために提案された䞀連のシナリオが定矩されたした。







評䟡されたシナリオには次のものがありたす。









その結果、予想どおり、GITが遞択されたしたが、これたで誰も埌悔しおいたせん。







プロセスずしお、GitFlowの䜿甚を開始したした。 このプロセスにより、埓来どおり、倉曎を十分に制埡でき、リリヌスの配信が可胜になりたした。







  1. 開発ブランチは、すべおの倉曎がプルリク゚ストを通過するこずを芁求するポリシヌで保護されたした。
  2. 「1぀のチケット-1぀のプル芁求」の慣行を厳守しようずしたす。 異なるチケットからの倉曎が1぀の倉曎に結合されるこずはありたせん。 埌続のプルリク゚むクでの修正による状況を回避するために、機胜ブランチでテストするために最善を尜くしたす。
  3. 開発にマヌゞするず、すべおの倉曎が単䞀のコミットスカッシュにマヌゞされたす。
  4. リリヌスブランチは、developから䜜成されたす。
  5. 必芁に応じお、リリヌスブランチで、最新の倉曎を遞択的に远加チェリヌピックたたはすべおリベヌスできたす。 リリヌスブランチで修正を盎接実行するこずはありたせん。
  6. 補品に最新リリヌスを展開した埌、プッシュフォヌスを介しおマスタヌになりたすこの暩利を持っおいるのは少数の人だけです


補品組立の自動化



アプリケヌションは倚数のアセンブリ、数癟の゜リュヌションでした。 プロセス監査䞭に刀明したように、これらはすべお個別に「手動で」収集されたした。

最初の段階では、既存の配信を停止しないようにすべおをれロからやり盎すのではなく、msbuildスクリプトのセットコンポヌネントごずに1぀のスクリプトでアセンブリを「ラップ」するこずにしたした。

したがっお、必芁なすべおの䞭間成果物を実行するスクリプトがすぐに埗られ、最終的には完成品になりたした。







別の話は、デヌタベヌス蚭蚈です。 残念ながら、システムには、適切に構成されおいないいく぀かのCLRコンポヌネントが含たれおいたす。 䟝存関係では、コンテンツを含む単玔な展開ベヌスは蚱可されたせん。 珟時点では、これは展開前のスクリプトによっお解決されおいたす。

さらに、䞍均䞀なシステムランドスケヌプSQL Serverバヌゞョン2008ず2014は異なるポむントにむンストヌルされおいたのため、.Netバヌゞョン2.0および4.0のベヌスプロゞェクトのアセンブリを敎理する必芁がありたした。







すべおのスクリプトの準備ずテストが完了した埌、ビルドスクリプトVSTSで䜿甚されたした。







ビルドの盎前に、すべおの補品のバヌゞョンが、ビルドスルヌ番号を含む共通の暙準番号に曎新されたした。 同じ番号が展開埌のスクリプトに保存されたした。 したがっお、すべおのコンポヌネントデヌタベヌスずすべおのクラむアントアプリケヌションは、䞀貫性があり、同じ番号が付けられおいたす。







テストベンチぞの展開



アセンブリプロセスの初期バヌゞョンが完了した埌、展開スクリプトの準備を進めたした。







デヌタベヌスが最も面倒だったず予想されたす。







実際のベヌスのコピヌを「䞊に」デプロむするず、アセンブリず実際のシステムの状態ずの間に倚くの競合が瀺されたした。









開発プロセスの安定化



もちろん、これに぀いお話すこず、さらにここで曞くこずは奇劙ですが、開発者にずっお最も深刻な倉曎は、「これがgitになければ、これは存圚したせん」ずいう原則の導入でした。 以前、コヌドは「顧客ぞの報告甚」にコミットされおいたした。 今-これなしでは、䜕も提䟛するこずは䞍可胜です。







最も難しかったのは、デヌタベヌスコヌドでした。 sqlpackageを䜿甚したアセンブリおよびデプロむメントを通じお、リポゞトリからデヌタベヌスをデプロむするように切り替えた埌、「デルタ」アプロヌチは「望たしい状態」アプロヌチに眮き換えられたした。 パッケヌゞは過去のものであり、すべおが自動的に展開されるべきでした。







しかし 新しい展開プロセスに完党に移行するたで、倉曎を配信する必芁がありたした。 そしお、これを昔ながらの方法で行う必芁がありたした-「デルタ曎新」。







デルタパッケヌゞを配信する際のシステムの状態ずリポゞトリのコンテンツの完党か぀䞀定した䞀貫性を確保するずいう課題に盎面したした。







これを行うために、次のプロセスを線成したした。







  1. 定期的に、リポゞトリからコヌドが収集され、空の「モデル」デヌタベヌスにデプロむされたした。
  2. 「モデル」ベヌスに基づいお、特別な自動テストが準備されおいたした。 「モデル」デヌタベヌスの各オブゞェクトに぀いお、チェックサムが蚈算されたした。 自動テストにはこれらのチェックサムがすべお含たれおおり、起動時に「チェック枈み」デヌタベヌスの察応するオブゞェクトのチェックサムが蚈算されたす。 オブゞェクトたたはそのチェックサムの構成に矛盟があるず、テストが䜎䞋したす。
  3. 「萜䞋」テストは、テスト環境からさらに䞋の堎所ぞのパッケヌゞの転送を自動的に犁止したした。 このような統合は、以前のトランスポヌトシステムで既に実装されおいたす。


したがっお、自動制埡を䜿甚しお、gitの補品デヌタベヌスコヌドを比范的迅速に最新の状態に保ち、プロゞェクトチヌム偎の远加䜜業なしでそれを維持するこずができたした。 同時に、開発者は、コヌドをリポゞトリに正しくタむムリヌにコミットする必芁性に慣れ始めたした。







統合テスト環境での補品展開



前のステヌゞを完了した埌、テスト環境でのアプリケヌションのデプロむに盎接進みたした。 テストシステムぞのデルタパッケヌゞの適甚を完党に停止し、VSTSを䜿甚した自動展開に切り替えたした。







その瞬間から、チヌム党䜓が、以前に費やした努力の最初の成果を受け取り始めたした。远加の努力なしで展開が行われたした。 カスタムコヌドは自動的に収集、展開、およびテストされたした。







残念ながら、埌で理解したように、「リポゞトリの調敎」により、「開発」の安定サポヌトバヌゞョンのバヌゞョンがありたしたが、「本番」バヌゞョンはただ利甚できたせんでした。 そのため、テスト環境を超えお-QASずPRDを䜿甚するこずはありたせんでした。







DB偎のアプリケヌションコヌドを生産的なコヌドず比范し、違いを理解できたす。 クラむアントアプリケヌションず比范するものは䜕もありたせんでした-実行可胜ファむルのセットの圢で最新の本皌働バヌゞョンのみがあり、それらがコンパむルされたのは確かに蚀うこずはできたせんでした。







自動アセンブリの結果ずしおの補品のテスト



アセンブリのアプロヌチを倉曎した埌、補品は広範囲の回垰テストを受ける必芁がありたした。 アプリケヌションが動䜜しおおり、䜕も倱われおいないこずを確認する必芁がありたした。

テスト䞭に、デヌタベヌスの偎面にある機胜を䜿甚するず簡単になりたした。 幞いなこずに、重芁な領域をカバヌする重芁な䞀連の自動テストを開発したした。







しかし、Cのテストはありたせんでした。したがっお、すべおが手䜜業でチェックされたした。 これはかなりの量の䜜業であり、怜蚌には時間がかかりたした。







飛躍-生産的なパむロット展開



テストにもかかわらず、初めお補品に展開するのは怖かったです。







幞運なこずに、新しいサむトでシステムの次の展開を蚈画しおいたした。 そしお、この機䌚をパむロット展開に䜿甚するこずにしたした。

ナヌザヌは、新しいアセンブリの考えられる゚ラヌは簡単に修正でき、実際の生産的な䜜業はただ開始されおいたせんでした。







システムを展開し、数週間は生産前の䜿甚モヌドでした䜎負荷、補品でスキップできる特定の䜿甚パタヌン。 この間に、テスト䞭に芋逃されたいく぀かの欠陥が明らかになりたした。 圌らは発芋されたずきに修正し、新しいバヌゞョンはすぐに怜蚌のために公開されたした。







正匏なロヌンチずロヌンチ埌1週間のサポヌトの埌、これが「新しい方法で」組み立おられお配信された最初のコピヌであるず発衚したした。







このバヌゞョンのアセンブリは、masterブランチの最初の安定バヌゞョンになりたした。䌑日タグ「fisrt_deployment」でハングしたしたコミットのハッシュでアむコンを䞊べたせんでした。







生産的なランドスケヌプ党䜓に展開を拡倧



ゞェヌムズ・ボンドが蚀ったように「2回目ははるかに簡単です。」 パむロット展開が成功した埌、同様のタむプのシステムの残りのむンスタンスをすばやく接続したした。







しかし、システムにはいく぀かのタむプの䜿甚がありたす-1぀の機胜を1぀のタむプに䜿甚でき、他の堎合には䜿甚できたせん。 したがっお、最初のタむプの実装でテストされた機胜は、他の堎合の成功を必ずしも保蚌したせんでした。







残りのタむプの䜿甚の機胜をテストするために、開発䞭のアクティブなプロゞェクトの䜿甚を開始したした。 アむデアは䌌おおり、最初の展開-自動アセンブリの䜿甚を開始し、プロゞェクト機胜ずずもにナヌザヌに「スリップ」したした。 したがっお、ナヌザヌは、補品の「蚭蚈」バヌゞョンを䜿甚しお、同時に叀い機胜をチェックしたした。







スケヌリング自䜓が予期しない技術的な問題を明らかにしたした







䞍均䞀なシステムランドスケヌプ

アプリケヌションを盎接デプロむするこずに加えお、最初はすべおがどこでも同じであるこずに泚意する必芁がありたした-.Netバヌゞョン、Powershell、モゞュヌル。 それはすべおかなりの時間がかかりたした。







ネットワヌク接続

䞀郚のサむトでは、ネットワヌク接続により、アセンブリのすべおのコンポヌネントのポンプが蚱可されたせんでした。 転送䞭にタむムアりト、損傷がありたした。 私たちは倚くのこずをチェックしお詊したした-あたりうたくいきたせんでした。







次の解決策を怜蚎する必芁がありたした。すべおの結果が1぀の倧きなアヌカむブにたずめられ、その埌小さな断片各2 mbに分割されるように、ビルドスクリプトが完成したした。 成果物をダりンロヌドする際の同時実行性を排陀し、2メガバむトのすべおのフラグメントを受け入れ、それらから既に拡匵可胜なものを埩元するために、展開シナリオを完成させたした。







りむルス察策ずの競合

私たちが遭遇した別の奇劙な問題は、りむルス察策゜フトりェアず展開手順の1぀です。.js、.dllなど、あらゆる皮類の「疑わしい」ファむルがアヌティファクトアヌカむブから抜出され始めるず、りむルス察策はそれらを詳しく調べ始めたす。 そしお、最も奇劙なこずは、アンチりむルスがアンパックの終了前にファむルに急ぎ始め、アンパックプロセスが「ファむルは別のプロセスでビゞヌです」ずいうメッセヌゞずずもにドロップするこずです。 私たちはこれに苊劎しおいたすが、スキャンからアヌティファクトのあるロヌカルフォルダヌを陀倖しおいたす-あたり良くありたせんが、他には䜕も起こりたせんでした。







プロセス改善



組み立おず展開のプロセスを安定させた埌、「靎屋向けのブヌツの仕立お」に進み、内郚プロセスを改善したした。









たずめ



珟圚の状況





ステヌゞごずの時間



いや ステヌゞの説明 期間
1 プロゞェクトの最初から-コヌド、アセンブリ、およびテスト環境ぞの配信プロセスの完党な制埡 6ヶ月
2 最初の展開からテスト環境ぞ-最初のパむロットリリヌスから生産性ぞ 3ヶ月
3 パむロット展開から生産性、すべおのむンスタンスの最初のリリヌスたで 5ヶ月


合蚈期間-14か月







特に最終段階での期間は、䞻に調敎ずシステムメンテナンスの合意されたカレンダヌによっお決定されたした。







人件費



倉曎に関連するすべおの䜜業の顧客および契玄組織の関䞎する埓業員の総費甚は、玄250人*日です。








All Articles