{"id":93885,"date":"2020-09-10T19:42:23","date_gmt":"2020-09-10T17:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov"},"modified":"2020-09-10T19:42:23","modified_gmt":"2020-09-10T17:42:23","slug":"continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","title":{"rendered":"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/ed8a32ae63b8dccfc8b4893ab27f1527.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Arutame, miks CI-t\u00f6\u00f6riistad ja CI on t\u00e4iesti erinevad asjad.<\/p>\n<p><\/p>\n<p>Millist valu CI p\u00fc\u00fcab leevendada, kust tuli idee, millised on viimased t\u00f5endid selle toimimise kohta, kuidas m\u00f5ista, kas teie k\u00e4sutuses on t\u00f5eliselt praktika, mitte lihtsalt paigaldatud Jenkins.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>M\u00f5te teha ettekande Continuous Integration'i kohta tuli juba aasta tagasi, kui ma k\u00e4isin t\u00f6\u00f6otsingutel. R\u00e4\u00e4kisin 10-15 ettev\u00f5ttega, neist ainult \u00fcks suutis arusaadavalt vastata, mis on CI, ja selgitada, kuidas nad m\u00f5istsid, et neil seda pole. \u00dclej\u00e4\u00e4nud r\u00e4\u00e4kisid arusaamatust juttu Jenkinsist \ud83d\ude42 Noh, meil on Jenkins, see teeb s\u00fcndmusi, CI! Ettekandes p\u00fc\u00fcan selgitada, mis on tegelikult Continuous Integration ja miks Jenkins ja sarnased t\u00f6\u00f6riistad on selle suhtes v\u00e4ga n\u00f5rgad.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/a57813a652c0d788e5a927dc8a7130ba.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja nii, mis tavaliselt tuleb CI s\u00f5na peale meelde? Enamikele inimestele tuleb meelde Jenkins, Gitlab CI, Travis jne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/c9799c11ba7bb7bbdb2048c2f314b22a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Isegi kui google\u2019ime, pakutakse meile need t\u00f6\u00f6riistad.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/028ef088b28b73e7905b1666d9d53d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kui k\u00fcsida, kas need tunduvad tuttavad, siis kohe p\u00e4rast t\u00f6\u00f6riistade loetlemist r\u00e4\u00e4gitakse, et CI t\u00e4hendab, et teil on Pull Requestis kommittimisel s\u00fcndmus ja testide l\u00e4biviimine.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/f37ba8f985c10900f669540e063c5e43.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Continuous Integration ei ole t\u00f6\u00f6riistadest ega testide kogumist haru sees! Continuous Integration on praktika, mis keskendub uue koodi pidevale integreerimisele, ja selleks ei ole absoluutset vajadust \u00fcles ehitada Jenkins'e, GitLab'e jne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/c3a12b4a875050550b42714607e787c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Enne kui l\u00e4heme edasi, et aru saada, milline on t\u00f5eline CI, sukeldume esmalt nende inimeste konteksti, kes selle v\u00e4lja m\u00f5tlesid, ja tunnetame olukorda, mida nad \u00fcritasid lahendada.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/2ab9c0f4dba2887fed5744c8b021b424.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nad \u00fcritasid lahendada meeskonnat\u00f6\u00f6 valupunkte!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/11a5f3b1075f8b8d0f169fe07adf6c91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vaadakem n\u00e4iteid, millega arendajad silmitsi seisavad meeskondade koost\u00f6\u00f6s. Oletame, et meil on projekt, git'i peaharud ja kaks arendajat.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/8138a52376e87239ff5f7b0af5cd8fee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nad alustavad t\u00f6\u00f6d, nagu paljud on juba harjunud. Nad v\u00f5tavad \u00fclesande Jira's, loovad feature haru ja kirjutavad koodi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/54720c40d9bbd9631b411a2a26c4083f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00dcks neist l\u00f5petab funktsiooni kiiremini ja liidab selle peaharuga.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/4593dc3cf33a44bf3a4d8166be9bc5da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teisel kulus rohkem aega, ta liitus hiljem ja sai konflikti. N\u00fc\u00fcd, selle asemel, et kirjutada ettev\u00f5ttele vajalikke funktsioone, kulutab arendaja oma aega ja energiat konfliktide lahendamisele.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/c947601fb1dd3b3dd64bac455dc6691a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mida keerulisem on oma funktsiooni \u00fchendada \u00fcldise meistriga, seda rohkem aega me selle jaoks kulutame. Ja see on vaid lihtne n\u00e4ide. See on n\u00e4ide, kus arendajaid on vaid kaks. Kujutage n\u00fc\u00fcd ette, kui neid on 10, 15 v\u00f5i isegi 100, kes kirjutavad \u00fchte repo. Te l\u00e4hete hulluks, lahendades k\u00f5iki neid konflikte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/16c6b8b51ae462f1e0acb966a93c0ae5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>On veidi teine olukord. Meil on meister ja mitu arendajat, kes teevad midagi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/21b78ad8d0cb7cb5bded6ef9d49707c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nad on loonud iga\u00fchele oma haru.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/b85d8aa0080f08c1ad8ad83f3a9ab084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00dcks neist liitus, k\u00f5ik oli head, \u00fclesanne anti \u00fcle.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/e96d4fd52c39089e3377ed85adeeb591.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teine arendaja samal ajal andis oma \u00fclesande. Oletame, et ta esitas selle \u00fclevaatamiseks. Paljudes firmades on praktika \u2013 \u00fclevaatus. \u00dchelt poolt on see hea ja kasulik praktika, teisalt aga pidurdab see meid paljuski. Me ei s\u00fcvene sellesse, aga siin on suurep\u00e4rane n\u00e4ide, kuhu v\u00f5ib viia vale \u00fclevaatuse ajalugu. Te esitasite pull requesti \u00fclevaatamiseks. Arendajal ei olnud rohkem midagi teha. Mida ta siis hakkab tegema? Ta hakkab v\u00f5tma muid \u00fclesandeid. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/7b8e121be99432606056acf11e20f518.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sel ajal tegi teine arendaja veel midagi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/ceaa5ba5b3b5014fad527362f5794e94.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esimene t\u00e4itis kolmanda \u00fclesande. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/9c27663e63bb9489ecffc5a1f73abb87.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja mingil pikemal ajal, kui tema \u00fclevaade on proovitud, p\u00fc\u00fcab ta sulanduda. Ja mis juhtub? Ta satub tohutute konfliktide piiristikku. Miks? Sest seni, kuni tema pull request oli \u00fclevaatamisel, on koodis juba liiga palju muutunud. <\/p>\n<p><\/p>\n<p>Lisaks konfliktide teemale on probleemiks ka suhtlused. Kui teie haru on \u00fclevaatamisel, ootab midagi, ja kui te kaua t\u00f6\u00f6tate funktsiooni kallal, l\u00f5petate j\u00e4lgimise, mis veel teie teenuse koodibaasis muutub. V\u00f5ib-olla olete asja, mille hetkel proovite lahendada, juba eile lahendanud ja saate m\u00f5nda meetodit taaskasutada. Kuid te ei n\u00e4e seda, sest te t\u00f6\u00f6tate alati vananenud haruga. Ja see vananenud haru toob alati kaasa selle, et peate lahendama merge-konflikti. <\/p>\n<p><\/p>\n<p>Tuleb v\u00e4lja, et kui t\u00f6\u00f6tame meeskonnas, st mitte \u00fcks inimene uurib repot, vaid umbes 5-10 inimest, siis mida kauem me oma koodi p\u00f5hiharusse ei lisame, seda enam kannatame selle t\u00f5ttu, et l\u00f5puks tuleb midagi sulanduda. Ja mida rohkem me konfliktidega silmitsi seisame ning millega vanema versiooniga t\u00f6\u00f6tame, seda rohkem probleeme meil on.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/55c070f65a4d3838fb8c02bb9684c76b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Koos t\u00f6\u00f6tamine on valus! Me segame alati \u00fcksteist. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/b914c50aad6f3c9f97edcad7e71ba627.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sellele probleemile p\u00f6\u00f6rati t\u00e4helepanu \u00fcle 20 aasta tagasi. Esimene viide pideva integreerimise praktikast leiti \u00e4\u00e4rmuslikest programmeerimistest.<\/p>\n<p><\/p>\n<p>\u00c4\u00e4rmuslik programmeerimine on pirmine agiilne raamistik. Lehek\u00fclg ilmus 1996. aastal. Idee oli kasutada programmeerimise, planeerimise ja muu praktikaid, et arendamine oleks v\u00f5imalikult paindlik, et saaksime kiiremini reageerida muudatustele ja kliendi n\u00f5udmistele. Nad hakkasid 24 aastat tagasi m\u00e4rkama, et kui sa teed midagi v\u00e4ga kaua ja eraldi, siis kulutad sellele rohkem aega, sest sul tekivad konfliktid. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/93a80838bdb3b297557dbf2ac7587965.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Praegu anal\u00fc\u00fcsime fraasi \u201epidev integreerimine\u201c s\u00f5na-s\u00f5nalt. Kui t\u00f5lkida otse, siis saame pidev integreerimine. Kuid kui pidev see tegelikult on, ei ole v\u00e4ga selge, see on pigem katkestatud. Samuti ei ole selge, kui palju see on integratsioon. <\/p>\n<p><\/p>\n<p>Seet\u00f5ttu toon teile praegu tsitaate \u00e4\u00e4rmuslikust programmeerimisest. Ja me anal\u00fc\u00fcsime m\u00f5lemat s\u00f5na eraldi. <\/p>\n<p><\/p>\n<p>Integreerimine \u2014 Nagu ma juba mainisin, p\u00fc\u00fcame, et iga insener t\u00f6\u00f6taks k\u00f5ige v\u00e4rskemate koodiversioonidega ja lisaks oma koodi v\u00f5imalikult sageli peamise haru k\u00fclge, et need oleksid v\u00e4iksed harud. Sest kui need on suured, v\u00f5ime kergesti n\u00e4dalaks kinni j\u00e4\u00e4da \u00fchinemis konfliktidesse. Eriti kui meil on pikk arendusts\u00fckkel, nagu waterfall, kus arendaja l\u00e4heb kuuks ajaks midagi suurt arendama. Ja integreerimise etapis j\u00e4\u00e4b ta t\u00f5eliselt pikaks ajaks kinni. <\/p>\n<p><\/p>\n<p>Integreerimine on see, kui me v\u00f5tame oma haru ja integreerime selle peamise haruga, \u00fchildame selle. On ideaalne variant, kus me transbase development, kus p\u00fc\u00fcame kirjutada otse peaharu, ilma igasuguste liigsete harudeta.<\/p>\n<p><\/p>\n<p>\u00dcldiselt on integreerimine oma koodi v\u00f5tmine ja selle peaharu viimine. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/8950103e6a59ed7132ec321ac6abe600.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mida m\u00f5eldakse s\u00f5na \u201econtinuous\u201c all, mis t\u00e4hendab pidevust? Praktikas p\u00fc\u00fcab arendaja integreerida oma koodi v\u00f5imalikult kiiresti. See on tema eesm\u00e4rk iga \u00fclesande t\u00e4itmisel \u2013 saada oma kood p\u00f5hiharusse nii kiiresti kui v\u00f5imalik. Ideaalilises maailmas teeksid arendajad seda iga paari tunni j\u00e4rel. S.t. sa v\u00f5tad v\u00e4ikese \u00fclesande, mergid selle p\u00f5hiharusse. K\u00f5ik on suurep\u00e4rane. Sa p\u00fc\u00fcdled selle poole. Ja seda tuleb teha pidevalt. Niipea, kui sa midagi teed, paigutad sa selle kohe p\u00f5hiharusse. <\/p>\n<p><\/p>\n<p>Ja arendaja, kes midagi teeb, vastutab selle eest, et see t\u00f6\u00f6tab ja mitte midagi ei katke. Siin t\u00f5useb tavaliselt esile testide teema. Soovime k\u00e4ivitada m\u00f5ned testid meie commit'ile, meie mergile, et veenduda, et see t\u00f6\u00f6tab. Siin v\u00f5ivad teile suureks abiks olla Jenkins.<\/p>\n<p><\/p>\n<p>Aga lugudega: teeme muudatused v\u00e4ikestena, teeme \u00fclesanded v\u00e4ikestena, ja teeme \u00fclesande ning \u00fcritame selle kohe \u00fchendusse saada \u2013 siin ei aita Jenkinsid. Sest Jenkins aitab teil ainult teste k\u00e4ivitada. <\/p>\n<p><\/p>\n<p>Te saate ka ilma nendeta hakkama. See ei takista teid milleski. Sest praktika eesm\u00e4rk on \u00fchendada nii tihti kui v\u00f5imalik, et mitte raisata aega tulevikus tekkivate konfliktide peale. <\/p>\n<p><\/p>\n<p>Kujutame ette, et meil on 2020. aasta ja mingil p\u00f5hjusel pole internetti. Ja me t\u00f6\u00f6tame lokaalselt. Meil pole Jenkinsit. See on normaalne. Te saate ikkagi luua lokaalse haru. Te olete sinna kirjutanud mingit koodi. Tehke \u00fclesanne 3-4 tunni jooksul. Vahetage peaharule, tehke git pull ja \u00fchendage oma haru sinna. Valmis. Kui teete seda tihti \u2013 \u00f5nnitleme, teil on pidev integreerimine!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/1f2117b65994b940edb04e0e119f6e8a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Millised on t\u00e4nap\u00e4eva maailmas t\u00f5endid, mis n\u00e4itavad, et selleks tasub pingutada? Sest \u00fcldiselt on see keeruline. Kui proovite nii t\u00f6\u00f6tada, m\u00f5istate, et peate mingisugusest planeerimisest kinni pidama ja rohkem aega \u00fclesannete koostamiseks kulutama. Sest kui teete man\u2026, siis te ei saa kiiresti liita ja seet\u00f5ttu j\u00e4\u00e4te h\u00e4tta. Teie praktikast ei piisa enam. <\/p>\n<p><\/p>\n<p>Ja see tuleb kalliks maksma. Alustada kohe j\u00e4rgmiseks p\u00e4evaks pideva integreerimisega ei \u00f5nnestu. Te harjute sellega v\u00e4ga kaua, palju aega kulub \u00fclesannete koostamise harjumise peale, palju aega kulub \u00fclevaatuspraktika muutmise harjumise peale, kui see teil juba on. Sest meie eesm\u00e4rk on, et see liituks t\u00e4na. Kui teete \u00fclevaatust kolme p\u00e4eva jooksul, on teil probleeme ja pidev integreerimine ei toimi. <\/p>\n<p><\/p>\n<p>Aga kas meil on mingeid aktuaalseid t\u00f5endeid just n\u00fc\u00fcd, mis \u00fctlevad, et sellesse praktikasse investeerimine on m\u00f5ttekas?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/2026a8f1d72fb05613511e7bab57e8ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esimene asi, mis mulle p\u00e4he tuli, on State of DevOps. See on uuring, mida kutid on juba seitse aastat l\u00e4bi viinud. Praegu teevad nad seda s\u00f5ltumatu organisatsioonina, kuid Google'i all.<\/p>\n<p><\/p>\n<p>Ja nende uurimus 2018. aastal n\u00e4itas korrelatsiooni ettev\u00f5tete vahel, kes p\u00fc\u00fcavad kasutada l\u00fchiajalisi harusid, mis integreeruvad kiiresti ja sageli. Nende IT-tulemuslikkus on oluliselt parem.<\/p>\n<p><\/p>\n<p>Millised on need n\u00e4itajad? Need on neli m\u00f5\u00f5dikut, mida nad k\u00fcsitlustes k\u00f5igist ettev\u00f5tetest koguvad: deployimise sagedus, muudatuste ooteaeg, teenuse taastamise aeg ja muudatuste eba\u00f5nnestumise m\u00e4\u00e4r.<\/p>\n<p><\/p>\n<p>Esiteks, on olemas see korrelatsioon: me teame, et ettev\u00f5tted, kes teevad sulandamisi tihti, saavutavad nende m\u00f5\u00f5dikute osas paremaid tulemusi. Samuti jagavad nad ettev\u00f5tteid erinevatesse kategooriatesse: aeglased ettev\u00f5tted, medium performer, high performer ja eliit. Eliit on Netflix, Amazon, kes on superkiired \u2014 nad teevad k\u00f5ik kiiresti, kenasti ja kvaliteetselt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/4fd98ef48a5cffdd6ae2ceea93dbb0bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teine lugu, mis juhtus alles kuu aega tagasi. Technology Radar'is ilmus suurep\u00e4rane m\u00e4rkmete postitus Gitflow'st. Gitflow erineb teistest sellega, et tema harud elavad kaua. On v\u00e4ljaandmispuud, mis elavad kaua ning funktsioonide harud, mis samuti kaua elavad. See praktika on Technology Radar'is hakanud HOLD-i minema. Miks? Sest inimesed seisavad silmitsi integratsiooni probleemidega. <\/p>\n<p><\/p>\n<p>Kui sinu haru elab v\u00e4ga pikka aega, j\u00e4\u00e4b see kinni, hakkab m\u00e4danema, ja me hakkame kulutama rohkem aega selle muutmise tegemiseks. <\/p>\n<p><\/p>\n<p>Ja hiljuti \u00fctles Gitflow autor, et kui p\u00fc\u00fcad saavutada pidevat integreerimist ja soovid, et saaksid v\u00f5imalikult sageli edasi liikuda, siis Gitflow on halb idee. Ta lisas oma artiklis, et kui sul on backend, kus saad sellele p\u00fc\u00fcda, siis Gitflow on sulle \u00fcleliigne, kuna see aeglustab sind ja loob integreerimisega probleeme. <\/p>\n<p><\/p>\n<p>See ei t\u00e4henda, et Gitflow oleks halb ja et seda ei tohiks kasutada. See sobib muudes olukordades. N\u00e4iteks, kui pead toetama mitut versiooni teenusest v\u00f5i rakendusest, s.t. kui pead toetama pikka aega. <\/p>\n<p><\/p>\n<p>Aga kui suhtled inimestega, kes selliseid teenuseid toetavad, kuuled palju n\u00f6rdimust selle \u00fcle, et see versioon oli 3.2, mis oli 4 kuud tagasi ja kuhu see parandamine ei saanud, ning n\u00fc\u00fcd, et see sisse viia, tuleb teha hulk muudatusi. Ja nad takerdusid j\u00e4lle ja nii nad n\u00e4pivad n\u00e4dal aega, et v\u00f5tta ja liita mingi uus funktsioon. <\/p>\n<p><\/p>\n<p>Nagu Alexander Kovalev \u00f5igesti m\u00e4rkis vestluses, ei t\u00e4henda korrelatsioon, et tegemist on p\u00f5hjus-tagaj\u00e4rjega. See on t\u00f5si. St. ei ole mingit otsest seost, et kui teil on pidev integreerimine, siis k\u00f5ik n\u00e4itajad on imeliselt head. Kuid on positiivne korrelatsioon, et kui \u00fcks on olemas, siis t\u00f5en\u00e4oliselt on ka teine. See ei ole kindlasti, aga t\u00f5en\u00e4oliselt. See on ainult korrelatsioon. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/d5fc050550b0e9f86a1fdf85fff32fa5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tundub, et me teeme juba midagi, n\u00e4iliselt me merge\u2019ime, aga kuidas m\u00f5ista, et meil on siiski pidev integreerimine, et me merge\u2019ime piisavalt tihti?<\/p>\n<p><\/p>\n<p>Jez Humble on Handbooki, Accelerate'i, Continuous Delivery veebisaidi ja raamatu \u201eContinuous Delivery\u201c autor. Ta pakub v\u00e4lja sellise testi:<\/p>\n<p><\/p>\n<ul>\n<li>Arendaja kood j\u00f5uab masterisse igap\u00e4evaselt. <\/li>\n<li>Iga commit'i puhul k\u00e4itate te unit-testid.<\/li>\n<li>Masteri build kukkus alla, see parandati umbes 10 minutiga.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ta soovitab kasutada sellist testi, et veenduda, et praktika on teil t\u00f5eliselt olemas. <\/p>\n<p><\/p>\n<p>Viimane punkt tundub mulle veidi vaidluslik. Kui saate vea 10 minutiga parandada, siis t\u00e4hendab see, et teil on pidev integreerimine, mis k\u00f5lab veidi kummaliselt, aga see omamoodi m\u00f5te eksisteerib. Miks? Sest kui te teete sageid liiteid, t\u00e4hendab see, et muudatused on v\u00e4ikesed. Kui v\u00e4ike muudatus p\u00f5hjustab teie p\u00f5hiversiooni katkestamise, suudate selle kiiresti leida, kuna muudatus on v\u00e4ike. Oletame, et teil oli v\u00e4ike liitmine, kus muudeti 20\u201330 rida. Seet\u00f5ttu saate kiiresti aru, mis p\u00f5hjus oli, kuna muudatused on napid ja teil on probleemide otsimiseks v\u00e4ga v\u00e4ike ala. <\/p>\n<p><\/p>\n<p>Ja isegi kui meie tootmisserver p\u00e4rast v\u00e4ljalaset kokku kukub, siis kui meil on pideva integreerimise praktika, on meil palju lihtsam tegutseda, kuna muudatused on v\u00e4ikesed. Jah, see m\u00f5jutab planeerimist. See teeb haiget. Ja t\u00f5en\u00e4oliselt on k\u00f5ige keerulisem selles praktikas see, et harjuda \u00fclesandeid jaotama, st kuidas teha nii, et v\u00f5taks midagi teha mitu tundi ja seej\u00e4rel l\u00e4bida kvalitatiivne \u00fclevaatus, kui see on olemas. \u00dclevaatus on t\u00e4iesti eraldi mure. <\/p>\n<p><\/p>\n<p>\u00dchik-testid on lihtsalt abivahend, mis aitab teil m\u00f5ista, kas teie integreerimine on \u00f5nnestunud ja midagi pole katki l\u00e4inud. Minu arvates pole see ka t\u00e4iesti kohustuslik punkt, kuna praktika m\u00f5te ei seisne selles. <\/p>\n<p><\/p>\n<p>Siin on l\u00fchidalt Continuous Integration'i kohta. See on k\u00f5ik, mis selle praktika kohta teada on. Olen k\u00fcsimustele avatud. <\/p>\n<p><\/p>\n<p>L\u00fchidalt kokku v\u00f5ttes \u00fctlen veel kord:<\/p>\n<p><\/p>\n<ul>\n<li>Continuous Integration ei t\u00e4henda Jenkins'i ega GitLab'i.<\/li>\n<li>See ei ole t\u00f6\u00f6riist, vaid praktika, mille kohaselt liidame meie koodi v\u00f5imalikult tihti master'isse. <\/li>\n<li>Tee seda selleks, et v\u00e4ltida tulevikus suuri probleeme, mis seotud mergimisega; ehk tekitame praegu v\u00e4ikese valulikkuse, et tulevikus v\u00e4ltida suurt. See on kogu idee. <\/li>\n<li>Koodiga toimub suhtlemine, aga ma n\u00e4en seda v\u00e4ga harva, kuigi selleks see on ka ette n\u00e4htud.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>K\u00fcsimused<\/strong><\/p>\n<p><\/p>\n<p><em>Mida teha \u00fclesannete mitte-dekompositsiooniga?<\/em><\/p>\n<p><\/p>\n<p>Dekompositsioon. Mis on probleem? Kas suudate tuua n\u00e4ite, et on mingi \u00fclesanne, mida ei saa dekompositsiooniks jagada?<\/p>\n<p><\/p>\n<p><em>On selliseid \u00fclesandeid, mida ei saa absoluutselt lahti harutada, n\u00e4iteks need, mis n\u00f5uavad v\u00e4ga s\u00fcgavat ekspertiisi ja mida on v\u00f5imalik lahendada tegelikult kuu aega enne mingit arusaadavat tulemust.<\/em> <\/p>\n<p><\/p>\n<p>Kui ma sind \u00f5igesti m\u00f5istan, siis on mingi suur ja keeruline \u00fclesanne, mille tulemust saab n\u00e4ha ainult kuu p\u00e4rast?<\/p>\n<p><\/p>\n<p><em>Jah, k\u00f5ik on \u00f5ige. Jah, tulemuse hindamine on v\u00f5imalik mitte varem kui kuu p\u00e4rast.<\/em> <\/p>\n<p><\/p>\n<p>Hea k\u00fcll. \u00dcldiselt pole see probleem. Miks? Sest antud juhul, kui r\u00e4\u00e4gime harudest, ei r\u00e4\u00e4gi me harust koos funktsiooniga. Funktsioonid v\u00f5ivad olla suured ja keerulised. Need v\u00f5ivad h\u00f5lmata suurt hulka komponente. Ja v\u00f5ib-olla me ei saa neid t\u00e4ielikult teha \u00fches haru. See on normaalne. Me peame lihtsalt selle loo lahti harutama. Kui funktsioon ei ole l\u00f5puni valmis, ei t\u00e4henda see, et m\u00f5ningaid selle koodi osi ei saa liita. Sa oled n\u00e4iteks lisanud migratsiooni ja funktsiooni sees on m\u00f5ned etapid. Sul on n\u00e4iteks etapp \u2013 teha migratsioon, lisada uus meetod. Ja need asjad, mida saab juba iga p\u00e4ev liita. <\/p>\n<p><\/p>\n<p><em>Hea k\u00fcll. Mis siis on selle m\u00f5te?<\/em><\/p>\n<p><\/p>\n<p>Miks on m\u00f5tet igap\u00e4evaselt v\u00e4ikeseid muudatusi kokku viia?<\/p>\n<p><\/p>\n<p><em>Jah.<\/em><\/p>\n<p><\/p>\n<p>Kui need on midagi katki teinud, siis n\u00e4ed seda kohe. Sul on v\u00e4ikene t\u00fckk, mis midagi katki tegi, ja seda on lihtsam parandada. M\u00f5tteks on see, et v\u00e4ikese t\u00fcki \u00fchendamine on oluliselt lihtsam kui suure \u00fchendamine n\u00e4dalate p\u00e4rast. Ja kolmas m\u00f5te on see, et teised insenerid saavad t\u00f6\u00f6tada juba aktuaalse koodiversiooniga. Nad n\u00e4evad, et siia on lisandunud migratsioonid ja siia on ilmunud mingi meetod, mida nad v\u00f5ivad samuti soovida kasutada. K\u00f5ik n\u00e4evad, mis su koodis toimub. Just nende kolme asja nimel seda praktikat tehakse. <\/p>\n<p><\/p>\n<p><em>Ait\u00e4h, k\u00fcsimus on suletud!<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg Soroka) Kas ma v\u00f5in lisada? Sa \u00fctlesid k\u00f5ike \u00f5igesti, tahan lihtsalt \u00fche lause lisada.<\/em><\/p>\n<p><\/p>\n<p>Nii.<\/p>\n<p><\/p>\n<p><em>Continuous Integration'i puhul liidetakse kood \u00fchisesse haru mitte siis, kui funktsioon on t\u00e4ielikult valmis, vaid siis, kui ehitus enam ei katke. Ja v\u00f5ite rahulikult commiteerida masterisse niipalju kordi p\u00e4evas kui soovite. Teine aspekt \u2013 kui te mingil p\u00f5hjusel ei suuda kuumisi \u00fclesannet jagada v\u00e4hemalt kolme p\u00e4eva \u00fclesanneteks, r\u00e4\u00e4kimata kolmest tunnist, siis on teil suur probleem. Ja see fakt, et teil ei ole Continuous Integration'i \u2013 on k\u00f5ige v\u00e4iksem neist probleemidest. See t\u00e4hendab, et teil on probleeme arhitektuuriga ja inseneripraktikad on nullis. Sest isegi kui see on uurimist\u00f6\u00f6, tuleks seda siiski vormistada h\u00fcpoteeside v\u00f5i ts\u00fcklina.<\/em> <\/p>\n<p><\/p>\n<p><em>R\u00e4\u00e4kisime neljast m\u00f5\u00f5dikust, mis eristavad edukaid ettev\u00f5tteid mahaj\u00e4\u00e4nutest. Nendest neljast m\u00f5\u00f5dikust tuleb veel l\u00e4bi elada. Kui teie keskmine \u00fclesanne kestab kuu aega, siis soovitaksin k\u00f5igepealt sellele m\u00f5\u00f5dikale t\u00e4helepanu p\u00f6\u00f6rata. V\u00e4hendage see esmalt kolme p\u00e4eva peale. Ja p\u00e4rast seda hakake m\u00f5tlema Continuous'e peale.<\/em><\/p>\n<p><\/p>\n<p>Kas ma sain \u00f5igesti aru, et arvad, et investeerimine inseneripraktikatesse ei ole m\u00f5istlik, kui igasugune \u00fclesanne kestab kuu aega?<\/p>\n<p><\/p>\n<p><em>Sul on pidev integreerimine. Ja seal on selline teema, et sa kas parandad vea 10 minuti jooksul v\u00f5i tagasit\u00f5mbad. Kujuta ette, et sa selle v\u00e4lja andsid. Ja sul on isegi pidev juurutamine, sa andsid selle v\u00e4lja produktsiooni ja alles siis m\u00e4rkad, et midagi l\u00e4ks valesti. Ja sul tuleb see tagasi v\u00f5tta, aga su andmebaasi migratsioon on juba toimunud. Sul on juba andmebaasi skeem j\u00e4rgmises versioonis, veel rohkem, on toimunud ka mingisugune varundamine, veel sinna andmed salvestatud.<\/em><\/p>\n<p><\/p>\n<p><em>Ja mis sul on alternatiivina? Kui sa tagasit\u00f5mbad koodi, siis see ei saa enam t\u00f6\u00f6tada selle uuendatud andmebaasiga.<\/em><\/p>\n<p><\/p>\n<p>Andmebaas liigub ainult edasi, jah. <\/p>\n<p><\/p>\n<p><em>Inimestel, kellel on halb inseneripraktika, on t\u00f5en\u00e4oliselt, et nad pole paksu raamatut ... ka lugenud. Mida teha varundusega? Kui sa taastud varundusest, siis sa kaotad andmed, mis selle hetkeni kogusid. N\u00e4iteks t\u00f6\u00f6tasid kolme tunni jooksul uue versiooniga andmebaasis, sinna registreerusid kasutajad. Sa tagastusid vanale varundusele, kuna uue versiooniga skeem ei t\u00f6\u00f6ta, vastavalt sellele kaotad sa need kasutajad. Ja nad on rahulolematud, nad pahandavad.<\/em><\/p>\n<p><\/p>\n<p><em>Ettevalmistamiseks, et omandada kogu praktika, mis toetab pidevat integreerimist ja pidevat tarnimist, ei piisa lihtsalt kirjutamisest... Esiteks, neid v\u00f5ib olla v\u00e4ga palju, mille t\u00f5ttu muutub see ebaefektiivseks. Lisaks on seal hulk teisi praktikaid, n\u00e4iteks teaduslikud. On olemas praktika, mille populariseeris GitHub, kus vana ja uus kood t\u00f6\u00f6tab samaaegselt. See t\u00e4hendab, et sa teed pooleliolevat funktsiooni, mis saab mingit v\u00e4\u00e4rtust tagastada: kas funktsiooni v\u00f5i REST API kaudu. Sa t\u00e4idad nii uut koodi kui ka vana koodi ja v\u00f5rdled nende vahelist erinevust. Ja kui erinevus eksisteerib, siis logid selle s\u00fcndmuse. Nii tead, et su uus funktsioon on valmis vanale peale kukkuma, kui teatud ajaperioodi jooksul ei ole nende kahe vahel lahknevust.<\/em> <\/p>\n<p><\/p>\n<p><em>Selliseid praktikaid on sadu. Ma soovitaksin alustada transbase arendamisest. See ei ole 100% pideva integreerimise mudel, kuid praktikad on samasugused, \u00fcks ilma teiseta ei ela h\u00e4sti.<\/em> <\/p>\n<p><\/p>\n<p>Kas t\u00f5id transbase arendamise n\u00e4itena, kust saab praktikaid vaadata, v\u00f5i soovitad inimestel alustada transbase arendamise kasutamist?<\/p>\n<p><\/p>\n<p><em>Vaadake, kuna nad ei saa seda kasutada. Selleks, et seda kasutada, tuleb palju lugeda. Ja kui inimesel on k\u00fcsimus: \u201eMida teha funktsiooniga, mis v\u00f5tab kuu aega\u201c, siis see t\u00e4hendab, et ta ei ole lugenud transbase arendamise kohta. Ma ei soovitaks seda praegu. Ma soovitaksin keskenduda rangelt sellele, kuidas suurte \u00fclesannete arhitektuuriliselt \u00f5igesti v\u00e4iksemateks t\u00fckkideks jagada. Just see on dekompositsiooni tuum.<\/em><\/p>\n<p><\/p>\n<p><em>Dekompositsioon on \u00fcks arhitekti t\u00f6\u00f6riistu. Esiteks teeme anal\u00fc\u00fcsi, seej\u00e4rel dekompositsiooni, seej\u00e4rel s\u00fcnteesi ja seej\u00e4rel integratsiooni. Nii koguneb meie jaoks k\u00f5ik kokku. Ja pidev integratsioon n\u00f5uab dekompositsiooni kaudu arengut. Esimesel etapil tekivad k\u00fcsimused, aga me r\u00e4\u00e4gime juba neljandast etapist, st mida sagedamini integratsiooni teeme, seda parem. Selleks on veel varakene, oleks hea esmalt oma monoliiti pisut toimetada.<\/em> <\/p>\n<p><\/p>\n<p><em>Tuleb joonistada mingisuguseid nooli ja ruute mingile skeemile. Sa ei saa \u00f6elda, et n\u00fc\u00fcd n\u00e4itan ma uue rakenduse arhitektuurskeemi ja n\u00e4itan \u00fchte ruutu, mille sees on roheline nupp rakenduse jaoks. Igal juhul on ruute ja nooli rohkem. Igas skeemis, mida ma olen n\u00e4inud, on neid rohkem kui \u00fcks. Ja isegi graafilise esitlemise tasemel toimub dekompositsioon juba. Seet\u00f5ttu saab ruute teha s\u00f5ltumatuks. Kui ei, siis on mul arhitekti vastu suured k\u00fcsimused.<\/em> <\/p>\n<p><\/p>\n<p>K\u00fcsimus vestlusest: \u201eKas \u00fclevaatus on kohustuslik ja kestab kaua, m\u00f5nikord p\u00e4eva v\u00f5i kauem?\u201c<\/p>\n<p><\/p>\n<p>Teie praktikaga on probleeme. \u00dclevaatus ei tohiks kesta p\u00e4eva v\u00f5i rohkem. See on sama lugu nagu eelneva k\u00fcsimusega, ainult veidi leebem. Kui \u00fclevaatus kestab p\u00e4eva, t\u00e4hendab see, et t\u00f5en\u00e4oliselt on tegemist v\u00e4ga suure muudatusega. Seega tuleks seda jagada v\u00e4iksemateks osadeks. Olegi soovitatud transbase arenduses on selline m\u00f5te, mida nimetatakse pidevaks \u00fclevaatuseks. Selle idee on see, et me teeme teadlikult nii v\u00e4ikese pull request'i, et soovime pidevalt v\u00e4ikeste muudatustega liituda. Seega muudab pull request \u00fche abstraktsiooni v\u00f5i 10 rida. T\u00e4nu sellele kestab meie \u00fclevaatus paar minutit. <\/p>\n<p><\/p>\n<p>Kui \u00fclevaade v\u00f5tab p\u00e4eva v\u00f5i enam, siis on midagi valesti. Esiteks v\u00f5ivad teil olla probleemid arhitektuuriga. V\u00f5i on see suur koodil\u00f5ik, n\u00e4iteks 1000 rida. V\u00f5i on teie arhitektuur nii keeruline, et inimene ei saa sellest aru. See on probleem, mida tuleb samuti lahendada. V\u00f5ib-olla ei olegi \u00fclevaatust vaja. Sellele peaksite samuti m\u00f5tlema. \u00dclevaatus on see, mis teid pidurdab. Sellel on oma eelised, kuid tuleb m\u00f5ista, miks te seda teete. Kas see on teie jaoks kiire teabe edastamise viis, kas selle kaudu seadistate sisemisi standardeid v\u00f5i midagi muud? Miks teil seda on vaja? Sest \u00fclevaatus peab olema kas v\u00e4ga kiire v\u00f5i tuleks see hoopis \u00e4ra j\u00e4tta. See on nagu transbase'i arendamine \u2013 v\u00e4ga ilus lugu, kuid ainult k\u00fcpsetele inimestele. <\/p>\n<p><\/p>\n<p>Mis puutub nelja m\u00f5\u00f5dikusse, siis soovitaksin need siiski eemaldada, et m\u00f5ista, kuhu see viib. Vaadata numbreid, vaadata pilti, kui halb see k\u00f5ik veel on. <\/p>\n<p><\/p>\n<p><em>(Dmitri) Olen valmis selle \u00fcle sinuga arutama. Numbrid ja m\u00f5\u00f5dikud on k\u00f5ik tore, praktika on tore. Kuid tuleb m\u00f5ista, kas see on ettev\u00f5ttele vajalik. On ettev\u00f5tteid, kellele ei ole selline muutuste sagedus vajalik. Tuntud on ettev\u00f5tted, kus ei tohi muudatusi teha iga 15 minuti j\u00e4rel. Ja mitte seep\u00e4rast, et nad oleksid kedagi halvad. See on eluts\u00fckkel. Ja et kasutada funktsioonide haru ja funktsioonide l\u00fclitit, on vaja s\u00fcgavaid teadmisi.<\/em> <\/p>\n<p><\/p>\n<p>See on keeruline. Kui soovite lugeda rohkem funktsioonide l\u00fclitite ajaloost, siis soovitan tungivalt. <noindex><a rel=\"nofollow\" href=\"https:\/\/trunkbaseddevelopment.com\/\">https:\/\/trunkbaseddevelopment.com\/<\/a><\/noindex>. Ja Martin Floweri korral on suurep\u00e4rane artikkel funktsioonide l\u00fclititest: milliseid t\u00fc\u00fcpe, eluts\u00fckleid jms. Funktsioonide l\u00fclitid \u2013 see on keeruline. <\/p>\n<p><\/p>\n<p><em>Ja sa ikkagi ei vastanud k\u00fcsimusele: 'Kas Jenkins on vajalik v\u00f5i mitte?'<\/em><\/p>\n<p><\/p>\n<p>Jenkins ei ole tegelikult kunagi vajalik. Kui t\u00f5siselt r\u00e4\u00e4kida, siis t\u00f6\u00f6riistad nagu Jenkins ja Gitlab toovad mugavust. N\u00e4ete, kas ehitamine toimis v\u00f5i mitte. Nad aitavad teil, kuid nad ei anna teile praktilisi kogemusi. Nad v\u00f5ivad anda vaid ringi \u2013 OK, mitte OK. Ja seda juhul, kui te kirjutate veel teste, sest kui teste ei ole, siis on see peaaegu m\u00f5ttetu. Seet\u00f5ttu on vaja, sest see on mugavam, kuid \u00fcldiselt saate ka ilma selleta hakkama, ei kaota kuigi palju. <\/p>\n<p><\/p>\n<p><em>K. e. kui teil on praktika, kas see t\u00e4hendab, et teil ei ole seda vaja?<\/em><\/p>\n<p><\/p>\n<p>Just. Soovitan Jez Humble'i testi. Ma olen viimase punkti osas kahtleval seisukohal. Kuid kokkuv\u00f5ttes, kui teil on kolm asja: te \u00fchendate pidevalt, k\u00e4ivitate teste masteris tehtud muudatuste puhul, kiiresti parandate masteri ehituse, siis v\u00f5ib-olla ei ole teil rohkemat vajagi. <\/p>\n<p><\/p>\n<p><em>Kui me ootame osalejatelt k\u00fcsimusi, siis minul on k\u00fcsimus. Me r\u00e4\u00e4kisime tootekoodist. Kas sa oled kasutanud ka infrastruktuurikoodi? Kas see on sama kood, millel on samad p\u00f5him\u00f5tted ja eluiga, v\u00f5i on seal teised eluiga ja p\u00f5him\u00f5tted? \u00dcldiselt, kui k\u00f5ik r\u00e4\u00e4givad pidevast integreerimisest ja arendamisest, unustavad nad, et infrastruktuurikood on samuti olemas. Viimasel ajal on seda \u00fcha rohkem. Kas peaksime sinna tuua k\u00f5ik need reeglid?<\/em><\/p>\n<p><\/p>\n<p>See ei ole ainult soovitus, see oleks suurep\u00e4rane, kuna see lihtsustaks elu. Niipea kui me t\u00f6\u00f6tame koodiga, mitte bash-skriptidega, vaid meil on normaalne kood.<\/p>\n<p><\/p>\n<p><em>Peatu-peat, bash-skript on samuti kood. \u00c4ra puutu minu vana armastust.<\/em> <\/p>\n<p><\/p>\n<p>Hea k\u00fcll, ma ei hakka sinu m\u00e4lestusi tallama. Mul on bash'i vastu isiklik antipaatia. See puruneb inetult ja haaravalt kogu aeg. Ja see katkeb sageli ettearvamatult, seet\u00f5ttu ma ei armasta seda. Aga h\u00e4sti, oletame, et sul on bash'is kood. V\u00f5ib-olla t\u00f5esti ma ei tea ja seal on normaalsed testimise raamistikud. Ma lihtsalt ei ole teadlik. Ja me saame samu eeliseid.<\/p>\n<p><\/p>\n<p>Kui me t\u00f6\u00f6tame infrastruktuuriga nagu koodiga, kohtame samu probleeme nagu arendajad. M\u00f5ned kuud tagasi sattusin olukorda, kus kolleeg saatis mulle 1 000 rea suuruse bash'i pull request'i. Ja sa j\u00e4\u00e4d 4 tunniks \u00fclevaate tegemisse kinni. Probleemid on samad. See on ikka veel kood. Ja ikka veel koost\u00f6\u00f6. Me j\u00e4\u00e4me kinni pull request'i ja meid pidurdavad samad bash'i mergen\u00fc\u00fcbid. <\/p>\n<p><\/p>\n<p>Ma j\u00e4lgisin seda asja praegu v\u00e4ga aktiivselt, keskendudes tarkvara infrastruktuuri maksimaalselt ilusale kodeerimisele. Olen praegu integreerinud infrastrukturi Pulumi. See on puhtalt kodeerimine. Seal on see veel kaunim, sest mul on k\u00f5ik programmeerimiskeele v\u00f5imalused. See t\u00e4hendab, et ma tegin samade if-de abil kauneid toggles ja k\u00f5ik on h\u00e4sti. Minu muudatus on juba Masteris. K\u00f5ik n\u00e4evad seda. Teised insenerid on sellest teadlikud. See on juba millegi peale m\u00f5jutanud. Kuid see ei ole aktiveeritud k\u00f5igis infrastruktuurides. See on aktiveeritud n\u00e4iteks minu testkeskkondades. Seega, vastates su k\u00fcsimusele veel kord, see on vajalik. See lihtsustab meie elu inseneridena, kes t\u00f6\u00f6tavad koodiga, t\u00e4pselt samamoodi. <\/p>\n<p><\/p>\n<p><em>Kas kellelgi on veel k\u00fcsimusi?<\/em> <\/p>\n<p><\/p>\n<p>Mul on k\u00fcsimus. Soovin j\u00e4tkata arutelu Olegiga. \u00dcldiselt arvan, et sul on \u00f5igus, et kui \u00fclesanne v\u00f5tab sul kuu aega, siis on sul arhitektuuriga probleeme, sul on probleeme anal\u00fc\u00fcsiga, dekompositsiooniga, planeerimisega jne. Kuid mul on tunne, et kui hakkad p\u00fc\u00fcdma elada Continuous Integration'i j\u00e4rgi, siis hakkad oma planeerimisega seotud muresid lahendama, sest sa ei p\u00e4\u00e4se sellest muidu. <\/p>\n<p><\/p>\n<p><em>(Oleg) Jah, k\u00f5ik on nii. Selle praktika t\u00f6\u00f6maht on sarnane igasuguste teiste t\u00f5siste praktikatega, mis muudavad kultuuri. K\u00f5ige raskem on harjumuste \u00fcletamine, eriti halbade harjumuste. Ja kui selle praktika juurutamiseks on vajalik t\u00f5sine muutus \u00fcmbritsevates harjumustes: arendajates, juhtkonnas, tootmisjuhtides, siis ootavad sind \u00fcllatused.<\/em> <\/p>\n<p><\/p>\n<p><em>Millised \u00fcllatused v\u00f5ivad tulla? Oletame, et otsustasite, et hakkate sagedamini integreerima. Ja teie integratsioonis on seotud veel m\u00f5ned asjad, n\u00e4iteks artefaktid. Ja teie ettev\u00f5ttes on n\u00e4iteks poliitika, et iga artefakt peab olema mingil moel arvesse v\u00f5etud mingis artefaktide laos\u00fcsteemis. Ja see v\u00f5tab aega. Inimene peab m\u00e4rkima, et tema, kui v\u00e4ljalaskemanager, on katsetanud seda artefakti tootmisse panekuks. Kui see v\u00f5tab 5-10-15 minutit, kuid samas teete v\u00e4ljalaske kord n\u00e4dalas, siis n\u00e4dalas pool tundi kulutada \u2013 see on v\u00e4ike maks.<\/em> <\/p>\n<p><\/p>\n<p><em>Kui teete pidevat integreerimist 10 korda p\u00e4evas, siis tuleb 10 korda korrutada 30 minutiga. Ja see \u00fcletab selle v\u00e4ljalaskemanageri t\u00f6\u00f6aja. Ta lihtsalt v\u00e4sib sellest. On pidevad kulud m\u00f5ningatele praktikatest. Ja k\u00f5ik.<\/em> <\/p>\n<p><\/p>\n<p><em>Ja teil on kas vaja see reegel t\u00fchistada, et te enam sellisega ei tegele, st te ei m\u00e4\u00e4ra k\u00e4sitsi millegi vastavuse astet. Te toetute t\u00e4ielikult mingile automatiseeritud testide komplektile, et kontrollida valmisolekut.<\/em> <\/p>\n<p><\/p>\n<p><em>Ja kui teil on vaja kellegi t\u00f5endit, et juht kirjutaks alla, ja te ei l\u00e4he produktsiooni, kui Vasja ei ole \u00f6elnud, et tal on lubatud jne. \u2013 siis kogu see jama takistab praktikaid. Sest kui on seotud mingisuguste tegevustega maksud, siis k\u00f5ik muutub 100 korda keerulisemaks. Seet\u00f5ttu v\u00f5idakse \u00fcleminekut tihti mitte k\u00f5igiga r\u00f5\u00f5muga vastu v\u00f5tta. Inimeste harjumustele on raske muutuda.<\/em> <\/p>\n<p><\/p>\n<p><em>Kui inimene teeb harjumusp\u00e4rast t\u00f6\u00f6d, siis ta teeb seda praktiliselt mitte m\u00f5eldes. Selle kognitiivne koormus on null. Ta lihtsalt teeb valmisoleku j\u00e4rgi, tal on peas juba kontroll-loend, ta on seda tuhat korda teinud. Ja kui sa tuled ja \u00fctled talle: \"\u00c4ra t\u00fchista seda praktikat ja alates esmasp\u00e4evast rakendame uut\", siis see muutub tema jaoks tohutuks kognitiivseks koormuseks. Ja see koormus tuleb k\u00f5igi jaoks korraga.<\/em> <\/p>\n<p><\/p>\n<p><em>Seega on k\u00f5ige lihtsam, kuigi t\u00f5si, et mitte k\u00f5ik ei suuda endale seda luksust lubada, kuid mina teen alati just nii. Kui algab uus projekt, siis tavaliselt sokutatakse sellesse projekti k\u00f5ik katsetamata praktikad. Kui projekt on noor, ei riskime me eriti millegagi. Prod veel ei eksisteeri, seega pole midagi kaotada. Seet\u00f5ttu saab seda kasutada treeninguna. Selline l\u00e4henemine t\u00f6\u00f6tab. Aga mitte k\u00f5ik ettev\u00f5tted ei saa endale lubada selliste projektide tihedat algust. Kuigi see on ka veidi kummaline, kuna praegu toimub pidev digitaalne transformatsioon, peaksid k\u00f5ik eksperimente k\u00e4ivitama, et konkurentide ees p\u00fcsida.<\/em> <\/p>\n<p><\/p>\n<p>Siin tabad end olukorrast, kus sul peab esmalt olema arusaam sellest, mida sa tegema pead. Maailm ei ole ideaalne, prod ka ei ole ideaalne. <\/p>\n<p><\/p>\n<p><em>Jah, need asjad on omavahel seotud.<\/em><\/p>\n<p><\/p>\n<p>\u00c4rivaldkonnas ei ole ka alati selgust, et nad peavad sinna suunda liikuma. <\/p>\n<p><\/p>\n<p><em>On olukord, kus muutused ei ole \u00fcldse v\u00f5imalikud. See juhtub siis, kui meeskonnale avaldatakse suuremat survet. Meeskond on juba \u00fcsna v\u00e4sinud. Neil pole \u00fcldse reservi katsetamiseks. Nad t\u00f6\u00f6tavad hommikust \u00f5htuni funktsioonide kallal. Ja juhtkonnale tundub, et funktsioone pole kunagi piisavalt. N\u00f5utakse aina rohkem ja rohkem. Sellises olukorras ei ole \u00fcldse mingeid muutusi v\u00f5imalik teha. Meeskonnale saab \u00f6elda ainult, et homme teeme nagu eile, lihtsalt tuleb teha funktsioon veidi rohkem. Mingeid \u00fcleminekuid uutele praktikale ei ole v\u00f5imalik teha. See on klassikaline olukord, kus pole aega kirvest teritada, peab puid langetama, seet\u00f5ttu langetatakse nurgataguse kirvega. Siin pole lihtsaid n\u00f5uandeid.<\/em> <\/p>\n<p><\/p>\n<p><em>(Dmitri) Loen v\u00e4lja t\u00e4psustuse vestlustest: \u00abAga vajame suurt testimise katvust erinevatel tasemetel. Kui palju aega testimisele kulutatakse? Tundub, et see on liiga kallis, v\u00f5tab palju aega.\u00bb<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg) See on klassikaline eksiarvamus. Testide peab olema piisavalt, et teil endil oleks kindlus. Continuous Integration ei ole selline asi, kus k\u00f5igepealt tehakse 100% teste ja alles siis hakatakse seda praktikat rakendama. Continuous Integration v\u00e4hendab teie kognitiivset koormust, kuna iga muudatus, mida te n\u00e4ete, on nii ilmselge, et te m\u00f5istate \u2013 kas see rikub midagi v\u00f5i mitte, isegi ilma testideta. Te saate seda kiiresti oma peas testida, kuna muudatused on v\u00e4ikesed. Isegi kui teil on ainult k\u00e4sitsi testijad, on neil samuti lihtsam. Te esitate ja \u00fctlete: \u201eVaata, ei ole midagi katki?\u201d Nad kontrollivad ja \u00fctlevad: \u201eEi, ei ole midagi katki.\u201d Sest tester teab, kuhu vaadata. Teil on \u00fcks commit seotud \u00fche koodijupiga. Ja see v\u00e4ljendub konkreetses k\u00e4itumises.<\/em><\/p>\n<p><\/p>\n<p>Siin oled sa muidugi natuke ilusamaks teinud. <\/p>\n<p><\/p>\n<p><em>(Dmitri) Siin ma ei n\u00f5ustu. On olemas praktika \u2013 testimise kaudu arendamine, mis just sellest p\u00e4\u00e4stab.<\/em> <\/p>\n<p><\/p>\n<p><em>(Oleg) Siin, ma ei ole veel sinna j\u00f5udnud. Esimene illusioon on see, et tuleb kirjutada t\u00e4pselt 100% teste v\u00f5i et Continuous Integrationiga ei tule \u00fcldse tegeleda. See ei ole t\u00f5si. Need on kaks paralleelset praktikat ja need ei s\u00f5ltu otseselt \u00fcksteisest. Teie testide katmine peaks olema optimaalne. Optimaalne t\u00e4hendab, et te olete ise kindel, et see kvaliteet, millega teie master p\u00e4rast commit'i j\u00e4\u00e4b, lubab teil kindlalt vajutada nuppu 'Deploy' reede \u00f5htul, isegi joobes. Kuidas te seda saavutate? \u00dclevaatete, katmise ja hea j\u00e4lgimise kaudu.<\/em> <\/p>\n<p><\/p>\n<p><em>Hea j\u00e4lgimine ei erine testidest. Kui te k\u00e4ivitate teste ainult \u00fche korra pre prod'is, siis kontrollivad nad teie k\u00f5iki kasutajate stsenaariume ainult korra. Kuid kui te neid k\u00e4ivitate l\u00f5pmatus ts\u00fcklis, siis on see teie rakendatud j\u00e4lgimis\u00fcsteem, mis katab pidevalt k\u00f5ike \u2013 kas on kokku kukkunud v\u00f5i mitte. Sel juhul on vahe ainult korduvuses. V\u00e4ga hea testide komplekt, mida k\u00e4ivitatakse l\u00f5pmatult, on j\u00e4lgimine. Ja \u00f5ige j\u00e4lgimine peaks olema just selline.<\/em> <\/p>\n<p><\/p>\n<p><em>Ja seega, kuidas te j\u00f5uate sellesse olekusse, kui te reede \u00f5htul oma koodi juurutate ja koju lahkute, on teine k\u00fcsimus. V\u00f5ib-olla olete lihtsalt julge peast soe.<\/em> <\/p>\n<p><\/p>\n<p>Naaseme hetkeks tagasiviivale pidevale integreerimisele. Oleme natuke teise keerulise praktikaga k\u00f5rvale p\u00f6\u00f6rdunud. <\/p>\n<p><\/p>\n<p><em>Ja teine illusioon on see, et MVP-d tuleb kiiresti teha, seega pole testid \u00fcldse vajalikud. See pole p\u00e4ris nii. Asi on selles, et kui te kirjutate MVP-s user story, siis on selle arendamine v\u00f5imalik kas kiirelt, st kuulete, et kuskil on mingi user story ja kohe hakkate seda kodeerima, v\u00f5i t\u00f6\u00f6tada TDD j\u00e4rgi. Ja TDD praktika n\u00e4itab, et see ei kesta kauem, st testid on pigem k\u00f5rvalm\u00f5ju. TDD praktika ei seisne mitte testimises. Kuigi see kannab nime Test Driven Development, on seal tegelikult tegemist millegi muuga kui testidega. See on pigem arhitektuuriline l\u00e4henemine. See on l\u00e4henemine, kuidas kirjutada t\u00e4pselt seda, mida on vaja, ja mitte kirjutada seda, mis pole vajalik. See praktika keskendub sellele, kuidas j\u00e4rgmist iteratsiooni teie arengu m\u00f5ttes rakenduse arhitektuuri loomisel saavutada.<\/em> <\/p>\n<p><\/p>\n<p><em>Seet\u00f5ttu ei ole neist illusioonidest nii lihtne vabaneda. MVP ja testid ei excluded \u00fcksteist. Tegelikult, vastupidi, kui teete MVP-d TDD praktikaga, siis teete selle paremini ja kiiremini kui lihtsalt proovimata.<\/em><\/p>\n<p><\/p>\n<p>See on v\u00e4ga ebamugav ja keeruline m\u00f5te. Kui kuulete, et n\u00fc\u00fcd hakkan kirjutama veel teste ja samal ajal teen midagi kiiremini, k\u00f5lab see t\u00e4iesti ebaadekvaatselt. <\/p>\n<p><\/p>\n<p><em>(Dmitri) Siin paljud, kui r\u00e4\u00e4givad MVP-st, on inimestel laisk kirjutada midagi korralikku. Need on siiski erinevad asjad. \u00c4rge muutke MVP-d mingiks halvaks asjaks, mis ei t\u00f6\u00f6ta.<\/em> <\/p>\n<p><\/p>\n<p>Jah-jah, sa oled \u00f5ige.<\/p>\n<p><\/p>\n<p><em>Ja siis \u00e4kki MVP prod.<\/em><\/p>\n<p><\/p>\n<p>Igaveseks. <\/p>\n<p><\/p>\n<p>TDD k\u00f5lab esialgu v\u00e4ga ebatavaline, kui kuuled, et kirjutad teste ja tundub, et teed rohkem t\u00f6\u00f6d. See v\u00f5ib tunduda kummaline, kuid tegelikult on see t\u00f5husam ja elegantsem. Kui sa kirjutad testi, m\u00f5tled juba peas palju selle \u00fcle, millist koodi ja kuidas sa kutsud, samuti millist k\u00e4itumist me sellelt oodata saame. Sa ei \u00fctle lihtsalt, et ma kirjutasin mingi funktsiooni ja see teeb midagi. Esmalt sa m\u00f5tled, et sellel on sellised tingimused ja nii kutsutakse seda. Sa katad selle testidega ja seel\u00e4bi saad aru, kuidas sinu koodi sees olevad liidesed v\u00e4lja n\u00e4evad. See m\u00f5jutab arhitektuuri v\u00e4ga palju. Su kood muutub automaatselt moodulamaks, sest sa p\u00fc\u00fcad esmalt m\u00f5ista, kuidas sa seda testida saad, ja alles seej\u00e4rel kirjutad selle. <\/p>\n<p><\/p>\n<p>Minu TDD teekond oli selline, et \u00fchel hetkel palkasin Ruby mentori, kui olin veel Ruby programmeerija. Ta \u00fctles: \"Teeme nii, et sa hakkad TDD-d rakendama.\" M\u00f5tlesin: \"Issand, n\u00fc\u00fcd pean veel midagi lisaks kirjutama.\" Lepisime kokku, et ma kirjutangi j\u00e4rgmise kahe n\u00e4dala jooksul kogu olemasoleva koodi Pythonis TDD p\u00f5hjal. Kahes n\u00e4dalas sain aru, et ma ei taha enam tagasi minna. Kahe n\u00e4dala jooksul p\u00fc\u00fcdes seda igal pool rakendada, m\u00f5istsin, kui palju lihtsam on isegi lihtsalt m\u00f5elda. Kuid see ei ole ilmselge, seega soovitan k\u00f5igil, kellele tundub, et TDD on keeruline, aegan\u00f5udev ja \u00fcleliigne, proovida seda j\u00e4rgida ainult kaks n\u00e4dalat. Minule piisab kahest.<\/p>\n<p><\/p>\n<p><em>(Dmitri) Saame selle m\u00f5tte infrastruktuuri k\u00e4itamise vaatenurgast lahti. Enne kui k\u00e4ivitame midagi uut, teeme me monitooringu ja seej\u00e4rel k\u00e4ivitame. Sel juhul muutub meie monitooring normaalseks testimiseks. Ja arendamine toimub monitooringu kaudu. Kuid enamik inimesi \u00fctleb, et see v\u00f5tab kaua aega, mul on laisk, tegin ajutise mustandi. Kui me teeme monitooringu korralikult, saame aru CI s\u00fcsteemi seisundist. CI s\u00fcsteemis on palju monitooringut. Saame aru s\u00fcsteemi seisundist, m\u00f5istame, mis selle sees toimub. Ja arendamise ajal loome s\u00fcsteemi, et see saavutaks soovitud oleku.<\/em> <\/p>\n<p><\/p>\n<p><em>Need praktikad on olnud tuntud juba ammu. Arutasime seda umbes 4 aastat tagasi. Kuid nelja aastaga ei ole praktiliselt midagi muutunud.<\/em> <\/p>\n<p><\/p>\n<p><em>K\u00e4esolevates m\u00e4rkustes soovitan ametliku arutelu l\u00f5petada.<\/em><\/p>\n<p><\/p>\n<p>Video (sisestatud meediaelemendina, kuid mikski ei t\u00f6\u00f6ta):<\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/zZ3qXVN3Oic\">https:\/\/youtu.be\/zZ3qXVN3Oic<\/a><\/noindex><br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/518406\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0431\u0441\u0443\u0434\u0438\u043c \u043f\u043e\u0447\u0435\u043c\u0443 CI-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 CI \u2013 \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e \u0440\u0430\u0437\u043d\u043e\u0435. \u041a\u0430\u043a\u0443\u044e \u0431\u043e\u043b\u044c CI \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0447\u0442\u043e \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Jenkins. \u041c\u044b\u0441\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e Continuous Integration \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0435\u0449\u0435 \u0433\u043e\u0434 \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u044f \u0445\u043e\u0434\u0438\u043b \u043f\u043e \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u0441\u043a\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443. \u041f\u043e\u043e\u0431\u0449\u0430\u043b\u0441\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":93886,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-93885","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041e\u0431\u0441\u0443\u0434\u0438\u043c \u043f\u043e\u0447\u0435\u043c\u0443 CI-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 CI \u2013 \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e \u0440\u0430\u0437\u043d\u043e\u0435. \u041a\u0430\u043a\u0443\u044e \u0431\u043e\u043b\u044c CI \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0447\u0442\u043e \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Jenkins. \u041c\u044b\u0441\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e Continuous Integration \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0435\u0449\u0435 \u0433\u043e\u0434 \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u044f \u0445\u043e\u0434\u0438\u043b \u043f\u043e \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u0441\u043a\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443. \u041f\u043e\u043e\u0431\u0449\u0430\u043b\u0441\u044f\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Continuous Integration \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 Jenkins. \u0410\u043d\u0434\u0440\u0435\u0439 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041e\u0431\u0441\u0443\u0434\u0438\u043c \u043f\u043e\u0447\u0435\u043c\u0443 CI-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 CI \u2013 \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e \u0440\u0430\u0437\u043d\u043e\u0435. \u041a\u0430\u043a\u0443\u044e \u0431\u043e\u043b\u044c CI \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0447\u0442\u043e \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Jenkins. \u041c\u044b\u0441\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e Continuous Integration \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0435\u0449\u0435 \u0433\u043e\u0434 \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u044f \u0445\u043e\u0434\u0438\u043b \u043f\u043e \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u0441\u043a\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443. \u041f\u043e\u043e\u0431\u0449\u0430\u043b\u0441\u044f\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-09-10T17:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-10T17:42:23+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Continuous Integration kui praktika, mitte Jenkins. Andrei Aleksandrov | ProHoster","description":"Arutame, miks CI-t\u00f6\u00f6riistad ja CI on t\u00e4iesti erinevad m\u00f5isted. Millist probleemi CI lahendab, kust tuli idee, millised on viimased t\u00f5endid selle toimimise kohta, kuidas m\u00f5ista, et teil on t\u00f5eliselt praktika, mitte lihtsalt paigaldatud Jenkins. M\u00f5te teha ettekannet Continuous Integration\u2019i teemal tekkis juba aasta tagasi, kui olin t\u00f6\u00f6otsingutel. Suhtlesin","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Continuous Integration \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 Jenkins. \u0410\u043d\u0434\u0440\u0435\u0439 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432 | ProHoster","og:description":"\u041e\u0431\u0441\u0443\u0434\u0438\u043c \u043f\u043e\u0447\u0435\u043c\u0443 CI-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 CI \u2013 \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e \u0440\u0430\u0437\u043d\u043e\u0435. \u041a\u0430\u043a\u0443\u044e \u0431\u043e\u043b\u044c CI \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0447\u0442\u043e \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Jenkins. \u041c\u044b\u0441\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e Continuous Integration \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0435\u0449\u0435 \u0433\u043e\u0434 \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u044f \u0445\u043e\u0434\u0438\u043b \u043f\u043e \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u0441\u043a\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443. \u041f\u043e\u043e\u0431\u0449\u0430\u043b\u0441\u044f","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-09-10T17:42:23+00:00","article:modified_time":"2020-09-10T17:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"93885","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:37:31","updated":"2022-09-27 15:57:30"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/93885","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=93885"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/93885\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/93886"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=93885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=93885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=93885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}