開発プロセスずCIパむプラむンを構築する、たたはQAのDevOps開発者になる方法

䞎えられた

  1. Angularを前面に持぀倧芏暡なJavaプロゞェクト、
  2. 小さなチヌム〜15人によっお開発されたした。
  3. フィヌチャヌブランチのヒヌプ䞊列で玄40個を䜿甚し、
  4. gitリポゞトリ内;
  5. 開発タスクに䜿甚できるプラむベヌトAmazonクラりド内の耇数の仮想サヌバヌ。
  6. Javaに少しうんざりしおいお、プロセスのセットアップに本圓に圹立぀こずをしたい開発者。

必須です

  1. QA゚ンゞニアに、各機胜ブランチを手動たたは自動で、他の機胜を劚げない専甚スタンドでテストする機䌚を提䟛したす。


QA 宇宙船制埡コン゜ヌル

だから、アメリカのルヌツを持぀小さなスタヌトアップで働くようになりたす...

そのようなスタヌトアップはただ小さいが、有望な補品ず垂堎を埁服する倧きな蚈画がある。

そしお最初は、開発チヌムは非垞に小さい最倧10人のですが、コヌドベヌスの開発はGitHub Enterpriseの䞀般的なリポゞトリで行われ、小さな機胜の迅速な割り圓お、マスタヌからのブランチ、同じブランチマスタヌぞの機胜ブランチの迅速なリリヌスサむクル。 チヌムリヌダヌは、誰が䜕をコミットしたかを远跡するこずができ、各コミットは読み取りだけでなく、それが正しいかどうかも理解したす。 したがっお、プルリク゚ストが開かれ、開発者自身が口頭で口頭で承認するたたは拒吊するずすぐにマヌゞされたす。

コヌドベヌスの敎合性を確保するために、チヌムはナニットテストず統合テストに䟝存しおいたすが、そのうち数千がすでに蚘述されおおり、玄60のカバレッゞが提䟛されおいたす少なくずもバック゚ンドに察しお。 開発リヌダヌは、リリヌス前にマスタヌでテストのフルサむクルも実行したす。

プロセスは次のようになりたす。

COMMITS»MANUAL TESTS»リリヌス

数ヶ月が経ちたす。 スタヌトアップは掻力を瀺し、投資により最倧15人の開発チヌムを構築できたす。 ほずんどの堎合、フロント゚ンドが登堎し、゚ンドナヌザヌが芋たり䜿甚したりするファサヌドをすばやく拡倧し始めたす。 正面は䜜業䞭のケシで正面から盎接テストされ、Seleniumでいく぀かのケヌスを䜜成したすが、Seleniumはゆっくりず知られおいるため、開発リヌダヌはリリヌス前にそれらを実行する時間がありたせん。

そしお、文字通り次々ず2぀のfakapsが発生したす。

最初に、バック゚ンドの1人が誀っおマスタヌをプッシュしたす貧しい男は冷たくなり、その埌時間を費やしたしたが、それに぀いおは考えたせんでした。自分を匕っ匵りたす。

その埌、フロンティアが別のブランチで玄2か月間開発した䞻芁な機胜の1぀であり、すべおのUIテストによるず、マスタヌのマヌゞが急激に赀になり、補品党䜓の䜜業がほずんどクラッシュした埌、緑になりたす。 独自のAPIの重倧な倉曎を聞いた。 そしお、テストはそれらを捕らえるのを助けたせんでした。 それは起こりたす。 しかし、混乱。

そのため、スタヌトアップの前に、QAチヌムを蚭立するずいう問題、そしお実際には、機胜ブランチず䞀般的な開発方法論を芏埋ず連携させるためのルヌルが完党に提起されおいたす。 たた、プルリク゚ストの前のコヌドは、開発リヌダヌすでにやるべきこずがたくさんありたすだけでなく、他の同僚もレビュヌする必芁があるこずが明らかになりたす。 䞀般的な成長の問題。

そこで、「 Given 」ずいうポむントに至りたした。

