{"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\/sv\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","title":{"rendered":"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/ed8a32ae63b8dccfc8b4893ab27f1527.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L\u00e5t oss diskutera varf\u00f6r CI-verktyg och CI \u00e4r helt olika saker.<\/p>\n<p><\/p>\n<p>Vilken sm\u00e4rta \u00e4r CI avsedd att l\u00f6sa, varifr\u00e5n kom id\u00e9n, vilka senaste bevis finns det f\u00f6r att det fungerar, hur man f\u00f6rst\u00e5r att man har en praktik och inte bara en installerad Jenkins.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Tanken att h\u00e5lla en f\u00f6rel\u00e4sning om Continuous Integration kom f\u00f6r ett \u00e5r sedan n\u00e4r jag var p\u00e5 intervjuer och s\u00f6kte jobb. Jag pratade med 10-15 f\u00f6retag, och av dem var det bara ett som kunde f\u00f6rklara vad CI var och hur de ins\u00e5g att de inte hade det. De andra pratade nonsens om Jenkins \ud83d\ude42 'Tja, vi har Jenkins, den g\u00f6r byggen, CI!' I min f\u00f6rel\u00e4sning kommer jag att f\u00f6rs\u00f6ka f\u00f6rklara vad Continuous Integration egentligen \u00e4r och varf\u00f6r Jenkins och liknande verktyg har mycket lite att g\u00f6ra med det.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/a57813a652c0d788e5a927dc8a7130ba.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u00e5, vad kommer vanligtvis att t\u00e4nka p\u00e5 n\u00e4r man h\u00f6r ordet CI? F\u00f6r de flesta kommer ord som Jenkins, Gitlab CI, Travis osv. att dyka upp.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/c9799c11ba7bb7bbdb2048c2f314b22a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c4ven om vi googlar kommer dessa verktyg att dyka upp bland resultaten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/028ef088b28b73e7905b1666d9d53d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Om du fr\u00e5gar bekanta kommer de direkt efter uppr\u00e4kningen av verktyg att ber\u00e4tta att CI \u00e4r n\u00e4r du har en byggprocess och tester som k\u00f6rs p\u00e5 varje pull request.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/f37ba8f985c10900f669540e063c5e43.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Continuous Integration handlar inte om verktyg, inte om byggen med tester i en gren! Continuous Integration \u00e4r en praktik av mycket frekvent integration av ny kod, och f\u00f6r dess till\u00e4mpning \u00e4r det inte alls n\u00f6dv\u00e4ndigt att bygga Jenkins, GitLab och s\u00e5 vidare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/c3a12b4a875050550b42714607e787c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Innan vi g\u00e5r igenom hur en komplett CI ser ut, l\u00e5t oss f\u00f6rst dyka ner i kontexten av de m\u00e4nniskor som kom p\u00e5 detta, och k\u00e4nna den sm\u00e4rta de f\u00f6rs\u00f6kte l\u00f6sa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/2ab9c0f4dba2887fed5744c8b021b424.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och den sm\u00e4rtan de f\u00f6rs\u00f6kte l\u00f6sa var den gemensamma arbetsprocessen i teamet!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/11a5f3b1075f8b8d0f169fe07adf6c91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L\u00e5t oss titta p\u00e5 exempel p\u00e5 vilka sv\u00e5righeter utvecklare st\u00f6ter p\u00e5 vid lagarbete. H\u00e4r har vi ett projekt, master-grenen i git och tv\u00e5 utvecklare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/8138a52376e87239ff5f7b0af5cd8fee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och de b\u00f6rjade arbeta som alla l\u00e4nge har vant sig vid. De tog en uppgift i JIRA, skapade en feature branch och b\u00f6rjade skriva kod.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/54720c40d9bbd9631b411a2a26c4083f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En avslutade funktionen snabbare och slog samman sin kod med master.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/4593dc3cf33a44bf3a4d8166be9bc5da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Den andra tog l\u00e4ngre tid, han slog samman senare och fick en konflikt. Nu, ist\u00e4llet f\u00f6r att skriva de funktionskrav som verksamheten beh\u00f6ver, spenderar utvecklaren tid och energi p\u00e5 att l\u00f6sa konflikter.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/c947601fb1dd3b3dd64bac455dc6691a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ju mer komplicerat det \u00e4r att integrera din funktion med huvudgrenen, desto mer tid spenderar vi p\u00e5 det. Och detta \u00e4r fortfarande ett ganska enkelt exempel jag har visat. Det h\u00e4r \u00e4r ett exempel d\u00e4r det bara \u00e4r tv\u00e5 utvecklare. T\u00e4nk er om 10, 15 eller 100 personer i f\u00f6retaget skriver i ett och samma repository. Ni skulle bli galna av att l\u00f6sa alla dessa konflikter. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/16c6b8b51ae462f1e0acb966a93c0ae5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det finns en n\u00e5got annorlunda situation. Vi har en huvudgren och flera utvecklare som g\u00f6r n\u00e5got.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/21b78ad8d0cb7cb5bded6ef9d49707c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De har skapat en gren vardera.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/b85d8aa0080f08c1ad8ad83f3a9ab084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En har f\u00f6rt samman sin gren, allt gick bra, uppgiften \u00e4r klar.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/e96d4fd52c39089e3377ed85adeeb591.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Under tiden har den andra utvecklaren slutf\u00f6rt sin uppgift. L\u00e5t oss s\u00e4ga att han har skickat den f\u00f6r granskning. I m\u00e5nga f\u00f6retag finns det en praxis \u2013 granskning. \u00c5 ena sidan \u00e4r denna praxis bra och anv\u00e4ndbar, \u00e5 andra sidan bromsar den oss p\u00e5 m\u00e5nga s\u00e4tt. L\u00e5t oss inte g\u00e5 in p\u00e5 det nu, men h\u00e4r \u00e4r ett utm\u00e4rkt exempel p\u00e5 vad en snedvriden granskning kan leda till. Du har skickat en pull request f\u00f6r granskning. Utvecklaren har inget mer att g\u00f6ra. Vad b\u00f6rjar han g\u00f6ra? Han b\u00f6rjar ta andra uppgifter. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/7b8e121be99432606056acf11e20f518.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Under denna tid har den andra utvecklaren \u00e4ven arbetat med n\u00e5got annat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/ceaa5ba5b3b5014fad527362f5794e94.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Den f\u00f6rsta slutf\u00f6rde den tredje uppgiften. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/9c27663e63bb9489ecffc5a1f73abb87.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och efter en l\u00e4ngre tid har han f\u00e5tt sin granskning godk\u00e4nd och f\u00f6rs\u00f6ker f\u00f6ra samman sina \u00e4ndringar. Och vad h\u00e4nder? Han f\u00e5ngar en m\u00e4ngd konflikter. Varf\u00f6r? F\u00f6r medan hans pull request h\u00e4ngde p\u00e5 granskning har det skett m\u00e5nga f\u00f6r\u00e4ndringar i koden. <\/p>\n<p><\/p>\n<p>F\u00f6rutom historia med konflikter finns det ocks\u00e5 kommunikationsproblem. S\u00e5 l\u00e4nge din gren h\u00e4nger p\u00e5 granskning, s\u00e5 l\u00e4nge den v\u00e4ntar, s\u00e5 l\u00e4nge du arbetar l\u00e4nge med en funktion, slutar du att h\u00e5lla koll p\u00e5 vad som f\u00f6r\u00e4ndras i kodbasen av din tj\u00e4nst. Kanske det du f\u00f6rs\u00f6ker l\u00f6sa nu redan l\u00f6stes ig\u00e5r och att du kan \u00e5teranv\u00e4nda en metod. Men du ser inte det, eftersom du alltid arbetar med en f\u00f6r\u00e5ldrad gren. Denna f\u00f6r\u00e5ldrade gren leder alltid till att du m\u00e5ste l\u00f6sa merge-konflikter. <\/p>\n<p><\/p>\n<p>Det visar sig att om vi arbetar som ett team, allts\u00e5 inte bara en person som arbetar i repositoryn, utan 5-10 personer, desto l\u00e4ngre vi v\u00e4ntar med att l\u00e4gga till v\u00e5r kod i huvudgrenen, desto mer lider vi av att vi till slut m\u00e5ste f\u00f6ra ihop n\u00e5got. Och ju fler konflikter vi har, och ju \u00e4ldre version vi arbetar med, desto fler problem f\u00e5r vi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/55c070f65a4d3838fb8c02bb9684c76b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Att samarbeta \u00e4r sm\u00e4rtsamt! Vi st\u00f6r alltid varandra. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/b914c50aad6f3c9f97edcad7e71ba627.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det h\u00e4r problemet uppm\u00e4rksammades f\u00f6r mer \u00e4n 20 \u00e5r sedan. Den f\u00f6rsta omn\u00e4mnandet av praktiken Continuous Integration hittade jag inom extrem programmering.<\/p>\n<p><\/p>\n<p>Extrem programmering \u00e4r den f\u00f6rsta agile-ramverket. Sidan skapades 1996. Tanken var att anv\u00e4nda vissa programmerings-, planerings- och andra metoder f\u00f6r att utvecklingen skulle vara s\u00e5 flexibel som m\u00f6jligt s\u00e5 vi snabbare skulle kunna reagera p\u00e5 f\u00f6r\u00e4ndringar och krav fr\u00e5n v\u00e5ra kunder. F\u00f6r 24 \u00e5r sedan m\u00f6tte de problemet att om man arbetar l\u00e4nge i sidled, s\u00e5 sl\u00f6sar man mer tid p\u00e5 det, eftersom man f\u00e5r konflikter. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/93a80838bdb3b297557dbf2ac7587965.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nu kommer vi att bryta ner frasen \"Continuous Integration\" ord f\u00f6r ord. Om vi \u00f6vers\u00e4tter bokstavligt f\u00e5r vi \"kontinuerlig integration\". Men hur kontinuerlig den \u00e4r, \u00e4r inte riktigt tydligt, den \u00e4r faktiskt ganska intermittent. Hur mycket den \u00e4r integration \u00e4r inte heller helt uppenbart. <\/p>\n<p><\/p>\n<p>D\u00e4rf\u00f6r ger jag er nu citat fr\u00e5n extrem programmering. Och vi kommer att bryta ner b\u00e5da orden separat. <\/p>\n<p><\/p>\n<p>Integration - Som jag redan n\u00e4mnt str\u00e4var vi efter att varje ingenj\u00f6r arbetar med den mest aktuella versionen av koden, s\u00e5 att de str\u00e4var efter att ofta l\u00e4gga till sin kod i den gemensamma grenen, s\u00e5 att det handlar om sm\u00e5 grenar. F\u00f6r om de \u00e4r stora kan vi l\u00e4tt fastna med merge-konflikter i en vecka. S\u00e4rskilt om vi har en l\u00e5ng utvecklingscykel som vattenfall, d\u00e4r en utvecklare har spenderat en m\u00e5nad p\u00e5 att bygga en stor funktion. Och vid integrationssteget kan han fastna v\u00e4ldigt l\u00e4nge. <\/p>\n<p><\/p>\n<p>Integration \u2013 det \u00e4r n\u00e4r vi tar v\u00e5r gren och integrerar den med master, vi merge:ar den. Det finns en ultimativ variant d\u00e4r vi transbase developer, d\u00e4r vi str\u00e4var efter att vi skriver direkt till master utan n\u00e5gra on\u00f6diga grenar.<\/p>\n<p><\/p>\n<p>I allm\u00e4nhet \u00e4r integration att ta sin kod och f\u00e5 den till master. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/8950103e6a59ed7132ec321ac6abe600.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vad menas med ordet \u00abcontinuous\u00bb och vad \u00e4r kontinuitet? Praktiken inneb\u00e4r att utvecklaren str\u00e4var efter att integrera sin kod s\u00e5 snabbt som m\u00f6jligt. Det \u00e4r hans m\u00e5l n\u00e4r han utf\u00f6r en uppgift \u2013 att f\u00e5 sin kod in i huvudgrenen s\u00e5 snart som m\u00f6jligt. I en perfekt v\u00e4rld skulle utvecklare g\u00f6ra detta var n\u00e5gra timmar. Det vill s\u00e4ga, du tar en liten uppgift, mergar den i huvudgrenen. Allt \u00e4r fantastiskt. Du str\u00e4var efter detta. Och det m\u00e5ste g\u00f6ras kontinuerligt. S\u00e5 snart du har gjort n\u00e5got, l\u00e4gger du genast in det i huvudgrenen. <\/p>\n<p><\/p>\n<p>Och utvecklaren som g\u00f6r n\u00e5got \u00e4r ansvarig f\u00f6r vad han har gjort f\u00f6r att det ska fungera och inte bryta n\u00e5got. H\u00e4r dyker vanligtvis historien om tester upp. Vi vill k\u00f6ra n\u00e5gra tester p\u00e5 v\u00e5rt kommits, p\u00e5 v\u00e5r merge, f\u00f6r att s\u00e4kerst\u00e4lla att det fungerar. Och h\u00e4r kan Jenkins hj\u00e4lpa dig.<\/p>\n<p><\/p>\n<p>Men n\u00e4r det handlar om: varf\u00f6r inte g\u00f6ra \u00e4ndringarna sm\u00e5, och varf\u00f6r inte g\u00f6ra uppgifterna sm\u00e5, och varf\u00f6r inte g\u00f6ra uppgiften och f\u00f6rs\u00f6ka mergea den i huvudgrenen direkt \u2013 h\u00e4r hj\u00e4lper inga Jenkins. F\u00f6r Jenkins hj\u00e4lper er enbart att k\u00f6ra tester. <\/p>\n<p><\/p>\n<p>Du kan klara dig utan dem. Det st\u00f6r dig inte alls. F\u00f6r m\u00e5let med praktiken \u00e4r att mergea s\u00e5 ofta som m\u00f6jligt f\u00f6r att inte spendera en stor m\u00e4ngd tid p\u00e5 konflikter i framtiden. <\/p>\n<p><\/p>\n<p>L\u00e5t oss f\u00f6rest\u00e4lla oss att vi har \u00e5r 2020 utan internet av n\u00e5gon anledning. Och vi arbetar lokalt. Vi har ingen Jenkins. Det \u00e4r okej. Du kan fortfarande skapa en lokal gren. Du har skrivit n\u00e5gon kod i den. G\u00f6rde uppgiften p\u00e5 3-4 timmar. V\u00e4xla till huvudgrenen, k\u00f6r git pull, merge din gren d\u00e4r. Klar. Om du g\u00f6r detta ofta \u2013 grattis, du har Continuous Integration!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/1f2117b65994b940edb04e0e119f6e8a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vilka bevis finns det i den moderna v\u00e4rlden f\u00f6r att det \u00e4r v\u00e4rt att l\u00e4gga kraft p\u00e5 detta? F\u00f6r det \u00e4r i grunden sv\u00e5rt. Om du f\u00f6rs\u00f6ker arbeta p\u00e5 detta s\u00e4tt, kommer du att m\u00e4rka att du m\u00e5ste planera mer, du m\u00e5ste \u00e4gna mer tid \u00e5t nedbrytning av uppgifter. F\u00f6r om du g\u00f6r man..., s\u00e5 kommer du inte att kunna mergea snabbt och d\u00e4rmed hamna i knipa. Du kommer inte att ha n\u00e5got praktiskt. <\/p>\n<p><\/p>\n<p>Och det kommer att bli dyrt. Att b\u00f6rja arbeta med Continuous Integration fr\u00e5n och med imorgon kommer inte att fungera. Ni kommer alla att beh\u00f6va mycket tid f\u00f6r att v\u00e4nja er vid detta, ni kommer att beh\u00f6va l\u00e5ng tid f\u00f6r att v\u00e4nja er vid att dela upp uppgifter, ni kommer att beh\u00f6va l\u00e5ng tid f\u00f6r att justera er granskning, om ni har en s\u00e5dan. F\u00f6r v\u00e5r m\u00e5ls\u00e4ttning \u00e4r att det ska sl\u00e5s samman idag. Om ni g\u00f6r er granskning under tre dagar, d\u00e5 har ni problem och Continuous Integration fungerar inte. <\/p>\n<p><\/p>\n<p>Men vilka aktuella bevis har vi just nu som s\u00e4ger oss att det \u00e4r meningsfullt att investera i denna praktik?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/2026a8f1d72fb05613511e7bab57e8ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det f\u00f6rsta som kom till mitt sinne var State of DevOps. Det \u00e4r en studie som grabbarna har genomf\u00f6rt i 7 \u00e5r. Just nu g\u00f6r de det som en oberoende organisation, men under Google.<\/p>\n<p><\/p>\n<p>Deras studie fr\u00e5n 2018 visade en korrelation mellan f\u00f6retag som str\u00e4var efter att anv\u00e4nda kortvariga grenar, som integreras snabbt och ofta, och deras IT-prestanda \u00e4r mycket b\u00e4ttre.<\/p>\n<p><\/p>\n<p>Vilka \u00e4r dessa m\u00e4tv\u00e4rden? Det handlar om 4 m\u00e4tv\u00e4rden som de samlar in fr\u00e5n alla f\u00f6retag i sina enk\u00e4ter: deployment frequency, lead time for changes, time to restore service, change failure rate.<\/p>\n<p><\/p>\n<p>F\u00f6r det f\u00f6rsta finns det denna korrelation; vi vet att f\u00f6retag som sl\u00e5r samman ofta har betydligt b\u00e4ttre dessa m\u00e4tv\u00e4rden. De delar \u00e4ven in f\u00f6retag i flera kategorier: l\u00e5ngsamma f\u00f6retag som producerar n\u00e5got l\u00e5ngsamt, medium performer, high performer och eliten. Eliten \u2013 det \u00e4r Netflix, Amazon, som \u00e4r super snabba, g\u00f6r allt snabbt, snyggt och av h\u00f6g kvalitet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/4fd98ef48a5cffdd6ae2ceea93dbb0bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En annan story som intr\u00e4ffade f\u00f6r bara en m\u00e5nad sedan. I Technology Radar publicerades en fantastisk notis om Gitflow. Gitflow skiljer sig fr\u00e5n alla andra genom att dess grenar lever l\u00e4nge. Det finns release-grenar som lever l\u00e4nge, och feature branches som ocks\u00e5 lever l\u00e4nge. Denna praktik i Technology Radar har flyttats till HOLD. Varf\u00f6r? Eftersom folk st\u00f6ter p\u00e5 problem med integrationen. <\/p>\n<p><\/p>\n<p>Om din gren lever mycket l\u00e4nge, b\u00f6rjar den fastna, den g\u00e5r ut p\u00e5 datum, och vi b\u00f6rjar sl\u00f6sa mer tid p\u00e5 att g\u00f6ra f\u00f6r\u00e4ndringar i den. <\/p>\n<p><\/p>\n<p>Nyligen sa f\u00f6rfattaren till Gitflow att om du str\u00e4var efter kontinuerlig integration, om du vill rulla ut f\u00f6r\u00e4ndringar s\u00e5 ofta som m\u00f6jligt, d\u00e5 \u00e4r Gitflow en d\u00e5lig id\u00e9. I en artikel n\u00e4mnde han att om ni har en backend d\u00e4r ni kan str\u00e4va efter detta, s\u00e5 \u00e4r Gitflow \u00f6verfl\u00f6digt f\u00f6r er, eftersom Gitflow kommer att sakta ner er och skapa problem med integrationen. <\/p>\n<p><\/p>\n<p>Det betyder inte att Gitflow \u00e4r d\u00e5ligt och att man inte ska anv\u00e4nda det. Det \u00e4r f\u00f6r andra situationer. Till exempel n\u00e4r ni beh\u00f6ver underh\u00e5lla flera versioner av en tj\u00e4nst eller applikation, det vill s\u00e4ga d\u00e4r ni m\u00e5ste st\u00f6dja den under en l\u00e4ngre tid. <\/p>\n<p><\/p>\n<p>Men om ni pratar med personer som underh\u00e5ller s\u00e5dana tj\u00e4nster, s\u00e5 kommer ni h\u00f6ra mycket klagom\u00e5l om att versionen 3.2, som var f\u00f6r fyra m\u00e5nader sedan, inte fick med sig en fix och nu, f\u00f6r att f\u00e5 in den, m\u00e5ste man g\u00f6ra en massa f\u00f6r\u00e4ndringar. S\u00e5 de sitter fast igen och k\u00e4mpar i en vecka f\u00f6r att f\u00e5 in en ny funktion. <\/p>\n<p><\/p>\n<p>Som Alexander Kovalev korrekt p\u00e5pekade i chatten, korrelation \u00e4r inte detsamma som orsakssamband. S\u00e5 \u00e4r det. Det finns ingen direkt relation som inneb\u00e4r att om ni har kontinuerlig integration, s\u00e5 kommer alla m\u00e4tv\u00e4rden att vara fantastiska, nej. Men det finns en positiv korrelation, det vill s\u00e4ga om det ena finns, d\u00e5 \u00e4r det troligt att det andra ocks\u00e5 finns. Det \u00e4r inte ett faktum, men troligt. Det \u00e4r bara en korrelation. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continous Integration som praxis, inte Jenkins. Andrey Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/d5fc050550b0e9f86a1fdf85fff32fa5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det verkar som att vi redan g\u00f6r n\u00e5got, vi mergear redan, men hur kan vi f\u00f6rst\u00e5 att vi faktiskt har kontinuerlig integration, att vi mergear tillr\u00e4ckligt ofta?<\/p>\n<p><\/p>\n<p>Jez Humble \u00e4r f\u00f6rfattare till Handbook, Accelerate, webbplatsen f\u00f6r Continuous Delivery och boken \"Continuous Delivery\". Han f\u00f6resl\u00e5r ett s\u00e5dant test:<\/p>\n<p><\/p>\n<ul>\n<li>Ingenj\u00f6rens kod g\u00e5r in i master varje dag. <\/li>\n<li>Vid varje commit k\u00f6r ni enhetstester.<\/li>\n<li>Bygget i master f\u00f6ll, men det \u00e5tg\u00e4rdades p\u00e5 cirka 10 minuter.<\/li>\n<\/ul>\n<p><\/p>\n<p>Han f\u00f6resl\u00e5r att anv\u00e4nda ett s\u00e5dant test f\u00f6r att s\u00e4kerst\u00e4lla att ni verkligen har de r\u00e4tta praxis. <\/p>\n<p><\/p>\n<p>Det sista finner jag en aning kontroversiellt. Det vill s\u00e4ga, om du kan l\u00f6sa det p\u00e5 10 minuter, betyder det att du har Continuous Integration, vilket l\u00e5ter lite konstigt i mina \u00f6ron, men det finns logik i det. Varf\u00f6r? Eftersom om du ofta sl\u00e5r samman, betyder det att dina f\u00f6r\u00e4ndringar \u00e4r sm\u00e5. Om ett litet f\u00f6r\u00e4ndring orsakar att din huvudversion bryts, kan du snabbt finna exemplet eftersom f\u00f6r\u00e4ndringen \u00e4r liten. Du hade en liten sammanslagning d\u00e4r 20\u201330 rader \u00e4ndrades. Och du kan snabbt f\u00f6rst\u00e5 vad som var orsaken, eftersom f\u00f6r\u00e4ndringarna \u00e4r s\u00e5 sm\u00e5, vilket ger en mycket liten s\u00f6komr\u00e5de f\u00f6r problemet. <\/p>\n<p><\/p>\n<p>Och \u00e4ven om vi efter release f\u00e5r ett problem i produktion, s\u00e5 om vi har en praxis f\u00f6r Continuous Integration, \u00e4r det mycket enklare f\u00f6r oss att agera, eftersom f\u00f6r\u00e4ndringarna \u00e4r sm\u00e5. Ja, det kommer att p\u00e5verka planeringen. Det kommer att vara sm\u00e4rtsamt. Och kanske det sv\u00e5raste med denna praxis \u00e4r att v\u00e4nja sig vid att bryta ner uppgifter, allts\u00e5 hur man kan ta n\u00e5got och g\u00f6ra det p\u00e5 n\u00e5gra timmar och ocks\u00e5 klara av en granskning, om du har en. Granskning \u00e4r en separat sm\u00e4rta. <\/p>\n<p><\/p>\n<p>Enhetstester \u00e4r bara en hj\u00e4lpare som hj\u00e4lper dig att f\u00f6rst\u00e5 \u2013 har din integration verkligen lyckats? Har ingenting g\u00e5tt s\u00f6nder? Enligt min mening \u00e4r det ocks\u00e5 inte ett helt obligatoriskt moment, eftersom syftet med praktiken inte ligger d\u00e4r. <\/p>\n<p><\/p>\n<p>Det h\u00e4r \u00e4r en kort sammanfattning av Continuous Integration. Det \u00e4r allt som finns i denna praxis. Jag \u00e4r redo f\u00f6r fr\u00e5gor. <\/p>\n<p><\/p>\n<p>Kort sammanfattar jag bara en g\u00e5ng till:<\/p>\n<p><\/p>\n<ul>\n<li>Continuous Integration \u00e4r inte Jenkins, det \u00e4r inte Gitlab.<\/li>\n<li>Det \u00e4r inte ett verktyg, det \u00e4r en praxis om att vi s\u00e5 ofta som m\u00f6jligt sl\u00e5r samman v\u00e5r kod i huvudversionen. <\/li>\n<li>Vi g\u00f6r detta f\u00f6r att undvika den enorma sm\u00e4rta som uppst\u00e5r med sammanslagningar i framtiden, det vill s\u00e4ga att vi upplever lite sm\u00e4rta nu f\u00f6r att inte beh\u00f6va uppleva mycket mer i framtiden. Det \u00e4r hela syftet. <\/li>\n<li>\u00c5t sidan g\u00e5r kommunikationen genom koden, men jag ser det v\u00e4ldigt s\u00e4llan, men det var ocks\u00e5 t\u00e4nkt p\u00e5 det.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Fr\u00e5gor<\/strong><\/p>\n<p><\/p>\n<p><em>Vad ska man g\u00f6ra med odekoflicerade uppgifter?<\/em><\/p>\n<p><\/p>\n<p>Dekoflicera. Vad \u00e4r problemet? Kan du ge ett exempel p\u00e5 en uppgift som inte kan dekofliceras?<\/p>\n<p><\/p>\n<p><em>Det finns s\u00e5dana uppgifter som inte kan dekofliceras \u00f6verhuvudtaget, till exempel de som kr\u00e4ver mycket djup expertis och som verkligen kan ta en m\u00e5nad f\u00f6r att n\u00e5 n\u00e5got rimligt resultat.<\/em> <\/p>\n<p><\/p>\n<p>Om jag f\u00f6rst\u00e5tt dig r\u00e4tt, s\u00e5 finns det en stor och komplex uppgift vars resultat f\u00f6rst kommer att synas om en m\u00e5nad?<\/p>\n<p><\/p>\n<p><em>Ja, det st\u00e4mmer. Ja, resultatet kan inte utv\u00e4rderas tidigare \u00e4n om en m\u00e5nad.<\/em> <\/p>\n<p><\/p>\n<p>Okej. I stort sett \u00e4r det inget problem. Varf\u00f6r? F\u00f6r i det h\u00e4r fallet, n\u00e4r vi pratar om grenar, pratar vi inte om en gren med en funktion. Funktioner kan vara stora och komplexa. De kan involvera m\u00e5nga komponenter. Och det \u00e4r m\u00f6jligt att vi inte kan g\u00f6ra dem helt i en gren. Det \u00e4r okej. Vi beh\u00f6ver bara dela upp den h\u00e4r historien. Om funktionen inte \u00e4r helt f\u00e4rdig betyder det inte att delar av dess kod inte kan sl\u00e5s samman. Du har till exempel lagt till en migration och inom funktionen finns det n\u00e5gra steg. Du har till exempel ett steg - att g\u00f6ra migrationen, l\u00e4gga till en ny metod. Och dessa saker kan du redan sl\u00e5 samman dagligen. <\/p>\n<p><\/p>\n<p><em>Okej. Vad \u00e4r d\u00e5 meningen med det h\u00e4r?<\/em><\/p>\n<p><\/p>\n<p>Vad \u00e4r meningen med att sl\u00e5 samman sm\u00e5 saker dagligen?<\/p>\n<p><\/p>\n<p><em>Ja.<\/em><\/p>\n<p><\/p>\n<p>Om de har brutit n\u00e5got ser du det genast. Du har en liten bit som brutit n\u00e5got, det \u00e4r l\u00e4ttare att fixa. Meningen \u00e4r att sl\u00e5 samman en liten bit nu \u00e4r mycket enklare \u00e4n att sl\u00e5 samman n\u00e5got stort om n\u00e5gra veckor. Och den tredje meningen \u00e4r att andra ingenj\u00f6rer kommer att arbeta med den aktuella versionen av koden. De kommer att se att det har lagts till migrationer h\u00e4r och att det har dykt upp en metod h\u00e4r som de ocks\u00e5 kanske vill anv\u00e4nda. Alla kommer att se vad som h\u00e4nder i din kod. Just f\u00f6r dessa tre saker utf\u00f6rs praktiken. <\/p>\n<p><\/p>\n<p><em>Tack, fr\u00e5gan \u00e4r besvarad!<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg Soroka) Kan jag f\u00e5 l\u00e4gga till n\u00e5got? Du sa helt r\u00e4tt, jag vill bara l\u00e4gga till en fras.<\/em><\/p>\n<p><\/p>\n<p>Okej.<\/p>\n<p><\/p>\n<p><em>Vid kontinuerlig integration sl\u00e5s koden samman i den gemensamma grenen inte n\u00e4r funktionen \u00e4r helt f\u00e4rdig, utan n\u00e4r bygget har slutat att krascha. Och ni kan fritt committa till master hur m\u00e5nga g\u00e5nger ni vill per dag. Den andra aspekten \u00e4r att om ni av n\u00e5gon anledning inte kan dela upp en m\u00e5nadsuppgift i uppgifter p\u00e5 \u00e5tminstone tre dagar, jag n\u00e4mner inte tre timmar, s\u00e5 har ni ett enormt problem. Och att ni inte har kontinuerlig integration \u00e4r det minsta av dessa problem. Det betyder att ni har problem med arkitekturen och att de tekniska metoderna ligger p\u00e5 noll. F\u00f6r \u00e4ven om det handlar om forskning m\u00e5ste det i alla fall formuleras i form av hypoteser eller cykler.<\/em> <\/p>\n<p><\/p>\n<p><em>Vi har pratat om 4 m\u00e4tv\u00e4rden som skiljer framg\u00e5ngsrika f\u00f6retag fr\u00e5n de mindre framg\u00e5ngsrika. Det kr\u00e4vs att dessa 4 m\u00e4tv\u00e4rden faktiskt uppn\u00e5s. Om ditt genomsnittliga uppdrag tar en m\u00e5nad skulle jag f\u00f6rst fokusera p\u00e5 detta m\u00e4tv\u00e4rde. Jag skulle f\u00f6rst f\u00e5 ner det till 3 dagar. Efter detta skulle jag b\u00f6rja t\u00e4nka p\u00e5 Continuous.<\/em><\/p>\n<p><\/p>\n<p>F\u00f6rst\u00e5r jag dig r\u00e4tt att du tycker att det i allm\u00e4nhet inte \u00e4r meningsfullt att investera i ingenj\u00f6rsmetoder om du har en uppgift som tar en m\u00e5nad?<\/p>\n<p><\/p>\n<p><em>Du har Continuous Integration. D\u00e4r finns det en situation d\u00e4r du inom 10 minuter antingen fixar en l\u00f6sning eller rullar tillbaka. T\u00e4nk dig att du har sl\u00e4ppt det. Och du har till och med continuous deployment, du har sl\u00e4ppt det p\u00e5 prod och f\u00f6rst efter\u00e5t m\u00e4rker du att n\u00e5got gick fel. Du m\u00e5ste rulla tillbaka, men din databas har redan migrerat. Din databas-schema har redan versionen f\u00f6r n\u00e4sta, dessutom har det redan gjorts n\u00e5gon backup och d\u00e4r har \u00e4ven data skrivits in.<\/em><\/p>\n<p><\/p>\n<p><em>Och vad har du som alternativ? Om du rullar tillbaka koden kan den redan inte fungera med den uppdaterade databasen.<\/em><\/p>\n<p><\/p>\n<p>Databasen r\u00f6r sig bara fram\u00e5t, ja. <\/p>\n<p><\/p>\n<p><em>F\u00f6r personer med d\u00e5liga ingenj\u00f6rspraktiker har de troligen inte l\u00e4st den tjocka boken om ... heller. Vad g\u00f6r man med backup? Om du \u00e5terst\u00e4ller fr\u00e5n en backup betyder det att du f\u00f6rlorar data som har samlats in under den tiden. Till exempel, arbetade du tre timmar med den nya versionen av databasen, d\u00e4r anv\u00e4ndare registrerade sig. Du g\u00e5r tillbaka till den gamla backupen eftersom schemat inte fungerar med den nya versionen, och d\u00e4rmed har du f\u00f6rlorat dessa anv\u00e4ndare. Och de \u00e4r missn\u00f6jda, de klagar.<\/em><\/p>\n<p><\/p>\n<p><em>F\u00f6r att beh\u00e4rska hela spektrumet av metoder som st\u00f6der Continuous Integration och Continuous Delivery r\u00e4cker det inte att bara l\u00e4ra sig att skriva \u2026. F\u00f6r det f\u00f6rsta kan de bli v\u00e4ldigt m\u00e5nga, och det blir opraktiskt. Dessutom finns det en massa andra metoder, som Scientific. Det finns en metod som GitHub populariserade en g\u00e5ng i tiden. Det \u00e4r n\u00e4r du har b\u00e5de gammal och ny kod som k\u00f6rs samtidigt. Det \u00e4r n\u00e4r du g\u00f6r en ofullst\u00e4ndig funktion, men den kan returnera n\u00e5got: antingen som en funktion eller som ett Rest API. Du k\u00f6r b\u00e5de ny och gammal kod och j\u00e4mf\u00f6r skillnaden mellan dem. Och om det finns en skillnad s\u00e5 loggar du det h\u00e4ndelsen. P\u00e5 s\u00e5 s\u00e4tt vet du att din nya funktion \u00e4r redo att rullas ut \u00f6ver den gamla, om det under en viss tid inte har funnits n\u00e5gon avvikelse mellan dessa tv\u00e5.<\/em> <\/p>\n<p><\/p>\n<p><em>Det finns hundratals s\u00e5dana metoder. Jag skulle f\u00f6resl\u00e5 att b\u00f6rja med transbase development. Den \u00e4r inte 100 % p\u00e5 Continuous Integration, men metoderna \u00e4r desamma, det ena kan inte utan det andra.<\/em> <\/p>\n<p><\/p>\n<p>Du n\u00e4mnde transbase development som exempel p\u00e5 var man kan se metoder, eller f\u00f6resl\u00e5r du att folk ska b\u00f6rja anv\u00e4nda transbase development?<\/p>\n<p><\/p>\n<p><em>Titta, eftersom de inte kan anv\u00e4nda det. F\u00f6r att kunna anv\u00e4nda dem m\u00e5ste man l\u00e4sa mycket. Och n\u00e4r en person fr\u00e5gar: \"Vad ska jag g\u00f6ra med en funktion som tar en m\u00e5nad?\" betyder det att han inte har l\u00e4st om transbase development. Jag skulle inte rekommendera det \u00e4nnu. Jag skulle r\u00e5da att fokusera enbart p\u00e5 hur man korrekt arkitektoniskt delar stora uppgifter i mindre. Det \u00e4r sj\u00e4lva syftet med dekomposition.<\/em><\/p>\n<p><\/p>\n<p><em>Dekomposition \u00e4r ett av verktygen f\u00f6r arkitekten. F\u00f6rst g\u00f6r vi en analys, sedan dekomposition, sedan syntes, och slutligen integration. P\u00e5 s\u00e5 s\u00e4tt faller allt p\u00e5 plats. Och f\u00f6r att n\u00e5 Continuous Integration m\u00e5ste man f\u00f6rst v\u00e4xa genom dekomposition. Fr\u00e5gor uppst\u00e5r i det f\u00f6rsta steget, men vi pratar redan om det fj\u00e4rde steget, det vill s\u00e4ga ju oftare man g\u00f6r integration, desto b\u00e4ttre. Det \u00e4r fortfarande f\u00f6r tidigt att g\u00f6ra det, det skulle vara bra att f\u00f6rst dela upp sin monolit.<\/em> <\/p>\n<p><\/p>\n<p><em>Det beh\u00f6vs n\u00e5gra pilar och kvadrater ritade p\u00e5 n\u00e5gon slags schema. Du kan inte s\u00e4ga att nu ska jag visa arkitektschemat f\u00f6r den nya applikationen och bara visa en kvadrat, inne i vilken det finns en gr\u00f6n knapp f\u00f6r applikationen. I vilket fall som helst kommer det att finnas fler kvadrater och pilar. P\u00e5 vilket schema jag \u00e4n har sett, har de alltid varit fler \u00e4n en. Och dekomposition g\u00f6rs redan p\u00e5 grafisk representationsniv\u00e5. D\u00e4rf\u00f6r kan kvadraterna g\u00f6ras oberoende. Om inte, s\u00e5 har jag stora fr\u00e5gor till arkitekten.<\/em> <\/p>\n<p><\/p>\n<p>Det finns en fr\u00e5ga fr\u00e5n chatten: \"Om en granskning \u00e4r obligatorisk och p\u00e5g\u00e5r l\u00e4nge, n\u00e5gon dag eller mer?\".<\/p>\n<p><\/p>\n<p>Ni har problem med praktiken. En granskning ska inte ta en dag eller mer. Det \u00e4r samma historia som den f\u00f6reg\u00e5ende fr\u00e5gan, bara lite mjukare. Om en granskning tar en dag, betyder det f\u00f6rmodligen att det handlar om en v\u00e4ldigt stor f\u00f6r\u00e4ndring. D\u00e5 borde man g\u00f6ra den mindre. I transbase development, som Oleg rekommenderade, finns det en grej som kallas continuous review. Id\u00e9n \u00e4r att vi medvetet g\u00f6r s\u00e5 sm\u00e5 pull requests som m\u00f6jligt, eftersom vi str\u00e4var efter att mergen konstant och i sm\u00e5 m\u00e4ngder. D\u00e4rf\u00f6r f\u00f6r\u00e4ndrar en pull request en abstraktion eller 10 rader. Tack vare detta tar granskningen bara n\u00e5gra minuter. <\/p>\n<p><\/p>\n<p>Om en granskning tar en dag eller mer, d\u00e5 \u00e4r n\u00e5got fel. F\u00f6r det f\u00f6rsta kan det finnas problem med arkitekturen. Antingen \u00e4r det en stor kodbit, p\u00e5 exempelvis 1 000 rader. Eller s\u00e5 har ni en s\u00e5 komplex arkitektur att en person inte kan f\u00f6rst\u00e5 den. Det \u00e4r ett problem, men det m\u00e5ste ocks\u00e5 l\u00f6sas. Kanske beh\u00f6vs det \u00f6verhuvudtaget ingen granskning. Det \u00e4r n\u00e5got man ocks\u00e5 beh\u00f6ver fundera p\u00e5. Granskning \u00e4r det som bromsar er. Den ger sina f\u00f6rdelar i allm\u00e4nhet, men ni beh\u00f6ver f\u00f6rst\u00e5 varf\u00f6r ni g\u00f6r detta. \u00c4r det ett s\u00e4tt f\u00f6r er att snabbt \u00f6verf\u00f6ra information, \u00e4r det ett s\u00e4tt att etablera vissa standarder internt eller vad? Varf\u00f6r beh\u00f6ver ni detta? F\u00f6r granskning m\u00e5ste antingen vara v\u00e4ldigt snabb, eller s\u00e5 ska den helt avbrytas. Det \u00e4r som transbase development \u2013 en mycket vacker historia, men bara f\u00f6r mogna personer. <\/p>\n<p><\/p>\n<p>Ang\u00e5ende de fyra metrikorna skulle jag rekommendera att ni faktiskt tar bort dem f\u00f6r att f\u00f6rst\u00e5 vad det leder till. Titta p\u00e5 siffrorna, titta p\u00e5 bilden, hur d\u00e5ligt allt ser ut. <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Jag \u00e4r redo att delta i diskussionen om detta med dig. Siffror och m\u00e4tningar \u00e4r allt bra, praktiken \u00e4r bra. Men vi m\u00e5ste f\u00f6rst\u00e5 \u2013 \u00e4r detta n\u00f6dv\u00e4ndigt f\u00f6r aff\u00e4ren? Det finns f\u00f6retag som inte beh\u00f6ver en s\u00e5dan snabba f\u00f6r\u00e4ndringar. Jag k\u00e4nner till f\u00f6retag d\u00e4r man inte kan g\u00f6ra \u00e4ndringar var 15:e minut. Och inte f\u00f6r att de \u00e4r d\u00e5liga. Det \u00e4r en s\u00e5dan livscykel. Och f\u00f6r att g\u00f6ra funktioner som branches, toggle-funktioner, kr\u00e4vs djupa kunskaper.<\/em> <\/p>\n<p><\/p>\n<p>Det \u00e4r sv\u00e5rt. Om du vill l\u00e4sa mer om historien kring toggle-funktioner, rekommenderar jag verkligen detta. <noindex><a rel=\"nofollow\" href=\"https:\/\/trunkbaseddevelopment.com\/\">https:\/\/trunkbaseddevelopment.com\/<\/a><\/noindex>. Och det finns en fantastisk artikel av Martin Fowler om toggle-funktioner: om vilka typer som finns, livscykler, osv. Toggle-funktionen \u00e4r komplex. <\/p>\n<p><\/p>\n<p><em>Och du svarade \u00e4nd\u00e5 inte p\u00e5 fr\u00e5gan: \"Beh\u00f6vs Jenkins eller inte?\"<\/em><\/p>\n<p><\/p>\n<p>Jenkins beh\u00f6vs egentligen inte i n\u00e5got fall. Om jag ska vara \u00e4rlig, s\u00e5 ger verktyg som Jenkins, Gitlab dig bekv\u00e4mlighet. Du kommer att se om bygget lyckades eller inte. De kan hj\u00e4lpa dig, men de ger dig inte praktiken. De kan bara ge dig en indikator \u2013 Okej, inte okej. Och s\u00e5vida du skriver tester, f\u00f6r annars \u00e4r det n\u00e4stan meningsl\u00f6st. S\u00e5 det beh\u00f6vs, f\u00f6r att \u2013 det \u00e4r bekv\u00e4mare, men i stort sett kan man klara sig utan det, man f\u00f6rlorar inte mycket. <\/p>\n<p><\/p>\n<p><em>Det vill s\u00e4ga, om du har praxis, s\u00e5 beh\u00f6vs det inte?<\/em><\/p>\n<p><\/p>\n<p>Helt korrekt. Jag rekommenderar testet av Jez Humble. Jag har en blandad k\u00e4nsla ang\u00e5ende den sista punkten. Men generellt, om du har tre saker; du sl\u00e5r samman konstant, du k\u00f6r tester p\u00e5 commits i master, och fixar bygget snabbt i master, d\u00e5 kanske du inte beh\u00f6ver n\u00e5got mer. <\/p>\n<p><\/p>\n<p><em>Medan vi v\u00e4ntar p\u00e5 fr\u00e5gor fr\u00e5n deltagarna, har jag en fr\u00e5ga. Vi har nu pratat om produktkod. Har du anv\u00e4nt det f\u00f6r infrastrukturkod? \u00c4r det samma slags kod, med samma principer och livscykel, eller finns det andra livscykler och principer? Vanligtvis n\u00e4r alla pratar om Continuous Integration och Development, gl\u00f6mmer man att det ocks\u00e5 finns infrastrukturkod. Och p\u00e5 senaste tiden har det \u00f6kat mer och mer. B\u00f6r vi f\u00f6ra in alla dessa regler d\u00e4r?<\/em><\/p>\n<p><\/p>\n<p>Det handlar inte bara om att det b\u00f6r g\u00f6ras, det skulle vara fantastiskt, eftersom det verkligen skulle f\u00f6renkla livet. S\u00e5 fort vi arbetar med kod, inte med bash-skript, utan vi har normal kod.<\/p>\n<p><\/p>\n<p><em>Stopp-stop, bash-skript \u00e4r ocks\u00e5 kod. R\u00f6r inte min gamla k\u00e4rlek.<\/em> <\/p>\n<p><\/p>\n<p>Bra, jag ska inte trampa p\u00e5 dina minnen. Jag har en personlig aversion mot bash. Det kraschar p\u00e5 ett fult och skr\u00e4mmande s\u00e4tt hela tiden. Och det kraschar ofta of\u00f6ruts\u00e4gbart, s\u00e5 jag gillar det inte. Men okej, l\u00e5t oss s\u00e4ga att du har kod i bash. Kanske har jag verkligen ingen aning, och det finns bra testframeworks d\u00e4r. Jag \u00e4r bara inte insatt. Och vi f\u00e5r samma f\u00f6rdelar.<\/p>\n<p><\/p>\n<p>N\u00e4r vi v\u00e4l hanterar infrastruktur som kod f\u00e5r vi alla samma problem som utvecklare. F\u00f6r n\u00e5gra m\u00e5nader sedan st\u00f6tte jag p\u00e5 en situation d\u00e4r en kollega skickade en pull request p\u00e5 1 000 rader bash. Och du fastnar p\u00e5 granskningen i 4 timmar. Problemen \u00e4r desamma. Det \u00e4r fortfarande kod. Och fortfarande samarbete. Vi fastnar med pull requests och vi fastnar med att reda ut samma sammanslagningskonflikter i bash, till exempel. <\/p>\n<p><\/p>\n<p>Just nu tittar jag v\u00e4ldigt aktivt p\u00e5 allt detta med att programmera infrastrukturen p\u00e5 det mest eleganta s\u00e4ttet. Jag har just integrerat Pulumi i infrastrukturen. Det \u00e4r ren programmering. D\u00e4r \u00e4r det \u00e4nnu mer tilltalande, eftersom jag har alla spr\u00e5kets m\u00f6jligheter, dvs. jag gjorde snygga toggles med samma if-satser mitt p\u00e5 plan. S\u00e5 mitt f\u00f6r\u00e4ndring finns redan i master. Alla kan se det. Andra ingenj\u00f6rer \u00e4r medvetna om det. Det har redan p\u00e5verkat n\u00e5got. Men det har inte aktiverats f\u00f6r alla infrastrukturer. Det har aktiverats f\u00f6r mina testmilj\u00f6er, till exempel. S\u00e5 f\u00f6r att svara p\u00e5 din fr\u00e5ga igen, det beh\u00f6vs. Det f\u00f6renklar verkligen livet f\u00f6r oss ingenj\u00f6rer som arbetar med kod. <\/p>\n<p><\/p>\n<p><em>\u00c4r det n\u00e5gra fler fr\u00e5gor?<\/em> <\/p>\n<p><\/p>\n<p>Jag har en fr\u00e5ga. Jag vill forts\u00e4tta diskussionen med Oleg. Generellt sett tycker jag att du har r\u00e4tt; om en uppgift tar en m\u00e5nad att g\u00f6ra, s\u00e5 har du problem med arkitekturen, du har problem med analys, dekonstruktion, planering, osv. Men jag har en k\u00e4nsla av att om du b\u00f6rjar f\u00f6rs\u00f6ka leva efter Continuous Integration, s\u00e5 kommer du att b\u00f6rja \u00e5tg\u00e4rda sm\u00e4rtorna med planeringen, f\u00f6r du kan inte undkomma det. <\/p>\n<p><\/p>\n<p><em>(Oleg) Ja, s\u00e5 \u00e4r det. Denna praktik \u00e4r j\u00e4mf\u00f6rbar i arbetsinsats med andra allvarliga metoder som f\u00f6r\u00e4ndrar kulturen. Det sv\u00e5raste att \u00f6vervinna \u00e4r vanor, s\u00e4rskilt d\u00e5liga vanor. Och om det kr\u00e4vs en betydande f\u00f6r\u00e4ndring av vanorna hos de runt omkring: utvecklare, ledning, produktionschef, d\u00e5 kan ni f\u00f6rv\u00e4nta er \u00f6verraskningar.<\/em> <\/p>\n<p><\/p>\n<p><em>Vilka \u00f6verraskningar kan det vara? L\u00e5t oss s\u00e4ga att du best\u00e4mmer att du ska g\u00f6ra integration oftare. Och under integrationen \u00e4r det anslutna saker, till exempel artefakter. I ditt f\u00f6retag finns det en policy att varje artefakt m\u00e5ste registreras p\u00e5 n\u00e5got s\u00e4tt i ett system f\u00f6r lagring av artefakter. Och det tar en viss tid. En person m\u00e5ste checka av att han, som release manager, har testat denna artefakt f\u00f6r att den \u00e4r redo f\u00f6r produktion. Om det tar 5-10-15 minuter, men du g\u00f6r utrullningar en g\u00e5ng i veckan, d\u00e5 inneb\u00e4r det att du en g\u00e5ng i veckan spenderar en halvtimme \u2013 en liten skatt.<\/em> <\/p>\n<p><\/p>\n<p><em>Om du g\u00f6r Continuous Integration 10 g\u00e5nger om dagen, s\u00e5 beh\u00f6ver du multiplicera 10 g\u00e5nger med 30 minuter. Och det \u00f6verskrider arbetsvolymen f\u00f6r denna release manager. Han blir helt enkelt tr\u00f6tt p\u00e5 det. Det finns st\u00e4ndiga kostnader f\u00f6r vissa metoder. Och s\u00e5 \u00e4r det.<\/em> <\/p>\n<p><\/p>\n<p><em>Och du m\u00e5ste antingen avskaffa denna regel s\u00e5 att du inte sysslar med s\u00e5dant nonsens, dvs. att du inte manuellt bed\u00f6mer \u00f6verensst\u00e4mmelse mellan n\u00e5got och n\u00e5got. Du litar helt och h\u00e5llet p\u00e5 en automatiserad upps\u00e4ttning tester f\u00f6r beredskap.<\/em> <\/p>\n<p><\/p>\n<p><em>Och om du beh\u00f6ver en bekr\u00e4ftelse fr\u00e5n n\u00e5gon, s\u00e5 att chefen godk\u00e4nner, och du inte r\u00f6r vid produktionen utan att Vasja s\u00e4ger att det \u00e4r okej, o.s.v. \u2013 allt detta st\u00e5r i v\u00e4gen f\u00f6r metoder. F\u00f6r om det finns relaterade aktiviteter som en sorts skatt, s\u00e5 \u00f6kar allt hundrafaldigt. D\u00e4rf\u00f6r kommer f\u00f6r\u00e4ndringen ofta inte att v\u00e4lkomnas av alla. Eftersom det \u00e4r sv\u00e5rt att \u00e4ndra m\u00e4nniskors vanor.<\/em> <\/p>\n<p><\/p>\n<p><em>N\u00e4r en person utf\u00f6r sitt vanliga arbete g\u00f6r han det n\u00e4stan utan att t\u00e4nka. Den kognitiva belastningen \u00e4r n\u00e4ra noll. Han str\u00e4var fram\u00e5t med det som redan \u00e4r f\u00e4rdigt, han har en checklista i huvudet, han har gjort det tusen g\u00e5nger. Och s\u00e5 fort du kommer och s\u00e4ger till honom: \"L\u00e5t oss avskaffa denna praktik och inf\u00f6ra en ny fr\u00e5n m\u00e5ndag\" blir det en betydande kognitiv belastning f\u00f6r honom. Den intr\u00e4ffar dessutom f\u00f6r alla p\u00e5 en g\u00e5ng.<\/em> <\/p>\n<p><\/p>\n<p><em>D\u00e4rf\u00f6r \u00e4r det enklaste, \u00e4ven om denna lyx inte alla har r\u00e5d med, n\u00e5got jag alltid g\u00f6r. Det \u00e4r f\u00f6ljande: N\u00e4r ett nytt projekt startar, trycks ofta alla opr\u00f6vade metoder in i det projektet. S\u00e5 l\u00e4nge projektet \u00e4r ungt riskerar vi inte mycket. Det finns ingen produktion \u00e4n, det g\u00e5r inte att f\u00f6rst\u00f6ra n\u00e5got. D\u00e4rf\u00f6r kan det anv\u00e4ndas som tr\u00e4ning. Denna metod fungerar. Men inte alla f\u00f6retag har m\u00f6jlighet att ofta starta s\u00e5dana projekt. \u00c4ven om det \u00e4r lite konstigt, eftersom det p\u00e5g\u00e5r en digital transformation \u00f6verallt, alla borde experimentera f\u00f6r att h\u00e4nga med konkurrenterna.<\/em> <\/p>\n<p><\/p>\n<p>H\u00e4r st\u00f6ter du p\u00e5 det faktum att du m\u00e5ste ha en f\u00f6rst\u00e5else f\u00f6r vad du beh\u00f6ver g\u00f6ra fr\u00e5n b\u00f6rjan. V\u00e4rlden \u00e4r inte perfekt, och produktionen \u00e4r inte perfekt heller. <\/p>\n<p><\/p>\n<p><em>Ja, dessa saker \u00e4r kopplade till varandra.<\/em><\/p>\n<p><\/p>\n<p>F\u00f6retag har inte alltid en f\u00f6rst\u00e5else f\u00f6r att de m\u00e5ste g\u00e5 just dit. <\/p>\n<p><\/p>\n<p><em>Det finns situationer d\u00e4r inga f\u00f6r\u00e4ndringar \u00e4r m\u00f6jliga \u00f6verhuvudtaget. Det \u00e4r en situation d\u00e4r st\u00f6rre press l\u00e4ggs p\u00e5 teamet. Teamet \u00e4r redan ganska utbr\u00e4nt. Det har ingen tid kvar f\u00f6r n\u00e5gra experiment. De jobbar hela dagen med funktioner. Och ledningen \u00e4r alltid otillfredsst\u00e4lld med funktionerna. Det kr\u00e4vs mer och mer. I en s\u00e5dan situation \u00e4r inga f\u00f6r\u00e4ndringar m\u00f6jliga. Teamet kan endast f\u00e5 veta att imorgon ska vi g\u00f6ra som vi gjorde ig\u00e5r, bara att vi beh\u00f6ver leverera lite fler funktioner. Inga \u00f6verg\u00e5ngar till n\u00e5gra metoder \u00e4r d\u00e4rf\u00f6r m\u00f6jliga. Det \u00e4r en klassisk situation d\u00e4r det inte finns tid att slipa en yxa, man m\u00e5ste hugga ner tr\u00e4d, s\u00e5 man hugger med en trubbig yxa. H\u00e4r finns det inga enkla r\u00e5d.<\/em> <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Jag l\u00e4ser upp en klarg\u00f6rande kommentar fr\u00e5n chatten: \"Men det beh\u00f6vs ett stort testt\u00e4cke p\u00e5 olika niv\u00e5er. Hur mycket tid \u00e4gnas \u00e5t tester? Det verkar ganska dyrt, det tar mycket tid.\"<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg) Det h\u00e4r \u00e4r en klassisk missuppfattning. Det borde finnas tillr\u00e4ckligt med tester s\u00e5 att ni sj\u00e4lva har f\u00f6rtroende. Continuous Integration \u00e4r inte en s\u00e5dan sak d\u00e4r 100 % av testerna k\u00f6rs f\u00f6rst och sedan b\u00f6rjar ni anv\u00e4nda denna praxis. Continuous Integration minskar den kognitiva belastningen genom att varje f\u00f6r\u00e4ndring ni ser med blotta \u00f6gat \u00e4r s\u00e5 uppenbar att ni f\u00f6rst\u00e5r \u2013 om den bryter n\u00e5got eller inte, \u00e4ven utan tester. Ni kan snabbt testa detta i huvudet, eftersom f\u00f6r\u00e4ndringarna \u00e4r sm\u00e5. \u00c4ven om ni endast har manuella testare \u00e4r det enklare f\u00f6r dem ocks\u00e5. Ni sl\u00e4pper en uppdatering och s\u00e4ger: \"Kolla, har n\u00e5got g\u00e5tt s\u00f6nder?\". De kontrollerar och s\u00e4ger: \"Nej, inget har g\u00e5tt s\u00f6nder\". Eftersom testaren vet var de ska titta. Ni har en commit kopplad till ett specifikt kodstycke. Och det exponerar ett konkret beteende.<\/em><\/p>\n<p><\/p>\n<p>H\u00e4r har du, f\u00f6rst\u00e5s, \u00f6verdrivit. <\/p>\n<p><\/p>\n<p><em>(Dmitry) H\u00e4r h\u00e5ller jag inte med. Det finns en praxis \u2013 testdriven utveckling som faktiskt kommer att r\u00e4dda oss fr\u00e5n detta.<\/em> <\/p>\n<p><\/p>\n<p><em>(Oleg) Ja, jag har inte kommit s\u00e5 l\u00e5ngt \u00e4n. Den f\u00f6rsta illusionen \u00e4r att man m\u00e5ste skriva 100 % tester eller inte alls syssla med Continuous Integration. Det \u00e4r en l\u00f6gn. Det h\u00e4r \u00e4r tv\u00e5 parallella praktiker. Och de \u00e4r inte direkt beroende av varandra. Ert testt\u00e4cke b\u00f6r vara optimalt. Optimalt betyder att ni sj\u00e4lva \u00e4r s\u00e4kra p\u00e5 att den kvalitet av huvudkoden som kvarst\u00e5r efter er commit till\u00e5ter er att trycka p\u00e5 knappen \"Deploy\" p\u00e5 fredag kv\u00e4ll, \u00e4ven om ni \u00e4r berusade. Hur uppn\u00e5r ni detta? Genom granskningar, genom t\u00e4ckning, genom bra \u00f6vervakning.<\/em> <\/p>\n<p><\/p>\n<p><em>Bra \u00f6vervakning \u00e4r inte skillnad fr\u00e5n tester. Om ni k\u00f6r tester en g\u00e5ng p\u00e5 pre-prod, s\u00e5 kontrollerar de era anv\u00e4ndarscenarier en g\u00e5ng och s\u00e5 enkelt \u00e4r det. Men om ni k\u00f6r dem i en o\u00e4ndlig slinga, d\u00e5 \u00e4r det ert utbyggda \u00f6vervakningssystem som testar allt o\u00e4ndligt \u2013 om det har kraschat eller inte. I detta fall \u00e4r skillnaden bara i eng\u00e5ngs- eller flerg\u00e5ngsk\u00f6rning. En mycket bra upps\u00e4ttning tester..., som k\u00f6rs o\u00e4ndligt, \u00e4r \u00f6vervakning. Och korrekt \u00f6vervakning b\u00f6r vara s\u00e5.<\/em> <\/p>\n<p><\/p>\n<p><em>Och d\u00e4rf\u00f6r, hur ni exakt ska n\u00e5 detta tillst\u00e5nd d\u00e4r ni kan deploya p\u00e5 fredag kv\u00e4ll och g\u00e5 hem \u00e4r en annan fr\u00e5ga. Kanske \u00e4r ni helt enkelt en modig idiot.<\/em> <\/p>\n<p><\/p>\n<p>L\u00e5t oss g\u00e5 tillbaka lite till Continuous Integration. Vi har avvikit n\u00e5got till en annan komplex praktik. <\/p>\n<p><\/p>\n<p><em>Och den andra illusionen \u00e4r att MVP s\u00e4gs vara n\u00e5got man m\u00e5ste g\u00f6ra snabbt, s\u00e5 tester beh\u00f6vs \u00f6verhuvudtaget inte. Det \u00e4r inte riktigt s\u00e5. Faktum \u00e4r att n\u00e4r du skriver en user story i MVP, s\u00e5 kan du utveckla den antingen helt p\u00e5 m\u00e5f\u00e5, dvs. du h\u00f6r att det finns en viss user story och springer direkt f\u00f6r att koda den, eller arbeta enligt TDD. Och enligt TDD, som erfarenheten visar, tar det inte l\u00e4ngre tid, dvs. tester \u00e4r en bieffekt. TDD-praktiken handlar inte om att testa. Trots namnet Test Driven Development handlar det \u00f6verhuvudtaget inte om tester. Det \u00e4r mer en arkitekturmetod. Det handlar om att skriva det som verkligen beh\u00f6vs och inte skriva det som inte beh\u00f6vs. Denna praktik fokuserar p\u00e5 n\u00e4sta iteration av dina tankar n\u00e4r det g\u00e4ller att skapa applikationens arkitektur.<\/em> <\/p>\n<p><\/p>\n<p><em>S\u00e5 det \u00e4r inte s\u00e5 enkelt att bli av med dessa illusioner. MVP och tester mots\u00e4ger inte varandra. Snarare tv\u00e4rtom, om du g\u00f6r MVP enligt TDD-praktiken, kommer du att g\u00f6ra det b\u00e4ttre och snabbare \u00e4n om du g\u00f6r det helt utan praktik och p\u00e5 m\u00e5f\u00e5.<\/em><\/p>\n<p><\/p>\n<p>Det \u00e4r en v\u00e4ldigt otydlig och komplex tanke. N\u00e4r du h\u00f6r att nu ska jag skriva ytterligare tester och samtidigt kommer jag att g\u00f6ra n\u00e5got snabbare, l\u00e5ter det helt orealistiskt. <\/p>\n<p><\/p>\n<p><em>(Dmitrij) M\u00e5nga n\u00e4r de pratar om MVP, det \u00e4r bara f\u00f6r att folk \u00e4r f\u00f6r lata f\u00f6r att skriva n\u00e5got bra. Och det \u00e4r verkligen tv\u00e5 olika saker. Man b\u00f6r inte f\u00f6rvandla MVP till n\u00e5got d\u00e5ligt som inte fungerar.<\/em> <\/p>\n<p><\/p>\n<p>Ja, du har r\u00e4tt.<\/p>\n<p><\/p>\n<p><em>Och pl\u00f6tsligt \u00e4r MVP i produktion.<\/em><\/p>\n<p><\/p>\n<p>F\u00f6r alltid. <\/p>\n<p><\/p>\n<p>Och TDD l\u00e5ter v\u00e4ldigt ovanligt n\u00e4r man h\u00f6r att du skriver tester och verkar g\u00f6ra mer arbete. Det l\u00e5ter v\u00e4ldigt konstigt, men faktiskt g\u00f6r det att det g\u00e5r snabbare och ser b\u00e4ttre ut. N\u00e4r du skriver ett test t\u00e4nker du redan mycket p\u00e5 vilken kod och hur den kommer att kallas, samt vilket beteende vi f\u00f6rv\u00e4ntar oss av den. Du s\u00e4ger inte bara att jag har skrivit en funktion och den g\u00f6r n\u00e5got. Du t\u00e4nker f\u00f6rst p\u00e5 att den har vissa villkor, den kommer att kallas p\u00e5 ett visst s\u00e4tt. Du t\u00e4cker det med tester och fr\u00e5n det f\u00f6rst\u00e5r du hur dina gr\u00e4nssnitt i din kod kommer att se ut. Det p\u00e5verkar verkligen arkitekturen. Din kod blir automatiskt mer modul\u00e4r, eftersom du f\u00f6rst f\u00f6rs\u00f6ker f\u00f6rst\u00e5 hur du kommer att testa den, och f\u00f6rst d\u00e4refter skriver du den. <\/p>\n<p><\/p>\n<p>Jag hade det s\u00e5 med TDD att jag vid ett tillf\u00e4lle anlitade en mentor i Ruby n\u00e4r jag fortfarande var Ruby-programmerare. Och han sa: \"L\u00e5t oss g\u00f6ra det med TDD.\" Jag t\u00e4nkte: \"\u00c5h nej, jag m\u00e5ste skriva n\u00e5got extra nu.\" Vi kom \u00f6verens om att jag skulle skriva all fungerande kod p\u00e5 Python med TDD under tv\u00e5 veckor. Efter tv\u00e5 veckor ins\u00e5g jag att jag aldrig ville g\u00e5 tillbaka. Genom att f\u00f6rs\u00f6ka till\u00e4mpa det \u00f6verallt under tv\u00e5 veckor f\u00f6rstod jag hur mycket enklare det blev att t\u00e4nka. Men det \u00e4r inte uppenbart, s\u00e5 jag rekommenderar till alla att om ni k\u00e4nner att TDD \u00e4r sv\u00e5rt, l\u00e5ngsamt och \u00f6verfl\u00f6digt, f\u00f6rs\u00f6k att h\u00e5lla p\u00e5 med det i tv\u00e5 veckor. F\u00f6r mig r\u00e4ckte det med tv\u00e5.<\/p>\n<p><\/p>\n<p><em>(Dmitrij) Vi kan utveckla den h\u00e4r tanken utifr\u00e5n infrastrukturen. Innan vi s\u00e4tter ig\u00e5ng n\u00e5got nytt g\u00f6r vi en \u00f6vervakning och d\u00e4refter s\u00e4tter vi ig\u00e5ng. I det h\u00e4r fallet blir \u00f6vervakningen ett normalt test. Och det finns utveckling genom \u00f6vervakning. Men n\u00e4stan alla s\u00e4ger att det tar l\u00e5ng tid, jag orkar inte, jag gjorde ett provisoriskt utkast. Om vi g\u00f6r \u00f6vervakningen ordentligt, f\u00f6rst\u00e5r vi tillst\u00e5ndet f\u00f6r CI-systemet. I CI-systemet finns mycket \u00f6vervakning. Vi f\u00f6rst\u00e5r systemets tillst\u00e5nd, vi vet vad som finns inuti. Under utvecklingen bygger vi just systemet s\u00e5 att det n\u00e5r det \u00f6nskade tillst\u00e5ndet.<\/em> <\/p>\n<p><\/p>\n<p><em>Dessa metoder har l\u00e4nge varit k\u00e4nda. Vi diskuterade dem f\u00f6r fyra \u00e5r sedan. Men \u00f6ver fyra \u00e5r har n\u00e4stan ingenting f\u00f6r\u00e4ndrats.<\/em> <\/p>\n<p><\/p>\n<p><em>Men p\u00e5 denna not vill jag avsluta den officiella diskussionen.<\/em><\/p>\n<p><\/p>\n<p>Video (infogad som medieelement, men av n\u00e5gon anledning fungerar det inte):<\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/zZ3qXVN3Oic\">https:\/\/youtu.be\/zZ3qXVN3Oic<\/a><\/noindex><br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47 Continuous Integration som en praxis, inte Jenkins. Andrey Alexandrov | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/93885","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=93885"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/93885\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/93886"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=93885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=93885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=93885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}