CI areng seente meeskonnas

TÀnapÀeval arendatakse enamik tarkvaratooteid meeskondades. Meeskonna arendamise edu tingimusi vÔib esitada lihtsa skeemina.

CI areng seente meeskonnas

Koodi kirjutades peaksite veenduma, et see:

  1. Töötab.
  2. Ei rikku midagi, sealhulgas teie kolleegide kirjutatud koodi.

Kui mÔlemad tingimused on tÀidetud, siis olete edusamme tegemas. Nende tingimuste lihtsaks kontrollimiseks ja kasulikult edasiviivale teele jÀÀmiseks on vÀlja töötatud pidev integreerimine.

CI on töövoog, kus integreerite oma koodi vÔimalikult sageli tootekoodi. Ja mitte lihtsalt integreerite, vaid kontrollite pidevalt, et kÔik toimib. Kuna tuleb sageli ja palju kontrollida, on mÔistlik mÔelda automatiseerimise peale. KÔike saab kÀsitsi kontrollida, kuid seda ei tohiks teha, ja siin on pÔhjus.

  • Inimesed on kallid. Iga programmeerija töötunni hind ĂŒletab igasuguste serverite töötunni hinda.
  • Inimesed teevad vigu. SeetĂ”ttu vĂ”ivad tekkida olukorrad, kus testid kĂ€ivitatakse vale haru peal vĂ”i koostatakse vale kommit testeritele.
  • Inimesed on laisad. Aeg-ajalt, kui mul on mĂ”ni ĂŒlesanne lĂ”petatud, tekib mul mĂ”te: „Milleks siin ĂŒldse midagi kontrollida? Kirjutasin kaks rida — kindlasti kĂ”ik töötab!” MĂ”tlen, et ka mĂ”nel teist vĂ”ivad sellised mĂ”tted aeg-ajalt pĂ€he tulla. Kuid kontrollida tuleb alati.

Kuidas juurutati ja arendati jĂ€tkuvat integreerimist Avito mobiiliviimiste meeskonnas, kuidas jĂ”uti 0-lt 450 kogumiseni pĂ€evas, ja milline on build-masinate 200 tunni kogumine pĂ€evas, rÀÀgib Nikolai Nesterov (nnesterov) — osaleja kĂ”igis CI/CD Android-rakenduse evolutsiooniliste muutuste juures.

Jutustus pÔhineb Android-meeskonna nÀitel, kuid enamik lÀhenemisviise on rakendatavad ka iOS-i puhul.

Vaata videot

Kaua aega tagasi töötas Avito Android-meeskonnas vaid ĂŒks inimene. Talle ei olnud mingil juhul vajalik mitte midagi jĂ€tkuva integreerimise kohta: kellegagi ei olnud vaja integreeruda.

Kuid rakendus kasvas, uusi ĂŒlesandeid tuli jĂ€rjest juurde ja seega kasvas ka meeskond. Ühel hetkel tuli aeg, mil oli vajalik koodi integreerimise protsess formaalsemaks muuta. Otsustati kasutada Git flow'd.

CI areng seente meeskonnas

Git flow kontseptsioon on teada: projektis on ĂŒks ĂŒhine haru develop, ja iga uue funktsiooni jaoks loovad arendajad eraldi haru, commitivad sinna, pushivad, ja kui nad soovivad oma koodi haru develop'iga ĂŒhendada, avavad pull request'i. Teadmiste vahetamiseks ja lĂ€henemiste aruteluks oleme sisse viinud koodivaatluse, mis tĂ€hendab, et kolleegid peavad ĂŒksteise koodi kontrollima ja kinnitama.

Kontrollid

Koodi vaatamine on suurepÀrane, kuid mitte piisav. SeetÔttu on sisse viidud automaatsed kontrollid.

  • Esmalt kontrollime ARK komponentide koostamist.
  • Palju Junit teste.
  • Arvutame koodikatvuse, kuna kĂ€ivitame teste.

Et mÔista, kuidas neid kontrolle kÀivitada, vaatame Avito arendusprotsessi.

