Haut ginn déi meescht Softwareprodukter an Teams entwéckelt. D'Konditioune fir eng erfollegrÀich Teamentwécklung kënnen a Form vun engem einfachen Diagramm duergestallt ginn.

Wann Dir Ăre Code geschriwwen hutt, musst Dir sĂ©cher sinn:
- Đ ĐŸĐ±ĐŸŃа.
- Et brĂ©cht nĂ€ischt, och de Code dĂ©i Ăr Kollegen geschriwwen hunn.
Wa béid Bedéngungen erfëllt sinn, da sidd Dir um Wee zum Erfolleg. Fir dës Konditiounen einfach z'iwwerpréiwen an net vum rentabele Wee ze deviéieren, si mir mat der kontinuéierlecher Integratioun komm.
CI ass e Workflow wou Dir Ăre Code sou dacks wĂ©i mĂ©iglech an de Gesamtproduktcode integrĂ©iert. An Dir integrĂ©iert net nĂ«mmen, awer kontrollĂ©iert och permanent datt alles funktionnĂ©iert. Well Dir musst vill an dacks iwwerprĂ©iwen, ass et derwĂ€ert un d'Automatisatioun ze denken. Dir kĂ«nnt alles manuell kontrollĂ©ieren, awer Dir sollt net, an hei ass firwat.
- Léif Leit. Eng Stonn Aarbecht vun all Programméierer ass méi deier wéi eng Stonn Aarbecht vun all Server.
- Leit maachen Feeler. Dofir kĂ«nne Situatiounen entstoen wann Tester op der falscher Branche ausgefĂŒhrt goufen oder dĂ©i falsch Verpflichtung fir Tester kompilĂ©iert gouf.
- D'Leit si faul. Vun ZÀit zu ZÀit, wann ech eng Aufgab fÀerdeg maachen, stellt de Gedanke op: "Wat ass et ze kontrolléieren? Ech hunn zwou Zeilen geschriwwen - alles funktionnéiert! Ech mengen e puer vun iech hunn och heiansdo esou Gedanken. Awer Dir sollt ëmmer kucken.
WĂ©i kontinuĂ©ierlech Integratioun implementĂ©iert an entwĂ©ckelt gouf am Avito mobilen EntwĂ©cklungsteam, wĂ©i se vun 0 op 450 Builds pro Dag gaange sinn, an datt d'Maschinnen 200 Stonnen den Dag montĂ©ieren, seet den Nikolai Nesterov () - e Participant un all evolutiven Ănnerungen am CI/CD Android-Applikatiounen.
D'Geschicht baséiert op engem Beispill Android-befeeler, awer déi meescht vun den Approche sinn och op iOS uwendbar.

Eemol war et eng ZÀit an AndroidD'Avito-Team bestoung just aus enger Persoun. Per Definitioun huet hien nÀischt vun der Continuous Integration gebraucht: et gouf keen, mat deem hie konnt integréieren.
Awer d'Applikatioun ass gewuess, ëmmer méi nei Aufgaben erschéngen, an d'Team ass deementspriechend gewuess. Irgendwann ass et ZÀit fir méi formell e Code Integratiounsprozess opzebauen. Et gouf decidéiert Git Flow ze benotzen.

D'Konzept vum Git Flow ass bekannt: e Projet huet eng gemeinsam Entwécklungszweig, a fir all nei Feature schneiden d'Entwéckler eng separat Branche, verpflichte se, drécken, a wa se hire Code an d'Entwécklungszweig fusionéiere wëllen, öffnen eng zéien Ufro. Fir Wëssen ze deelen an Approche ze diskutéieren, hu mir Code iwwerpréiwung agefouert, dat ass, Kollegen mussen all aner Code kontrolléieren an confirméieren.
Schecken
Code mat Ăren Aen ze gesinn ass cool, awer net genuch. Dofir ginn automatesch Kontrollen agefouert.
- Ăischt vun all, mir kontrollĂ©ieren ARK AssemblĂ©e.
- Vill Junit Tester.
- Mir betruechten Code Cover, well mir Tester lafen.
Fir ze verstoen wéi dës Kontrolle solle lafen, kucke mer den Entwécklungsprozess an Avito.
Et kann schematesch wéi dës duergestallt ginn:
- En Entwéckler schreift Code op sengem Laptop. Dir kënnt Integratiounschecken direkt hei ausféieren - entweder mat engem Commit Hook, oder einfach Schecken am Hannergrond lafen.
- Nodeems den Entwéckler de Code gedréckt huet, mécht hien eng Pull-Ufro op. Fir datt sÀi Code an der Entwécklungszweig abegraff ass, ass et néideg duerch e Code review ze goen an déi erfuerderlech Unzuel vun BestÀtegungen ze sammelen. Dir kënnt Schecken a Builds hei aktivéieren: bis all Builds erfollegrÀich sinn, kann d'Pull-Ufro net fusionéiert ginn.
- Nodeems d'Pull-Ufro fusionéiert ass an de Code an der Entwécklung abegraff ass, kënnt Dir eng bequem ZÀit wielen: zum Beispill an der Nuecht, wann all d'Servere gratis sinn, a lafen esou vill Schecken wéi Dir wëllt.
Keen huet gÀr Scannen op hirem Laptop lafen. Wann en Entwéckler eng Feature fÀerdeg ass, wëll hie se séier drécken an eng Pull-Ufro opmaachen. Wann an dësem Moment e puer laang Kontrollen lancéiert ginn, ass dat net nëmmen net ganz agreabel, mÀ och d'Entwécklung verlangsamt: wÀhrend de Laptop eppes iwwerpréift, ass et onméiglech normal drun ze schaffen.
Mir hu wierklech gÀr Schecken an der Nuecht lafen, well et vill ZÀit ass a Serveren, Dir kënnt ronderëm roaméieren. Awer, leider, wann de Feature Code an d'Entwécklung kënnt, huet den Entwéckler vill manner Motivatioun fir d'Feeler ze fixéieren déi CI fonnt hunn. Ech hunn mech periodesch gefaangen ze denken, wann ech all d'Fehler am Moienbericht fonnt hunn, datt ech se enges Daags méi spéit fixéieren, well elo gëtt et eng cool nei Aufgab am Jira, déi ech just wëll ufÀnken ze maachen.
Wann d'Schecken eng Pull-Ufro blockéieren, da gëtt et genuch Motivatioun, well bis d'Builds gréng ginn, gëtt de Code net entwéckelt, wat heescht datt d'Aufgab net ofgeschloss gëtt.
Als Resultat hu mir déi folgend Strategie gewielt: mir lafen de maximal méigleche Set vu Schecken an der Nuecht, a lancéiert déi kritesch vun hinnen an, am wichtegsten, déi schnellsten op engem Pull Ufro. Awer mir stoppen net do - parallel optiméiere mir d'Geschwindegkeet vun de Kontrollen fir se aus dem Nuetsmodus ze transferéieren fir Ufrokontrollen ze zéien.
Zu dÀr ZÀit goufen all eis Builds zimlech séier ofgeschloss, also hu mir einfach den ARK Build, Junit Tester a Code Coverage Berechnungen als Blocker fir d'Pull Ufro abegraff. Mir hunn et ugeschalt, doriwwer geduecht, an hunn de Codeofdeckung opginn well mir geduecht hunn datt mir et net brauchen.
Et huet eis zwee Deeg gedauert fir de Basis-CI komplett opzestellen (nodréiglech ass d'ZÀitschÀtzung ongeféier, néideg fir Skala).
Duerno hu mir ugefaang weider ze denken - kontrolléiere mir iwwerhaapt richteg? Lafen mir Builds op Pull Ufroen richteg?
Mir hunn de Bau op de leschte Verpflichtung vun der Branche ugefaang, aus dÀr d'Pull-Ufro opgemaach gouf. Awer Tester vun dësem Engagement kënnen nëmme weisen datt de Code deen den Entwéckler geschriwwen huet funktionnéiert. Awer si beweisen net datt hien nÀischt gebrach huet. TatsÀchlech musst Dir den Zoustand vun der Entwécklungszweig iwwerpréiwen nodeems eng Feature an et fusionéiert ass.

Fir dëst ze maachen, hu mir en einfachen Bash-Skript geschriwwen premerge.sh:
#!/usr/bin/env bash
set -e
git fetch origin develop
git merge origin/developHei ginn all dĂ©i lescht Ănnerunge vun der EntwĂ©cklung einfach eropgezunn an an dĂ©i aktuell Branche fusionĂ©iert. Mir hunn de premerge.sh Skript als den Ă©ischte SchrĂ«tt an all Build bĂ€igefĂŒĂŒgt an ugefaang genau ze kontrollĂ©ieren wat mir wĂ«llen, dat ass Integratioun.
Et huet drÀi Deeg gedauert fir de Problem ze lokaliséieren, eng Léisung ze fannen an dëst Skript ze schreiwen.
D'Applikatioun huet sech entwĂ©ckelt, Ă«mmer mĂ©i Aufgaben erschĂ©ngen, d'Equipe ass gewuess, an premerge.sh huet eis heiansdo ugefaangen ze loossen. EntwĂ©ckler haten konfliktend Ănnerungen dĂ©i de Bau gebrach hunn.
E Beispill vu wéi dat geschitt:

Zwee EntwĂ©ckler fĂ€nken glĂ€ichzĂ€iteg un Feature A a B ze schaffen. Den EntwĂ©ckler vun der Feature A entdeckt eng onbenotzt Feature am Projet answer() an, wĂ©i e gudde Jong Scout, ewechzehuelen et. Zur selwechter ZĂ€it fĂŒĂŒgt den EntwĂ©ckler vun der Feature B en neien Uruff un dĂ«s Funktioun a senger Branche.
Entwéckler fÀerdeg hir Aarbecht an oppen eng Pull Ufro zur selwechter ZÀit. D'Builds ginn lancéiert, premerge.sh kontrolléiert béid Pull-Ufroe betreffend de leschten Entwécklungsstaat - all Schecken si gréng. Duerno gëtt d'Pull-Ufro vun der Feature A fusionéiert, d'Pull-Ufro vun der Feature B fusionéiert ... Boom! Entwéckelt Pausen well den Entwécklungscode en Opruff un eng net existent Funktioun enthÀlt.

Wann et net wÀert entwéckelen, ass et lokal Katastroph. Dat ganzt Team kann nÀischt sammelen an et fir Test ofginn.
Et ass geschitt, datt ech meeschtens un Infrastrukturaufgaben geschafft hunn: Analyse, Netzwierk, Datenbanken. Dat ass, et war ech deen déi Funktiounen a Klassen geschriwwen hunn déi aner Entwéckler benotzen. Dofir hunn ech mech ganz dacks an Àhnleche Situatiounen fonnt. Ech hat dëst Bild souguer eng ZÀitchen hÀnkt.

Well dëst eis net gepasst huet, hu mir ugefaang Optiounen ze entdecken fir dëst ze vermeiden.
Wéi net ze Paus entwéckelen
Déi éischt Optioun: nei opzebauen all Pull Ufroe beim Update entwéckelen. Wann, an eisem Beispill, d'Pull-Ufro mat Feature A déi éischt ass, déi an der Entwécklung abegraff ass, gëtt d'Pull-Ufro vun der Feature B nei opgebaut, an deementspriechend falen d'Schecken wéinst engem Kompiléierungsfehler.
Fir ze verstoen wéi laang dëst dauert, betruecht e Beispill mat zwee PRs. Mir oppen zwee PRs: zwee baut, zwee Lafen vun Schecken. Nodeems den éischte PR an d'Entwécklung fusionéiert ass, muss deen zweeten nei opgebaut ginn. Am Ganzen erfuerderen zwee PRs drÀi Kontrollen: 2 + 1 = 3.
Am Prinzip ass et gutt. Awer mir hunn d'Statistike gekuckt, an déi typesch Situatioun an eisem Team war 10 oppe PRs, an dann ass d'Zuel vun de Schecken d'Zomm vum Fortschrëtt: 10 + 9 +... + 1 = 55. Dat ass, 10 ze akzeptéieren. PRs, Dir musst 55 Mol opbauen. An dëst ass an enger idealer Situatioun, wann all Kontrollen déi éischte Kéier passéieren, wann keen eng zousÀtzlech Pull-Ufro opmaacht, wÀhrend dës Dose veraarbecht ginn.
Stellt Iech vir als EntwĂ©ckler, deen als Ăischte muss op de KnĂ€ppche "Merge" klicken, well wann en Noper dat mĂ©cht, da musst Dir waarden bis all d'Builds erĂ«m duerchgoen ... Nee, dat geet net , et wĂ€ert d'EntwĂ©cklung eescht verlangsamen.
Zweet méiglech Manéier: sammelen Pull Ufroen no Code review. Dat ass, Dir öffnet eng Pull-Ufro, sammelt déi erfuerderlech Unzuel vun Genehmegunge vu Kollegen, korrigéiert wat néideg ass, a lancéiert dann d'Builds. Wa se erfollegrÀich sinn, gëtt d'Pull Ufro an d'Entwécklung fusionéiert. An dësem Fall gëtt et keng zousÀtzlech Restart, awer de Feedback ass staark verlangsamt. Als Entwéckler, wann ech eng Pull-Ufro opmaachen, wëll ech direkt kucken ob et funktionnéiert. Zum Beispill, wann en Test feelt, musst Dir et séier fixéieren. Am Fall vun enger Verspéidung baut de Feedback verlangsamt, an dofir déi ganz Entwécklung. Dat huet eis och net gepasst.
Als Resultat ass nëmmen déi drëtt Optioun bliwwen - Velo. All eise Code, all eis Quelle ginn an engem Repository um Bitbucket Server gespÀichert. Deementspriechend hu mir e Plugin fir Bitbucket missen entwéckelen.

Dëse Plugin iwwerschreift de Pull-Ufro-Fusiounsmechanismus. Den Ufank ass Standard: de PR mécht op, all Versammlungen ginn lancéiert, Code Iwwerpréiwung ass ofgeschloss. Awer nodeems d'Code-Iwwerpréiwung ofgeschloss ass an den Entwéckler decidéiert op "Fusioun" ze klicken, kontrolléiert de Plugin géint deen Entwécklungsstaat d'Schecken ausgefouert goufen. Wann d'Entwécklung no de Builds aktualiséiert gouf, erlaabt de Plugin net datt sou eng Pull-Ufro an d'Haaptzweig fusionéiert gëtt. Et wÀert einfach d'Builds vun enger relativ rezenter Entwécklung nei starten.

An eisem Beispill mat konfliktende Ănnerunge falen esou Builds wĂ©inst engem KompilĂ©ierungsfehler. Deementspriechend muss den EntwĂ©ckler vun der Feature B de Code korrigĂ©ieren, d'Schecken nei starten, da wĂ€ert de Plugin automatesch d'Pull-Ufro applizĂ©ieren.
Ier Dir dëse Plugin implementéiert, hu mir am Duerchschnëtt 2,7 Iwwerpréiwung lafen pro Pull Ufro. Mam Plugin gouf et 3,6 Starten. Dëst huet eis gepasst.
Et ass derwĂ€ert ze bemierken datt dĂ«se Plugin en Nodeel huet: et fĂ€nkt de Bau nĂ«mmen eemol un. Dat heescht, et gĂ«tt nach Ă«mmer eng kleng FĂ«nster, duerch dĂ©i konfliktend Ănnerunge kĂ«nne entwĂ©ckelen. Awer d'Wahrscheinlechkeet vun dĂ«sem ass niddereg, a mir hunn dĂ«sen Ofwiesselung tĂ«scht der Zuel vun den Starten an der Wahrscheinlechkeet vum Echec gemaach. An zwee Joer huet et nĂ«mmen eemol gebrannt, also war et wahrscheinlech net Ă«msoss.
Et huet eis zwou Wochen gedauert fir déi éischt Versioun vum Bitbucket Plugin ze schreiwen.
Nei Schecken
Mëttlerweil ass eis Team weider wuessen. Nei Schecken goufen dobÀi.
Mir hu geduecht: Firwat Feeler maachen, wa se kĂ«nne verhĂ«nnert ginn? An dofir hunn se Ă«mgesat statesch Code AnalyseMir hunn ugefaange mat Fussel, wat dobĂ€i ass Android SDK. Mee zu dĂ€r ZĂ€it wousst et guer net, wĂ©i ee mat Kotlin-Code schaffe soll, an 75% vun eiser Applikatioun war schonn a Kotlin geschriwwen. Dofir gouf agebaute Lint zu Lint bĂ€igefĂŒĂŒgt. Android Studiokontrollen.
Fir dëst ze erreechen, musse mir vill Ustrengungen maachen: huelen Android Studio, packen et an Docker, a mat engem virtuelle Monitor op CI lafen, sou datt et mengt, et wier op engem richtege Laptop. Mee et huet funktionéiert.
Et war och an dëser ZÀit datt mir vill ugefaang hunn ze schreiwen Instrumenter Tester an ëmgesat Screenshot Testen. Dëst ass wann e Referenz Screenshot fir eng separat kleng Vue generéiert gëtt, an den Test besteet aus engem Screenshot aus der Vue ze huelen an et mam Standard direkt Pixel fir Pixel ze verglÀichen. Wann et eng Diskrepanz ass, heescht et datt de Layout iergendwou falsch gaang ass oder eppes an de Stiler falsch ass.
Awer Instrumenter Tester a Screenshot Tester mussen op Apparater lafen: op Emulatoren oder op realen Apparater. Bedenkt datt et vill Tester ginn a se dacks lafen, ass e ganze Bauerenhaff gebraucht. Ăren eegene Bauerenhaff starten ass ze Aarbechtsintensiv, also hu mir eng fĂ€erdeg Optioun fonnt - Firebase Test Lab.
Firebase Test Lab
Et gouf gewielt well Firebase e Google Produkt ass, dat heescht et soll zouverlÀsseg sinn an onwahrscheinlech jee stierwen. D'PrÀisser sinn raisonnabel: $ 5 pro Stonn Operatioun vun engem richtegen Apparat, 1 $ pro Stonn Operatioun vun engem Emulator.
Et huet ongeféier drÀi Wochen gedauert fir Firebase Test Lab an eisem CI ëmzesetzen.
Awer d'Team ass weider wuessen, a Firebase huet leider ugefaang eis ze loossen. Zu dĂ€r ZĂ€it huet hien keng SLA. Heiansdo huet Firebase eis gewaart bis dĂ©i erfuerderlech Unzuel vun Apparater gratis waren fir Tester, an huet net direkt ugefaang se auszefĂ©ieren, wĂ©i mir wollten. D'Waarden an der Linn huet bis zu eng hallef Stonn gedauert, wat eng ganz laang ZĂ€it ass. Instrumentatiounstester goufen op all PR ausgefĂŒhrt, VerspĂ©idungen hunn d'EntwĂ©cklung wierklech verlangsamt, an dunn ass de monatleche Rechnung mat enger ronner Zomm komm. Am Allgemengen gouf decidĂ©iert Firebase opzeginn an intern ze schaffen, well d'Team genuch gewuess ass.
Docker + Python + bash
Mir hunn Docker geholl, Emulatoren dran gestoppt, en einfache Programm am Python geschriwwen, deen am richtege Moment déi erfuerderlech Unzuel vun Emulatoren an der erfuerderter Versioun bréngt an se stoppt wann néideg. An, natierlech, e puer Bash Scripten - wou wiere mir ouni si?
Et huet fënnef Wochen gedauert fir eisen eegene Testëmfeld ze kreéieren.
Als Resultat gouf et fir all Pull-Ufro eng extensiv Fusiounsblockéierungslëscht vu Kontrollen:
- ARK Assemblée;
- Junit Tester;
- Lint;
- Android Studio-Checks;
- Instrumenter Tester;
- Screenshot Tester.
Dëst huet vill méiglech Decompte verhënnert. Technesch huet alles geschafft, awer d'Entwéckler hunn beschwéiert datt d'Waarde op d'Resultater ze laang war.
Wéi laang ass ze laang? Mir hunn Daten vu Bitbucket an TeamCity an den Analysesystem eropgelueden an dat realiséiert Duerchschnëtt WaardezÀit 45 Minutten. Dat ass, en Entwéckler, wann Dir eng Pull-Ufro opmaacht, waart am Duerchschnëtt 45 Minutten op d'Bauresultater. Menger Meenung no ass dat vill, an Dir kënnt net esou schaffen.
Natierlech hu mir beschloss all eis Builds ze beschleunegen.
Loosst eis beschleunegen
Gesinn, datt baut oft an enger Schlaang stinn, déi éischt Saach mir maachen ass kaaft méi Hardware - extensiv Entwécklung ass déi einfachst. Builds gestoppt Schlaangen, mÀ d'WaardezÀit ass nëmme liicht erofgaang, well e puer Schecken selwer ganz laang gedauert hunn.
Ewechzehuelen Schecken déi ze laang daueren
Eis kontinuéierlech Integratioun konnt dës Aarte vu Feeler a Probleemer opfÀnken.
- Gitt net. CI kann e KompilĂ©ierungsfehler opfĂ€nken wann eppes net baut wĂ©inst konfliktende Ănnerungen. WĂ©i ech scho gesot hunn, da kann keen eppes zesummestellen, d'EntwĂ©cklung stoppt, a jidderee gĂ«tt nervös.
- Bug am Verhalen. Zum Beispill, wann d'Applikatioun gebaut ass, ma Crash wann Dir e KnÀppchen Press, oder de KnÀppchen guer net gedréckt. Dëst ass schlecht well sou e Feeler de Benotzer erreechen kann.
- Bug am Layout. Zum Beispill gëtt e KnÀppchen geklickt, awer ass 10 Pixel no lénks geréckelt.
- Erhéijung vun technesch Schold.
Nodeems mir dĂ«s LĂ«scht gekuckt hunn, hu mir gemierkt datt nĂ«mmen dĂ©i Ă©ischt zwee Punkte kritesch sinn. Mir wĂ«llen esou Problemer als Ă©ischt opfĂ€nken. Bugs am Layout ginn an der Design-IwwerprĂ©iwungsstadium entdeckt a kĂ«nnen dann einfach korrigĂ©iert ginn. Ămgank mat technesch Schold verlaangt eng separat Prozess a Planung, sou decidĂ©iert mir et net op engem Pull Ufro ze Test.
BasĂ©ierend op dĂ«ser Klassifikatioun hu mir d'ganz LĂ«scht vun de Schecken opgeriicht. Ausgestrach Lint an huet sĂ€i Start iwwer Nuecht ofgesot: just fir datt et e Bericht gĂ©if produzĂ©ieren wĂ©i vill Problemer et am Projet waren. Mir ausgemaach getrennt mat der technesch Schold ze schaffen, an ĐŸŃ Android Studio-Checks goufen komplett opginn.. Android Studio an Docker fir Inspektiounen auszefĂ©ieren klĂ©ngt interessant, awer et ass e bĂ«ssen lĂ€steg ze verwalten. All Versiounsupdate Android Studio ass e Kampf gĂ©int obskur KĂ€feren. Screenshottester ze maachen war och schwĂ©ier, well d'BibliothĂ©ik net ganz stabil war a heiansdo falsch Positiver generĂ©iert huet. Screenshot Tester goufen aus der ChecklĂ«scht gelĂ€scht.
Als Resultat ware mir lénks mat:
- ARK Assemblée;
- Junit Tester;
- Instrumenter Tester.
Gradle Remote Cache
Ouni schwéier Schecken ass alles besser ginn. Awer et gëtt keng Limite fir Perfektioun!
Eis Applikatioun war schonn an ongeféier 150 Gradle Moduler opgedeelt. Gradle Remote Cache funktionnéiert normalerweis gutt an dësem Fall, also hu mir beschloss et ze probéieren.
Gradle Remote Cache ass e Service deen Artefakte fir individuell Aufgaben an eenzel Moduler kache bauen. Gradle, anstatt de Code tatsÀchlech ze kompiléieren, benotzt HTTP fir op de Ferncache ze klappen a froen ob iergendeen dës Aufgab scho gemaach huet. Wann jo, download et einfach d'Resultat.
Gradle Remote Cache lafen ass einfach well Gradle en Docker Bild ubitt. Mir hunn dat an drÀi Stonnen fÀerdeg bruecht.
Alles wat Dir maache musst war Docker starten an eng Zeil am Projet schreiwen. Awer och wann et séier lancéiert ka ginn, dauert et zimlech vill ZÀit bis alles gutt funktionnéiert.
Drënner ass de Cache vermësst Grafik.

Ganz um Ufank louch de Prozentsaz vun de Cache-Feeler bei ongeféier 65%. No drÀi Wochen hu mir et fÀerdeg bruecht, dëse WÀert op 20% ze erhéijen. Et huet sech erausgestallt, datt d'Aufgaben, déi et sammelt, Android D'Applikatioun hat komesch transitiv OfhÀngegkeeten, déi dozou gefouert hunn, datt Gradle de Cache verpasst huet.
Duerch d'Verbindung vum Cache hu mir de Bau staark beschleunegt. Awer nieft der Assemblée gëtt et och Instrumentatiounstester, a si huelen eng laang ZÀit. VlÀicht net all Tester musse fir all Pull-Ufro lafen. Fir erauszefannen, benotze mir Impaktanalyse.
Impakt Analyse
Op enger Pull Ufro sammele mir Git Diff a fanne déi modifizéiert Gradle Moduler.

Et mécht Sënn nëmmen Instrumentatioun Tester ze lafen déi geÀnnert Moduler an all Moduler kontrolléieren, datt op hinnen hÀnkt. Et ass kee Sënn fir Tester fir Nopeschmoduler ze lafen: de Code do ass net geÀnnert an nÀischt kann briechen.
Instrumentatiounstester sinn net sou einfach, well se mussen am Top-Level Applikatiounsmodul lokaliséiert ginn. Mir hunn Heuristik mat Bytecode Analyse benotzt fir ze verstoen zu wéi engem Modul all Test gehéiert.
D'Upgrade vun der Operatioun vun den Instrumentatiounstester sou datt se nëmmen déi involvéiert Moduler testen, huet ongeféier aacht Wochen gedauert.
Moossname fir d'Inspektiounen ze beschleunegen hunn erfollegrÀich geschafft. Vun 45 Minutte si mir erop op ongeféier 15. Et ass schonn normal eng Véierelstonn op e Bau ze waarden.
Awer elo hunn d'Entwéckler ugefaang ze beschwéieren datt se net verstinn wéi eng Builds lancéiert ginn, wou de Log ze gesinn, firwat de Bau rout ass, wéi en Test gescheitert ass, etc.

Probleemer mat Feedback verlangsamen d'Entwécklung, also hu mir probéiert sou kloer an detailléiert Informatioun iwwer all PR ze bidden a wéi méiglech ze bauen. Mir hunn ugefaang mat Kommentaren am Bitbucket zum PR, beweist wéi ee Bau gescheitert ass a firwat, a gezielt Messagen am Slack geschriwwen. Zum Schluss hu mir e PR-Dashboard fir d'SÀit erstallt mat enger Lëscht vun alle Builds déi am Moment lafen an hire Status: Schlaang, Lafen, Crash oder fÀerdeg. Dir kënnt op de Build klickt an op sÀi Logbuch kommen.

Sechs Woche goufen u detailléierte Feedback verbruecht.
PlÀng
Loosst eis op déi rezent Geschicht goen. Nodeems mir de Feedbackproblem geléist hunn, hu mir en neien Niveau erreecht - mir hunn decidéiert eisen eegene Emulatorfarm ze bauen. Wann et vill Tester an Emulatoren sinn, si si schwéier ze verwalten. Als Resultat sinn all eis Emulatoren an de k8s Cluster geplënnert mat flexiblen Ressourcemanagement.
ZousÀtzlech ginn et aner PlÀng.
- Retour Lint (an aner statesch Analyse). Mir schaffen schonn an dëser Richtung.
- Run alles op engem PR Blocker Enn-zu-Enn Tester op all SDK Versiounen.
Also, mir hunn d'Geschicht vun der Entwécklung vun der kontinuéierlecher Integratioun an Avito verfollegt. Elo wëll ech e puer Rotschléi ginn aus engem erfuerene Siicht.
Tipps
Wann ech nëmmen ee Rot kéint ginn, wier et dëst:
Sief virsiichteg mat Shell Scripten!
Bash ass e ganz flexibel a mÀchtegt Tool, et ass ganz bequem a séier Scripte ze schreiwen. Mee du kanns domat an eng Fal falen, a mir si leider dran gefall.
Et huet alles ugefaang mat einfache Scripten déi op eise Baumaschinne lafen:
#!/usr/bin/env bash
./gradlew assembleDebugAwer wéi Dir wësst, alles entwéckelt a gëtt mat der ZÀit méi komplizéiert - loosst eis ee Skript vun engem aneren ausféieren, loosst eis e puer Parameteren do passéieren - um Enn hu mir eng Funktioun missen schreiwen déi bestëmmt op wéi engem Niveau vum Bash Nesting mir elo an der Rei sinn déi néideg Zitater asetzen, fir dat Ganzt unzefÀnken.

Dir kënnt d'AarbechtskÀschte fir d'Entwécklung vun esou Scripten virstellen. Ech roden Iech net an dës Fal ze falen.
Wat kann ersat ginn?
- All Scripting Sprooch. Schreiwen un Python oder Kotlin Skript méi praktesch well et programméiere ass, net Scripten.
- Oder beschreiwen all Build Logik an der Form BenotzerdefinĂ©iert Grade Aufgaben fir Ăre Projet.
Mir hunn decidéiert déi zweet Optioun ze wielen, an elo lÀschen mir systematesch all Bash Scripten a schreiwen vill personaliséiert Gradle Aufgaben.
Tipp #2: Store Infrastruktur am Code.
Et ass bequem wann d'Kontinuéierlech Integratioun Astellung net an der UI Interface vu Jenkins oder TeamCity, etc., awer a Form vun Textdateien direkt am Projet Repository gespÀichert ass. Dëst gëtt Versiounsméiglechkeet. Et wÀert net schwéier sinn de Code op enger anerer Branche zréckzerollen oder ze bauen.
Scripte kĂ«nnen an engem Projet gespĂ€ichert ginn. Wat maache mat der Ămwelt?
Tipp #3: Docker kann mat der Ămwelt hĂ«llefen.
Android- Et wÀert den Entwéckler definitiv hëllefen, leider nach net fir iOS.
Dëst ass e Beispill vun enger einfacher Docker Datei déi jdk an Android-sdk enthÀlt:
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
Nodeems Dir dës Docker-Datei geschriwwen hutt (ech soen Iech e Geheimnis, Dir musst et net schreiwen, awer se just fÀerdeg aus GitHub zéien) an d'Bild zesummegesat hunn, kritt Dir eng virtuell Maschinn op dÀr Dir d'Applikatioun bauen kënnt a lafen Junit Tester.
DĂ©i zwee HaaptgrĂ«nn firwat dĂ«st SĂ«nn mĂ©cht sinn Skalierbarkeet a Widderhuelbarkeet. Mat Docker kĂ«nnt Dir sĂ©ier eng Dose Bauagenten erhĂ©ijen dĂ©i genau datselwecht Ămfeld wĂ©i dee virdrun hunn. DĂ«st mĂ©cht d'Liewen vun CI Ingenieuren vill mĂ©i einfach. Et ass zimmlech einfach den Android-sdk an den Docker ze drĂ©cken, awer mat Emulatoren ass et e bĂ«sse mĂ©i schwĂ©ier: Dir musst e bĂ«sse mĂ©i haart schaffen (oder de fĂ€erdege vum GitHub eroflueden).
Tipp Nummer 4: Vergiesst net datt d'Inspektiounen net fir d'Inspektioun gemaach ginn, mee fir d'Leit.
Schnell an, am wichtegsten, kloere Feedback ass ganz wichteg fir Entwéckler: wat gebrach ass, wéi en Test gescheitert ass, wou kann ech de Buildlog gesinn.
Tipp #5: Sidd pragmatesch wann Dir Kontinuéierlech Integratioun entwéckelt.
Verstinn kloer wéi eng Zorte vu Feeler Dir wëllt verhënneren, wéi vill Ressourcen, ZÀit a ComputerzÀit Dir bereet sidd ze verbréngen. Kontrollen, déi ze laang daueren, kënnen zum Beispill iwwer Nuecht ausgestallt ginn. An déi vun hinnen, déi net ganz wichteg Feeler opfÀnken, solle komplett opginn.
Tipp #6: Benotzt fÀerdeg Tools.
Et gi vill Firmen elo déi Cloud CI ubidden.

DĂ«st ass eng gutt LĂ©isung fir kleng Teams. Dir braucht nĂ€ischt ze Ă«nnerstĂ«tzen, just e bĂ«sse Sue bezuelen, Ăr Applikatioun bauen a souguer Instrumentatiounstester ausfĂ©ieren.
Tipp #7: An enger grousser Equipe sinn intern Léisunge méi rentabel.
Awer desto oder spéider, wéi d'Team wiisst, wÀerten intern Léisunge méi rentabel ginn. Et gëtt ee Problem mat dësen Entscheedungen. Et gëtt e Gesetz vun der Ofsenkung vun de Rendementer an der Wirtschaft: an all Projet ass all spéider Verbesserung ëmmer méi schwéier a erfuerdert ëmmer méi Investitiounen.
Economie beschreift eist ganzt Liewen, inklusiv Kontinuéierlech Integratioun. Ech hunn en ZÀitplang vun AarbechtskÀschte fir all Etapp vun der Entwécklung vun eiser Kontinuéierlecher Integratioun gebaut.

Et ass kloer datt all Verbesserung ëmmer méi schwéier gëtt. Wann Dir dës Grafik kuckt, kënnt Dir verstoen datt Kontinuéierlech Integratioun muss am Aklang mat dem Wuesstum vun der Teamgréisst entwéckelt ginn. Fir e Team vun zwee Leit, 50 Deeg ze verbréngen fir en internen Emulator Bauerenhaff z'entwéckelen ass eng mëttelméisseg Iddi. Awer glÀichzÀiteg, fir e grousst Team, guer net kontinuéierlech Integratioun ze maachen ass och eng schlecht Iddi, well Integratiounsproblemer, Kommunikatioun fixéieren, asw. et wÀert nach méi ZÀit huelen.
Mir hunn ugefaang mat der Iddi datt d'Automatisatioun gebraucht gëtt, well d'Leit deier sinn, si maachen Feeler a si faul. Awer d'Leit automatiséieren och. Dofir gëllen all déiselwecht Probleemer fir d'Automatisatioun.
- Automatisatioun ass deier. Denkt un den Aarbechtsplang.
- Wann et ëm d'Automatiséierung geet, maachen d'Leit Feeler.
- Heiansdo ass et ganz faul ze automatiséieren, well alles funktionnéiert esou. Firwat soss eppes verbesseren, firwat all dës Kontinuéierlech Integratioun?
Mee ech hunn Statistiken: Feeler ginn an 20% vun Versammlungen gefaangen. An dëst ass net well eis Entwéckler Code schlecht schreiwen. Dëst ass well d'Entwéckler zouversiichtlech sinn datt wa se e Feeler maachen, et net an der Entwécklung ophalen, et gëtt vun automatiséierte Kontrollen gefaangen. Deementspriechend kënnen d'Entwéckler méi ZÀit verbréngen fir Code an interessant Saachen ze schreiwen, anstatt eppes lokal ze lafen an ze testen.
Praxis kontinuéierlech Integratioun. Awer a Moderatioun.
Iwwregens, Nikolai Nesterov gëtt net nëmmen super Rapporten selwer, mÀ ass och Member vun der Programm Comité an hëlleft anerer sënnvoll Rieden fir Iech virbereeden. D'VollstÀndegkeet an d'Nëtzlechkeet vum nÀchste Konferenzprogramm kënnen duerch Themen bewÀert ginn . A fir Detailer kommt den 22-23 Abrëll op Infospace.
Source: will.com
