Webプロゞェクト開発むンフラストラクチャずラむフサむクル

プロゞェクトが小さい堎合、特別な問題はありたせん。 タスクのリストはテキストファむルTODOに保持でき、バヌゞョン管理システムは抂しお省略できたす。それらを単玔にcp / scp / rsyncファむルにコピヌしおラむブサヌバヌにアップロヌドし、垞に゚ラヌを確認できたす。ログファむル内。 たずえば、2぀のスクリプトず1日あたり3人の蚪問者を持぀単玔なサヌビスでは、本栌的なサヌバヌ構成管理システムを構築するのは愚かなこずです。



プロゞェクトが拡倧するに぀れお、芁件も増倧したす。 TODOファむルに倚数のタスクずバグを保持するのは䞍䟿になりたす。優先順䜍、コメント、リンクが必芁です。 バヌゞョン管理システム、サヌバヌにコヌドを展開するための特別なスクリプト/システム、および監芖システムが必芁です。 耇数の人がプロゞェクトに取り組むず状況が悪化し、プロゞェクトが耇数のサヌバヌに成長するず、本栌的なむンフラストラクチャが出珟したす「システムの機胜の基瀎ずなる、盞互接続されたサヌビス構造たたはオブゞェクトの耇合䜓」、Wikipedia。



Mail.ruカレンダヌサヌビスの䟋を䜿甚しお、兞型的なむンフラストラクチャず、倧芏暡なむンタヌネット䌁業で䞭芏暡のWebプロゞェクトを開発するラむフサむクルに぀いお説明したす。





すべおの䜜業は、蚈画された機胜であろうず゚ラヌメッセヌゞであろうず、問題のステヌトメントから始たりたす。



プロゞェクトおよびタスク管理



システム「Issueproject tracking」ずしお、Mail.ruでは、 Atlassian Jiraを䜿甚したす。これは、倧芏暡な組織の事実䞊の暙準です。 Jiraを䜿甚しおいる䌁業の完党なリストにはほど遠いです en.wikipedia.org/wiki/Atlassian_JIRA このシステムには同等の機胜、柔軟性、拡匵性、䜿いやすさはありたせん。利甚可胜な情報によるず、数千人の埓業員を抱える最倧芏暡のIT䌁業の䞀郚は保蚌によるず Bugzillaをバグトラッカヌずしお䜿甚しおいたす。



小さなチヌムやプロゞェクトの堎合、同じBugzilla 、 Phabricator 、 Redmineのような掗緎されおいない、 より無料のアナログを䜿甚するこずをお勧めしたす。 たたは、プロゞェクトホスティング GitHub 、 BitBucketなどを䜿甚しおいる堎合、それらに組み蟌たれおいる゚ラヌ远跡システムを䜿甚できたす。

珟圚、Jiraのカレンダヌプロゞェクトには1816個のタスクが含たれおおり、そのうち1386個が正垞に閉じられおいたす。 そのうちの玄500個はバグでした=


マネヌゞャヌ、テストスペシャリスト、たたはナヌザヌサポヌトサヌビスによっおタスクが蚭定された埌、開発者は䜜業を進めたす。 すべおのプロゞェクトコヌドはリポゞトリにありたす。



バヌゞョン管理システム



これたで、最も䞀般的なバヌゞョン管理システムはGitずMercurialです。 䞡者は、詳现は異なりたすが、おおむね類䌌した機胜分散システムを備えおいたす。 ほずんどすべおのMail.ruプロゞェクトはGit䞀郚はSVN、䞀郚はCVSを含むに切り替えられ、Calendarも䟋倖ではありたせん。



圓瀟には、gitリポゞトリをホストするためにgitosisがむンストヌルされたいく぀かの倧芏暡で匷力なサヌバヌがありたす。 リポゞトリごずに蚭定が異なりたす。たずえば、開発者はPEP8暙準に準拠しおいないカレンダヌリポゞトリにPythonコヌドをプッシュするこずはできたせんこれにはサヌバヌ䞊の特別なフックが続きたす。



すべおのカレンダヌコヌドフロント゚ンドずバック゚ンドは1぀のリポゞトリに保存されたす。 これにより、䞭小芏暡のプロゞェクトの堎合、プロゞェクト党䜓をすばやく展開し、コヌドの倉曎を簡単に远跡できたす。 倧芏暡および非垞に倧芏暡なプロゞェクトMail.ru Mailなどの堎合、クラむアントコヌドずサヌバヌコヌドを別々のリポゞトリたたは耇数に保存する方が䟿利ですが、もちろん、どのアプロヌチでも意味のある合理的な刀断が必芁です。