Skeemiliselt vÔib selle esitada jÀrgmiselt:

  • Arendaja kirjutab koodi oma sĂŒlearvutis. Integreerimiskontrolle saab kĂ€ivitada otse siin — kas commit hook'i abil vĂ”i lihtsalt taustal kontrolle kĂ€ivitades.
  • PĂ€rast seda, kui arendaja on koodi pushinud, avab ta pull request'i. Selleks, et tema kood jĂ”uaks haru develop, peab ta lĂ€bima koodivaatluse ja koguma vajaliku arvu kinnitusi. Siin saab sisse lĂŒlitada kontrollid ja build'id: seni, kuni kĂ”ik build'id ei ole edukad, ei saa pull request'i ĂŒhendada.
  • PĂ€rast seda, kui pull request on kokku sulandatud ja kood on arenduses, saab valida sobiva aja: nĂ€iteks öösel, kui kĂ”ik serverid on vabad, ja kĂ€ivitada teste nii palju kui vĂ”imalik.

Testide kĂ€itamine oma sĂŒlearvutis ei olnud kellelegi meeltmööda. Kui arendaja on funktsionaalsuse lĂ”petanud, soovib ta selle kiiresti osutada ja avada pull requesti. Kui sel hetkel kĂ€ivitatakse mingeid pikki teste, on see mitte ainult ebameeldiv, vaid pidurdab ka arendust: seni kuni sĂŒlearvuti midagi testib, ei ole seal normaalselt tööd teha.

Öösel testide kĂ€itamine oli meile vĂ€ga meeltmööda, sest aega ja servereid on palju, vĂ”ib vabalt testida. Kuid kahjuks, kui funktsionaalsuse kood on arenduses, on arendajal tĂ”enĂ€oliselt palju vĂ€hem motivatsiooni parandada CI leidnud vigu. Aeg-ajalt tabasin end mĂ”ttelt, kui vaatasin hommikusest raportist ĂŒles leitud vigu, et parandan need kunagi hiljem, sest praegu on Jira's Ă€ge uus ĂŒlesanne, mida tahaks kohe tegema hakata.

Kui teste takistavad pull requesti, on motivatsioon piisav, sest seni kuni ehitused ei ole roheline, ei pÀÀse kood arendusse ja seega ei saa ĂŒlesanne lĂ”puleviidud.

LĂ”puks valisime sellise strateegia: öösel teeme vĂ”imalikult palju kontrollerite teste ja kĂ”ige kriitilisemad ning, mis kĂ”ige tĂ€htsam, kiireimad, запусĐșĐ°Đ”ĐŒ pull request'is. Kuid me ei peatu sellega — samal ajal optimeerime kontrollide lĂ€bimise kiirus, et viia need ööreĆŸiimist ĂŒle pull request'i kontrollimiseks.

Sel ajal lĂ€bisid kĂ”ik meie kogumid piisavalt kiiresti, seega lĂŒlitasime pull request'i blokkerisse AРК kogumise, Junit-testid ja koodi katvuse kalkulatsiooni. LĂŒlitasime sisse, mĂ”tlesime ja loobusime koodi katvusest, kuna arvasime, et see pole meile vajalik.

Kogu pÔhisi CI seadistamiseks kulus meil kaks pÀeva (siin ja edaspidi on ajakava umbkaudne, vajalik ulatuse mÔistmiseks).

PĂ€rast seda hakkasime mĂ”tlema edasi — kas me kontrollime ĂŒldse Ă”igesti? Kas me kĂ€ivitame kogumid pull request'is Ă”igesti?

KÀivitame kogumise viimase haru commit'i peal, mille alusel pull request avati. Kuid selle commit'i kontrollid vÔivad nÀidata vaid, et kood, mille arendaja kirjutas, töötab. Kuid need ei tÔenda, et ta midagi rikub. Tegelikult tuleks kontrollida haru develop seisundit pÀrast seda, kui funktsioon on sinna viidud.

CI areng seente meeskonnas

Selle jaoks kirjutasime me lihtsa bash-skripti premerge.sh:

#!/usr/bin/env bash

set -e

git fetch origin develop

git merge origin/develop

Siin tÔmmatakse lihtsalt kÔik kÔige vÀrskemad muudatused develop'ist ja liidetakse praegusesse haru. Me lisasime skripti premerge.sh kÔigi ehituste esimeseks sammuks ning hakkasime kontrollima tÀpselt seda, mida me tahame, nimelt integratsiooni.

Probleemide lokaliseerimiseks, lahenduse leidmiseks ja selle skripti kirjutamiseks kulus kolm pÀeva.