いいえ、私はビルド゚ンゞニアになる぀もりはありたせんでした。 しかし、プロゞェクトアセンブリの開発ず、コヌナヌのロヌカル開発者サヌバヌにむンストヌルされたTeamCityでの単䜓テストの実行におけるリヌドの実蚌に成功した埌、誰かがこれをバトルモヌドに蚭定する必芁がありたした。 そしお、私は機胜の間にいく぀かの自由時間を過ごしたした。

さあ、始めたしょう。

たず、AmazonクラりドでTCヘッドむンスタンス+ 2぀の無料゚ヌゞェントをセットアップし、それらを切断しおGihabaリポゞトリでコミットをリッスンしたす仮想PRADは各githubで仮想HEADを䜜成し、倉曎をリッスンするのは非垞に簡単です。 。 だれかがコミットするず、5分埌にアセンブリがキュヌに入りたす。 䟿利に。

COMMITS»プルリク゚スト»ビルド+テスト»リリヌス

しかし、十分ではありたせん。

圓時のgithubには、プルリク゚ストを衚瀺するための非垞に䞍快なむンタヌフェむスがあり、コメントを残すこずもできたせんでした。 それは、スクリヌンのフットクロスを浪費しなければならなかったので長すぎたす。 ぀たり、チヌムメンバヌからマヌゞする暩利を奪うこずは可胜でしたが、サヌドパヌティのサヌビスなしで通垞のコヌドレビュヌを提䟛するこずは䞍可胜でした。 さらに、機胜をタスクにアタッチし、タスクを機胜自䜓にアタッチするように、同時にJiraず統合するこずも望んでいたした。

幞いなこずに、Atlassianには同様の゜リュヌションがあり、それはBitBucket Serverず呌ばれ、圓時はStashずも呌ばれおいたした。 他のアトラシアン補品ずこの統合マゞックをすべお実行でき、コヌドレビュヌに非垞に䟿利です。 移行するこずにしたした。

しかし、この玠晎らしい補品は、githubずは異なり、すべおのPRに仮想HEADを䜜成するわけではありたせん。たた、移行埌は䜕も聞くこずができたせんでした。 コミット埌のフックも機胜したせんでした。これは、党員が適切に察凊する時間がないためです。

そのため、圓初、キャッシュずTeamCityの統合は、曲がった束葉杖によっお行われおいたした。 フックに倢䞭になった海倖の同僚は、ビルトむンREST APIを䜿甚しおプルリク゚ストを衚瀺する代わりに、垞にtail -fを䞭心に展開するログ解析を必死に行い、grepで目的のタむプの倉曎を探しおからRESTをプルしたすAPI TC。 最も論理的なアプロヌチではなく、䞀郚のビルドは2倍になり始めたしたが、䞀床は䜕ができたすか。

将来を芋据えお-時間が来たら、stash-watcher.shを人間で曞き換え、通垞のRESTを介しお倉曎を取埗し、JSONレスポンスを優れた匷力なjqナヌティリティで解析するこずができたした。 -そしお、本圓に必芁な堎合にのみTeamCityをプルしたす。 それず同時に、スクリプトをシステムデヌモンに登録しお、再起動時に起動されるようにしたした。 Amazonianむンスタンスをずきどき再起動する必芁がありたす。

パズルには2぀のピヌスがありたす。

COMMITS»プルリク゚スト»コヌドレビュヌ|| 建物ずテスト»リリヌス

この間に、QA゚ンゞニアがチヌムに登堎したした。

悪いこず 1日間、5぀の機胜ブランチをロヌカルで切り替え、それらを手動で収集しお実行したす はい、あなたは敵にこれを望みたせん!!!

私は正盎に認めたすQA゚ンゞニア特に女の子を心から愛しおいたす。 そしお、䞀般的に、私は䞀人ではありたせん。 元々単䜓テストを信じおいたニュヌペヌクの同僚でさえ、結局は圌らを愛しおいたす。 しかし、圌らは問題を挠然ず定匏化したずき、それに぀いおも知りたせんでした「あなたは私たちのクラりドのどこかで各ブランチのアプリケヌションのむンスタンスを自動的に起動できるように、そのような質問を䜕らかの方法で調査する必芁がありたす、珟圚開発䞭の機胜で䜕が起きおいるのか。 したすか」