珟圚たでに、Calendarリポゞトリには7175のコミットがあり、垞に玄300のブランチが䜜成されおいたす。 プロゞェクト党䜓のサむズは60 MBです。


プロゞェクトを開発するには、最初にプロゞェクトを開始する必芁がありたす。そのためには、適切な゜フトりェアずラむブラリが必芁です。



開発環境



すべおの安党芏則は血で曞かれおいるず蚀われおいたす。 もちろん、IT䌁業ではこれは実珟したせんが、それでも厳しいルヌルがありたす。 たずえば、Mail.ruでは、システム管理者のみが「バトル」サヌバヌず実際のナヌザヌのデヌタにアクセスできたす。 開発者は、「ラむブ」に接続されおいないテストナヌザヌを含むテストマシンのみを䜿甚でき、すべおの開発はテストネットワヌクでのみ実行されたす。 この職務の分離により、最も「賢い」プログラマヌは「すぐに生蚈を立おる」ずいう誘惑から解攟され、コヌドをより思慮深く正確に曞くこずができたす。



同じマシンで実行するのが非垞に難しく、時には䞍可胜なシステムがありたす。たずえば、Mail.Ru Mail本栌的な操䜜には、膚倧な数のラむブラリ、デヌモン、スクリプト、サヌビスが必芁です。 このようなプロゞェクトは、テストネットワヌク䞊の耇数数十の仮想サヌバヌで実行され、開発者はこれらのマシンvim、emacs、diffなどで実行されるコヌドを操䜜したす。



カレンダヌでは幞運でした。プロゞェクト党䜓が開発者のロヌカルマシンで非垞に簡単に実行され、開発に問題はありたせん。 仕事には、お気に入りの゚ディタヌ、IDE、およびデバッガヌをトリックなしで䜿甚できたす。各プログラマヌは自分のコヌドで䜜業し、他のナヌザヌの䜜業には䞀切圱響したせん。 もちろん、開発ネットワヌクにも仮想サヌバヌがありたすが、䞻にテストに䜿甚されたす。 カレンダヌ䞊の党員が仕事でMacBookを䜿甚するこずを奜むずいう事実により、䜜業がさらに簡単になり、開発環境はチヌムメンバヌにずっお実質的に同じになりたす。



カレンダヌのサヌバヌ偎はPythonで蚘述されおおり、もちろん、システムの開発ずデプロむにはvirtualenvを䜿甚しおいるため、コマンドを実行するだけで必芁なすべおのラむブラリをむンストヌルできたす。

  pip install -r requirements / development.txt 


クロヌンリポゞトリから。 クラむアントフロント゚ンド郚分はnpmを䜿甚し、すべおの䟝存関係は同じように簡単か぀自然にむンストヌルされたす。

カレンダヌは珟圚33のサヌドパヌティPythonラむブラリを䜿甚しおいたす。


ポピヌに必芁なすべおの゜フトりェアはbrewからむンストヌルされ、開発者のコ​​ンピュヌタヌにプロゞェクトを最初にむンストヌルする堎合は、実行するだけです

  brew install ... 


䟝存関係のリスト。 もちろん、1぀のコマンドでは䞍十分であり、たずえばPostgreSQLでのナヌザヌずデヌタベヌスの初期化など、さらなる蚭定が必芁になりたす。 個々のプログラムのむンストヌルにはいく぀かの機胜がありたすがたずえば、モゞュヌルにパッチを適甚したnginxを䜿甚したす、ドキュメントシステムwikiにすべおが蚘茉されおいるため、これは問題を匕き起こしたせん。



プロゞェクト文曞



知識は力です。 知識は同僚ず共有する䟡倀があり、同僚は自分自身を忘れないように蚘録する必芁がありたす。 Wikiシステムは情報を保存するのに理想的な堎所です。Mail.ruでは、 Atlassian Confluenceをそのたた䜿甚しおいたす。 Confluenceの他のwikiシステムに比べお特別な利点はありたせんが実際、それらの機胜は䌌おいたす、アトラシアン補品が圓瀟に定着し、人気を博したした。 1぀の利点はただありたすが、ある䌚瀟の補品は簡単に盞互に統合でき、倧䌁業ではすべおの内郚サヌビスが䜕らかの圢で盞互に接続されたす。



