Яндекс.Директ: как мы деплоим наши Perl-web-приложения7. Öèôðû
íåïðåðûâíàÿ ðàçðàáîòêà ñ 2003 ãîäà;
300 KSLOC perl-êîäà;
∼1000 èìåíîâàííûõ åäèíèö ôóíêöèîíàëüíîñòè:
ñòðàíèöû web-èíòåðôåéñà;
ìåòîäû âíåøíåãî API;
ìåòîäû âíóòðåííèõ API;
êðîíîâûå ñêðèïòû;
èåðàðõèÿ ïîëüçîâàòåëåé (15 ðîëåé);
30 ìëí. âíåøíèõ çàïðîñîâ ê perl-ïðèëîæåíèÿì / ñóòêè
(ìíîãî çàïèñåé è òÿæåëûõ ÷òåíèé);
mysql: ∼170 ìëðä. çàïèñåé
îáùåíèå ñ äåñÿòêàìè ñìåæíûõ ñåðâèñîâ;
ñåé÷àñ ∼40 ðàçðàáîò÷èêîâ, â ò.÷. ∼20 perl-ðàçðàáîò÷èêîâ;
10000 êîììèòîâ / 7 ìåñÿöåâ, â ò.÷. 2500 trunk-êîììèòîâ;
ïðîäàêøåí: perl-êîä íà ∼40 ñåðâåðàõ;
∼2 ðåëèçà â íåäåëþ.
10. Ñðåäû
ðàçðàáîò÷åñêèå, ÒÑ, ïðîäàêøåí:
ðàçðàáîò÷åñêèå ñ óïðîùåííîé èíôðàñòðóêòóðîé;
ÒÑ ñ ïîëíîöåííîé, êàê íà ïðîäàêøåíå;
ðàçðàáîò÷åñêèå è òåñòîâûå ÁÄ: îáåçëè÷åííûé áåêàï
ïðîäàêøåíà
ðåãóëÿðíî òåñòèðóåòñÿ áåêàï è âîññòàíîâëåíèå;
ðàçíîîáðàçíûå äàííûå äëÿ òåñòèðîâàíèÿ;
äîñòóïû ðàçäåëåíû (ïðîäàêøåí îáíîâëÿþò òîëüêî
àäìèíû).
13. Ðåëèçû
ïåðâè÷íûé èñòî÷íèê èíôîðìàöèè î ðåëèçàõ òðåêåð:
÷òî è êàê âûêëàäûâàåì;
êàêèå ïðîáëåìû íàéäåíû;
ñòàòóñû (ïîäòâåðæäåíèÿ QA, çàêàç÷èêà, RM);
êàæäûé ðåëèç òåñòèðóåòñÿ íà ÒÑ;
÷òî òåñòèðîâàòü:
èçìåíåíèÿ îò ïðîøëîãî ðåëèçà (svn log);
ðåãðåññèîííûå òåñòû;
â êàæäîì commit-message ññûëêà íà òèêåò â òðåêåðå
(ïðîâåðÿåòñÿ svn hook-îì).
15. Êîä, ìàëåíüêèå õèòðîñòè
mainline releasable;
ïàêåòèðóåòñÿ ëèáî òðàíê, ëèáî ðåëèçíûé áðàí÷ (òðàíê +
÷åððè-ïèê);
ïî âåðñèè âñåãäà ïîíÿòíî, êàêàÿ òî÷êà â ðåïîçèòîðèè
ïàêåòèðîâàëàñü;
îòäåëüíûé êîíòðîëèðóåìûé deb-ðåïîçèòîðèé;
æóðíàë: ÷òî âûëîæåíî â êàæäûé ìîìåíò íà ñåðâåðàõ,
ïèñüìà îá îáíîâëåíèÿõ;
çàâèñèìîñòè óêàçûâàòü ñ =;
ïîòåíöèàëüíî îïàñíûå/ñëîæíîîòêàòûâàåìûå îáíîâëåíèÿ
îòäåëüíî îò ïðî÷èõ ðåëèçîâ;
çàðàíåå ïðîâåðÿòü ïðèãîäíîñòü çàâèñèìîñòåé ê óñòàíîâêå.
16. Ìèãðàöèè: èçìåíåíèå ñòðóêòóðû ÁÄ (àëüòåðû)
Ôàéëû ìèãðàöèé â /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 '',
}
ïðèìåíÿþòñÿ ïîëóàâòîìàòè÷åñêè íà ÒÑ, âðó÷íóþ íà
ïðîäàêøåíå;
20. Ìèãðàöèè: ìàëåíüêèå õèòðîñòè
ãëîáàëüíîãî ïîðÿäêà íåò;
÷åëîâåêîïîíÿòíûå èìåíà ñ ïðèìåðíîé äàòîé;
îáÿçàòåëüíûå ðåâüþ è àïïðóâû;
óíèâåðñàëüíûé ôîðìàò äëÿ âñåõ äåéñòâèé,
ñîïðîâîæäàþùèõ îáíîâëåíèå êîäà;
õåëïåð äëÿ ñîçäàíèÿ øàáëîíà ìèãðàöèè;
ïàðñèíã: Safe::reval;
ñòðîãàÿ âàëèäàöèÿ;
ïðîâåðêà ñèíòàêñèñà sql: DBIx::MyParsePP;
âðåìÿ ïðèìåíåíèÿ: äî/ïîñëå âûêëàäêè êîäà/êîãäà óãîäíî;
òÿæåëûå ìèãðàöèè;
òåêñòîâûå îïèñàíèÿ ìèãðàöèé ïèøóòñÿ âìåñòå ñ
changelog-îì â ðåëèçíûé òèêåò;
åñëè íàäî êîììåíòàðèè, êàê îòêàòûâàòü.
21. Ìîíèòîðèíã ñõåìû ÁÄ
Ôàéëû â /db_schema
.schema.sql, .data.sql ñõåìû è ñëîâàðíûå äàííûå;
.text îïèñàíèå òàáëèö;
ñêðèïò äëÿ ñðàâíåíèÿ ÁÄ ñ ôàéëàìè;
îò÷åòû î ðàñõîæäåíèè ïðîäàêøåí-áàçû è ñîõðàíåííûõ
ñõåì.
À åùå SchemaSpy: âèçóàëèçàöèÿ ñâÿçåé â ÁÄ.
Æäåò ðåøåíèÿ: ïðîâåðÿòü àêòóàëüíîñòü ñîõðàíåííûõ ñõåì
ñðàçó ïîñëå êîììèòà.
24. Ïðîâåðêè, êîòîðûå äåëàþò æèçíü ñïîêîéíåå
ñèíòàêñèñ è ïîäòâåðæäåííîñòü ìèãðàöèé;
îòñóòñòâèå îòëàäî÷íîé ïå÷àòè â ñêðèïòàõ ìèãðàöèé;
ñèíòàêñèñ êðîíòàáîâ (íàïðèìåð: ïðè îòñóòñòâèè ïåðåâîäà
ñòðîêè â êîíöå ôàéëà cron èãíîðèðóåò ôàéë);
ñîîòâåòñòâèå ñóùåñòâóþùèõ ñêðèïòîâ è çàïèñåé â
êðîíòàáàõ;
ïðàâèëüíûå ôàéëû â /debian: ãëîáàëüíûå ôàéëû +
ôàéëû, îòíîñÿùèåñÿ ê ñóùåñòâóþùèì ïàêåòàì;
êîìïèëÿöèÿ âñåãî perl-êîäà;
êîìïèëÿöèÿ âñåõ TT-øàáëîíîâ;
ñîîòâåòñòâèå èñïîëüçóåìûõ è ñóùåñòâóþùèõ øàáëîíîâ;
íà âñåõ ñêðèïòàõ åñòü svn:executable + ïðàâèëüíûé shebang;
25. Ïðîâåðêè, êîòîðûå äåëàþò æèçíü ñïîêîéíåå
îòñóòñòâèå ñëåäîâ íåäîðàçðåøåííûõ êîíôëèêòîâ;
mergeinfo òîëüêî íà êîðíå ïðîåêòà;
íå÷åëîâåêî÷èòàåìûå ôàéëû èìåþò ïðàâèëüíûé mime-type;
âñå èñõîäíèêè â utf8;
ìåòêà NO_PRODUCTION.