{"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>R\u00e4\u00e4gime, miks CI-t\u00f6\u00f6riistad ja CI on t\u00e4iesti erinevad asjad.<\/p>\n<p><\/p>\n<p>Millist valu CI peaks lahendama, kust idee alguse sai, millised on viimased t\u00f5endid, et see toimib, ja kuidas m\u00f5ista, et teil on olemas praktika, mitte lihtsalt paigaldatud Jenkins.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>M\u00f5te pidada ettekannet Continuous Integrationist tekkis juba aastat tagasi, kui k\u00e4isin t\u00f6\u00f6intervjuudel. Suhtlesin 10-15 ettev\u00f5ttega, neist vaid \u00fcks suutis arusaadavalt vastata, mis on CI ja kuidas nad m\u00f5istsid, et neil seda ei ole. \u00dclej\u00e4\u00e4nud r\u00e4\u00e4kisid arusaamatut juttu Jenkinsist \ud83d\ude42. Noh, meil on Jenkins, see teeb kogumisi, CI! Ettekanne p\u00fc\u00fcab selgitada, mis on tegelikult Continuous Integration ja miks Jenkins ja sarnased t\u00f6\u00f6riistad on selle suhtes v\u00e4ga n\u00f5rgalt seotud.<\/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>Nii et, mis tavaliselt tuleb meelde s\u00f5na CI kuuldes? Enamiku inimeste jaoks tulevad p\u00e4he 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 me otsime seda internetist, siis pakub see meile neid t\u00f6\u00f6riistu.<\/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 tuttavatelt, siis kohe p\u00e4rast t\u00f6\u00f6riistade loetlemist r\u00e4\u00e4gitakse, et CI on siis, kui teie Pull Request'is toimub kogumine 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 seotud t\u00f6\u00f6riistadega, ei ole seotud kogumiste ja testide tegemisega haru sees! Continuous Integration on praktika, mis h\u00f5lmab uue koodi v\u00e4ga sagedast integreerimist, ning selle rakendamiseks ei ole sugugi vajalik Jenkinsite, GitLabi jms ehitamine.<\/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 vaatame, milline n\u00e4eb v\u00e4lja t\u00e4iemahuline CI, s\u00fcveneme k\u00f5igepealt inimestesse, kes selle v\u00e4lja m\u00f5tlesid, ja tunnetame seda valu, millega nad p\u00fc\u00fcdsid toime tulla.<\/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 lahendasid meeskonnat\u00f6\u00f6 valu!<\/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, milliste raskustega arendajad meeskonnat\u00f6\u00f6s silmitsi seisavad. Oletame, et meil on projekt, git'te master-haru 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>Ja nad l\u00e4ksid t\u00f6\u00f6le, nagu on kaua harjutud. V\u00f5tsid \u00fclesande JIRA's, l\u00f5id feature haru, 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 l\u00f5petas funktsiooni kiiremini ja liitis selle masterisse.<\/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 vajalikke \u00e4rifunktsioone, 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 p\u00f5higa, seda rohkem aega me selleks kulutame. Ja see on veel piisavalt lihtne n\u00e4ide, mida ma n\u00e4itasin. See on n\u00e4ide, kus arendajaid on vaid 2. Kujutage ette, kui 10 v\u00f5i 15 v\u00f5i 100 inimest ettev\u00f5ttes kirjutavad \u00fchte hoidlat. Te hakkate \u00e4ra p\u00f6\u00f6rama, kui k\u00f5iki neid konflikte 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\/16c6b8b51ae462f1e0acb966a93c0ae5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>On veidi teine olukord. Meil on master 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 \u00fchendas, k\u00f5ik on h\u00e4sti, \u00fclesanne on valmis.<\/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 valmis. Oletame, et ta esitas selle \u00fclevaatamiseks. Paljudes ettev\u00f5tetes on praktika \u2013 \u00fclevaatus. \u00dchest k\u00fcljest on see praktika \u2013 hea ja kasulik, teisest k\u00fcljest t\u00f5kestab see meid tihti. \u00c4rgem laskugem sellesse s\u00fcgavale, aga siin on suurep\u00e4rane n\u00e4ide, kuidas vale \u00fclevaatuse praktika v\u00f5ib p\u00f5hjustada probleeme. Te esitasite pull request'i \u00fclevaatamiseks. Arendajal pole enam midagi teha. Mida ta hakkab tegema? Ta hakkab v\u00f5tma teisi \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>Selle aja jooksul 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 p\u00e4rast m\u00f5nda aega, kui tema \u00fclevaatus on l\u00e4bi viidud, \u00fcritab ta uuesti liituda. Ja mis juhtub? Ta satub tohututesse konfliktidesse. Miks? Sest seni, kuni tema pull request oli \u00fclevaatamiseks, muutus koodis palju. <\/p>\n<p><\/p>\n<p>Peale konfliktide on veel teema suhtluses. Seni, kuni teie haru on \u00fclevaatamiseks, seni, kuni see ootab, ja seni, kuni te viibite funktsiooni arendamisega, l\u00f5petate te j\u00e4lgimise, mis veel teie teenuse koodibaasis muutub. V\u00f5ib-olla on see, mida te praegu \u00fcritate lahendada, juba eile lahendatud ja mingit meetodit saab taaskasutada. Aga te ei n\u00e4e seda, sest t\u00f6\u00f6tate alati vananenud haruga. Ja see vananenud haru toob alati kaasa selle, et peate lahendama \u00fchildamisprobleemi. <\/p>\n<p><\/p>\n<p>Kuna me t\u00f6\u00f6tame meeskonnana, st mitte \u00fcks inimene ei toimi hoidlas, vaid inimesi on 5-10, siis mida kauem me oma koodi masterisse ei lisa, seda rohkem me kannatame selle t\u00f5ttu, et l\u00f5puks on vaja midagi \u00fchendama hakata. Ja mida rohkem meil on konflikte ja mida vanema versiooniga me t\u00f6\u00f6tame, seda rohkem on meil probleeme.<\/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 midagi teha \u2013 see 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>Selle probleemile p\u00f6\u00f6rati t\u00e4helepanu \u00fcle 20 aasta tagasi. Esimese mainimise praktika Continuous Integration kohta leidsin \u00e4\u00e4rmuslikust programmeerimisest.<\/p>\n<p><\/p>\n<p>\u00c4\u00e4rmuslik programmeerimine on esimene agile raamistiku element. Lehek\u00fclg ilmus 1996. aastal. Idee oli kasutada teatud programmeerimis- ja planeerimistavasid ning muid aspekte, et arendus oleks v\u00f5imalikult paindlik, et saaksime kiiremini reageerida muutustele ja klientide n\u00f5udmistele. 24 aastat tagasi alustasid nad sellega, et kui sa teed midagi v\u00e4ga kaua ja eraldi, kulutad selle asemel rohkem aega, sest 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>N\u00fc\u00fcd uurime fraasi \u201eContinuous Integration\u201d eraldi s\u00f5nadena. Kui t\u00f5lkida otse, saame pidev integreerimine. Kuid kui pidev see tegelikult on, ei ole v\u00e4ga selge; see on \u00fcsna katkestatud. Samuti ei ole selge, kui palju see on integreerimine. <\/p>\n<p><\/p>\n<p>Ja seet\u00f5ttu toongi teieni n\u00fc\u00fcd tsitaate \u00e4\u00e4rmuslikust programmeerimisest. Kaks s\u00f5na anal\u00fc\u00fcsime eraldi. <\/p>\n<p><\/p>\n<p>Integreerimine \u2014 Nagu juba mainisin, p\u00fc\u00fcame, et iga insener t\u00f6\u00f6taks k\u00f5ige j\u00f5udsamate koodiversioonidega, et ta p\u00fc\u00fcaks oma koodi sageli lisada peavoolu, et need oleksid v\u00e4iksed harud. Sest kui need on suured, v\u00f5ime lihtsalt n\u00e4dalaks merge-konfliktidega kinni j\u00e4\u00e4da. Eriti kui meil on pikk arendusts\u00fckkel, nagu waterfall, kus arendaja l\u00e4heb kuuks ajaks tegema m\u00f5nda suurt omadust. Ja integreerimise etapis j\u00e4\u00e4b ta t\u00f5eliselt pikaks ajaks kinni. <\/p>\n<p><\/p>\n<p>Integreerimine t\u00e4hendab, et v\u00f5tame oma haru ja integreerime selle peavooluga, me teeme selle merge. On ka \u00e4\u00e4rmuslik variant, kus me transbase developer, kus me p\u00fc\u00fcame kirjutada otse peavoolu, ilma igasuguste lisaharudeta.<\/p>\n<p><\/p>\n<p>\u00dcldiselt on integreerimine v\u00f5tta oma kood ja tuua see peavoolu. <\/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\u00f5istetakse s\u00f5na \u201econtinuous\u201d all, mis on pidevuse m\u00f5iste? Praktika t\u00e4hendab, et arendaja p\u00fc\u00fcab oma koodi integreerida v\u00f5imalikult kiiresti. See on tema eesm\u00e4rk igas \u00fclesandes \u2013 muuta nii, et tema kood ilmuks masterisse v\u00f5imalikult kiiresti. Ideaalne maailm oleks see, kus arendajad teevad seda iga paari tunni tagant. T. e. v\u00f5tad v\u00e4ikese \u00fclesande, mergid selle masterisse. K\u00f5ik on suurep\u00e4rane. Sa p\u00fc\u00fcad seda saavutada. Ja seda tuleb teha pidevalt. Niipea kui oled midagi teinud, surud kohe selle masterisse. <\/p>\n<p><\/p>\n<p>Ja arendaja, kes midagi teeb, on vastutav selle eest, et see toimiks ja midagi ei katki l\u00e4heks. Siin ilmub tavaliselt v\u00e4lja lugu katsetest. Me tahame k\u00e4ivitada m\u00f5ningaid teste meie commit\u2019i, meie merge\u2019i kohta, et veenduda, et see t\u00f6\u00f6tab. Siin v\u00f5ivad aidata teid Jenkins.<\/p>\n<p><\/p>\n<p>Aga lugudega: las muudatused on v\u00e4ikesed, las \u00fclesanded on v\u00e4ikesed, las teeme \u00fclesande ja proovime kohe selle masterisse mergida \u2013 siin ei aita teid Jenkins. Sest Jenkins aitab teid ainult testide k\u00e4ivitamisel. <\/p>\n<p><\/p>\n<p>Sa saad hakkama ka ilma nendeta. See ei sega sind absoluutselt. Sest praktika eesm\u00e4rk on mergeerida v\u00f5imalikult tihti, et tulevikus ei peaks kulutama tohutult aega konfliktide lahendamisele. <\/p>\n<p><\/p>\n<p>Kujutage ette, et meil on 2020. aasta ja mingil p\u00f5hjusel pole internetti. Me t\u00f6\u00f6tame kohapeal. Meil ei ole Jenkinsit. See on normaalne. Sa saad ikka v\u00f5tta ja luua kohalik haru. Sa oled sinna kirjutanud mingi koodi. Tegid \u00fclesande 3-4 tunni jooksul. L\u00fclitusid masterisse, tegid git pulli, mergisid oma haru sinna. Valmis. Kui teed seda sageli \u2013 \u00f5nnitleme, sul on Continuous Integration!<\/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\u00e4eval t\u00f5endid selle kohta, et sellele tasub j\u00f5udu rakendada? Sest \u00fcldiselt on see keeruline. Kui sa proovid nii t\u00f6\u00f6tada, m\u00f5istad, et sul on n\u00fc\u00fcd vaja mingit planeerimist, pead rohkem aega kulutama \u00fclesannete dekompositsioonile. Sest kui sa teed man\u2026, ei saa sa kiiresti mergeerida ja seet\u00f5ttu satud raskusesse. Praktikat sul enam pole. <\/p>\n<p><\/p>\n<p>Ja see tuleb kallis. T\u00f6\u00f6 Continuous Integration'iga alates j\u00e4rgmise p\u00e4evast ei \u00f5nnestu. Te peate k\u00f5ik v\u00e4ga kaua harjuma, te harjute v\u00e4ga kaua \u00fclesandeid dekomponeerima, harjute v\u00e4ga kaua oma \u00fclevaatamise praktikat, kui see teil on, muutma. Sest meie eesm\u00e4rk on, et see sulanduks t\u00e4na. Ja kui te teete \u00fclevaadet kolme p\u00e4eva jooksul, siis on teil probleem ja Continuous Integration ei \u00f5nnestu teil. <\/p>\n<p><\/p>\n<p>Aga kas meil on m\u00f5ni praegu oled t\u00f5end, mis \u00fctleb meile, et sellesse praktikas 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 \u2013 on State of DevOps. See on uuring, mida poisid teevad juba 7 aastat. N\u00fc\u00fcd nad teevad seda s\u00f5ltumatuna organisatsioonina, aga Google'i all.<\/p>\n<p><\/p>\n<p>Ja nende uuring 2018. aastal n\u00e4itas seost ettev\u00f5tete vahel, kes \u00fcritavad kasutada l\u00fchiajalisi haru, mis integreeruvad kiiresti ja tihti, nende IT j\u00f5udlusn\u00e4itajad on oluliselt paremad.<\/p>\n<p><\/p>\n<p>Mis need n\u00e4itajad on? Need on 4 m\u00f5\u00f5dikut, mida nad saavad k\u00f5ikidelt ettev\u00f5tetelt oma k\u00fcsitluste kaudu: deployment frequency, lead time for changes, time to restore service, change failure rate.<\/p>\n<p><\/p>\n<p>Esiteks, on see seos olemas, me teame, et ettev\u00f5tetel, kes sulanduvad tihti, on need m\u00f5\u00f5dikud palju paremad. Ja neil on ettev\u00f5tete jagamine mitmesse kategooriasse: aeglased ettev\u00f5tted, kes toodavad midagi aeglaselt, keskmine tegija, hea tegija ja eliit. Eliit on Netflix, Amazon, kes on uskumatult kiire, 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 kuu aega tagasi. Technology Radar'is ilmus suurep\u00e4rane m\u00e4rkus Gitflow'ist. Gitflow erineb k\u00f5ikidest teistest seet\u00f5ttu, et selle harud elavad kaua. On avaldamis harud, mis elavad kaua, ja funktsiooniharu, mis ka elavad kaua. See praktika on Technology Radar'is liikunud HOLD-i. Miks? Sest inimesed puutuvad kokku integratsioonivaluga. <\/p>\n<p><\/p>\n<p>Kui sul haru elab v\u00e4ga kaua, siis see h\u00e4ilib, l\u00e4heb vanaks ja me hakkame kulutama rohkem aega, et sellesse mingit muudatust teha. <\/p>\n<p><\/p>\n<p>Ja hiljuti \u00fctles Gitflow autor, et kui p\u00fc\u00fcdlete pideva integreerimise poole ja soovite v\u00f5imalikult sageli edasi liikuda, on Gitflow halb m\u00f5te. Ta t\u00e4iendavalt m\u00e4rkis artiklis, et kui teil on tagaplaan, kus saate sellele suunata, siis on Gitflow teile liialt koormav, kuna see aeglustab teid ja tekitab integreerimise probleeme. <\/p>\n<p><\/p>\n<p>See ei t\u00e4henda, et Gitflow oleks halb ega sobiks kasutamiseks. See on m\u00f5eldud teiste olukordade jaoks. N\u00e4iteks siis, kui peate toetama mitmeid teenuse v\u00f5i rakenduse versioone, st olukordades, kus peate seda pikema aja jooksul toetama. <\/p>\n<p><\/p>\n<p>Kuid kui suhtlete inimestega, kes selliseid teenuseid toetavad, kuulete palju kaebusi selle kohta, et versioon 3.2 oli neli kuud tagasi ja seal ei olnud selle parandust, ja n\u00fc\u00fcd, et see parandada, on vajalik teha hulk muudatusi. Ja nad on taas ummikus, veetes n\u00e4dala selle kallal, et v\u00f5tta ja liita mingi uus funktsioon. <\/p>\n<p><\/p>\n<p>Kuidas m\u00e4rkis Alexander Kovalev \u00f5igesti vestluses, ei t\u00e4henda korrelatsioon p\u00f5hjust ja tagaj\u00e4rge. See on t\u00f5si. Siis ei ole mingit otsest seost, et kui teil on pidev integreerimine, siis on k\u00f5ik m\u00f5\u00f5dikud suurep\u00e4rased. Kuid on positiivne korrelatsioon, et kui \u00fcks, siis on t\u00f5en\u00e4oliselt ka teine. See ei ole fakt, aga t\u00f5en\u00e4oliselt. See on lihtsalt 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 juba teeme midagi, n\u00e4iliselt liitume, kuid kuidas m\u00f5ista, et meil on ikkagi pidev integreerimine, et me liitume piisavalt sageli?<\/p>\n<p><\/p>\n<p>Jez Humble on raamatu 'Accelerate', Continuous Delivery veebisaidi ja raamatu 'Pidev tarnimine' autor. Ta pakub sellist testi:<\/p>\n<p><\/p>\n<ul>\n<li>Inseneri kood j\u00f5uab meistrisse igap\u00e4evaselt. <\/li>\n<li>Iga commit'i korral k\u00e4ivitate unit-testid.<\/li>\n<li>Meistri ehitus purunes, see parandati umbes 10 minuti jooksul.<\/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>Viimase punkti osas olen ma veidi kahtlev. Ehk kui teil \u00f5nnestub probleem 10 minuti jooksul lahendada, siis t\u00e4hendab see, et teil on pidev integratsioon, see k\u00f5lab minu arust veidi kahtlaselt, kuid sellel on oma m\u00f5te. Miks? Sest kui te teete tihti liitumisi, siis t\u00e4hendab see, et teie muudatused on v\u00e4ikesed. Kui teie v\u00e4ike muudatus p\u00f5hjustas p\u00f5hiharu purunemise, saate kiiresti probleemi tuvastada, sest muudatus on tilluke. Teil oli v\u00e4ike liitumine, mis muutis 20-30 rida. Seega saate kiiresti aru, mis oli p\u00f5hjuseks, sest muudatused on pisikesed ja teil on probleemide otsimiseks v\u00e4ga v\u00e4ike valdkond. <\/p>\n<p><\/p>\n<p>Ja isegi kui meil p\u00e4rast v\u00e4ljalaskmist tootmine kokku kukub, teeb pideva integreerimise praktika meie t\u00f6\u00f6 palju lihtsamaks, sest muudatused on v\u00e4ikesed. Jah, see m\u00f5jutab planeerimist. See on valus. Ja ilmselt on selle praktika k\u00f5ige raskem osa harjuda \u00fclesandeid jagama, s.t. kuidas v\u00f5tta midagi ja teha see m\u00f5ne tunni jooksul, samal ajal kui l\u00e4bite \u00fclevaatuse, kui see teil on. \u00dclevaatus on eraldi valu. <\/p>\n<p><\/p>\n<p>\u00dcksuse testid on lihtsalt abivahend, mis aitab teil m\u00f5ista, kas teie integreerimine \u00f5nnestus ja kas midagi l\u00e4ks katki. Minu arvates ei ole see ka kokkuv\u00f5ttes kohustuslik punkt, sest praktika sisu ei seisne selles. <\/p>\n<p><\/p>\n<p>See on l\u00fchidalt pidevast integreerimisest. See on k\u00f5ik, mis selle praktika kohta on. Olen valmis k\u00fcsimustele vastama. <\/p>\n<p><\/p>\n<p>Kokkuv\u00f5tteks veel kord \u00fctlen:<\/p>\n<p><\/p>\n<ul>\n<li>Pidev integreerimine ei ole Jenkins, see ei ole Gitlab.<\/li>\n<li>See ei ole t\u00f6\u00f6riist, see on praktika, mille kohaselt me liidame oma koodi peaharusse v\u00f5imalikult tihti. <\/li>\n<li>Teeme seda selleks, et v\u00e4ltida tohutut valu, mis tekib tulevaste liitumistega, s.t. tunneme n\u00fc\u00fcd v\u00e4ikest valu, et mitte tunda suurt valu tulevikus. See on kogu m\u00f5te. <\/li>\n<li>Koodi kaudu kulgeb suhtlus, kuid ma n\u00e4en seda v\u00e4ga harva, kuigi selleks see ka m\u00f5eldud on.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>K\u00fcsimused<\/strong><\/p>\n<p><\/p>\n<p><em>Mida teha lahti dekompositsiooniga \u00fclesannetega?<\/em><\/p>\n<p><\/p>\n<p>Dekomposeerida. Mis probleem? Kas saate tuua n\u00e4ite, et on \u00fclesanne, mida ei saa dekomponeerida?<\/p>\n<p><\/p>\n<p><em>On olemas \u00fclesandeid, mida ei saa \u00fcldse dekomponeerida, n\u00e4iteks need, mis n\u00f5uavad v\u00e4ga s\u00fcgavat ekspertiisi ja mis v\u00f5ivad tegelikult kesta kuu aega, enne kui mingit arvestatavat tulemust saavutatakse.<\/em> <\/p>\n<p><\/p>\n<p>Kui ma sind \u00f5igesti m\u00f5istan, siis on olemas mingi suur ja keeruline \u00fclesanne, mille tulemust on v\u00f5imalik n\u00e4ha alles kuu p\u00e4rast?<\/p>\n<p><\/p>\n<p><em>Jah, k\u00f5ik on \u00f5ige. Jah, tulemust saab hinnata mitte varem kui kuu p\u00e4rast.<\/em> <\/p>\n<p><\/p>\n<p>Hea. \u00dcldiselt pole see probleem. Miks? Sest antud juhul, kui me r\u00e4\u00e4gime harudest, siis me ei r\u00e4\u00e4gi harust, millel on funktsioon. Funktsioonid v\u00f5ivad olla suured ja keerulised. Need v\u00f5ivad m\u00f5jutada suurt hulka komponente. Ja v\u00f5ib-olla ei suuda me neid t\u00e4ielikult \u00fchte haru panna. See on normaalne. Me peame lihtsalt seda lugu jagama. Kui funktsioon ei ole l\u00f5puni valmis, siis see ei t\u00e4henda, et m\u00f5ned selle koodi t\u00fckid ei saa \u00fchineda. Sa lisasid, \u00fctleme, migratsiooni ja funktsiooni sees on m\u00f5ned etapid. Sul on, \u00fctleme, etapp \u2013 teha migratsioon, lisada uus meetod. Ja neid asju saad juba igap\u00e4evaselt \u00fchendada. <\/p>\n<p><\/p>\n<p><em>Hea. Mis siis on selle m\u00f5te?<\/em><\/p>\n<p><\/p>\n<p>Mis m\u00f5te on igap\u00e4evaselt v\u00e4ikeste asjade \u00fchinemises?<\/p>\n<p><\/p>\n<p><em>Jah.<\/em><\/p>\n<p><\/p>\n<p>Kui need on sulle midagi katki teinud, n\u00e4ed sa seda kohe. Sul on v\u00e4ike t\u00fckk, mis midagi katki tegi, ja sul on lihtsam see parandada. M\u00f5te on see, et praegu on v\u00e4ikese t\u00fcki \u00fchendamine palju lihtsam kui midagi suurt \u00fchendamine paar n\u00e4dalat hiljem. Ja kolmas m\u00f5te on see, et teised insenerid t\u00f6\u00f6tavad juba aktuaalse koodiversiooniga. Nad n\u00e4evad, et siin on m\u00f5ned migratsioonid lisandunud, ja siin on ilmunud m\u00f5ni meetod, mida nad v\u00f5ib-olla ka soovivad kasutada. K\u00f5ik n\u00e4evad, mis sinu koodis toimub. Just nende kolme asja nimel praktika toimumiski. <\/p>\n<p><\/p>\n<p><em>Ait\u00e4h, k\u00fcsimus on selge!<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg Soroka) Kas ma v\u00f5in lisada? Sa \u00fctlesid k\u00f5ik \u00f5igesti, tahan ainult \u00fchte lauset lisada.<\/em><\/p>\n<p><\/p>\n<p>Nii.<\/p>\n<p><\/p>\n<p><em>Continuous Integration'i puhul liidetakse kood \u00fchisesse harusse mitte siis, kui funktsioon on t\u00e4ielikult valmis, vaid siis, kui ehitus on katkenud. Ja v\u00f5ite julgelt p\u00fchenduda masterisse nii palju kordi kui soovite p\u00e4evas. Teine aspekt \u2013 kui te ei saa mingil p\u00f5hjusel kuupikkust \u00fclesannet jagada v\u00e4hemalt kolmeks p\u00e4evaks, ma r\u00e4\u00e4gin kolmest tunnist, siis on teil suur probleem. Ja see, et teil pole Continuous Integrationi \u2013 on selle probleemide seas v\u00e4ikseim. See t\u00e4hendab, et teil on probleemid arhitektuuriga ja inseneripraktika on null. Sest isegi kui tegemist on uurimist\u00f6\u00f6ga, tuleb see igal juhul vormistada h\u00fcpoteeside v\u00f5i ts\u00fcklina.<\/em> <\/p>\n<p><\/p>\n<p><em>Me r\u00e4\u00e4kisime neljast m\u00f5\u00f5tmetest, mis eristavad edukaid ettev\u00f5tteid tagapoolsetest. Enne nende nelja m\u00f5\u00f5tme saavutamist tuleb veel k\u00f5vasti vaeva n\u00e4ha. Kui keskmise \u00fclesande t\u00e4itmine v\u00f5tab aega kuu, siis soovitaksin k\u00f5igepealt sellele m\u00f5\u00f5tmele keskenduda. Asetaksin selle esimese kolme p\u00e4eva piiridesse. Ja alles seej\u00e4rel alustada pideva arendamise m\u00f5tetega.<\/em><\/p>\n<p><\/p>\n<p>Kas ma sain \u00f5igesti aru, et arvad, et investeerida inseneripraktikatesse pole m\u00f5tet, kui sul iga \u00fclesanne v\u00f5tab kuu aega?<\/p>\n<p><\/p>\n<p><em>Sul on pidev integreerimine. Seal on selline asi, et sa kas parandad vea 10 minutiga v\u00f5i rullid tagasi. Kujutle, et sa oled selle v\u00e4lja lasknud. Samuti on sul isegi pidev juurutamine, sa oled selle tootmisse saatnud ja alles siis m\u00e4rkad, et midagi l\u00e4ks valesti. Ja n\u00fc\u00fcd pead selle tagasi rullima, kuid sul on juba toimunud andmebaasi migratsioon. Sinu andmebaasi skeem on juba j\u00e4rgmise versiooni peal, lisaks on toimunud ka mingi varundamine ning sinna on juba andmeid salvestatud.<\/em><\/p>\n<p><\/p>\n<p><em>Mis alternatiiv sul on? Kui sul on kood tagasi rullitud, siis see ei saa enam uuendatud andmebaasiga t\u00f6\u00f6tada.<\/em><\/p>\n<p><\/p>\n<p>Andmebaas liigub ainult edasi, jah. <\/p>\n<p><\/p>\n<p><em>Inimestel, kellel on halvad inseneripraktikad, on t\u00f5en\u00e4oliselt ka paks raamat selle kohta \u2026 pole lugenud. Mida teha varundusega? Kui sa taastud varundusest, siis kaotad andmed, mis selle aja jooksul on kogunenud. N\u00e4iteks t\u00f6\u00f6tasid kolme tunni jooksul uue andmebaasi versiooniga, kus kasutajad registreerusid. Sa taastad vana varunduse, sest uue versiooniga skeem ei t\u00f6\u00f6ta, seega need kasutajad, kelle sa kaotasid, on rahulolematud ja kurdavad.<\/em><\/p>\n<p><\/p>\n<p><em>Kogu selle praktikate spektri omandamiseks, mis toetavad Continuous Integration'i ja Continuous Delivery't, ei piisa vaid programmist kirjutamisest ... Esiteks, neid v\u00f5ib olla v\u00e4ga palju, mis muutub ebapraktiiseks. Lisaks on seal palju teisi praktikaid, nagu Scientific. On selline praktika, mida GitHub kunagi populariseeris. See on siis, kui sinu vana kood ja uus kood t\u00f6\u00f6tavad samaaegselt. See on siis, kui sa teed puuduolevat funktsiooni, mis v\u00f5ib tagastada mingisuguse v\u00e4\u00e4rtuse: kas funktsioonina v\u00f5i Rest API'na. Sa t\u00e4idad nii uut kui ka vana koodi ja v\u00f5rdled nende vahelisi erinevusi. Ja kui erinevus on olemas, siis sa logid selle s\u00fcndmuse. Nii tead, et sinu uus funktsioon on valmis vanale \u00fclesse ehitamiseks, kui sul ei ole teatud aja jooksul nende kahe vahel erinevusi.<\/em> <\/p>\n<p><\/p>\n<p><em>Selliseid praktikaid on sadu. Ma soovitaksin alustada transbase arendusega. See ei ole 100 % Continuous Integrationil, kuid praktikad on samad, \u00fcks ilma teiselt elab halvasti.<\/em> <\/p>\n<p><\/p>\n<p>Kas sa t\u00f5id transbase arenduse n\u00e4itena, kust saab praktikaid vaadata, v\u00f5i soovitad sa inimestel hakata kasutama transbase arendust?<\/p>\n<p><\/p>\n<p><em>Vaadata, kuna nad ei saa seda kasutada. Selleks, et neid kasutada, tuleb palju teavet lugeda. Kui inimesel on k\u00fcsimus: \"Mida teha funktsiooniga, mis v\u00f5tab kuu aega?\", siis see t\u00e4hendab, et ta ei ole transbase arenduse kohta lugenud. Ja ma ei soovitaks veel kasutada. Ma soovitaksin keskenduda ainult sellele, kuidas \u00f5igesti arhitektuurselt suured \u00fclesanded v\u00e4iksemateks murda. Selles seisnebki dekonstruktsioon.<\/em><\/p>\n<p><\/p>\n<p><em>Dekonstruktsioon on \u00fcks arhitekti t\u00f6\u00f6riistadest. Esiteks teeme anal\u00fc\u00fcsi, siis dekonstruktsiooni, seej\u00e4rel s\u00fcnteesi ja l\u00f5puks integratsiooni. Nii koondame k\u00f5ik kokku. Ja arendusele tuleb enne j\u00f5uda l\u00e4bi dekonstruktsiooni. Esimese etapi jooksul tekivad k\u00fcsimused, aga me r\u00e4\u00e4gime juba neljandast etapist, st mida sagedamini integreerida, seda parem. Veel on liiga vara integreerida, v\u00f5iks esmalt oma monoliti pisut l\u00f5hustada.<\/em> <\/p>\n<p><\/p>\n<p><em>On some diagram, you need to draw a number of arrows and squares. You can't just say, 'Now I'll show the architectural diagram of the new application and show one square with a green button for the application.' In any case, there will be more squares and arrows. On any diagram I've seen, there were more than one. And decomposition is already done at the level of graphical representation. Therefore, the squares can be independent. If not, then I have big questions for the architect.<\/em> <\/p>\n<p><\/p>\n<p>There is a question from the chat: 'If the review is mandatory and takes a long time, over a day?'<\/p>\n<p><\/p>\n<p>You have issues with practice. The review shouldn't take more than a day. This is the same story as the previous question, just a bit softer. If the review takes a day, it probably concerns some very large change. It needs to be smaller. In the transbase development that Oleg recommended, there's a concept called continuous review. The idea is that we make pull requests intentionally small because we aim to merge continuously and in small increments. Therefore, a pull request changes one abstraction or 10 lines. This way, our reviews take a couple of minutes. <\/p>\n<p><\/p>\n<p>If a review takes a day or more, then something is wrong. Firstly, you may have some issues with architecture. Either it's a large chunk of code, say, 1,000 lines, or your architecture is so complex that a person cannot understand it. This is a side issue, but it also needs to be addressed. Perhaps, there is no need for a review at all. This is also something to consider. Reviews are the thing that slows you down. They have their benefits overall, but you need to understand why you are doing this. Is it a way for you to quickly pass on information? Is it for you to set certain standards internally, or what? Why do you need this? Because a review needs to be either very quick or completely canceled. This is like transbase development\u2014it\u2019s a very beautiful concept, but only for mature teams. <\/p>\n<p><\/p>\n<p>Regarding the 4 metrics, I would recommend measuring them to understand what they lead to. Look at the numbers, see the picture, how bad it all is. <\/p>\n<p><\/p>\n<p><em>(Dmitri) Olen valmis arutama seda sinuga. Numbrid ja m\u00f5\u00f5dikud on k\u00f5ik suurep\u00e4rased, praktika on samuti suurep\u00e4rane. Kuid tuleb aru saada, kas see on \u00e4ri jaoks vajalik. On ettev\u00f5tteid, kellele ei ole vajalik selline muutuste kiirus. Ma tean ettev\u00f5tteid, kus muudatusi ei saa teha iga 15 minuti tagant. Ja mitte sellep\u00e4rast, et nad oleksid halvad. See on eluts\u00fckkel. Ja et teostada funktsiooni branches, funktsiooni toggle, on vajalikud s\u00fcgavad teadmised.<\/em> <\/p>\n<p><\/p>\n<p>See on keeruline. Kui soovite lugeda l\u00e4hemalt funktsioonist toggle, siis soovitan v\u00e4ga. <noindex><a rel=\"nofollow\" href=\"https:\/\/trunkbaseddevelopment.com\/\">https:\/\/trunkbaseddevelopment.com\/<\/a><\/noindex>. Ja Martin Fowleril on suurep\u00e4rane artikkel funktsioonidest toggle: milliseid t\u00fc\u00fcpe, eluts\u00fckleid jne on olemas. Funktsioon toggle 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 \u00fchelgi juhul vajalik. Kui t\u00f5siselt r\u00e4\u00e4kida, siis t\u00f6\u00f6riistad: Jenkins, Gitlab toovad teile mugavust. Te n\u00e4ete, kas kogumine \u00f5nnestus v\u00f5i mitte. Need v\u00f5ivad teid aidata, kuid nad ei tule teiega praktikat. Nad v\u00f5ivad anda teile lihtsalt ringi \u2013 Ok, ei Ok. Ja seda juhul, kui te kirjutate veel teste, sest kui teste ei ole, siis on see peaaegu m\u00f5ttetu. Seet\u00f5ttu on see vajalik, kuna see on mugavam, kuid \u00fcldiselt on v\u00f5imalik ka ilma selleta elada, kaotate mitte palju. <\/p>\n<p><\/p>\n<p><em>St. kui teil on praktika, siis ei ole see teile vajalik?<\/em><\/p>\n<p><\/p>\n<p>T\u00e4pselt. Soovitan Jez Humble'i testi. Seal mul on viimase punkti suhtes kahetised tunded. Kuid \u00fcldiselt, kui teil on kolm asja, te liidate pidevalt, k\u00e4itate teste commitide peal masteris, kiiresti parandate buildi masteris, siis v\u00f5ib-olla ei ole teil rohkem midagi vaja. <\/p>\n<p><\/p>\n<p><em>Kuna me ootame osalejatelt k\u00fcsimusi, on mul k\u00fcsimus. Me r\u00e4\u00e4kisime praegu toote koodist. Kas oled kasutanud seda infrastruktuuri koodi jaoks. Kas see on sama kood, sellel on samad printsiibid ja sama eluts\u00fckkel, v\u00f5i on seal teised eluts\u00fcklid ja printsiibid? Tavaliselt, kui k\u00f5ik r\u00e4\u00e4givad pidevast integreerimisest ja arendamisest, unustatakse, et on ka infrastruktuuri kood. Ja viimasel ajal on seda \u00fcha rohkem ja rohkem. Kas peaksime seal rakendama neid reegleid?<\/em><\/p>\n<p><\/p>\n<p>Isegi mitte, et peaks, vaid see oleks suurep\u00e4rane, kuna see lihtsustab elu. Kuni me t\u00f6\u00f6tame koodiga, mitte bash-skriptidega, ja meil on korralik kood.<\/p>\n<p><\/p>\n<p><em>Peatus-peatuse, bash-skript \u2013 see on samuti kood. \u00c4ra puutu minu vana armastust.<\/em> <\/p>\n<p><\/p>\n<p>Hea, ma ei hakka sinu m\u00e4lestusi tallama. Mul on bashi vastu isiklik vastumeelsus. See laguneb rumalalt ja hirmu\u00e4ratavalt kogu aeg. Ja see laguneb sageli ettearvamatult, seega ei meeldi see mulle. Aga oletame, et sul on bashis kood. V\u00f5ib-olla ma t\u00f5esti ei tea ja seal on normaalsed testimisraamistike. Ma lihtsalt ei ole kursis. Ja me saame samu plusse.<\/p>\n<p><\/p>\n<p>Niipea kui me t\u00f6\u00f6tame infrastruktuuriga nagu koodiga, saame k\u00f5ik samad probleemid nagu arendajad. M\u00f5ni kuu tagasi sattusin olukorda, kus kolleeg saatis mulle 1 000 rida bashi pull requesti. Ja sa j\u00e4\u00e4d 4 tunniks seda \u00fcle vaatama. Probleemid on samad. See on ikka veel kood. Ja ikka veel koost\u00f6\u00f6. Me j\u00e4\u00e4me kinni pull requesti ja j\u00e4\u00e4me kinni bashi sama merge-konfliktide lahendamisse. <\/p>\n<p><\/p>\n<p>Ma vaatan praegu v\u00e4ga aktiivselt kogu seda asja maksimaalselt ilusa infrastruktuuri programmeerimise suunas. Olen praegu infrastruktuuri t\u00f5mmanud Pulumi. See on puhtalt programmeerimine. Seal on see veelgi ilusam, sest mul on k\u00f5ik programmeerimiskeele v\u00f5imalused, st ma tegin sama IF-idega ilusaid toggle-sid ja k\u00f5ik on h\u00e4sti. Nimelt, mu muudatus on juba masteris. Seda n\u00e4evad juba k\u00f5ik. Teised insenerid on sellest kursis. See on juba millegile m\u00f5jutanud. Kuid samas ei aktiveeritud see k\u00f5igile infrastruktuuridele. See aktiveeriti n\u00e4iteks minu testkeskkondade jaoks. Seet\u00f5ttu, vastates sinu k\u00fcsimusele veel kord, see on vajalik. See muudab meie elu inseneridena, kes t\u00f6\u00f6tavad koodiga, kindlasti lihtsamaks. <\/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 sa oled \u00f5ige, et kui \u00fclesanne v\u00f5tab sul kuu aega, siis sul on arhitektuuri probleem, sul on anal\u00fc\u00fcsi, dekompositsiooni, planeerimise jne probleem. Aga mul on selline tunne, et kui sa hakkad proovima elada Continuous Integration j\u00e4rgi, siis hakkad sa planeerimisega seotud probleeme parandama, sest sa ei p\u00e4\u00e4se sellest enam kuskile. <\/p>\n<p><\/p>\n<p><em>(Oleg) Jah, k\u00f5ik on nii. Selle praktika t\u00f6\u00f6maht on v\u00f5rreldav mis tahes muu t\u00f5sise praktikaga, mis muudab kultuuri. K\u00f5ige raskem takistuste \u00fcletamine on harjumused, eriti halvad harjumused. Ja kui selle praktika rakendamiseks on vaja t\u00f5sist harjumuste muutmist \u00fcmbritsevate inimeste seas: arendajad, juhtkond, tootmisjuht, siis ootavad teid \u00fcllatused.<\/em> <\/p>\n<p><\/p>\n<p><em>Millised v\u00f5ivad olla \u00fcllatused? Oletame, et otsustasite, et hakkate sagedamini integreerima. Ja teie integreerimisele on seotud veel mingid asjad, n\u00e4iteks artefaktid. Teie ettev\u00f5ttes on n\u00e4iteks poliitika, et iga artefakt peab olema mingil moel arvesse v\u00f5etud mingis artefaktide ladustamise s\u00fcsteemis. Ja see v\u00f5tab aega. Inimene peab m\u00e4rkima, et ta, kui v\u00e4ljaandete haldur, on selle artefakti testinud valmisoleku osas tootmisse viimiseks. Kui see v\u00f5tab 5-10-15 minutit, aga samal ajal teete v\u00e4ljaandeid kord n\u00e4dalas, siis n\u00e4dalas pooltunnine ajakulu ei ole suur maksu.<\/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\u00e4ljaandete halduri t\u00f6\u00f6aega. Ta lihtsalt v\u00e4sib selle tegemisest. Mingid praktikaid on pidevad kulud. Ja k\u00f5ik.<\/em> <\/p>\n<p><\/p>\n<p><em>Ja teil on vaja kas t\u00fchistada see reegel, et te ei tegele selliste asjadega, st et te ei m\u00e4\u00e4rata k\u00e4sitsi vastavust millegi suhtes. Te toetute t\u00e4ielikult mingitele automatiseeritud valmisoleku testide komplektidele.<\/em> <\/p>\n<p><\/p>\n<p><em>Ja kui teil on kellegilt t\u00f5end, et juht allkirjastab, ja te ei liiguta tootmisse, kui Vassja ei \u00fctle, et ta lubab jne \u2013 k\u00f5ik see jama takistab praktikaid. Sest kui mingid tegevused on maksuna seotud, siis k\u00f5ik k\u00fcmneid kordi suureneb. Seega ei ole toimetuse muudatus k\u00f5igile alati r\u00f5\u00f5m. Sest inimeste harjumusi on raske muuta.<\/em> <\/p>\n<p><\/p>\n<p><em>Kui inimene teeb harjumusp\u00e4rast t\u00f6\u00f6d, teeb ta seda praktiliselt mitte m\u00f5eldes. Selle kognitiivne koormus on null. Ta teeb lihtsalt valmiste pealt, tal on peas juba kontrollnimekiri, ta on seda tuhat korda teinud. Ja kui sa tuled ja \u00fctled talle: \u201e\u00c4rme tee seda praktikat ja alates esmasp\u00e4evast rakendame uut,\u201d siis muutub see tema jaoks suureks kognitiivseks koormuseks. Ja see koormus hakkab k\u00f5igile koheselt pihta.<\/em> <\/p>\n<p><\/p>\n<p><em>Seega on k\u00f5ige lihtsam, kuigi see luksus ei ole k\u00f5igile kergesti k\u00e4ttesaadav, kuid mina teen alati just nii. Kui k\u00e4ivitatakse uus projekt, siis torkavad k\u00f5ik proovimata praktikad kohe sellesse projekti. Seni, kuni projekt on uus, ei riski me eriti millegagi. Prod pole veel saadaval, pole mida kokku varisema panna. Seet\u00f5ttu saab seda kasutada treeninguna. Selline l\u00e4henemine t\u00f6\u00f6tab. Kuid mitte k\u00f5ik ettev\u00f5tted ei saa selliseid projekte sageli alustada. Kuigi see on ka veidi kummaline, kuna praegu toimub pidev digitaalne transformatsioon, peavad k\u00f5ik katsetusi k\u00e4ivitama, et konkurentidega sammu pidada.<\/em> <\/p>\n<p><\/p>\n<p>Siin satud sa vastu sellele, et sul peaks alguses olema arusaam sellest, mida sul on vaja teha. 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>\u00c4ril pole ka alati arusaama, et nad peavad minema just sinna, kuhu peab. <\/p>\n<p><\/p>\n<p><em>On olukord, kus ei ole mingid muudatused \u00fcldse v\u00f5imalikud. See on olukord, kus meeskonnale avaldatakse suuremat survet. Meeskond on juba \u00fcsna l\u00e4bip\u00f5lenud. Neil ei ole enam mingit reservaega katsetuste jaoks. Nad t\u00f6\u00f6tavad hommikust \u00f5htuni funktsioonide kallal. Ja juhtkonnale on funktsioonidest alati v\u00e4he. N\u00f5utakse \u00fcha rohkem ja rohkem. Sellises olukorras ei ole \u00fcldse mingid muudatused v\u00f5imalikud. Meeskonnale saab vaid \u00f6elda, et homme teeme t\u00e4pselt nii nagu eile, lihtsalt tuleb teha funktsioone natuke rohkem. Mingid \u00fcleminekud mingitesse praktikatesse selles m\u00f5ttes ei ole v\u00f5imalikud. See on klassikaline olukord, kus pole aega kirvest teritada, peab puid langetama, seega langetatakse tuima kirvega. Siin lihtsaid n\u00f5uandeid ei ole.<\/em> <\/p>\n<p><\/p>\n<p><em>(Dmitri) Loen v\u00e4lja t\u00e4psustuse vestlusest: \u201eAga vajavad suurt testimise katet erinevatel tasanditel. Kui palju aega p\u00fchendatakse testimisele? See on kuidagi kallis, v\u00f5tab palju aega.\u201d<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg) See, this is a classic misconception. There should be enough tests to ensure your own confidence. Continuous Integration is not something where you first run 100% of the tests and only then start applying this practice. Continuous Integration reduces your cognitive load because each change you see is so obvious that you understand whether it will break something or not, even without tests. You can quickly test it in your mind because the changes are small. Even if you only have manual testers, it\u2019s easier for them too. You roll out a change and say: 'Look, did anything break?' They check and reply: 'No, nothing is broken.' Because the tester knows where to look. You have one commit related to one piece of code. And this exploits specific behavior.<\/em><\/p>\n<p><\/p>\n<p>Here you certainly embellished. <\/p>\n<p><\/p>\n<p><em>(Dmitry) I disagree here. There is a practice \u2014 test-driven development, which will help with this.<\/em> <\/p>\n<p><\/p>\n<p><em>(Oleg) Well, I haven't reached that yet. The first illusion is that you need to write exactly 100% of tests or you shouldn't engage in Continuous Integration at all. This is false. These are two parallel practices. And they do not directly depend on each other. Your test coverage should be optimal. Optimal means that you confidently believe that the quality of the master branch after your commit allows you to confidently click the 'Deploy' button on a Friday evening, even if you've had a few drinks. How do you achieve this? Through reviews, through coverage, through good monitoring.<\/em> <\/p>\n<p><\/p>\n<p><em>Good monitoring is indistinguishable from tests. If you run tests once on pre-prod, they check all your user scenarios only once. But if you run them in an endless loop, it becomes your deployed monitoring system that tests everything infinitely\u2014whether it has crashed or not. In this case, the difference lies only in whether it's done once or repeatedly. A very good set of tests..., run infinitely, is monitoring. And proper monitoring should be like that.<\/em> <\/p>\n<p><\/p>\n<p><em>And so how exactly you will achieve that state when you deploy on a Friday evening and go home is another question. Perhaps you are just a bold maverick.<\/em> <\/p>\n<p><\/p>\n<p>Naasime tagasi veidi Continuous Integration'i juurde. Oleme p\u00f5genenud veidi teise keerulisse praktikasse. <\/p>\n<p><\/p>\n<p><em>Ja teine illusioon on see, et MVP-d tuleb kiiresti teha, seega katsetele pole seal \u00fcldse kohta. Asi ei ole nii. Nimelt, kui kirjutate MVP-s user story, siis selle arendamine v\u00f5ib toimuda kas lihtsalt kuulmise p\u00f5hjal \u2014 kuulete, et on mingi user story ja jooksete seda kohe kodeerima \u2014 v\u00f5i TDD p\u00f5hjal. Ja TDD puhul, nagu praktika n\u00e4itab, ei kesta see kauem; testid on pigem k\u00f5rvaltoime. TDD praktika ei seisne testimises. Hoolimata sellest, et see on nimega Test Driven Development, ei ole seal tegemist t\u00f5eliselt testidega. See on pigem arhitektuuri l\u00e4henemine. See on l\u00e4henemine, kuidas kirjutada just seda, mida on vaja, ja mitte kirjutada seda, mida ei ole vaja. See praktika keskendab teie edasise m\u00f5tlemise iteratsioonile rakenduse arhitektuuri loomise osas.<\/em> <\/p>\n<p><\/p>\n<p><em>Seep\u00e4rast ei ole neid illusioone nii lihtne purustada. MVP ja testid ei vastandu teineteisele. Pigem vastupidi: kui teete MVP-d TDD praktika kohaselt, teete seda paremini ja kiiremini kui siis, kui teete seda lihtsalt ilma praktikata.<\/em><\/p>\n<p><\/p>\n<p>See on v\u00e4ga ebaselge ja keeruline m\u00f5te. Kui kuulete, et n\u00fc\u00fcd hakkan ma kirjutama veel teste ja samal ajal teen midagi kiiremini, siis see k\u00f5lab t\u00e4iesti ebaadekvaatselt. <\/p>\n<p><\/p>\n<p><em>(Dmitri) Siin, kui paljud nimetavad MVP-d, on inimesed laisad, et kirjutada midagi normaalset. Ja need on ikkagi erinevad asjad. MVP-d ei tohiks muuta millekski halbaks ja mitte toimivaks.<\/em> <\/p>\n<p><\/p>\n<p>Jah-jah, sa oled \u00f5igus.<\/p>\n<p><\/p>\n<p><em>Ja siis \u00fchel hetkel on MVP tootmises.<\/em><\/p>\n<p><\/p>\n<p>Igaveseks. <\/p>\n<p><\/p>\n<p>Ja TDD k\u00f5lab v\u00e4ga harjumatult, kui kuuled, et kirjutad teste ja justkui teed rohkem t\u00f6\u00f6d. See k\u00f5lab v\u00e4ga kummaliselt, kuid t\u00f5esti, see teeb asja kiiremini ja atraktiivsemalt. Kui kirjutate testi, m\u00f5tletem sellega juba palju, milline kood on ja kuidas see kutset saab, ning millist k\u00e4itumist me sellelt ootame. Te ei \u00fctle lihtsalt, et ma olen kirjutanud mingi funktsiooni ja see teeb midagi. Te m\u00f5tlete k\u00f5igepealt sellele, et tal on sellised tingimused, ja see kutsub teatud viisil esile. Te katate selle testidega ja sellega m\u00f5istate, millised on teie koodi sisemised liidesed. See m\u00f5jutab arhitektuuri v\u00e4ga palju. Teie kood muutub automaatselt modulaarsemaks, sest te \u00fcritate esmalt aru saada, kuidas te seda katsetate, ja alles seej\u00e4rel kirjutate selle. <\/p>\n<p><\/p>\n<p>Mul on TDD l\u00e4henemisega nii, et mingil hetkel palkasin Ruby mentori, kui olin veel Ruby programmeerija. Ta \u00fctles: \u201eTeeme nii, et teed TDD j\u00e4rgi.\u201d Ja ma m\u00f5tlesin: \u201eKurrat, n\u00fc\u00fcd tuleb j\u00e4llegi midagi juurde kirjutada.\u201d Lepisime kokku, et j\u00e4rgmise kahe n\u00e4dala jooksul kirjutan kogu t\u00f6\u00f6tava koodi Pythonis TDD j\u00e4rgi. Kahe n\u00e4dala p\u00e4rast sain aru, et ma ei taha enam tagasi minna. P\u00fc\u00fcdes neid kahte n\u00e4dalat igal pool rakendada, m\u00f5istsin, kui palju lihtsam on isegi lihtsalt m\u00f5elda. Aga see ei ole ilmselge, seega soovitan k\u00f5igil, et kui teil on tunne, et TDD \u2013 see on keeruline, pikk ja liig, proovige seda j\u00e4rgida v\u00e4hemalt kaks n\u00e4dalat. Mul piisab kahest, et seda m\u00f5ista.<\/p>\n<p><\/p>\n<p><em>(Dmitri) Saame seda m\u00f5tet arendada infrastruktuuri ekspluateerimise vaatenurgast. Enne kui me midagi uut deployime, teeme j\u00e4lgimise ning seej\u00e4rel k\u00e4ivitame. Sel juhul muutub meie j\u00e4lgimine tavaliseks testimiseks. Ja on olemas arendamine l\u00e4bi j\u00e4lgimise. Kuid enamik \u00fctleb, et see on pikk, mul on laisk, ma tegin ajutise mustandi. Kui me saydime korraliku j\u00e4lgimise, saame aru CI s\u00fcsteemi olekust. Ja CI s\u00fcsteemis on palju j\u00e4lgimist. Me m\u00f5istame s\u00fcsteemi seisundit, me teame, mis tal sees on. Ja arenduse k\u00e4igus loome s\u00fcsteemi, et see j\u00f5uaks soovitud olekusse.<\/em> <\/p>\n<p><\/p>\n<p><em>Need praktikad on olnud tuntud juba ammu. Me arutasime seda umbes 4 aastat tagasi. Kuid viimase 4 aastaga pole praktiliselt midagi muutunud.<\/em> <\/p>\n<p><\/p>\n<p><em>Kuid selle m\u00e4rkmega pakun ametliku arutelu l\u00f5petamiseks.<\/em><\/p>\n<p><\/p>\n<p>video (sisestatud meediaelemendina, kuid mingil p\u00f5hjusel 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 5.0.1.1 - aioseo.com -->\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) 5.0.1.1\" \/>\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: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\udd47J\u00e4tkuv integreerimine kui praktika, mitte Jenkins. Andrei Aleksandrov | ProHoster","description":"","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: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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}