Rakendus arenes, ĂŒlesandeid tuli ĂŒha rohkem, meeskond kasvas ja premerge.sh hakkas meid mĂ”nikord alt vedama. Develop'isse tungisid vastuolulised muudatused, mis lĂ”hkusid ehituse.

NĂ€ide sellest, kuidas see juhtub:

CI areng seente meeskonnas

Kaks arendajat hakkavad samal ajal töötama funktsioonide A ja B kallal. Funktsiooni A arendaja leiab projektist kasutamata funktsiooni answer() ja, nagu hea skaut, eemaldab selle. Samal ajal lisab funktsiooni B arendaja oma harusse uue vÀljakutse sellele funktsioonile.

Arendajad lĂ”petavad töö ja avavad samal ajal pull request'i. KĂ€ivitatakse ehitused, premerge.sh kontrollib mĂ”lemat pull request'i arvestades vĂ€rsket olukorda develop'is — kĂ”ik kontrollid on rohelised. PĂ€rast seda liidetakse funktsiooni A pull request, liidetakse funktsiooni B pull request
 Bum! Develop lĂ€heb katki, sest koodis on kutsumine mitteeksisteerivale funktsioonile.

CI areng seente meeskonnas

Kui develop ei suuda töötada, on see kohalik katastroof. Kogu meeskond ei suuda midagi koguda ega testimiseks anda.

Nii juhtus, et olen sagedamini tegelenud infrastruktuuri ĂŒlesannetega: analĂŒĂŒs, vĂ”rk, andmebaasid. See tĂ€hendab, et just mina kirjutasin need funktsioonid ja klassid, mida teised arendajad kasutavad. SeetĂ”ttu sattusin tihti sarnastesse olukordadesse. Mul oli isegi ĂŒhel perioodil selline pilt.

CI areng seente meeskonnas

Kuna see ei rahuldanud meid, hakkasime uurima vÔimalusi, kuidas seda ennetada.

Kuidas mitte katkestada develop

Esimene variant: kĂ”ik pull requestid (PR) ĂŒmber kompileerida, kui develop'i vĂ€rskendatakse. Kui meie nĂ€ites PR funktsiooni A lĂ€heb esimesena develop'i, siis kompileeritakse PR funktsiooni B ĂŒmber ning seega ei lĂ€he testimised lĂ€bi, kuna tekib kompileerimisviga.

Et mĂ”ista, kui kaua selleks aega kulub, vaatame kahte PR-i nĂ€idet. Avame kaks PR-i: kaks ehitust, kaks testide kĂ€ivitamist. PĂ€rast seda, kui esimene PR on devlapi sisse voolu lĂ€inud, tuleb teine ĂŒmber kompileerida. Kokku kulub kahe PR-i jaoks kolm testimise kĂ€ivitamist: 2 + 1 = 3.

PĂ”himĂ”tteliselt on kĂ”ik normaalne. Kuid me vaatasime statistikat ja meie meeskonnas oli tavaline olukord, kus oli 10 avatud PR-i, ning seega kontrollide arv on summa: 10 + 9 +
 + 1 = 55. See tĂ€hendab, et 10 PR-i aktsepteerimiseks tuleb kokku 55 korda uuesti ĂŒles ehitada. Ja see on ideaalne olukord, kus kĂ”ik kontrollid lĂ€bivad esimese korraga, ja keegi ei ava lisanduvaid pull request'e, samal ajal kui seda kĂŒmmet töödeldakse.

Kujutage ette end arendajana, kes peab esimesena nuppu 'merge' vajutama, sest kui seda teeb naaber, tuleb oodata, kuni kÔik kogumised uuesti lÀbi kÀivad... Ei, nii ei saa, see takistab tÔsiselt arendust.

Teine vĂ”imalus: koguda pull request pĂ€rast koodide ĂŒlevaatust. See, you open a pull request, gather the necessary approvals from colleagues, fix what needs to be fixed, and then run the builds. If they are successful, the pull request is merged with develop. In this case, there are no additional restarts, but feedback slows down significantly. As a developer, when I open a pull request, I want to see immediately if it builds. For example, if a test fails, it needs to be fixed quickly. If the build is delayed, feedback slows down, which affects the entire development process. This was also unsatisfactory for us.

In the end, only the third option remained — bicycle. All our code, all our source files are stored in a repository on the Bitbucket server. Accordingly, we had to develop a plugin for Bitbucket.

CI areng seente meeskonnas

