Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Яндекс.Директ: как мы деплоим наши Perl-web-при...
Search
Elena Bolshakova
June 13, 2014
Programming
800
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Яндекс.Директ: как мы деплоим наши Perl-web-приложения
http://event.yapcrussia.org/yr2014/talk/273
Elena Bolshakova
June 13, 2014
More Decks by Elena Bolshakova
See All by Elena Bolshakova
Here be dragons: perltrap.com
helena
0
190
Devel::YCallTrace -- noch ein anderes Werkzeug zur Analyse von Perl Programmen
helena
0
590
Other Decks in Programming
See All in Programming
自分的「カンファレンスの楽しみ方」
syumai
0
200
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
450
Family mrubyの進捗
kishima
1
100
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
200
巨大モノリシックアプリ モダン化大作戦
ktcryomm
0
190
アクセシビリティから考える情報設計
high_g_engineer
0
320
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
120
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
220
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
140
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
110
typoなんかねぇよ
raspython3
0
680
Featured
See All Featured
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
450
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Automating Front-end Workflow
addyosmani
1369
210k
A designer walks into a library…
pauljervisheath
211
25k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Darren the Foodie - Storyboard
khoart
PRO
3
3.9k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
970
Transcript
ßíäåêñ.Äèðåêò: êàê ìû äåïëîèì íàøè Perl-ïðèëîæåíèÿ Åëåíà Áîëüøàêîâà 2014-06-13
Section 1 Êòî ìû
Ýòî ßíäåêñ
Ýòî ðåêëàìà
Ýòî ðàçìåùåíèå ðåêëàìû â ßíäåêñå Äèðåêò
Section 2 Êàêèå ìû
Öèôðû íåïðåðûâíàÿ ðàçðàáîòêà ñ 2003 ãîäà; 300 KSLOC perl-êîäà; ∼1000
èìåíîâàííûõ åäèíèö ôóíêöèîíàëüíîñòè: ñòðàíèöû web-èíòåðôåéñà; ìåòîäû âíåøíåãî API; ìåòîäû âíóòðåííèõ API; êðîíîâûå ñêðèïòû; èåðàðõèÿ ïîëüçîâàòåëåé (>15 ðîëåé); 30 ìëí. âíåøíèõ çàïðîñîâ ê perl-ïðèëîæåíèÿì / ñóòêè (ìíîãî çàïèñåé è òÿæåëûõ ÷òåíèé); mysql: ∼170 ìëðä. çàïèñåé îáùåíèå ñ äåñÿòêàìè ñìåæíûõ ñåðâèñîâ; ñåé÷àñ ∼40 ðàçðàáîò÷èêîâ, â ò.÷. ∼20 perl-ðàçðàáîò÷èêîâ; 10000 êîììèòîâ / 7 ìåñÿöåâ, â ò.÷. 2500 trunk-êîììèòîâ; ïðîäàêøåí: perl-êîä íà ∼40 ñåðâåðàõ; ∼2 ðåëèçà â íåäåëþ.
Òåõíîëîãèè ubuntu perl server-side javascript python, django mysql mongodb map-reduce
(YT) memcached
Òåõíîëîãèè-2 plack apache nginx starman gearman ubic soap (SOAP::Lite) xmlrpc
(XMLRPC::Lite) jsonrpc (JSON::RPC, JSON::RPC::Simple::Client, JSON::RPC2::Client)
Ñðåäû ðàçðàáîò÷åñêèå, ÒÑ, ïðîäàêøåí: ðàçðàáîò÷åñêèå ñ óïðîùåííîé èíôðàñòðóêòóðîé; ÒÑ
ñ ïîëíîöåííîé, êàê íà ïðîäàêøåíå; ðàçðàáîò÷åñêèå è òåñòîâûå ÁÄ: îáåçëè÷åííûé áåêàï ïðîäàêøåíà ðåãóëÿðíî òåñòèðóåòñÿ áåêàï è âîññòàíîâëåíèå; ðàçíîîáðàçíûå äàííûå äëÿ òåñòèðîâàíèÿ; äîñòóïû ðàçäåëåíû (ïðîäàêøåí îáíîâëÿþò òîëüêî àäìèíû).
Section 3 Ïîðà â ïðîäàêøåí
Óïðàâëåíèå ñåðâåðàìè Ñîáñòâåííàÿ Rex-ïîäîáíàÿ óòèëèòà ïîâåðõ ssh; íà óïðàâëÿåìûõ ìàøèíàõ
íèêàêèõ àãåíòîâ.
Ðåëèçû ïåðâè÷íûé èñòî÷íèê èíôîðìàöèè î ðåëèçàõ òðåêåð: ÷òî è
êàê âûêëàäûâàåì; êàêèå ïðîáëåìû íàéäåíû; ñòàòóñû (ïîäòâåðæäåíèÿ QA, çàêàç÷èêà, RM); êàæäûé ðåëèç òåñòèðóåòñÿ íà ÒÑ; ÷òî òåñòèðîâàòü: èçìåíåíèÿ îò ïðîøëîãî ðåëèçà (svn log); ðåãðåññèîííûå òåñòû; â êàæäîì commit-message ññûëêà íà òèêåò â òðåêåðå (ïðîâåðÿåòñÿ svn hook-îì).
Êîä deb-ïàêåòû, apt Óäîáíî: ðàáîòàåò; óíèâåðñàëüíî; ìíîãî ãîòîâûõ èíñòðóìåíòîâ; çàâèñèìîñòè,
â ò.÷. íåïåðëîâûå. Íåóäîáíî: óñòàíàâëèâàòü íå âåðõíþþ âåðñèþ íåïðîñòî; ïîëíîöåííî îòêàòèòü âñå êàê áûëî íåïðîñòî.
Êîä, ìàëåíüêèå õèòðîñòè mainline releasable; ïàêåòèðóåòñÿ ëèáî òðàíê, ëèáî ðåëèçíûé
áðàí÷ (òðàíê + ÷åððè-ïèê); ïî âåðñèè âñåãäà ïîíÿòíî, êàêàÿ òî÷êà â ðåïîçèòîðèè ïàêåòèðîâàëàñü; îòäåëüíûé êîíòðîëèðóåìûé deb-ðåïîçèòîðèé; æóðíàë: ÷òî âûëîæåíî â êàæäûé ìîìåíò íà ñåðâåðàõ, ïèñüìà îá îáíîâëåíèÿõ; çàâèñèìîñòè óêàçûâàòü ñ >=; ïîòåíöèàëüíî îïàñíûå/ñëîæíîîòêàòûâàåìûå îáíîâëåíèÿ îòäåëüíî îò ïðî÷èõ ðåëèçîâ; çàðàíåå ïðîâåðÿòü ïðèãîäíîñòü çàâèñèìîñòåé ê óñòàíîâêå.
Ìèãðàöèè: èçìåíåíèå ñòðóêòóðû ÁÄ (àëüòåðû) Ôàéëû ìèãðàöèé â /deploy ïèøóòñÿ
è êîììèòÿòñÿ âìåñòå ñ êîäîì; ôîðìàò ñòðîãèé, íî ÷åëîâåêî÷èòàåìûé: 20140613_client_comments.migr { type => 'sql', db => 'main', when => 'before', time_estimate => "20 sec", sql => "alter table clients add column `comment` varchar(140) default ''", } ïðèìåíÿþòñÿ ïîëóàâòîìàòè÷åñêè íà ÒÑ, âðó÷íóþ íà ïðîäàêøåíå;
Ìèãðàöèè: êîíâåðòàöèè äàííûõ 20140614_normalize_geo.migr { type => 'script', when =>
'after', time_estimate => "10 ÷àñîâ", comment => "åñëè óïàäåò -- ìîæíî çàïóñêàòü çàíîâî", script => "normalize_geo.pl", }
Ìèãðàöèè: ïðî÷èå äåéñòâèÿ 20131218_upgrade_nginx.migr { type => 'manual', when =>
'any', time_estimate => "10 min", text => "Âûïîëíèòü íà ñåðâåðàõ ãðóïïû PERL: apt-get install nginx-common=1.4.4-5 nginx=1.4.4-5 \ nginx-full=1.4.4-5 è çàòåì nginx-upgrade ", }
Ìèãðàöèè: æäåò ðåøåíèÿ àâòîìàòè÷åñêè ïðîâåðÿòü ïðèìåíåííîñòü; ïðîñòûå ñêðèïòû çàïóñêàòü áåç
ó÷àñòèÿ ÷åëîâåêà.
Ìèãðàöèè: ìàëåíüêèå õèòðîñòè ãëîáàëüíîãî ïîðÿäêà íåò; ÷åëîâåêîïîíÿòíûå èìåíà ñ ïðèìåðíîé
äàòîé; îáÿçàòåëüíûå ðåâüþ è àïïðóâû; óíèâåðñàëüíûé ôîðìàò äëÿ âñåõ äåéñòâèé, ñîïðîâîæäàþùèõ îáíîâëåíèå êîäà; õåëïåð äëÿ ñîçäàíèÿ øàáëîíà ìèãðàöèè; ïàðñèíã: Safe::reval; ñòðîãàÿ âàëèäàöèÿ; ïðîâåðêà ñèíòàêñèñà sql: DBIx::MyParsePP; âðåìÿ ïðèìåíåíèÿ: äî/ïîñëå âûêëàäêè êîäà/êîãäà óãîäíî; òÿæåëûå ìèãðàöèè; òåêñòîâûå îïèñàíèÿ ìèãðàöèé ïèøóòñÿ âìåñòå ñ changelog-îì â ðåëèçíûé òèêåò; åñëè íàäî êîììåíòàðèè, êàê îòêàòûâàòü.
Ìîíèòîðèíã ñõåìû ÁÄ Ôàéëû â /db_schema .schema.sql, .data.sql ñõåìû
è ñëîâàðíûå äàííûå; .text îïèñàíèå òàáëèö; ñêðèïò äëÿ ñðàâíåíèÿ ÁÄ ñ ôàéëàìè; îò÷åòû î ðàñõîæäåíèè ïðîäàêøåí-áàçû è ñîõðàíåííûõ ñõåì. À åùå SchemaSpy: âèçóàëèçàöèÿ ñâÿçåé â ÁÄ. Æäåò ðåøåíèÿ: ïðîâåðÿòü àêòóàëüíîñòü ñîõðàíåííûõ ñõåì ñðàçó ïîñëå êîììèòà.
Ðåãóëÿðíûå çàïóñêè ñêðèïòîâ Ôàéëû â /etc/cron.d Ãåíåðèðóþòñÿ ïðè ñáîðêå ïàêåòîâ
èç pod + íåìíîãî ïîäãîòîâëåííûõ çàðàíåå
Section 4 Áîíóñ-òðåê
Ïðîâåðêè, êîòîðûå äåëàþò æèçíü ñïîêîéíåå ñèíòàêñèñ è ïîäòâåðæäåííîñòü ìèãðàöèé; îòñóòñòâèå
îòëàäî÷íîé ïå÷àòè â ñêðèïòàõ ìèãðàöèé; ñèíòàêñèñ êðîíòàáîâ (íàïðèìåð: ïðè îòñóòñòâèè ïåðåâîäà ñòðîêè â êîíöå ôàéëà cron èãíîðèðóåò ôàéë); ñîîòâåòñòâèå ñóùåñòâóþùèõ ñêðèïòîâ è çàïèñåé â êðîíòàáàõ; ïðàâèëüíûå ôàéëû â /debian: ãëîáàëüíûå ôàéëû + ôàéëû, îòíîñÿùèåñÿ ê ñóùåñòâóþùèì ïàêåòàì; êîìïèëÿöèÿ âñåãî perl-êîäà; êîìïèëÿöèÿ âñåõ TT-øàáëîíîâ; ñîîòâåòñòâèå èñïîëüçóåìûõ è ñóùåñòâóþùèõ øàáëîíîâ; íà âñåõ ñêðèïòàõ åñòü svn:executable + ïðàâèëüíûé shebang;
Ïðîâåðêè, êîòîðûå äåëàþò æèçíü ñïîêîéíåå îòñóòñòâèå ñëåäîâ íåäîðàçðåøåííûõ êîíôëèêòîâ; mergeinfo
òîëüêî íà êîðíå ïðîåêòà; íå÷åëîâåêî÷èòàåìûå ôàéëû èìåþò ïðàâèëüíûé mime-type; âñå èñõîäíèêè â utf8; ìåòêà NO_PRODUCTION.
Ñïàñèáî! Âîïðîñû? Åëåíà Áîëüøàêîâà,
[email protected]