「わかりたした」ず蚀いたしたたあ、他に誰ですかか぀おDevOpsに参加したのは最埌の人です、「ここにアむテムがありたす」 必須が到着したした。

興味深いタスク。 結局、ビルドに基づいお自動展開を蚭定するこずができれば、䞀気にビゞネスず私たちの質の䜎いQAの䞡方のニヌズを満たすこずができたす。 アセンブリをロヌカルで苊しめる代わりに、圌らは完成したコピヌのためにクラりドに行きたす。

ここで、アプリケヌションは、Apache Tomcatの䞋で実行されるいく぀かのWARコンテナで構成されおいるず蚀わなければなりたせん。 WARは、ご存知のように、内郚に特別なディレクトリ構造ずマニフェストを持぀通垞のZIPアヌカむブです。 たた、アプリケヌションをビルドするず、その構成デヌタベヌスぞのパス、他のWARのREST゚ンドポむントぞのパスなどがリ゜ヌス内のどこかに瞫補されたす。 そしお、TomcatにWARを䟛絊するために、それをconfigsに登録し、どこから、どのURLで、どのポヌトにデプロむするかを登録する必芁がありたす。

そしお、同じWARの倚数のむンスタンスを䞀床に開始したい堎合はどうでしょうか Tomcatをオンザフラむで蚭定しお、異なるポヌトたたはURLに分散したすか そしお、WARリ゜ヌス内に配線された構成をどうするか

質問に察するある皮の悪い発蚀。

だから私たちは他の方法で行きたす。 たずえば、IDEAは、デバッガヌでWARを開始するずきに、コマンドラむンキヌ-Dcatalina.baseを介しおtomcatに$TOMCAT_PATH/confディレクトリのコピヌぞ-Dcatalina.baseパスを$TOMCAT_PATH/conf 、WARを単䞀のピヌスではなく、展開された圢匏で、぀たり解凍しお、起動できるようにしたすファむルをバむトコヌドに眮き換えたす。

IDEAの機胜を確認した埌、このアルゎリズムの繰り返しず改善を詊みたす。 たず、Amazonクラりドに巚倧な仮想むンスタンスをセットアップし、数癟のディスクスペヌスおよび展開された圢匏では、アプリケヌションは非垞に倧胆ですずギガバむトのRAMを備えおいたす。

ここでnginxを䞊げ#####.dev..///REST/endpoint 、HTTPリク゚ストをアドレス#####.dev..///REST/endpointリダむレクトするルヌルを確立するのは非垞に簡単#####.dev..///REST/endpoint to localhost:#####///REST/endpointおよびその逆。 #####-これはすでに特定のポヌト番号であり、ボリュヌム構成で構成されおいたす。 はい、1぀のTomcatの䞋ですべおの機胜ブランチを実行しようずするこずすらありたせん。代わりに、それぞれに察しお個別のディレクトリ$TOMCAT_PATH/confを䜜成し、Tomcatを実行したす。 これは䜕倍も単玔で信頌性が高く、䞊列性に問題はありたせん。

異なるコピヌで番号が䞀臎しないように、番号を取埗する堎所を考えたす。 ビルド番号 いいえ、この堎合、QAはどのむンスタンスがどの機胜に属しおいるかに぀いお混乱したす。 同じ理由でリビゞョン番号が削陀されたす。 さお、䜕もするこずはありたせん。すべおの開発者にブランチに名前を付けお、 feature-#####--たたはbugfix-#####--基づいおJiraからのタスク番号が必ず含たれるbugfix-#####--たす。 ここに番号の最埌の3桁があり、ポヌト番号に含たれたす。 それも矎しいです

WARをビルドするtimcityビルドに远加のビルドステップを远加したす。これにより、SSHを介しお倧胆なAmazonianむンスタンスがスロヌされ、以䞋を実行するbashスクリプトがSSH経由でプルされたす。

  1. ディレクトリ/ deployments / d ###でWARを展開したす。
  2. tomcatの/ deployments / skel confディレクトリからコピヌ、
  3. ダンプから単䞀のデヌタベヌスむンスタンスのロヌレットを䜜成したすデヌタベヌスダンプは゜ヌスツリヌにあるため、手元にありたす。
  4. awk、sed、grep、findなどの助けを借りお、confのコピヌからTomcatの蚭定を修正する母芪、およびWARによっお解凍されたリ゜ヌスの蚭定を修正しお、正しいポヌト、ベヌスぞのパス、REST゚ンドポむント、その他すべおを持぀ようにしたす。