See plugina ĂŒhiselt pull requestide sulgemise mehhanismi. Algus on tavaline: pull request avatakse, kĂ”ik kogumised kĂ€ivitatakse, toimub koodide ĂŒlevaatus. Kuid pĂ€rast seda, kui koodide ĂŒlevaatus on lĂ€bitud ja arendaja otsustab "ĂŒhendada" nuppu vajutada, kontrollib plugina, millise oleku korral arendustiim testid kĂ€ivitati. Kui pĂ€rast kogumisi on arendussi mĂ”ni uuendus toimunud, ei luba plugina sellist pull requesti pĂ”hiharusse liita. Ta lihtsalt kĂ€ivitab kogumised uuesti vĂ€rskema arendusseisu suhtes.

CI areng seente meeskonnas

Meie konfliktsete muudatuste nÀites ei lÀhe sellised kogumised lÀbi kompileerimise veateate tÔttu. Vastavalt on arendaja B funktsionaalsuse koodi parandamise kohustuses, et uuesti testida, siis plugina rakendab automaatselt pull requesti.

Enne selle plugina rakendamist oli meil keskmiselt 2.7 testimist ĂŒhe pull requesti kohta. Plugina rakendamisega tĂ”usis see 3.6 testimiseni. See meid rahuldas.

Tuleb mĂ€rkida, et sellel pluginal on puudus: see kĂ€ivitab ehituse uuesti ainult ĂŒks kord. See tĂ€hendab, et jÀÀb vĂ€ike aken, mille kaudu vĂ”ivad arengusse sattuda konfliktivad muudatused. Kuid selle tĂ”enĂ€osus on madal, ja me nĂ€gime raskust koguste ja purunemise tĂ”enĂ€osuse vahel. Kahte aastat jooksul on see toimunud vaid ĂŒks kord, seega ilmselt mitte asjata.

Esimese versiooni kirjutamine Bitbucketile vÔttis meil kaks nÀdalat.

Uued kontrollid

Samal ajal jÀtkas meie meeskond kasvu. Meile lisandusid uued kontrollid.

Me mĂ”tlesime: miks parandada vigu, kui neid saab ennetada? Ja seetĂ”ttu rakendasime koodi staatiline analĂŒĂŒs. Alustasime lintiga, mis on osa Android SDK-st. Kuid sel ajal ei osanud see ĂŒldse töötada Kotlin-koodiga, samas kui meie rakendusest oli juba 75% kirjutatud Kotlinis. SeetĂ”ttu lisasime lintile integreeritud Android Studio kontrolle.

Selleks tuli meeleheitlikult tegutseda: vĂ”tta Android Studio, pakkida see Dockerisse ja kĂ€ivitada CI-s virtuaalse monitoriga, et ta arvestaks, et see töötab reaalses sĂŒlearvutis. Kuid see töötas.

Samuti alustasime sel ajal palju instrumentatsiooniteste ja rakendasime screenshot-teste.. See on hetk, mil genereeritakse referentskuva eraldi vÀikesele vaatele, ja test seisneb selles, et vaate ekraanipilt vÔetakse ja vÔrreldakse referentsiga piksel-piksel. Kui on erinevus, tÀhendab see, et kuskil on paigutus vale vÔi stiilides on midagi valesti.

Kuid instrumentatsioonitestid ja ekraanipiltide testid tuleb kĂ€ivitada seadmetes: emulaatoritel vĂ”i reaalsetel seadmetel. Arvestades, et teste on palju ja need kĂ€ivitatakse tihti, on vajalik terve farm. Oma farmi rajamine on liiga töömahukas, seega leidsime valmis lahenduse — Firebase Test Lab.

Firebase Test Lab

Valiti, kuna Firebase on Google'i toode, mis tÀhendab, et see peaks olema usaldusvÀÀrne ja tÔenÀoliselt mitte kunagi surema. Hinnad on taskukohased: 5 $ tunni eest reaalset seadet, 1 $ tunni eest emulaatorit.

Firebase Test Labi integreerimiseks meie CI-s kulus umbes kolm nÀdalat.

