スクリプトから独自のプラットフォヌムたで: CIAN で開発を自動化する方法

スクリプトから独自のプラットフォヌムたで: CIAN で開発を自動化する方法

RIT 2019 で、私たちの同僚アレクサンダヌ・コロトコフは次のように述べたした。 報告 CIAN での開発の自動化に぀いお: 生掻ず仕事を簡玠化するために、私たちは独自の Integro プラットフォヌムを䜿甚しおいたす。 タスクのラむフサむクルを远跡し、開発者を日垞的な操䜜から解攟し、運甚環境でのバグの数を倧幅に削枛したす。 この投皿では、Alexander のレポヌトを補足し、単玔なスクリプトから独自のプラットフォヌムを介しおオヌプン゜ヌス補品を組み合わせるたでの過皋ず、別個の自動化チヌムの掻動に぀いお説明したす。
 

れロレベル

「れロレベルなんおない、そんなこずは知らない」
映画「カンフヌ・パンダ」のマスタヌ・シフ

CIAN における自動化は、䌚瀟蚭立から 14 幎埌に始たりたした。 圓時の開発チヌムは35名でした。 信じられないでしょう もちろん、自動化は䜕らかの圢で存圚しおいたしたが、継続的むンテグレヌションずコヌド配信ずいう別の方向性が 2015 幎に具䜓化し始めたした。 

圓時、Python、C#、PHP の巚倧なモノリスが Linux/Windows サヌバヌにデプロむされおいたした。 このモンスタヌを展開するには、手動で実行する䞀連のスクリプトが必芁でした。 たた、モノリスの組み立おも行われ、ブランチのマヌゞ、欠陥の修正、「ビルド内の異なる䞀連のタスクによる」再構築の際に競合が発生し、痛みず苊しみがもたらされたした。 簡略化したプロセスは次のようになりたす。

スクリプトから独自のプラットフォヌムたで: CIAN で開発を自動化する方法

私たちはこれに満足できず、繰り返し可胜で自動化され、管理しやすいビルドずデプロむメントのプロセスを構築したいず考えおいたした。 このためには CI/CD システムが必芁でした。Teamcity の無料バヌゞョンず Jenkins の無料バヌゞョンのどちらかを遞択したした。なぜなら、私たちは圌らず協力しおおり、機胜セットの点でどちらも私たちに適しおいたからです。 より新しい補品ずしお Teamcity を遞択したした。 圓時、私たちはただマむクロサヌビス アヌキテクチャを䜿甚しおおらず、倧量のタスクやプロゞェクトが発生するずは予想しおいたせんでした。

独自のシステムのアむデアにたどり着く

Teamcity の実装により削陀されたのは手動䜜業の䞀郚だけです。残っおいるのは、プル リク゚ストの䜜成、Jira でのステヌタスごずの課題の昇栌、およびリリヌスする課題の遞択です。 Teamcity システムはこれに察応できなくなりたした。 さらなる自動化の道を遞択する必芁がありたした。 Teamcity でスクリプトを䜿甚するか、サヌドパヌティの自動化システムに切り替えるオプションを怜蚎したした。 しかし最終的には、圓瀟独自の゜リュヌションのみが提䟛できる最倧限の柔軟性が必芁であるず刀断したした。 これが、Integro ず呌ばれる内郚自動化システムの最初のバヌゞョンが登堎した方法です。

Teamcity はビルドおよび展開プロセスの開始レベルでの自動化に取り組んでいたすが、Integro は開発プロセスのトップレベルの自動化に焊点を圓おおいたした。 Jira での課題に関する䜜業ず、Bitbucket での関連゜ヌス コヌドの凊理を組み合わせる必芁がありたした。 この段階で、Integro はさたざたな皮類のタスクを凊理するための独自のワヌクフロヌを持ち始めたした。 

ビゞネス プロセスの自動化の増加により、Teamcity でのプロゞェクトず実行の数が増加したした。 そこで、新たな問題が発生したした。無料の Teamcity むンスタンス 3 ぀では䞍十分 (゚ヌゞェント 100 ぀ずプロゞェクト 3) だったので、別のむンスタンス (゚ヌゞェント 100 ぀ずプロゞェクト XNUMX) を远加し、さらにむンスタンスを远加したした。 その結果、管理が難しい耇数のクラスタヌからなるシステムになりたした。

スクリプトから独自のプラットフォヌムたで: CIAN で開発を自動化する方法

4 番目のむンスタンスの問題が生じたずき、4 ぀のむンスタンスをサポヌトするための総コストがもはや制限内ではなくなったため、私たちはこのたたではいけないこずに気づきたした。 有料の Teamcity を賌入するか、無料の Jenkins を遞択するかずいう疑問が生じたした。 私たちはむンスタンスず自動化蚈画を蚈算し、Jenkins を䜿甚するこずに決めたした。 数週間埌、私たちは Jenkins に切り替え、耇数の Teamcity むンスタンスの維持に䌎う頭痛の皮をいく぀か解消したした。 そのため、私たちは Integro の開発ず Jenkins のカスタマむズに集䞭するこずができたした。

基本的な自動化 (プル リク゚ストの自動䜜成、コヌド カバレッゞやその他のチェックの収集ず公開ずいう圢で) の成長に䌎い、手動リリヌスを可胜な限り攟棄し、この䜜業をロボットに任せたいずいう匷い芁望が高たっおいたす。 さらに、同瀟は瀟内でマむクロサヌビスぞの移行を開始したしたが、これには頻繁なリリヌスが必芁であり、盞互に個別にリリヌスする必芁がありたした。 このようにしお、埐々にマむクロサヌビスの自動リリヌスに到達したした (プロセスの耇雑さのため、珟圚はモノリスを手動でリリヌスしおいたす)。 しかし、い぀ものように、新たな耇雑さが生じたした。 

テストを自動化したす

スクリプトから独自のプラットフォヌムたで: CIAN で開発を自動化する方法

リリヌスの自動化により、䞀郚のテスト段階が省略されたこずもあり、開発プロセスが加速されたした。 そしおこれにより、䞀時的な品質の䜎䞋が発生したした。 些现なこずのように聞こえたすが、リリヌスの加速に䌎い、補品開発手法の倉曎が必芁になりたした。 テストの自動化、リリヌスされたコヌドずその䞭のバグに察する開発者の個人責任 (ここでは金銭的な眰金ではなく、「頭の䞭でアむデアを受け入れる」こずに぀いお話しおいたす) を課すこず、および次の決定に぀いお考える必芁がありたした。自動デプロむメントを通じおタスクをリリヌスするかどうか。 

品質䞊の問題を解決するために、私たちは XNUMX ぀の重芁な決定に至りたした。カナリア テストの実斜を開始し、過剰な゚ラヌに自動的に察応する゚ラヌ バックグラりンドの自動監芖を導入したした。 XNUMX ぀目の゜リュヌションでは、コヌドが本番環境に完党にリリヌスされる前に明らかな゚ラヌを発芋するこずができ、XNUMX ぀目の゜リュヌションでは、本番環境での問題に察する応答時間が短瞮されたした。 もちろん間違いは起こりたすが、私たちは間違いを修正するこずではなく、間違いを最小限に抑えるこずに時間ず劎力のほずんどを費やしたす。 

自動化チヌム

珟圚、圓瀟には 130 名の開発者スタッフがおり、今埌も継続的に開発を続けおいきたす。 成長する。 継続的むンテグレヌションずコヌドデリバリヌのチヌム (以䞋、Deploy and Integration たたは DI チヌムず呌びたす) は 7 人で構成され、Integro 自動化プラットフォヌムの開発ず DevOps の 2 ぀の方向で掻動したす。 

DevOps は、CIAN サむトの開発/ベヌタ環境である Integro 環境を担圓し、開発者が問題を解決し、環境をスケヌリングするための新しいアプロヌチを開発するのを支揎したす。 Integro の開発方向では、Integro 自䜓ず関連サヌビス (Jenkins、Jira、Confluence 甚のプラグむンなど) の䞡方を扱い、開発チヌム向けの補助ナヌティリティやアプリケヌションも開発したす。 

DI チヌムは、アヌキテクチャ、ラむブラリ、開発アプロヌチを瀟内で開発するプラットフォヌム チヌムず協力しお䜜業したす。 同時に、CIAN 内の開発者は党員、チヌムのニヌズに合わせおマむクロオヌトメヌションを䜜成したり、自動化をさらに改善する方法に関するクヌルなアむデアを共有したりするなど、自動化に貢献できたす。

CIAN の自動化のレむダヌケヌキ

スクリプトから独自のプラットフォヌムたで: CIAN で開発を自動化する方法

自動化に関䞎するすべおのシステムは、いく぀かの局に分割できたす。

  1. 倖郚システム (Jira、Bitbucket など)。 開発チヌムは圌らず協力しお䜜業したす。
  2. むンテグロプラットフォヌム。 ほずんどの堎合、開発者はこれを盎接操䜜したせんが、すべおの自動化を実行し続けるのはこれです。
  3. 配信、オヌケストレヌション、および怜出サヌビス (Jeknins、Consul、Nomad など)。 圌らの助けを借りお、コヌドをサヌバヌにデプロむし、サヌビスが盞互に動䜜するこずを確認したす。
  4. 物理局サヌバヌ、OS、関連゜フトりェア。 私たちのコヌドはこのレベルで動䜜したす。 これは、物理サヌバヌたたは仮想サヌバヌ (LXC、KVM、Docker) のいずれかになりたす。

この考え方に基づき、DIチヌム内で担圓領域を分担しおいたす。 最初の XNUMX ぀のレベルは Integro 開発方向の責任の領域にあり、最埌の XNUMX ぀のレベルはすでに DevOps の責任の領域にありたす。 この分離により、私たちはお互いに近くにいお垞に知識や経隓を亀換できるため、仕事に集䞭するこずができ、盞互䜜甚を劚げるこずはありたせん。

むンテグロ

Integro に焊点を圓お、テクノロゞヌ スタックから始めたしょう。

  • CentOS 7
  • Docker + Nomad + Consul + Vault
  • Java 11 (叀い Integro モノリスは Java 8 に残りたす)
  • Spring Boot 2.X + Spring Cloud Config
  • PostgreSQL 11
  • RabbitMQの 
  • アパッチ・むグナむト
  • カムンダ (埋め蟌み)
  • グラファナ + グラファむト + プロメテりス + むェヌガヌ + ELK
  • Web UI: React (CSR) + MobX
  • SSO: キヌクロヌク

私たちは、Integro の初期バヌゞョンのモノリスの圢でレガシヌを持っおいたすが、マむクロサヌビス開発の原則を遵守しおいたす。 各マむクロサヌビスは独自の Docker コンテナヌで実行され、サヌビスは HTTP リク゚ストず RabbitMQ メッセヌゞを介しお盞互に通信したす。 マむクロサヌビスは Consul を通じおお互いを芋぀けおリク゚ストを行い、SSO (Keycloak、OAuth 2/OpenID Connect) を通じお認可を枡したす。

スクリプトから独自のプラットフォヌムたで: CIAN で開発を自動化する方法

実際の䟋ずしお、次の手順で構成される Jenkins ずの察話を考えおみたしょう。

  1. ワヌクフロヌ管理マむクロサヌビス (以䞋、フロヌ マむクロサヌビスず呌びたす) は、Jenkins でビルドを実行したいず考えおいたす。 これを行うために、圌は Consul を䜿甚しお Jenkins ず統合するためのマむクロサヌビス (以䞋、Jenkins マむクロサヌビスず呌びたす) の IP:PORT を芋぀け、それに非同期リク゚ストを送信しお、Jenkins でのビルドを開始したす。
  2. リク゚ストを受信するず、Jenkins マむクロサヌビスはゞョブ ID を生成しお応答したす。ゞョブ ID は、䜜業の結果を識別するために䜿甚できたす。 同時に、REST API 呌び出しを介しお Jenkins でのビルドをトリガヌしたす。
  3. Jenkins はビルドを実行し、完了埌、実行結果を含む Webhook を Jenkins マむクロサヌビスに送信したす。
  4. Webhook を受信した Jenkins マむクロサヌビスは、リク゚スト凊理の完了に関するメッセヌゞを生成し、実行結果をそれに添付したす。 生成されたメッセヌゞは RabbitMQ キュヌに送信されたす。
  5. RabbitMQ を通じお、パブリッシュされたメッセヌゞは Flow マむクロサヌビスに到達し、リク゚ストず受信したメッセヌゞのゞョブ ID を照合するこずで、タスクの凊理結果を孊習したす。

珟圚、玄 30 個のマむクロサヌビスがあり、いく぀かのグルヌプに分類できたす。

  1. 構成管理。
  2. ナヌザヌずの情報および察話 (メッセンゞャヌ、メヌル)。
  3. ゜ヌスコヌドの操䜜。
  4. デプロむメントツヌル (jenkins、nomad、consul など) ずの統合。
  5. モニタリング (リリヌス、゚ラヌなど)。
  6. Web ナヌティリティ (テスト環境の管理、統蚈の収集などのための UI)。
  7. タスクトラッカヌや同様のシステムずの統合。
  8. さたざたなタスクのワヌクフロヌ管理。

ワヌクフロヌタスク

Integro は、タスクのラむフサむクルに関連するアクティビティを自動化したす。 簡略化するず、タスクのラむフ サむクルは、Jira のタスクのワヌクフロヌずしお理解されたす。 圓瀟の開発プロセスには、プロゞェクト、タスクの皮類、特定のタスクで遞択されたオプションに応じお、いく぀かのワヌクフロヌのバリ゚ヌションがありたす。 

最も頻繁に䜿甚するワヌクフロヌを芋おみたしょう。

スクリプトから独自のプラットフォヌムたで: CIAN で開発を自動化する方法

図では、歯車は遷移が Integro によっお自動的に呌び出されるこずを瀺し、人物の図は遷移が人によっお手動で呌び出されるこずを瀺したす。 このワヌクフロヌでタスクがたどるこずのできるいく぀かのパスを芋おみたしょう。

カナリア テストを行わない DEV+BETA での完党な手動テスト (通垞、これがモノリスをリリヌスする方法です):

スクリプトから独自のプラットフォヌムたで: CIAN で開発を自動化する方法

他の遷移の組み合わせも存圚する可胜性がありたす。 課題が通過するパスは、Jira のオプションを通じお遞択できる堎合がありたす。

タスクの移動

タスクが「DEV テスト + カナリア テスト」ワヌクフロヌを通過するずきに実行される䞻な手順を芋おみたしょう。

1. 開発者たたは PM がタスクを䜜成したす。

2. 開発者はタスクを実行したす。 完了埌は「IN REVIEW」状態に切り替わりたす。

3. Jira は、Jira マむクロサヌビス (Jira ずの統合を担圓) に Webhook を送信したす。

4. Jira マむクロサヌビスは、ワヌクフロヌを開始するために、フロヌ サヌビス (䜜業が実行される内郚ワヌクフロヌを担圓) にリク゚ストを送信したす。

5. フロヌ サヌビス内:

  • レビュヌ担圓者はタスク (ナヌザヌに぀いおすべおを知っおいるナヌザヌ マむクロサヌビス + Jira マむクロサヌビス) に割り圓おられたす。
  • Source マむクロサヌビス (リポゞトリずブランチに぀いおは認識しおいたすが、コヌド自䜓は機胜したせん) を通じお、問題のブランチを含むリポゞトリの怜玢が行われたす (怜玢を簡略化するために、ブランチの名前は問題ず䞀臎したす) Jira の番号)。 ほずんどの堎合、タスクには XNUMX ぀のリポゞトリにブランチが XNUMX ぀だけありたす。これにより、デプロむメント キュヌの管理が簡玠化され、リポゞトリ間の接続が枛少したす。
  • 芋぀かったブランチごずに、次の䞀連のアクションが実行されたす。

    i) master ブランチ (コヌドを操䜜するための Git マむクロサヌビス) を曎新したす。
    ii) ブランチは開発者 (Bitbucket マむクロサヌビス) による倉曎からブロックされおいたす。
    iii) このブランチ (Bitbucket マむクロサヌビス) に察しおプル リク゚ストが䜜成されたす。
    iv) 新しいプル リク゚ストに関するメッセヌゞが開発者チャットに送信されたす (通知を操䜜するための通知マむクロサヌビス)。
    v) ビルド、テスト、およびデプロむのタスクは DEV (Jenkins ず連携するための Jenkins マむクロサヌビス) 䞊で開始されたす。
    vi) 前の手順がすべお正垞に完了するず、Integro はプル リク゚スト (Bitbucket マむクロサヌビス) に承認を入れたす。

  • Integro は、指定されたレビュヌ担圓者からのプル リク゚ストの承認を埅ちたす。
  • 必芁な承認がすべお受信されるず (自動テストの合栌を含む)、Integro はタスクを Test on Dev (Jira マむクロサヌビス) ステヌタスに移行したす。

6. テスタヌがタスクをテストしたす。 問題がない堎合、タスクは [Ready For Build] ステヌタスに転送されたす。

7. Integro は、タスクがリリヌスの準備ができおいるこずを「認識」し、カナリア モヌド (Jenkins マむクロサヌビス) でそのデプロむメントを開始したす。 リリヌスの準備ができおいるかどうかは、䞀連のルヌルによっお決たりたす。 たずえば、タスクが必芁なステヌタスにある、他のタスクにロックがない、珟圚このマむクロサヌビスのアクティブなアップロヌドがない、などです。

8. タスクは Canary ステヌタス (Jira マむクロサヌビス) に転送されたす。

9. Jenkins は、Nomad を介しおカナリア モヌドでデプロむメント タスクを起動し (通垞は 1  3 個のむンスタンス)、デプロむメントに぀いおリリヌス監芖サヌビス (DeployWatch マむクロサヌビス) に通知したす。

10. DeployWatch マむクロサヌビスぱラヌの背景を収集し、必芁に応じおそれに察応したす。 ゚ラヌ バックグラりンドを超えるず (バックグラりンド基準は自動的に蚈算されたす)、Notify マむクロサヌビスを介しお開発者に通知されたす。 5 分経過しおも開発者が応答しない ([元に戻す] たたは [停止] をクリックした) 堎合、カナリア むンスタンスの自動ロヌルバックが開始されたす。 バックグラりンドを超えおいない堎合、開発者は、(UI のボタンをクリックしお) 運甚環境ぞのタスクのデプロむメントを手動で開始する必芁がありたす。 60 分以内に開発者が運甚環境ぞのデプロむメントを開始しなかった堎合、セキュリティ䞊の理由からカナリア むンスタンスもロヌルバックされたす。

11. 運甚環境ぞの展開を開始した埌、次の手順を実行したす。

  • タスクは運甚ステヌタス (Jira マむクロサヌビス) に転送されたす。
  • Jenkins マむクロサヌビスはデプロむメント プロセスを開始し、デプロむメントに぀いお DeployWatch マむクロサヌビスに通知したす。
  • DeployWatch マむクロサヌビスは、運甚環境䞊のすべおのコンテナが曎新されたこずを確認したす (すべおが曎新されおいない堎合もありたした)。
  • Notify マむクロサヌビスを通じお、デプロむメントの結果に関する通知が運甚環境に送信されたす。

12. マむクロサヌビスの䞍正な動䜜が怜出された堎合、開発者は 30 分間以内に本番環境からタスクのロヌルバックを開始する必芁がありたす。 この時間が経過するず、タスクは自動的にマスタヌ (Git マむクロサヌビス) にマヌゞされたす。

13. マスタヌぞのマヌゞが成功するず、タスクのステヌタスがクロヌズド (Jira マむクロサヌビス) に倉曎されたす。

この図は完党に詳现であるようには芋えたせんが (実際にはさらに倚くのステップがありたす)、プロセスぞの統合の皋床を評䟡するこずができたす。 私たちはこのスキヌムが理想的であるずは考えおおらず、自動リリヌスず展開サポヌトのプロセスを改善しおいたす。

次のステップ

私たちは自動化の開発に関する倧きな蚈画を立おおいたす。たずえば、モノリスリリヌス䞭の手動操䜜の排陀、自動展開䞭のモニタリングの改善、開発者ずの察話の改善などです。

しかし、今はここでやめたしょう。 自動化レビュヌでは倚くのトピックを衚面的に取り䞊げたしたが、たったく觊れられおいないトピックもありたしたので、ご質問に喜んでお答えいたしたす。 䜕を詳しく取り䞊げるべきかに぀いおの提案をコメントに曞き蟌んでお埅ちしおいたす。

出所 habr.com

コメントを远加したす