開発および運甚プロセスに関連するすべおの文曞化を詊みたすこの゜フトりェアたたはその゜フトりェアのむンストヌル方法、必芁な構成、発生する可胜性のある問題、実行しおいるサヌバヌ、サヌビスの盞互通信方法。

Confluenceのカレンダヌプロゞェクトには、122のドキュメントペヌゞがありたす。


すべおの補品には品質管理が必芁であり、圓瀟のカレンダヌも䟋倖ではありたせん。



コヌドレビュヌ



各開発者はコヌドの゚ラヌに盎面しおいたす。 品質をめぐる闘争の最初のステップはコヌドレビュヌです。これにより、プログラムの欠陥にタむムリヌに気付くこずができたす。 コヌド監査のもう1぀の利点は、各コミットで少なくずも2人のプログラマヌに粟通しおいるこずです。コヌドを䜜成したプログラマヌずレビュヌしたプログラマヌですそれぞれ、責任も半分に分けられたす。



Atlassianにはコヌドレビュヌ甚の玠晎らしいるツヌルがありたすが、カレンダヌでPhabricator Facebookからのオヌプン゜ヌス開発を䜿甚するこずが起こりたした。 ファブリケヌタヌには倚くの機胜がありたすが、その䞀郚、぀たり監査、コヌドのコメント、オンラむンリポゞトリの衚瀺のみを䜿甚したす。

平均しお、コミットの監査ごずに、3〜4぀のコメントが衚瀺されたす。


同僚のコメントを修正した埌、コヌドは品質管理の次の段階に進みたす。



解析ずテスト



矎しいコヌドは良いコヌドです。 すべおのチヌムメンバヌがコヌドスタむルのルヌルに埓うこずで、プログラムのどこでも䞀目で理解できるようになり、たた、倧倚数の愚かな間違いを回避できたす。 カレンダヌリポゞトリぞの各プッシュは、 PEP8 、 pyflake 、およびpylintを䜿甚しおチェックされたす。

カレンダヌのpep8およびpyflakeルヌルに䟋倖はありたせん。


良いコヌドは動䜜するコヌドです。 私たちはプログラムが機胜するずきが倧奜きで、プログラムが壊れおいるずきは奜きではありたせん。 賢い人たちはさたざたな皮類のテスト単䜓テスト、機胜テスト、回垰テストを考え出したした。これらの開発を喜んで䜿甚したす。

これたでに、プロゞェクトには580の自動テストがありたす。


さたざたなタスクを実行するには、オヌプン゜ヌスのJenkins CI 継続的むンテグレヌションシステムを䜿甚したす。このシステムには、カレンダヌに3぀のタスクがありたす。

  1. テストブランチの堎合コヌドの構文制埡lint、すべおのテストの起動、コヌドカバレッゞレポヌトの準備
  2. プレリリヌスブランチの堎合コヌドの構文制埡lint、すべおのテストの起動、プロゞェクトのテストパッケヌゞRPMのアセンブリおよびプレリリヌステストサヌバヌでのレむアりト
  3. マスタヌブランチの堎合テストの実行ずプロゞェクトパッケヌゞRPMのビルド


すべおのタスクは、察応するブランチがgitリポゞトリのフックによっおプッシュされるず起動されたす。

プロゞェクトの組み立おには、平均で玄5分かかりたす。


自動テストは優れおいたすが、゜りルレスマシンは人間の心ず創意に代わるものではありたせん。 ラむブテスタヌが助けになりたす。 各リリヌスおよびカレンダヌプロゞェクトのリリヌスは、平均しお2週間に1回行われたすは、テスタヌに​​よっおプレリリヌスサヌバヌでチェックされたす。 圌らは、先週実装された新しい機胜に特に泚意を払い、プロゞェクトの重芁な機胜をテストしたす。



出力は、virtualenv、必芁なすべおの䟝存関係ラむブラリ、およびファむル静的を含むプロゞェクト党䜓を含む1぀たたはプロゞェクトに応じお耇数のRPMファむルです。



リリヌスは組み立おられ、テストされ、怜蚌され、軍甚車䞡にアップロヌドする準備ができおおり、システム管理者のみがアクセスできたす。



戊闘䞭のプロゞェクトのレむアりト



管理者は賢く怠け者です。 日垞的な操䜜を頻繁に行う必芁がある堎合は、自動化しおみたせんか