Kuid meeskond jÀtkas kasvu ja kahjuks alustas Firebase meid alt vedama. Sel ajal ei olnud tal mingit SLA-d. MÔnikord pidi Firebase ootama, kuni vajalik arv seadmeid testimiseks vabastatakse, mitte ei alustanud nende tÀitmist kohe, nagu me soovisime. Ooteaeg jÀrjekorras kestis kuni poole tunni, mis oli vÀga pikk. Instrumentatsiooni testid kÀidi lÀbi iga PR-i juures, viivitused pidurdasid arendust ja seejÀrel tuli veel kuu arve suure summa eest. KokkuvÔttes otsustati Firebase'ist loobuda ja hakata in-house arendama, kuna meeskond oli piisavalt suur.

Docker + Python + bash

VĂ”tsime Dockeri, panime sinna emulaatorid, kirjutasime lihtsa programmi Pythonis, mis vajalikul hetkel kĂ€ivitab vajaliku arvu emulaatoreid soovitud versioonis ja kui vaja, peatab need. Ja loomulikult paar bash-skripti — kuidas siis ilma nendeta?

Oma testimisruumi loomiseks kulus viis nÀdalat.

Tulemuseks oli igale pull request'ile laialdane, sulgemise blokeeriv kontrollide loetelu:

  • ARK kogumine;
  • Junit-testid;
  • Lint;
  • Android Studio kontrollid;
  • Instrumentatsiooni testid;
  • Kuvapilditesti.

See vÀltis palju vÔimalikke rikkeid. Tehniliselt kÔik töötas, kuid arendajad kaebasid, et tulemuste ootamine on liiga pikk.

Liiga pikk — kui kaua see kestab? Laadime Bitbucketist ja TeamCityst andmed analĂŒĂŒsi sĂŒsteemi ja saame aru, et keskmine ootamisaeg on 45 minutit. See tĂ€hendab, et arendaja ootab keskmiselt oma pull request'i tulemusi 45 minutit. Minu arvates on see vĂ€ga palju ja nii ei saa töötada.

Muidugi otsustasime kiirendada kÔiki meie build'e.

Aktiivselt parandame

NĂ€gin, et buildid jÀÀvad sageli jĂ€rjekorda, seega ostsime kĂ”igepealt rohkem riistvara — ekstensiivne areng on kĂ”ige lihtsam. Buildid lakkasid jĂ€rjekorras seismast, kuid ootamisaeg vĂ€henes vaid veidi, sest mĂ”ned kontrollid olid iseenesest vĂ€ga pikad.

Eemaldame liiga pikad kontrollid

Meie pidev integreerimine suudab selliseid vigu ja probleeme tuvastada.

  • Ei koondata. CI suudab tabada kompileerimviga, kui konfliktsete muudatuste tĂ”ttu midagi ei koo. Nagu ma juba ĂŒtlesin, siis tollal ei suuda keegi midagi kokku panna, areng seiskub ja kĂ”ik on Ă€revuses.
  • KĂ€itumise viga. NĂ€iteks, kui rakendus kĂ€ivitatakse, kuid nuppu vajutades see kukub vĂ”i nupp ei reageeri ĂŒldse. See on halb, sest selline viga vĂ”ib jĂ”uda kasutajani.
  • Disaini viga. NĂ€iteks, nupp reageerib, kuid on 10 pikslit vasakule nihkunud.
  • Tehnilise vĂ”la suurenemine.

Seda nimekirja vaadates mĂ”istsime, et kriitilised on vaid esimesed kaks punkti. Selliseid probleeme soovime esmajĂ€rjekorras tuvastada. Disaini vigade avastamine toimub disaini ĂŒlevaate etapis ja seal on neid lihtne parandada. Tehnilise vĂ”la haldamine nĂ”uab eraldi protsessi ja planeerimist, seetĂ”ttu otsustasime seda pull request'il mitte kontrollida.

Selle klassifitseerimise pĂ”hjal lĂ€bisime kogu kontrollide nimekirja. VĂ€listasime Linti ja lĂŒkkasime selle kĂ€ivitamise ööse: lihtsalt et saada aruandlust, kui palju probleeme projektis on. Tehnilise vĂ”laga oleme kokku leppinud töötama eraldi, ja Android Studio kontrolle oleme tĂ€ielikult loobunud. Android Studio Dockeris vigade kontrollimiseks kĂ”lab huvitavalt, kuid toob palju ebamugavusi ĂŒhilduvuses. Iga Android Studio versiooni uuendus on vĂ”itlus arusaamatute tĂ”rgetega. Samuti oli ekraanipildi testide toetamine keeruline, sest teek toimis ebastabiilselt ja esines valehĂ€iresid. Ekraanipildi teste eemaldati kontrollide nimekirjast.

