MÅ«sdienÄs lielÄkÄ daļa programmatÅ«ras produktu tiek izstrÄdÄti komandÄs. VeiksmÄ«gas komandas attÄ«stÄ«bas nosacÄ«jumus var attÄlot vienkÄrÅ”as diagrammas veidÄ.
Kad esat uzrakstÄ«jis kodu, jums tas ir jÄpÄrliecinÄs:
Tas darbojas.
Tas neko nesabojÄ, ieskaitot kodu, ko uzrakstÄ«ja jÅ«su kolÄÄ£i.
Ja abi nosacÄ«jumi ir izpildÄ«ti, tad jÅ«s esat ceÄ¼Ä uz panÄkumiem. Lai viegli pÄrbaudÄ«tu Å”os nosacÄ«jumus un nenovirzÄ«tos no ienesÄ«gÄ ceļa, mÄs izdomÄjÄm nepÄrtrauktu integrÄciju.
CI ir darbplÅ«sma, kurÄ jÅ«s pÄc iespÄjas biežÄk integrÄjat savu kodu kopÄjÄ produkta kodÄ. Un jÅ«s ne tikai integrÄjat, bet arÄ« pastÄvÄ«gi pÄrbaudiet, vai viss darbojas. TÄ kÄ jums ir jÄpÄrbauda daudz un bieži, ir vÄrts padomÄt par automatizÄciju. JÅ«s varat pÄrbaudÄ«t visu manuÄli, bet jums nevajadzÄtu, un lÅ«k, kÄpÄc.
Mīļie cilvÄki. Jebkura programmÄtÄja darba stunda ir dÄrgÄka nekÄ jebkura servera stunda.
CilvÄki pieļauj kļūdas. TÄpÄc var rasties situÄcijas, kad testi tika palaisti nepareizÄ zarÄ vai testÄtÄjiem tika apkopota nepareiza apÅemÅ”anÄs.
CilvÄki ir slinki. Ik pa laikam, kad pabeidzu kÄdu uzdevumu, rodas doma: āKo tur pÄrbaudÄ«t? Es uzrakstÄ«ju divas rindiÅas - viss darbojas! DomÄju, ka dažiem no jums arÄ« reizÄm rodas tÄdas domas. Bet jums vienmÄr ir jÄpÄrbauda.
KÄ nepÄrtrauktÄ integrÄcija tika ieviesta un izstrÄdÄta Avito mobilo ierÄ«Äu izstrÄdes komandÄ, kÄ viÅi veica no 0 lÄ«dz 450 bÅ«vÄm dienÄ un ka bÅ«vÄtÄs maŔīnas tiek komplektÄtas 200 stundas dienÄ, saka Nikolajs Å esterovs (nnesterovs) ir visu CI/CD Android lietojumprogrammas evolÅ«cijas izmaiÅu dalÄ«bnieks.
StÄsts ir balstÄ«ts uz Android komandas piemÄru, taÄu lielÄkÄ daļa pieeju ir piemÄrojamas arÄ« iOS.
KÄdreiz Avito Android komandÄ strÄdÄja viens cilvÄks. PÄc definÄ«cijas viÅam nekas nebija vajadzÄ«gs no nepÄrtrauktÄs integrÄcijas: nebija neviena, ar ko integrÄties.
TaÄu pieteikums auga, parÄdÄ«jÄs arvien jauni uzdevumi, un attiecÄ«gi auga komanda. KÄdÄ brÄ«dÄ« ir pienÄcis laiks formÄlÄk izveidot koda integrÄcijas procesu. Tika nolemts izmantot Git flow.
Git plÅ«smas jÄdziens ir labi zinÄms: projektam ir viena kopÄ«ga izstrÄdes filiÄle, un katrai jaunai funkcijai izstrÄdÄtÄji nogriež atseviŔķu zaru, apÅemas to Ä«stenot, nospiež un, kad viÅi vÄlas apvienot savu kodu izstrÄdes zarÄ, atver izvilkt pieprasÄ«jumu. Lai dalÄ«tos zinÄÅ”anÄs un apspriestu pieejas, mÄs ieviesÄm koda pÄrskatÄ«Å”anu, proti, kolÄÄ£iem ir jÄpÄrbauda un jÄapstiprina vienam otra kods.
PÄrbaudes
RedzÄt kodu ar acÄ«m ir forÅ”i, bet ar to nepietiek. TÄpÄc tiek ieviestas automÄtiskÄs pÄrbaudes.
PirmkÄrt, mÄs pÄrbaudÄm ARK montÄža.
Daudz Junita testi.
MÄs apsveram koda pÄrklÄjumu, jo mÄs veicam testus.
Lai saprastu, kÄ Å”Ä«s pÄrbaudes jÄveic, apskatÄ«sim izstrÄdes procesu Avito.
Shematiski to var attÄlot Å”Ädi:
IzstrÄdÄtÄjs raksta kodu savÄ klÄpjdatorÄ. JÅ«s varat palaist integrÄcijas pÄrbaudes tieÅ”i Å”eit ā vai nu ar fiksÄcijas ÄÄ·i, vai vienkÄrÅ”i palaist pÄrbaudes fonÄ.
Kad izstrÄdÄtÄjs ir nospiedis kodu, viÅÅ” atver izvilkÅ”anas pieprasÄ«jumu. Lai tÄ kods tiktu iekļauts izstrÄdes nozarÄ, ir jÄiziet koda pÄrskatÄ«Å”ana un jÄsavÄc nepiecieÅ”amais apstiprinÄjumu skaits. Å eit varat iespÄjot pÄrbaudes un bÅ«vÄjumus: kamÄr visas bÅ«ves nav veiksmÄ«gas, vilkÅ”anas pieprasÄ«jumu nevar sapludinÄt.
PÄc tam, kad izvilkÅ”anas pieprasÄ«jums ir apvienots un kods ir iekļauts izstrÄdÄ, varat izvÄlÄties Ärtu laiku: piemÄram, naktÄ«, kad visi serveri ir brÄ«vi, un veikt tik daudz pÄrbaužu, cik vÄlaties.
Nevienam nepatika veikt skenÄÅ”anu savÄ klÄpjdatorÄ. Kad izstrÄdÄtÄjs ir pabeidzis funkciju, viÅÅ” vÄlas to Ätri nospiest un atvÄrt vilkÅ”anas pieprasÄ«jumu. Ja Å”ajÄ brÄ«dÄ« tiek palaistas dažas ilgas pÄrbaudes, tas ne tikai nav Ä«paÅ”i patÄ«kami, bet arÄ« palÄnina attÄ«stÄ«bu: kamÄr klÄpjdators kaut ko pÄrbauda, āāar to nav iespÄjams normÄli strÄdÄt.
Mums ļoti patika palaist Äekus naktÄ«, jo laika un serveru ir daudz, var klÄ«st apkÄrt. TaÄu diemžÄl, kad funkcijas kods tiek izstrÄdÄts, izstrÄdÄtÄjam ir daudz mazÄka motivÄcija labot CI atrastÄs kļūdas. Periodiski pieÄ·Äru sevi pie domas, kad skatÄ«jos uz visÄm rÄ«ta atskaitÄ atrastajÄm kļūdÄm, ka kÄdreiz vÄlÄk tÄs izlaboÅ”u, jo tagad JirÄ ir jauns forÅ”s uzdevums, ko tikai gribu sÄkt darÄ«t.
Ja pÄrbaudes bloÄ·Ä pull pieprasÄ«jumu, tad ir pietiekami daudz motivÄcijas, jo, kamÄr bÅ«vdarbi nav zaļi, kods neiekļūs izstrÄdes procesÄ, kas nozÄ«mÄ, ka uzdevums netiks pabeigts.
RezultÄtÄ mÄs izvÄlÄjÄmies Å”Ädu stratÄÄ£iju: mÄs veicam maksimÄli iespÄjamo pÄrbaužu komplektu naktÄ« un palaižam kritiskÄkÄs no tÄm un, pats galvenais, ÄtrÄkÄs pÄc pieprasÄ«juma. TaÄu mÄs neapstÄjamies pie tÄ ā paralÄli mÄs optimizÄjam pÄrbaužu Ätrumu, lai tÄs pÄrsÅ«tÄ«tu no nakts režīma uz pieprasÄ«jumu pÄrbaudes.
TajÄ laikÄ visas mÅ«su bÅ«ves tika pabeigtas diezgan Ätri, tÄpÄc mÄs vienkÄrÅ”i iekļÄvÄm ARK bÅ«vÄjumu, Junit testus un koda pÄrklÄjuma aprÄÄ·inus kÄ pull pieprasÄ«juma bloÄ·ÄtÄju. MÄs to ieslÄdzÄm, domÄjÄm par to un atteicÄmies no koda pÄrklÄjuma, jo uzskatÄ«jÄm, ka mums tas nav vajadzÄ«gs.
Mums bija nepiecieÅ”amas divas dienas, lai pilnÄ«bÄ iestatÄ«tu pamata CI (turpmÄk laika aprÄÄ·ins ir aptuvens, nepiecieÅ”ams mÄrogam).
PÄc tam sÄkÄm domÄt tÄlÄk ā vai vispÄr pÄrbaudÄm pareizi? Vai mÄs pareizi izpildÄm bÅ«ves, pamatojoties uz izvilkÅ”anas pieprasÄ«jumiem?
MÄs sÄkÄm veidoÅ”anu, izmantojot pÄdÄjo filiÄles apÅemÅ”anos, no kuras tika atvÄrts izvilkÅ”anas pieprasÄ«jums. TaÄu Ŕīs saistÄ«bas testi var tikai parÄdÄ«t, ka izstrÄdÄtÄja ierakstÄ«tais kods darbojas. Bet tie nepierÄda, ka viÅÅ” neko nav salauzis. PatiesÄ«bÄ jums ir jÄpÄrbauda izstrÄdes filiÄles stÄvoklis pÄc tam, kad lÄ«dzeklis ir apvienots tajÄ.
Lai to izdarÄ«tu, mÄs uzrakstÄ«jÄm vienkÄrÅ”u bash skriptu premerge.sh:
Å eit visas jaunÄkÄs izmaiÅas no izstrÄdes tiek vienkÄrÅ”i uzvilktas un apvienotas paÅ”reizÄjÄ filiÄlÄ. MÄs pievienojÄm premerge.sh skriptu kÄ pirmo soli visÄs versijÄs un sÄkÄm pÄrbaudÄ«t tieÅ”i to, ko mÄs vÄlamies, tas ir, integrÄcija.
PagÄja trÄ«s dienas, lai lokalizÄtu problÄmu, atrastu risinÄjumu un uzrakstÄ«tu Å”o skriptu.
Lietojumprogramma attÄ«stÄ«jÄs, parÄdÄ«jÄs arvien vairÄk uzdevumu, komanda auga, un premerge.sh dažkÄrt sÄka mÅ«s pievilt. Develop bija pretrunÄ«gas izmaiÅas, kas pÄrtrauca bÅ«vniecÄ«bu.
PiemÄrs, kÄ tas notiek:
Divi izstrÄdÄtÄji vienlaikus sÄk strÄdÄt pie lÄ«dzekļiem A un B. LÄ«dzekļa A izstrÄdÄtÄjs atklÄj projektÄ neizmantotu lÄ«dzekli answer() un kÄ labs skauts to noÅem. TajÄ paÅ”Ä laikÄ funkcijas B izstrÄdÄtÄjs savÄ filiÄlÄ pievieno jaunu Ŕīs funkcijas izsaukumu.
IzstrÄdÄtÄji pabeidz darbu un vienlaikus atver izvilkÅ”anas pieprasÄ«jumu. BÅ«vÄjums tiek palaists, premerge.sh pÄrbauda abus izvilkÅ”anas pieprasÄ«jumus attiecÄ«bÄ uz jaunÄko izstrÄdes stÄvokli ā visas pÄrbaudes ir zaļas. PÄc tam objekta A piesaistes pieprasÄ«jums tiek apvienots, objekta B piesaistes pieprasÄ«jums tiek apvienots... Boom! IzstrÄdes pÄrtraukumi, jo izstrÄdes kodÄ ir izsaukums uz neesoÅ”u funkciju.
Kad tas neattÄ«stÄs, tas ir vietÄjÄ katastrofa. Visa komanda nevar savÄkt neko un iesniegt to pÄrbaudei.
TÄ sagadÄ«jÄs, ka es visbiežÄk strÄdÄju pie infrastruktÅ«ras uzdevumiem: analÄ«tika, tÄ«kls, datu bÄzes. Tas ir, es uzrakstÄ«ju tÄs funkcijas un klases, kuras izmanto citi izstrÄdÄtÄji. Å Ä« iemesla dÄļ es ļoti bieži nokļuvu lÄ«dzÄ«gÄs situÄcijÄs. Man pat kÄdu laiku Ŕī bilde bija karÄjusies.
TÄ kÄ tas mums nebija piemÄrots, mÄs sÄkÄm pÄtÄ«t iespÄjas, kÄ to novÄrst.
KÄ nepÄrkÄpt attÄ«stÄ«ties
Pirmais variants: Atjauninot izstrÄdÄt, pÄrbÅ«vÄt visus izvilkÅ”anas pieprasÄ«jumus. Ja mÅ«su piemÄrÄ izvilkÅ”anas pieprasÄ«jums ar lÄ«dzekli A ir pirmais, kas tiek iekļauts izstrÄdes procesÄ, objekta B izvilkÅ”anas pieprasÄ«jums tiks pÄrbÅ«vÄts, un attiecÄ«gi pÄrbaudes neizdosies kompilÄcijas kļūdas dÄļ.
Lai saprastu, cik ilgi tas prasÄ«s, apsveriet piemÄru ar diviem PR. MÄs atveram divus PR: divas versijas, divas pÄrbaudes. PÄc tam, kad pirmais PR ir apvienots attÄ«stÄ«bÄ, otrais ir jÄpÄrbÅ«vÄ. KopumÄ diviem PR ir jÄveic trÄ«s pÄrbaudes: 2 + 1 = 3.
PrincipÄ ir labi. Bet mÄs paskatÄ«jÄmies statistiku, un tipiskÄ situÄcija mÅ«su komandÄ bija 10 atvÄrti PR, un tad pÄrbaužu skaits ir progresijas summa: 10 + 9 +... + 1 = 55. Tas ir, pieÅemt 10 PR, jums ir jÄpÄrbÅ«vÄ 55 reizes. Un tas ir ideÄlÄ situÄcijÄ, kad visas pÄrbaudes iziet pirmo reizi, kad neviens neatver papildu izvilkÅ”anas pieprasÄ«jumu, kamÄr Å”ie desmiti tiek apstrÄdÄti.
IedomÄjieties sevi kÄ izstrÄdÄtÄju, kuram pirmajam jÄnoklikŔķina uz pogas āsapludinÄtā, jo, ja kaimiÅÅ” to izdarÄ«s, jums bÅ«s jÄgaida, lÄ«dz visas bÅ«ves atkal tiks cauri... NÄ, tas nedarbosies. , tas nopietni palÄninÄs attÄ«stÄ«bu.
Otrais iespÄjamais veids: apkopot izvilkÅ”anas pieprasÄ«jumus pÄc koda pÄrskatÄ«Å”anas. Tas nozÄ«mÄ, ka jÅ«s atverat izvilkÅ”anas pieprasÄ«jumu, savÄc nepiecieÅ”amo apstiprinÄjumu skaitu no kolÄÄ£iem, labojat nepiecieÅ”amo un pÄc tam palaižat bÅ«vÄjumus. Ja tie ir veiksmÄ«gi, izvilkÅ”anas pieprasÄ«jums tiek apvienots izstrÄdes procesÄ. Å ajÄ gadÄ«jumÄ papildu restartÄÅ”anas nav, taÄu atgriezeniskÄ saite ir ievÄrojami palÄninÄta. KÄ izstrÄdÄtÄjs, atverot izvilkÅ”anas pieprasÄ«jumu, es uzreiz vÄlos redzÄt, vai tas darbosies. PiemÄram, ja tests neizdodas, jums tas Ätri jÄlabo. AizkavÄtas uzbÅ«ves gadÄ«jumÄ palÄninÄs atgriezeniskÄ saite un lÄ«dz ar to arÄ« visa izstrÄde. ArÄ« Å”is mums nederÄja.
RezultÄtÄ palika tikai treÅ”Ä iespÄja - riteÅbraukÅ”ana. Viss mÅ«su kods, visi avoti tiek glabÄti Bitbucket servera repozitorijÄ. AttiecÄ«gi mums bija jÄizstrÄdÄ Bitbucket spraudnis.
Å is spraudnis ignorÄ vilkÅ”anas pieprasÄ«juma apvienoÅ”anas mehÄnismu. SÄkums ir standarta: tiek atvÄrts PR, tiek palaisti visi mezgli, koda pÄrskatÄ«Å”ana ir pabeigta. Bet pÄc tam, kad koda pÄrskatÄ«Å”ana ir pabeigta un izstrÄdÄtÄjs nolemj noklikŔķinÄt uz āsapludinÄtā, spraudnis pÄrbauda, āāpret kuru izstrÄdes stÄvokli tika veiktas pÄrbaudes. Ja izstrÄde ir atjauninÄta pÄc bÅ«vÄÅ”anas, spraudnis neļaus sapludinÄt Å”Ädu vilkÅ”anas pieprasÄ«jumu galvenajÄ filiÄlÄ. Tas vienkÄrÅ”i restartÄs salÄ«dzinoÅ”i nesenas izstrÄdes versijas.
MÅ«su piemÄrÄ ar pretrunÄ«gÄm izmaiÅÄm Å”Ädas bÅ«ves neizdosies kompilÄcijas kļūdas dÄļ. AttiecÄ«gi funkcijas B izstrÄdÄtÄjam bÅ«s jÄlabo kods, jÄrestartÄ pÄrbaudes, tad spraudnis automÄtiski piemÄros vilkÅ”anas pieprasÄ«jumu.
Pirms Ŕī spraudÅa ievieÅ”anas mÄs veicÄm vidÄji 2,7 pÄrskatÄ«Å”anas reizes vienam piesaistes pieprasÄ«jumam. Ar spraudni bija 3,6 palaiÅ”anas reizes. Tas mums derÄja.
Ir vÄrts atzÄ«mÄt, ka Å”im spraudnim ir trÅ«kums: tas tikai vienu reizi restartÄ bÅ«vniecÄ«bu. Tas nozÄ«mÄ, ka joprojÄm ir neliels logs, caur kuru var attÄ«stÄ«ties pretrunÄ«gas izmaiÅas. TaÄu tÄ iespÄjamÄ«ba ir zema, un mÄs veicÄm Å”o kompromisu starp startu skaitu un neveiksmes iespÄjamÄ«bu. Divu gadu laikÄ tas izÅ”Äva tikai vienu reizi, tÄpÄc, iespÄjams, tas nebija velti.
Bitbucket spraudÅa pirmÄs versijas uzrakstÄ«Å”ana aizÅÄma divas nedÄļas.
Jauni Äeki
TikmÄr mÅ«su komanda turpinÄja augt. Ir pievienoti jauni Äeki.
MÄs domÄjÄm: kÄpÄc kļūdÄ«ties, ja tÄs var novÄrst? Un tÄpÄc viÅi to Ä«stenoja statiskÄ koda analÄ«ze. MÄs sÄkÄm ar lint, kas ir iekļauta Android SDK. Bet tajÄ laikÄ viÅÅ” vispÄr nemÄcÄja strÄdÄt ar Kotlin kodu, un mums jau bija 75% no pieteikuma KotlinÄ rakstÄ«ts. TÄpÄc savÄrstÄ«Å”anai tika pievienoti iebÅ«vÄtie Android Studio pÄrbauda.
Lai to izdarÄ«tu, mums nÄcÄs veikt daudz kļūdu: paÅemiet Android Studio, iepakojiet to programmÄ Docker un palaidiet to CI ar virtuÄlo monitoru, lai tas domÄtu, ka tas darbojas Ä«stÄ klÄpjdatorÄ. Bet tas izdevÄs.
Å ajÄ laikÄ arÄ« mÄs sÄkÄm daudz rakstÄ«t instrumentÄcijas testi un Ä«stenots ekrÄnuzÅÄmumu pÄrbaude. Tas ir tad, kad atseviŔķam mazam skatam tiek Ä£enerÄts atsauces ekrÄnuzÅÄmums, un pÄrbaude sastÄv no ekrÄnuzÅÄmuma uzÅemÅ”anas no skata un salÄ«dzinÄÅ”anas ar standarta tieÅ”i pa pikseļiem. Ja ir neatbilstÄ«ba, tas nozÄ«mÄ, ka izkÄrtojums kaut kur ir nogÄjis greizi vai kaut kas nav kÄrtÄ«bÄ stilos.
Bet instrumentu pÄrbaudes un ekrÄnuzÅÄmumu testi ir jÄpalaiž ierÄ«cÄs: emulatoros vai reÄlÄs ierÄ«cÄs. Å emot vÄrÄ, ka testu ir daudz un tie tiek palaisti bieži, ir vajadzÄ«ga vesela ferma. Savas saimniecÄ«bas dibinÄÅ”ana ir pÄrÄk darbietilpÄ«ga, tÄpÄc atradÄm gatavu variantu ā Firebase Test Lab.
Firebase testa laboratorija
Tas tika izvÄlÄts, jo Firebase ir Google produkts, kas nozÄ«mÄ, ka tam ir jÄbÅ«t uzticamam un, visticamÄk, tas nekad nenomirs. Cenas ir saprÄtÄ«gas: 5 USD par reÄlas ierÄ«ces darbÄ«bas stundu, 1 USD par emulatora darbÄ«bas stundu.
Lai ieviestu Firebase Test Lab mÅ«su CI, bija nepiecieÅ”amas aptuveni trÄ«s nedÄļas.
TaÄu komanda turpinÄja augt, un Firebase diemžÄl sÄka mÅ«s pievilt. TajÄ laikÄ viÅam nebija SLA. DažkÄrt Firebase lika mums gaidÄ«t, lÄ«dz vajadzÄ«gais ierÄ«Äu skaits bÅ«s brÄ«vs testu veikÅ”anai, un nesÄka tos izpildÄ«t uzreiz, kÄ gribÄjÄm. GaidÄ«Å”ana rindÄ aizÅÄma lÄ«dz pusstundai, kas ir ļoti ilgs laiks. InstrumentÄcijas testi tika veikti katrÄ PR, kavÄÅ”anÄs patieÅ”Äm palÄninÄja attÄ«stÄ«bu, un tad ikmÄneÅ”a rÄÄ·ins nÄca ar apaļu summu. KopumÄ tika nolemts pamest Firebase un strÄdÄt iekÅ”Ä, jo komanda bija pietiekami augusi.
Docker + Python + bash
MÄs paÅÄmÄm Docker, iebÄzÄm tajÄ emulatorus, uzrakstÄ«jÄm vienkÄrÅ”u programmu Python, kas Ä«stajÄ brÄ«dÄ« palaiž vajadzÄ«go emulatoru skaitu pareizajÄ versijÄ un aptur tos, kad nepiecieÅ”ams. Un, protams, pÄris bash skripti ā kur gan mÄs bÅ«tu bez tiem?
Lai izveidotu mÅ«su paÅ”u testa vidi, bija nepiecieÅ”amas piecas nedÄļas.
RezultÄtÄ katram izvilkÅ”anas pieprasÄ«jumam bija plaÅ”s apvienoÅ”anas bloÄ·ÄjoÅ”o pÄrbaužu saraksts:
ARK montÄža;
Junita testi;
Plūksna;
Android Studio pÄrbaudes;
Instrumentu pÄrbaudes;
EkrÄnuzÅÄmumu testi.
Tas novÄrsa daudzus iespÄjamos bojÄjumus. Tehniski viss darbojÄs, taÄu izstrÄdÄtÄji sÅ«dzÄjÄs, ka rezultÄtu gaidÄ«Å”ana bija pÄrÄk ilga.
Cik ilgi ir par ilgu? MÄs augÅ”upielÄdÄjÄm datus no Bitbucket un TeamCity analÄ«zes sistÄmÄ un to sapratÄm vidÄjais gaidÄ«Å”anas laiks 45 minÅ«tes. Tas nozÄ«mÄ, ka izstrÄdÄtÄjs, atverot izvilkÅ”anas pieprasÄ«jumu, vidÄji gaida 45 minÅ«tes, lai iegÅ«tu bÅ«vÄÅ”anas rezultÄtus. ManuprÄt, tas ir daudz, un jÅ«s nevarat tÄ strÄdÄt.
Protams, mÄs nolÄmÄm paÄtrinÄt visas mÅ«su bÅ«ves.
PaÄtrinÄsim
Redzot, ka Äkas bieži vien stÄv rindÄ, vispirms mÄs darÄm iegÄdÄjÄs vairÄk aparatÅ«ras ā ekstensÄ«va attÄ«stÄ«ba ir visvienkÄrÅ”ÄkÄ. Builds pÄrtrauca rindas, bet gaidÄ«Å”anas laiks saruka tikai nedaudz, jo dažas pÄrbaudes paÅ”as aizÅÄma ļoti ilgu laiku.
PÄrÄk ilgu laiku Äeku noÅemÅ”ana
MÅ«su nepÄrtrauktÄ integrÄcija var uztvert Å”Äda veida kļūdas un problÄmas.
Netaisos. CI var uztvert kompilÄcijas kļūdu, ja kaut kas netiek izveidots pretrunÄ«gu izmaiÅu dÄļ. KÄ jau teicu, tad neviens neko nevar samontÄt, attÄ«stÄ«ba apstÄjas, un visi kļūst nervozi.
Kļūda uzvedÄ«bÄ. PiemÄram, ja lietojumprogramma ir izveidota, bet, nospiežot pogu, tÄ avarÄ vai poga netiek nospiesta vispÄr. Tas ir slikti, jo Å”Äda kļūda var sasniegt lietotÄju.
Kļūda izkÄrtojumÄ. PiemÄram, uz pogas ir noklikŔķinÄts, bet tÄ ir pÄrvietota par 10 pikseļiem pa kreisi.
TehniskÄ parÄda pieaugums.
Apskatot Å”o sarakstu, mÄs sapratÄm, ka tikai pirmie divi punkti ir kritiski. MÄs vÄlamies vispirms novÄrst Å”Ädas problÄmas. IzkÄrtojuma kļūdas tiek atklÄtas dizaina pÄrskatÄ«Å”anas stadijÄ, un pÄc tam tÄs var viegli izlabot. Tehnisko parÄdu risinÄÅ”anai ir nepiecieÅ”ams atseviŔķs process un plÄnoÅ”ana, tÄpÄc mÄs nolÄmÄm to nepÄrbaudÄ«t pÄc pieprasÄ«juma.
Pamatojoties uz Å”o klasifikÄciju, mÄs satricinÄjÄm visu Äeku sarakstu. IzsvÄ«trots Lint un atlika tÄ palaiÅ”anu uz nakti: tikai tÄpÄc, lai tas sagatavotu ziÅojumu par to, cik daudz problÄmu bija projektÄ. VienojÄmies strÄdÄt atseviŔķi ar tehnisko parÄdu, un Android Studio pÄrbaudes tika pilnÄ«bÄ atmestas. Android Studio programmÄ Docker pÄrbaužu veikÅ”anai izklausÄs interesanti, taÄu rada daudz problÄmu atbalsta jomÄ. JebkurÅ” Android Studio versiju atjauninÄjums nozÄ«mÄ cÄ«Åu ar nesaprotamÄm kļūdÄm. Bija arÄ« grÅ«ti atbalstÄ«t ekrÄnuzÅÄmumu testus, jo bibliotÄka nebija ļoti stabila un bija kļūdaini pozitÄ«vi. EkrÄnuzÅÄmumu testi ir izÅemti no kontrolsaraksta.
RezultÄtÄ mums palika:
ARK montÄža;
Junita testi;
InstrumentÄcijas testi.
Gradle attÄlÄ keÅ”atmiÅa
Bez smagÄm pÄrbaudÄm viss kļuva labÄk. Bet pilnÄ«bai nav robežu!
MÅ«su lietojumprogramma jau bija sadalÄ«ta aptuveni 150 pakÄpes moduļos. Gradle attÄlÄ keÅ”atmiÅa parasti Å”ajÄ gadÄ«jumÄ darbojas labi, tÄpÄc mÄs nolÄmÄm to izmÄÄ£inÄt.
Gradle attÄlÄ keÅ”atmiÅa ir pakalpojums, kas var keÅ”atmiÅÄ saglabÄt artefaktus atseviŔķiem uzdevumiem atseviŔķos moduļos. Gradle tÄ vietÄ, lai faktiski apkopotu kodu, izmanto HTTP, lai pieklauvÄtu pie attÄlÄs keÅ”atmiÅas un jautÄtu, vai kÄds jau ir veicis Å”o uzdevumu. Ja jÄ, tas vienkÄrÅ”i lejupielÄdÄ rezultÄtu.
Gradle attÄlÄs keÅ”atmiÅas palaiÅ”ana ir vienkÄrÅ”a, jo Gradle nodroÅ”ina Docker attÄlu. Mums tas izdevÄs trÄ«s stundu laikÄ.
Viss, kas jums jÄdara, bija palaist Docker un projektÄ ierakstÄ«t vienu rindiÅu. Bet, lai gan to var Ätri palaist, tas prasÄ«s diezgan daudz laika, lai viss darbotos labi.
ZemÄk ir keÅ”atmiÅas izlaiÅ”anas diagramma.
PaÅ”Ä sÄkumÄ keÅ”atmiÅas izlaidumu procents bija aptuveni 65. PÄc trim nedÄļÄm mums izdevÄs Å”o vÄrtÄ«bu palielinÄt lÄ«dz 20%. IzrÄdÄ«jÄs, ka Android lietojumprogrammas apkopotajiem uzdevumiem ir dÄ«vainas pÄrejoÅ”as atkarÄ«bas, kuru dÄļ Gradle palaida garÄm keÅ”atmiÅu.
Savienojot keÅ”atmiÅu, mÄs ievÄrojami paÄtrinÄjÄm veidoÅ”anu. Bet papildus montÄžai ir arÄ« instrumentu pÄrbaudes, un tÄs aizÅem ilgu laiku. IespÄjams, ne visi testi ir jÄveic katram vilkÅ”anas pieprasÄ«jumam. Lai to noskaidrotu, mÄs izmantojam ietekmes analÄ«zi.
Ir lietderÄ«gi palaist tikai instrumentu testus, kas pÄrbauda mainÄ«tos moduļus un visus no tiem atkarÄ«gos moduļus. Nav jÄgas palaist testus blakus esoÅ”ajiem moduļiem: kods tur nav mainÄ«jies un nekas nevar salÅ«zt.
InstrumentÄcijas testi nav tik vienkÄrÅ”i, jo tiem jÄatrodas augstÄkÄ lÄ«meÅa lietojumprogrammu modulÄ«. MÄs izmantojÄm heiristiku ar baitkoda analÄ«zi, lai saprastu, kuram modulim pieder katrs tests.
Instrumentu pÄrbaužu darbÄ«bas uzlaboÅ”ana, lai tie pÄrbaudÄ«tu tikai iesaistÄ«tos moduļus, aizÅÄma apmÄram astoÅas nedÄļas.
PÄrbaužu paÄtrinÄÅ”anas pasÄkumi ir bijuÅ”i veiksmÄ«gi. No 45 minÅ«tÄm mÄs uzkÄpÄm lÄ«dz apmÄram 15. Tas jau ir normÄli, ka jÄgaida ceturtdaļstundu, lai uzbÅ«vÄtu.
Bet tagad izstrÄdÄtÄji ir sÄkuÅ”i sÅ«dzÄties, ka nesaprot, kuras bÅ«ves tiek palaists, kur var redzÄt žurnÄlu, kÄpÄc bÅ«ve ir sarkana, kurÅ” tests neizdevÄs utt.
ProblÄmas ar atgriezenisko saiti palÄnina attÄ«stÄ«bu, tÄpÄc mÄs centÄmies sniegt pÄc iespÄjas skaidrÄku un detalizÄtÄku informÄciju par katru PR un bÅ«vniecÄ«bu. MÄs sÄkÄm ar komentÄriem pakalpojumÄ Bitbucket PR, norÄdot, kurÅ” veidojums neizdevÄs un kÄpÄc, un rakstÄ«jÄm mÄrÄ·tiecÄ«gus ziÅojumus Slack. BeigÄs mÄs izveidojÄm lapai PR informÄcijas paneli ar visu paÅ”laik darbojoÅ”os bÅ«vÄjumu sarakstu un to statusu: rindÄ, darbojas, avarÄja vai pabeigta. Varat noklikŔķinÄt uz bÅ«ves un nokļūt tÄs žurnÄlÄ.
SeÅ”as nedÄļas tika veltÄ«tas detalizÄtÄm atsauksmÄm.
PlÄni
PÄriesim pie nesenÄs vÄstures. Atrisinot atgriezeniskÄs saites problÄmu, mÄs sasniedzÄm jaunu lÄ«meni - nolÄmÄm izveidot savu emulatoru fermu. Ja ir daudz testu un emulatoru, tos ir grÅ«ti pÄrvaldÄ«t. RezultÄtÄ visi mÅ«su emulatori pÄrcÄlÄs uz k8s klasteru ar elastÄ«gu resursu pÄrvaldÄ«bu.
TurklÄt ir arÄ« citi plÄni.
Atgriezties Lint (un cita statiskÄ analÄ«ze). MÄs jau strÄdÄjam Å”ajÄ virzienÄ.
Palaidiet visu uz PR bloÄ·ÄtÄja pilnÄ«gas pÄrbaudes visÄs SDK versijÄs.
TÄtad, mÄs esam izsekojuÅ”i Avito nepÄrtrauktÄs integrÄcijas attÄ«stÄ«bas vÄsturei. Tagad es vÄlos sniegt dažus padomus no pieredzÄjuÅ”a viedokļa.
Š”Š¾Š²ŠµŃŃ
Ja es varÄtu sniegt tikai vienu padomu, tas bÅ«tu Å”Äds:
LÅ«dzu, esiet uzmanÄ«gi ar Äaulas skriptiem!
Bash ir ļoti elastÄ«gs un spÄcÄ«gs rÄ«ks, ar to ir ļoti Ärti un Ätri rakstÄ«t skriptus. Bet ar to jÅ«s varat iekrist lamatÄs, un diemžÄl mÄs tajÄ iekritÄm.
Viss sÄkÄs ar vienkÄrÅ”iem skriptiem, kas darbojÄs mÅ«su bÅ«vÄÅ”anas iekÄrtÄs:
#!/usr/bin/env bash
./gradlew assembleDebug
Bet, kÄ zinÄms, ar laiku viss attÄ«stÄs un kļūst sarežģītÄks - palaist vienu skriptu no otra, nododam tur dažus parametrus - beigÄs bija jÄuzraksta funkcija, kas nosaka, kÄdÄ bash ligzdoÅ”anas lÄ«menÄ« mÄs tagad esam kÄrtÄ«bÄ lai ievietotu nepiecieÅ”amos citÄtus, lai viss sÄktu.
Jebkura skriptu valoda. RakstÄ«t Python vai Kotlin skripts ÄrtÄk, jo tÄ ir programmÄÅ”ana, nevis skripti.
Vai veidlapÄ aprakstiet visu veidoÅ”anas loÄ£iku PielÄgoti gradle uzdevumi jÅ«su projektam.
MÄs nolÄmÄm izvÄlÄties otro iespÄju, un tagad mÄs sistemÄtiski dzÄÅ”am visus bash skriptus un rakstÄm daudz pielÄgotu gradle uzdevumu.
2. padoms. SaglabÄjiet infrastruktÅ«ru kodÄ.
Tas ir Ärti, ja iestatÄ«jums Continuous Integration tiek glabÄts nevis Jenkins vai TeamCity u.c. lietotÄja interfeisÄ, bet gan teksta failu veidÄ tieÅ”i projekta repozitorijÄ. Tas nodroÅ”ina versijas spÄju. NebÅ«s grÅ«ti atjaunot vai izveidot kodu citÄ filiÄlÄ.
Skriptus var saglabÄt projektÄ. Ko darÄ«t ar vidi?
Padoms Nr. 3: Docker var palÄ«dzÄt ar vidi.
Tas noteikti palÄ«dzÄs Android izstrÄdÄtÄjiem; iOS, diemžÄl, tÄda vÄl nav.
Å is ir vienkÄrÅ”a docker faila piemÄrs, kurÄ ir jdk un android-sdk:
FROM openjdk:8
ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip"
ANDROID_HOME="/usr/local/android-sdk"
ANDROID_VERSION=26
ANDROID_BUILD_TOOLS_VERSION=26.0.2
# Download Android SDK
RUN mkdir "$ANDROID_HOME" .android
&& cd "$ANDROID_HOME"
&& curl -o sdk.zip $SDK_URL
&& unzip sdk.zip
&& rm sdk.zip
&& yes | $ANDROID_HOME/tools/bin/sdkmanager --licenses
# Install Android Build Tool and Libraries
RUN $ANDROID_HOME/tools/bin/sdkmanager --update
RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}"
"platforms;android-${ANDROID_VERSION}"
"platform-tools"
RUN mkdir /application
WORKDIR /application
Uzrakstot Å”o Docker failu (atklÄÅ”u noslÄpumu, tas nav jÄraksta, bet vienkÄrÅ”i jÄizvelk gatavu no GitHub) un samontÄts attÄls, jÅ«s iegÅ«stat virtuÄlo maŔīnu, uz kuras varat veidot aplikÄciju un palaist Junita testus.
Divi galvenie iemesli, kÄpÄc tam ir jÄga, ir mÄrogojamÄ«ba un atkÄrtojamÄ«ba. Izmantojot docker, varat Ätri izveidot duci bÅ«vaÄ£entu, kuriem bÅ«s tieÅ”i tÄda pati vide kÄ iepriekÅ”Äjai. Tas ievÄrojami atvieglo CI inženieru dzÄ«vi. Ir diezgan viegli ievietot android-sdk dokerÄ, taÄu ar emulatoriem tas ir nedaudz grÅ«tÄk: jums bÅ«s jÄstrÄdÄ nedaudz vairÄk (vai vÄlreiz lejupielÄdÄjiet pabeigto no GitHub).
Padoms Nr.4: neaizmirstiet, ka pÄrbaudes tiek veiktas nevis pÄrbaužu, bet gan cilvÄku dÄļ.
IzstrÄdÄtÄjiem ļoti svarÄ«gas ir Ätras un, pats galvenais, skaidras atsauksmes: kas sabojÄjÄs, kÄds tests neizdevÄs, kur var redzÄt buildlog.
Skaidri saprotiet, kÄda veida kļūdas vÄlaties novÄrst, cik daudz resursu, laika un datora laika esat gatavs tÄrÄt. PÄrbaudes, kas aizÅem pÄrÄk ilgu laiku, var, piemÄram, atlikt uz nakti. Un no tiem, kas uztver ne pÄrÄk svarÄ«gas kļūdas, vajadzÄtu pilnÄ«bÄ atteikties.
6. padoms: izmantojiet gatavus rīkus.
Tagad ir daudz uzÅÄmumu, kas nodroÅ”ina mÄkoÅa CI.
Tas ir labs risinÄjums mazÄm komandÄm. Jums nekas nav jÄatbalsta, vienkÄrÅ”i samaksÄjiet nedaudz naudas, izveidojiet lietojumprogrammu un pat veiciet instrumentu pÄrbaudes.
7. padoms: lielÄ komandÄ iekÅ”Äjie risinÄjumi ir izdevÄ«gÄki.
TaÄu agri vai vÄlu, komandai augot, iekÅ”Äjie risinÄjumi kļūs izdevÄ«gÄki. Ar Å”iem lÄmumiem ir viena problÄma. EkonomikÄ pastÄv atdeves samazinÄÅ”anÄs likums: jebkurÄ projektÄ katrs nÄkamais uzlabojums ir arvien grÅ«tÄks un prasa arvien lielÄkus ieguldÄ«jumus.
Ekonomika apraksta visu mÅ«su dzÄ«vi, ieskaitot nepÄrtrauktu integrÄciju. Es izveidoju darbaspÄka izmaksu grafiku katram mÅ«su nepÄrtrauktÄs integrÄcijas attÄ«stÄ«bas posmam.
Skaidrs, ka jebkurÅ” uzlabojums kļūst arvien grÅ«tÄks. Skatoties uz Å”o grafiku, var saprast, ka nepÄrtraukta integrÄcija ir jÄattÄ«sta atbilstoÅ”i komandas lieluma pieaugumam. Divu cilvÄku komandai pavadÄ«t 50 dienas iekÅ”ÄjÄs emulatoru fermas izstrÄdei ir viduvÄja ideja. Bet tajÄ paÅ”Ä laikÄ lielai komandai NepÄrtrauktÄs integrÄcijas nedarÄ«Å”ana vispÄr ir arÄ« slikta doma, jo integrÄcijas problÄmas, komunikÄcijas laboÅ”ana utt. tas prasÄ«s vÄl vairÄk laika.
MÄs sÄkÄm ar domu, ka automatizÄcija ir vajadzÄ«ga, jo cilvÄki ir dÄrgi, viÅi kļūdÄs un ir slinki. Bet cilvÄki arÄ« automatizÄ. TÄpÄc visas tÄs paÅ”as problÄmas attiecas uz automatizÄciju.
AutomatizÄcija ir dÄrga. Atcerieties darba grafiku.
RunÄjot par automatizÄciju, cilvÄki pieļauj kļūdas.
Dažreiz ir ļoti slinki automatizÄt, jo viss darbojas tÄ. KÄpÄc uzlabot kaut ko citu, kÄpÄc visa Ŕī nepÄrtrauktÄ integrÄcija?
Bet man ir statistika: kļūdas tiek pieÄ·ertas 20% mezglu. Un tas nav tÄpÄc, ka mÅ«su izstrÄdÄtÄji slikti raksta kodu. Tas ir tÄpÄc, ka izstrÄdÄtÄji ir pÄrliecinÄti, ka, ja viÅi pieļaus kÄdu kļūdu, tÄ nenonÄks izstrÄdes procesÄ, to pÄrbaudÄ«s automatizÄtas pÄrbaudes. AttiecÄ«gi izstrÄdÄtÄji var pavadÄ«t vairÄk laika koda un interesantu lietu rakstÄ«Å”anai, nevis kaut ko palaist un testÄt lokÄli.
PraktizÄjiet nepÄrtrauktu integrÄciju. Bet ar mÄru.
Starp citu, Nikolajs Å esterovs ne tikai pats sniedz lieliskus ziÅojumus, bet ir arÄ« programmas komitejas loceklis AppsConf un palÄ«dz citiem sagatavot jÄgpilnas runas jums. NÄkamÄs konferences programmas pilnÄ«gumu un lietderÄ«bu var novÄrtÄt pÄc tÄmÄm grafiks. Un sÄ«kÄkai informÄcijai nÄc uz Infospace 22.-23.aprÄ«lÄ«.