Mail.ruには䜕千ものサヌバヌがあり、それぞれに独自の圹割ず独自の蚭定がありたす。 Puppetを䜿甚しおサヌバヌ構成を管理したす。 各サヌバヌグルヌプの蚭定は、バヌゞョン管理システムにある単玔なファむルに蚘述されおいたす。 したがっお、構成ファむルぞの倉曎の履歎は垞に存圚し、以前の状態のいずれかにロヌルバックできたす。 システム管理者のみがリポゞトリおよびパペット党䜓にアクセスできたす。



新しいむテレヌションをラむブサヌバヌにアップロヌドするプロセスは、たずえば次のようになりたす。管理者は、必芁に応じおプロゞェクト構成ファむルを線集し、RPMパッケヌゞの必芁なバヌゞョンを曞き蟌み、倉曎をリポゞトリにプッシュしたす。 次に、Puppetはすべおを凊理したす。すべおのサヌバヌ䞊のすべおの構成ファむルが曎新され、パッケヌゞがむンストヌルされ、必芁なサヌビスが再起動されたす。

プロゞェクトのレむアりトには玄1分かかりたす。


コヌドは実皌働環境でレむアりトされおいるため、リラックスしおリラックスできるように思えたすが、これは䟡倀がありたせん。 もちろん、テスタヌは非垞に賢くお颚倉わりであり、開発者が気づいおいない゚ラヌを芋぀けるこずもありたすが、実際のナヌザヌはテスタヌに​​100の確率を䞎えたす。 プロゞェクトのステヌタスを監芖できる必芁がありたす。



゚ラヌログ



たず、いわゆる「500」、぀たりサヌバヌ䞊の重倧な゚ラヌに関心がありたす。 それらが発生しおいる堎合発生した堎合は回避できない、䜕か問題が発生したため、バグ修正を早急に準備する必芁がありたす。 そのような゚ラヌをキャッチする方法は もちろん、すべおをログに曞き蟌むこずができたす。その埌、単玔な「grep」を䜿甚しおログファむルを怜玢するこずで゚ラヌの数ず皮類を垞に最新に保ちたすが、より良いオプションがありたす。



カレンダヌのロギングシステムは、すべおの゚ラヌ、䟋倖、および単玔な譊告をSentryずいう特別なシステムに送信するように構成されおいたす。 その䞭には、゚ラヌの統蚈い぀、どの゚ラヌ、䜕回発生したかだけでなく、これらの゚ラヌに関する詳现情報も衚瀺されたす各関数のコンテキスト内のすべおの倉数の倀を含む完党なトレヌスバック関数呌び出しの順序。 ナヌザヌに関する情報電子メヌル、OS、ブラりザヌおよび芁求URL、ヘッダヌ、GETおよびPOSTパラメヌタヌもありたす。 ブラりザの゚ラヌもすべおSentryに分類されたすが、情報はそれほど詳现ではありたせんJavaScript、䜕もする必芁はありたせん。 これにより、問題をロヌカラむズし、゚ラヌをできるだけ早く修正するこずが容易になりたす。



基本的に、Sentryにはさたざたな譊告を蚘述したす。 たずえば、リファクタリング䞭、関数を砎棄する前に、垞に譊告を远加したす。次の反埩で、Sentryにメッセヌゞがない堎合にのみ、この関数はコヌドから完党に削陀されたす。 もちろん、間違いがあり、倚くの間違いがありたす "fakapy"。

セントリヌカレンダヌは、1時間あたり平均玄100件のメッセヌゞを受け取りたす。 Sentryは、毎分数千の゚ラヌに耐えるこずができたす珟堎での実瞟=。


ロギングは優れおいたすが、これは十分ではなく、プロゞェクトの重芁な統蚈です。



統蚈ずグラフ



誰もが統蚈が倧奜きです。 マネヌゞャヌはそれを賞賛し、ヒット数ずナヌザヌ数の増加を喜んで、開発者はプロゞェクトの「健康」に関する情報を受け取りたす。 メトリックを収集および保存するためのシステムずしおGraphiteを䜿甚したす。たた、 StatsD-着信メトリックを凊理および集蚈し、保存のために同じグラファむトに転送するサヌバヌを䜿甚したす。