LÔpuks jÀid meil alles:

  • ARK kogumine;
  • Junit-testid;
  • Instrumentatsioonitestid.

Gradle kaugvÀlimÀlu

Ilma keeruliste kontrollideta on kÔik parem. Kuid tÀiustamisel ei ole piire!

Meie rakendus oli juba jagatud umbes 150 gradle mooduliks. Tavaliselt töötab sellisel juhul Gradle kaugvÀlimÀlu hÀsti, ja otsustasime seda proovida.

Gradle kaugvĂ€limĂ€lu on teenus, mis suudab kahetseda kogumise artefakte eraldi ĂŒlesannete jaoks erinevates moodulites. Gradle, selle asemel et reaalselt koodi kompileerida, kĂŒsib HTTP kaudu kaugvĂ€limĂ€lult, kas keegi on selle ĂŒlesande juba tĂ€itnud. Kui jah, siis laadib lihtsalt tulemuse alla.

Gradle kaugvÀlimÀlu kÀivitamine on lihtne, sest Gradle pakub Docker'i pilti. Meil Ônnestus seda teha kolme tunni jooksul.

Kogu, mida oli vaja, oli Docker kĂ€ivitamine ja projekti ĂŒhele reale kirjutamine. Kuigi selle kiirelt tööle saamine on vĂ”imalik, kulub selle tĂ”rgeteta toimimiseks siiski rohkelt aega.

Allpool on cache misside graafik.

CI areng seente meeskonnas

Alguses oli cache'i möödalaskmise protsent umbes 65. Kolme nĂ€dala pĂ€rast suudeti see vÀÀrtus viia 20%ni. Selgus, et Android rakenduse kogutavad ĂŒlesanded omavad kummalisi transitiivseid sĂ”ltuvusi, mistĂ”ttu Gradle jĂ€ttis cache'i kĂ”rvale.

Cache'i ĂŒhendamine kiirendas meie ehitust mĂ€rgatavalt. Kuid lisaks ehitusele kĂ€ivad ka instrumentation testid, ja need vĂ”tavad kaua aega. VĂ”ib-olla ei pea kĂ”iki teste jooksutama iga pull request'i puhul. Selle selgitamiseks kasutame impaktilahendust.

Impaktilahendus

Pull request'i puhul kogume git diff'i ja leiame muudetud Gradle moodulid.

CI areng seente meeskonnas

On mÔttekas kÀivitada ainult need instrumentation testid, mis kontrollivad muudetud mooduleid ja kÔiki mooduleid, mis neist sÔltuvad. KÔrvalloodud moodulite teste pole mÔtet kÀivitada: seal ei ole kood muutunud, seega ei saa midagi puruneda.

Instrumentation testidega ei ole kĂ”ik nii lihtne, kuna need peavad olema kĂ”ige kĂ”rgema taseme rakenduse moodulis. Kasutasime heuristikast bytecode'i analĂŒĂŒsi, et mĂ”ista, millisele moodulile iga test kuulub.

Instrumentation testide tÀiendamine, et nad kontrolliksid ainult aktiivseid mooduleid, kestis umbes kaheksa nÀdalat.

Kontrollide kiirusmeetmed töötasid edukalt. 45 minutist oleme jĂ”udnud umbes 15 minutini. Veerand tundi oodata buildi on nĂŒĂŒd normaalne.

Aga nĂŒĂŒd hakkasid arendajad kurtma, et nad ei saa aru, millised buildid kĂ€ivitatakse, kus vaadata logi, miks build on punane, milline test on kukkunud jne.

CI areng seente meeskonnas

Tagasiside probleemid aeglustavad arendust, seetĂ”ttu pĂŒĂŒdsime pakkuda maksimaalselt arusaadavat ja detailset teavet iga PR ja buildi kohta. Alustasime Bitbucketis PR-i kommentaaridega, mĂ€rkides, milline build kukkus ja miks, saatsime adresseeritud sĂ”numeid Slackis. LĂ”puks tegime PR-i jaoks armatuurlaud, kus on loetelu kĂ”ikidest buildidest, mis praegu kĂ€ivitatakse, ja nende olekust: ootel, kĂ€ivitatakse, kukkus vĂ”i lĂ”ppes. Buildile saab klikkida ja vaadata selle logi.