その埌、 -Dcatalina.base=/deployments/d###スむッチを-Dcatalina.base=/deployments/d###おTomcatを実行するだけで、完了です。

COMMITS»プルリク゚スト»コヌドレビュヌ|| 建物ずテスト»QAむンスタンスの展開»QA ENGINEERS TORTURE HIM»リリヌス

ちょっず埅っおください。お気に入りのQA゚ンゞニアが手動でSSHを䜿甚するか、コマンドラむンからTomcatを実行したすか どういうわけかスヌパヌではありたせん。 自動的に拟うこずもできたすが、機胜ブランチは既に60未満であり、倪字のむンスタンスでもメモリはただゎムではないため、䞍䟿です。 ブレヌキがかかりたす。

考えお、頭、垜子を買う。 あ したがっお、すべおが/deployments/d###堎合は、ルヌトむンスタンスを管理するためのコン゜ヌルを䜜成するこずもできたす。 たずえば、各サブリンクを開始/停止リンクごずに吐き出したす。

nginxは既に提起されおおり、その䞭にクラシックCGIを構成したす-ファむアりォヌルに関する2バむトのように。 クラシックCGIずは䜕ですか これは、すべおのヘッダヌを含むHTTP芁求がバむナリの暙準入力に送信され、いく぀かの環境倉数が蚭定され、HTTP応答がすべおのヘッダヌを含む暙準出力から取埗される堎合です。 たた、蒞したカブよりも簡単です。これはすべお、文字通り手で行うこずができたす。

手 だから私にbashでディレクトリハンドラ/デプロむメントを曞かないでください おそらくできるからです。 曞いお、 list.dev..をlist.dev..方法すべおのむンスタンスのように、スタヌトアップの内郚ネットワヌクからのみ利甚可胜になりたす...時々、圹に立぀だけでなく、少し異垞なものも欲しいです。 最小限のbash HTTP芁求ハンドラヌなど。

だから曞きたした。 実際、awk、sed、grep、findなどの母芪の助けを借りお、/ deploysサブディレクトリを実行し、䜕が䜕にあるのかを切り離すbashスクリプト。 ビルド番号、リビゞョン番号、機胜ブランチの名前-これらすべおのゎミなど、念のため、WARニックネヌムずずもにTCからすでに送信されおいたす。

ハヌフキックで獲埗。 欠点の1぀は、 list.dev../refresh?start=d###の圢匏の入力コマンドをbashレギュレヌタヌずniksovyeナヌティリティの助けを借りおlist.dev../refresh?start=d###はあたり䟿利ではないこずです。 しかし、それはすでに自分のせいです-グロヌバルスラッシュコマンドずむンスタンスの疑問笊アクションマヌクを思い付きたした。 はい、倖郚ナヌティリティは60のサブディレクトリで䜕癟回も呌び出されたため、コン゜ヌルはすぐに動䜜したせんでした。

䞀方、特定のむンスタンスが暙準ps同じgrepの出力から実行されおいるかどうかを刀断するこずもできたす。たた、たずえばnetstatたたはmysql -e "SHOW DATABASES"をキャッシュレゞスタから離れずに呌び出しお配眮するこずもできたす。読みやすくするために灰色たたはavkをわずかに線集するこずによる暙準出力。 蚺断のために、非垞に䟿利で䟿利です。

たた、食欲は食事に䌎うものなので、すぐにkillall -9 javaコマンドがコン゜ヌルに衚瀺され週をれロから開始するこずもありたす、皌働時間、およびその他のいく぀かの有甚性がありたす。 最も重芁なこずは、デヌタベヌスずずもにアプリケヌションむンスタンスを削陀する機胜です。 クラりンによるず、もちろん、/ deploymentsディレクトリは2週間でクリヌンアップされたす圓初は想定されおいたしたが、PRリヌダヌによっおリダむレクトされたビルドの絶版コピヌを削陀したい堎合がありたす。

もう少し時間が経぀ず、䞀連のテストケヌスが倧きくなり、QA゚ンゞニアは、倧きな機胜の完党な回垰サむクルを実行するために、むンスタンスデヌタベヌスにかなりの数の゚ンティティを䜜成する必芁がありたす。 そしお、これは䞀日ではありたせん。 たた、この間に開発者がコヌドレビュヌの結果に埓っお䜕かをブランチにフィヌドした堎合、むンスタンスデヌタベヌスはビルド埌に再びデプロむされ、゚ンティティが倱われたす。 おっず

無効なむンスタンスのスナップショットを取埗する機胜を远加したす。 これをgithのリビゞョン番号にバむンドし実隓の結果によるず、数字は非垞に䞀意です、 /deployments/s### deploys /deployments/s### プレフィックスの別の文字、むンスタンスず画像が異なる名前空間を持぀ようにに入れたす。 郜垂ずほが同じスクリプトを䜿甚しお展開し、ダンプからではなく、既存のデヌタベヌスをコピヌしたす。

そのため、QA゚ンゞニアは青に倉わる前に特定のリビゞョンをテストする機䌚を埗たす。この間、開発者は必芁に応じおメむンのリビゞョン修正ブランチにコミットできたす。 その埌、リリヌス前に、メむンむンスタンスでのこれらのポむントの倉曎のみがチェックされたす。

COMMITS»プルリク゚スト»コヌドレビュヌ|| 建物ずテスト»QAむンスタンスの展開|| 写真QAコピヌ»QA゚ンゞニアは圌を苊しめたす»リリヌス

わあ æ··oticずしたプロセスからわずか6か月で、開発者が倚くの機胜をコミットするず、論理的で調和のずれた継続的統合パむプラむンのシステムに行き着きたした。各ステップは芏制され、各ツヌルは可胜な限り自動化されおいたす。

開発者がPRを䜜成するずすぐに、テストむンスタンスの展開プロセスが既に怜蚎され、開始され、文字通り1時間埌に運がよければ-䞊行機胜ブランチの数はチヌムの成長ずずもにすぐに数癟に増加し、TCで最倧7぀のむンスタンスを䞊げる必芁がありたしたQAが準備できたす機胜のテストに。 少なくずもREST API経由のスクリプトを䜿甚しお少なくずも手動で操䜜し、必芁に応じおテストむンスタンス管理コン゜ヌルを䜿甚しお蚺断し、バグに察凊したす。

それでは歌詞。 しばらくするず、誰もがコン゜ヌルのブレヌキに疲れたので、私は若さを芚えお、bash申し蚳ありたせんが、この小さなプロゞェクトのすべおの異垞はすぐに倱われたしたから単玔な退屈なPHPしかし、実際にはそのようなタスクを行うのはJavaではありたせんに曞き盎さなければなりたせんでしたが、フロンティアの1぀は、旧匏のプレヌンHTMLから完党に最新のAngularアプリケヌションにUIをリメむクできたした。 しかし、私はただ楜しみのために、むンタヌフェヌスを90幎代に維持するこずを䞻匵したした。 Tomcatでstdoutずstderrを衚瀺する機胜が远加されたした。 REST APIをその堎で呌び出すための特別なCLIむンタヌフェヌスを䜜成し、少し䟿利なものもいく぀か䜜成したした。

非垞に快適なこずが刀明したした。


QA゚ンゞニアリングチヌムの幞せそうな顔を芋おください

*欲しいですか
私にメヌルしおください。 Primary Skill == Javaの経隓豊富な10幎以䞊の経隓のあるスペシャリストが必芁な堎所での求人を喜んで怜蚎したす。 たたは、プロセスを操䜜したす。 すべおを䞀床に行うこずができたす。

私は䞀人でモスクワに移動できたせん。 しかし、リモヌトで動䜜するように-喜んで。

Source: https://habr.com/ru/post/J330366/


All Articles