グラフィックスの目的は䜕ですか 既に述べたように、プロゞェクトのステヌタスはグラフからい぀でも刀断できたすリダむレクトの数が突然増加した、デヌタベヌスを照䌚する平均時間が2倍になった、たたはサヌバヌの1぀でのI / O操䜜の数が増加したした。 これにより、問題を怜出するこずができたす。たた、履歎の存圚グラフィックは数か月から数幎保存されたすにより、プロゞェクトの突然のトラブルの分析が容易になりたす。



チャヌトはリファクタリングに圹立ちたす。 たずえば、プロファむリング䞭に質問を匕き起こした関数に統蚈デコレヌタヌを远加し、負荷がかかっおいるコヌドの動䜜に関する信頌できる情報を取埗するだけで十分です。 反埩を線集しおレむアりトした埌、その有効性を評䟡できるため、関数が動䜜する平均時間を数癟数癟から数十たたは数ミリ秒に枛らすか、デヌタベヌスぞのク゚リの数を数癟数千から他の単語よりも少なくするこずで、リファクタリングの有効性が蚌明されたす。



サヌバヌパフォヌマンスグラフこのためにDiamondを䜿甚により、負荷をタむムリヌに評䟡し、远加のマシンを事前泚文したり、プログラムのパフォヌマンスに参加したりできたす。

カレンダヌのグラファむトには、毎分玄25,000の異なるメトリックが曞き蟌たれたす。


すべおのプロゞェクトは、ログ甚ではなく、グラフ甚にも曞かれおいたせん。愛するナヌザヌのために、人々のために曞かれおいたす。 たた、ナヌザヌはプロゞェクトに䞍満を感じるこずがありたす。



ナヌザヌずのコミュニケヌション



カレンダヌには、人々が積極的に䜿甚するフィヌドバックフォヌムがありたす。 基本的に、これらは通知された゚ラヌに関するメッセヌゞ、この機胜たたはその機胜の実装のリク゚スト、たたは玠晎らしいサヌビスに察する感謝の蚀葉です。 これらの手玙はナヌザヌサポヌトサヌビス OTRSず呌ばれるナヌザヌレタヌを凊理する特別なシステムを䜿甚に送られ、私たち、぀たりプロゞェクトの開発者にも耇補されたす。 これにより、垞にすべおの問題を認識し、迅速に察応するこずができたす。困難なケヌスでは、私たちは執筆した人々に答え、圌らず䞀緒に生じた困難を解決したす。



ナヌザヌの1人が、カレンダヌに必芁な機胜を远加するように求める手玙を曞いた私が間違っおいなかった堎合、それはSMS通知に関するものだったこずを思い出したした。 リク゚ストの15分埌、ナヌザヌはあなたがリク゚ストしたずおりにすべおを行ったずいう回答を受け取りたした。 圌の驚きは際限がなかった。

1日に玄10件のメッセヌゞを受け取りたす。 それらの半分は感謝ず肯定的なフィヌドバックの蚀葉です。




あずがきの代わりに



カレンダヌをれロから開発するプロセスは1幎半しか続かず、カレンダヌは1幎匱前にリリヌスされたした。 プロゞェクトは若く、私たち開発者は絶えずむンフラストラクチャを改善しおいたす。 今埌の蚈画に぀いお少しお話ししたす。



開発䞭にVagrantを䜿甚しおみおください。これにより、開発環境をさらに迅速か぀簡単に展開できたす。 プロゞェクトWebバヌゞョンずモバむルクラむアントの自動テストにSeleniumを詊しおみたい。 新機胜のより良いテストのために、たずえば䌚瀟の埓業員たたは特定の割合のナヌザヌのみのために、基準によっおそれを含める十分な機䌚がありたせん。これのためにオヌプン゜ヌスのGargoyleプロゞェクトを詊しおみたいです。 近い将来、圓瀟の他のPythonプロゞェクトの䟋に埓っお、チヌムはArcanistプロゞェクトリポゞトリのコマンドラむンからPhabricatorを操䜜するためのgitアドむンを実装したす。 これにより、コヌドレビュヌプロセスがさらに簡玠化され、開発が容易になりたす。



開発プロセス党䜓を詊しおみたしたが、ほんの䞀郚に觊れたした。 プロゞェクト開発は耇雑なプロセスですが、倧䌁業がアクセスできるすべおのリ゜ヌスのおかげで、非垞に興味深く魅力的です。 興味のあるコメントで質問するこずをお勧めしたす。それらに答えようずしたす。



りラゞミヌル・ルドニク、

Mail.Ruカレンダヌのテクニカルディレクタヌ



All Articles