CI areng seente meeskonnas

Detailide tagasisidele kulus kuus nÀdalat.

Tunniplaanid

Liigume edasi uusima loo juurde. Tagasiside probleemi lahendamisega jĂ”udsime uuele tasemele — otsustasime luua oma emulaatorite farmi. Kui teste ja emulaatoreid on palju, on nende haldamine keeruline. LĂ”ppkokkuvĂ”ttes on kĂ”ik meie emulaatorid kolitud k8s-klastrisse paindliku ressursihaldusega.

Lisaks on veel teisi plaane.

  • Tagasta Lint (ja muud staatilised analĂŒĂŒsid). Me juba töötame selle suunas.
  • KĂ€ivitada PR-blokeerijana kĂ”ik end-to-end testid kĂ”ikide SDK versioonide jaoks.

Nii oleme jĂ€lginud Continuous Integration'i arengu ajalugu Avitos. NĂŒĂŒd tahan anda mĂ”ned nĂ€punĂ€ited kogenud vaatenurgast.

NÔuanded

Kui ma saaksin anda ainult ĂŒhe nĂ”uande, siis see oleks:

Palun olge ettevaatlik shell-skriptide suhtes!

Bash on vÀga paindlik ja vÔimas tööriist, sellel on mugav ja kiire skriptide kirjutamine. Kuid selle sisse vÔib langeda lÔksu, ja me, kahjuks, langesime sellesse.

KÔik algas lihtsatest skriptidest, mida kÀitati meie ehitusmasinatel:

#!/usr/bin/env bash
./gradlew assembleDebug

Kuid nagu teada, areng ja keerukus on ajaga laiemaks lĂ€inud — laseme ĂŒhe skripti teise seest vĂ€lja, edastame sinna mingid parameetrid — lĂ”ppkokkuvĂ”ttes pidime kirjutama funktsiooni, mis mÀÀrab, millisel bash-i sĂŒgaval tasemel me parasjagu oleme, et sisestada Ă”ige jutumĂ€rk, et kĂ”ik toimiks.

CI areng seente meeskonnas

Kas saate ette kujutada nende skriptide arendamiseks vajalikke ressursse? Soovin mitte sattuda sellesse lÔksu.

Mida saab kasutada asendajana?

  • Iga skripti keelt. Kirjutamine Pythonis vĂ”i Kotlin Scriptis on mugavam, sest see on programmeerimine, mitte skriptid.
  • VĂ”i kirjeldada kogu build-loogikat Custom gradle tasks teie projekti jaoks.

Meie otsustasime valida teise vÔimaluse ja praegu eemaldame jÀrk-jÀrgult kÔik bash-skriptid ning kirjutame palju kohandatud gradle-tasks.

nÔuanne nr 2: hoida infrastruktuur koodina.

On mugav, kui pideva integreerimise seadistamine ei ole Jenkins, TeamCity jm kasutajaliidese kaudu, vaid tekstifailide kujul otse projekti hoidlas. See tagab versioonihalduse. Tagasiviimine vÔi koodi kogumine teisel harul ei ole keeruline.

Skripte saab hoida projektis. Aga mis teha keskkonnaga?

nÔuanne nr 3: keskkonnas vÔib aidata Docker.

Androidi arendajatele on see kindlasti kasuks, iOSi jaoks kahjuks ei ole.

See on nÀide lihtsast docker-failist, mis sisaldab jdk ja 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

# Laadi alla 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

# Paigalda Android Build Tool ja teegid
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

Kirjutasin selle docker-faili (salaja ĂŒtlen, et seda ei ole vaja ise kirjutada, saab valmis vĂ”tta GitHubist) ja pildi kokku panemisega saate virtuaalse masina, millel saate rakendust koostada ja Junit teste kĂ€ivitada.

Kaks peamist argumenti, miks see mĂ”istlik on: skaleeritavus ja korduvus. Dockerit kasutades saab kiiresti ĂŒles tĂ”sta kĂŒmneid ehitusagensid, millel on tĂ€pselt sama keskkond nagu eelneval. See teeb CI-inseneride elu oluliselt kergemaks. Android-sdk pakkimine Dockerisse on ĂŒsna lihtne, emulaatoritega on natuke keerulisem: tuleb veidi vaeva nĂ€ha (vĂ”i laadida GitHubist valmis lahendus).

NÔuanne nr 4: Àrge unustage, et kontrolle tehakse mitte kontrollide pÀrast, vaid inimeste jaoks.

Arendajatele on vÀga oluline kiire ja mis kÔige tÀhtsam, arusaadav tagasiside: mis neil katki lÀks, milline test ebaÔnnestus, kus build-logi vaadata.

NÔuanne nr 5: olge pragmaatilised pideva integratsiooni arendamisel.

Selgelt mĂ”istke, milliseid tĂ”rkeid soovite Ă€ra hoida, kui palju olete valmis ressursse, aega ja masina aega kulutama. Liiga pikaajalised kontrollid vĂ”ib nĂ€iteks ööseks ĂŒle kanda. Ja nende seast, mis pĂŒĂŒavad mitte eriti olulisi vigu, tasub tĂ€ielikult loobuda.

NÔuanne nr 6: kasutage valmis tööriistu.

Praegu on palju ettevÔtteid, mis pakuvad pilvepÔhist CI.

CI areng seente meeskonnas

VĂ€ikeste meeskondade jaoks on see head lahendus. Pole vaja midagi toetada, lihtsalt maksate veidi raha, koguge oma rakendus ja isegi jooksutage instrumentatsiooni teste.

NÔuanne nr 7: suure meeskonna jaoks on kasulikumad in-house lahendused.

Kuid varem vĂ”i hiljem, meeskonna suurenedes, hakkavad in-house lahendused olema kasumlikumad. Nende lahendustega on ĂŒks aspekt. Majanduses on kahanemise seadus: igas projektis saab iga jĂ€rgmise tĂ€iustuse tegemine jĂ€rjest keerulisemaks, nĂ”udes ĂŒha rohkem investeeringuid.

Majandus kirjeldab kogu meie elu, sealhulgas pidevat integreerimist. Olen koostanud diagrammi tööjÔukulu kohta iga etapi kohta meie pideva integreerimise arendamisel.

CI areng seente meeskonnas

On nĂ€ha, et iga tĂ€iustuse saavutamine muutub jĂ€rjest keerulisemaks. Seda diagrammi vaadates on vĂ”imalik mĂ”ista, et pidevat integreerimist tuleb arendada koos meeskonna suuruse kasvuga. Kahe inimese meeskond on 50 pĂ€eva investeerimine sisemiste emulaatorite talu arendamisse ĂŒsna tobe idee. Kuid sama halb idee on ka suurte meeskondade puhul pideva integreerimisega mitte tegeleda, kuna integraatsiooni probleemide, suhtlemise parandamise jne tegelemine vĂ”tab veel rohkem aega.

Alustasime tÔdemusega, et automatiseerimine on vajalik, kuna inimesed on kallid, nad teevad vigu ja kipuvad olema laisikud. Kuid automatiseerimise teevad samuti inimesed. SeetÔttu kehtivad kÔik need probleemid ka automatiseerimise kohta.

  • Automatiseerimine on kallis. Pidage meeles tööjĂ”u kulude graafikut.
  • Automatiseerimise kĂ€igus teevad inimesed vigu.
  • MĂ”nikord on automatiseerimine vĂ€ga tĂŒĂŒtu, kuna kĂ”ik töötab niigi. Miks veel midagi parandada, miks kogu see pidev integreerimine?

Aga mul on statistika: 20%-l ehitustest tuvastatakse vigu. See ei juhtu mitte seetĂ”ttu, et meie arendajad kirjutavad halba koodi. See toimub seetĂ”ttu, et arendajad usuvad, et kui nad teevad mĂ”ne vea, siis see ei pÀÀse develop'i. Automaatkontrollid pĂŒĂŒavad selle kinni. Seega saavad arendajad kulutada rohkem aega koodi kirjutamisele ja huvitavatele asjadele ning mitte midagi kohalikult jooksutada ja kontrollida.

Tegelege pideva integreerimisega. Kuid mÔÔdukalt.

Muide, Nikolai Nesterov mitte ainult ei tee lahedaid ettekandeid, vaid kuulub ka programmikomiteesse, AppsConf ja aitab teistel valmistada teile sisukaid esinemisi. Tulevase konverentsi programmi tĂ€ielikkust ja kasulikkust saab hinnata teemade jĂ€rgi kava. Ja ĂŒksikasjade saamiseks tulge 22.-23. aprillil Infopinda.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster