Infrastruktur som kode: Hvordan vi Fornyet vår utviklings- / frigjøringsprosess for å omfatte teamskalaen vår

(11. desember 2020)

I denne artikkelen viser vi hvordan vi håndterte vår kontinuerlige distribusjonsprosess tidligere, hva som fikk oss til å endre det vi har, og hvilke anstrengelser vi gjorde for å gjøre prosessen så enkel / effektiv som mulig.

Artikkelen kan gi en innledende devops-smak, men i det vesentlige påvirker frigjøringsprosessen alle team og hvordan de fungerer alene eller samarbeide med andre lag, vil vi vise hvordan roller skiftes bare ved å endre prosessen.

Om oss

Vi i Halan hjelper deg med å tilby logistikkløsninger og på forespørsel ( avdrag, levering, betaling online, e-handel) for den underbetjente befolkningen av eksisterende teknologier innen transport og andre tjenester, kan du sjekke ut vår ap p her ( android / iOS )

Gi den gamle prosessen det skyldes, det gode og det dårlige

Vi vil begynne med hvordan vi håndterte prosessen vår tidligere, og hvordan det påvirket oss enten positivt eller negativt.

For teamet mitt har vi nesten alt distribuert over AWS med GitHub som vårt versjonskontrollsystem, så vi må finne ut en måte å sende funksjoner fra GitHub-repoer til AWS-tjenester.

Versjonskontrollering av implementeringer

Vi avhengig av AWS-kodeledning , setter vi utløsere for å starte en distribusjonsrørledning når en ny forpliktelse slås sammen til en av hovedgrenene som representerer de kjente trinnene: dev , prod og iscenesettelse miljøer.

oversikt over hvordan distribusjoner utløses

Denne strømmen betyr at en hvilken som helst funksjon på hovedgrenen er på produksjon, som sikkert gjør sammenslåing for å mestre et tabuemne å diskutere og ikke alle hadde at tillatelse for å fusjonere PR-en din til master.

Samme ting var for andre grener, men det var ikke t virkelig et problem, siden dev og iscenesettelse envs ikke egentlig er så skummelt.

Vår kvalitetssikring begynte å teste og verifisere funksjoner når de slås sammen på iscenesettelsen, noe som betyr at de først tester på iscenesettelses-env, så hvis de er bekreftet , blir funksjonen slått sammen til master grenen. det ser ut til å fungere bra, men la oss se på ulempene ved en slik prosess.

Dette tillot oss å teste og distribuere flere funksjoner samtidig på hvert trinn (dev, iscenesettelse), som er bra og dårlig på samme tid fordi:

  • Det betyr at utviklere ikke trenger å vente på at hverandre skal få kontroll over dev / staging-miljøet.
  • Men det betyr at funksjonene på dev-trinn kunne feilaktig føre til at hverandre ikke fungerer eller arbeid (falske positive), og begge disse tilfellene er veldig dårlige og kan få koden til å gå på produksjon mens den ikke fungerer.

Divergerende filialer, unødvendig omlegging

Som du kanskje allerede har lagt merke til, sa vi det for å distribuere på dev env, du må slå sammen koden din på dev-grenen. Vel, den delen ødela dessverre raskt tidslinjen til grenen vår som:

  • Ikke alle funksjonene som er testet på dev, går i produksjon, så vi hadde som spøkelsesforpliktelser å ligge i vår enhetlige dev-gren .
  • Et eksperimenteringslaboratorium uten tvil, folk kan oppdage at de har gjort noe galt etter en stund, og bestemmer seg for å slippe koden / forplikter og starte en ny, men det gir oss fortsatt sine gamle forpliktelser fusjonert på dev-grenen.

Denne typen oppførsel produserte det vi kaller divergens mellom grener, for å slå sammen en -funksjon gren som har master som sin base til dev, må du løse konflikter ! som er vanskelig rart du bokstavelig talt er i konflikt med spøkelser og løser ting som aldri kommer til å være på produksjon lenger, som helt sikkert gir deg to dårlige alternativer:

  • Bygg en ny gren for funksjonen din som er forkledd fra den opprinnelige funksjonsgrenen og løs konflikter på den, og slå den originale grenen sammen til master når du er ferdig med å teste.
  • Løs konflikter i avdelingen din, og velg deretter dine forpliktelser til en ny gren når du slår seg sammen til master.

Når flere utviklere blir med på teamet vårt, vil ting begynne å bli styggere og divergens vil helt sikkert ta en tur opp.

Fornyelse av bygg / distribusjonsprosessen

Det første vi hadde i tankene er hvordan vi skal bli kvitt de divergerende grenene, vi trenger en ny metode å trygt levere funksjoner til produksjon sømløst og kontrollere hvor mange funksjoner som distribueres på produksjon uten å involvere kildekontroll med distribusjonsvirksomhet.

En liten gjennomgang av AWS

Først må vi identifisere elementer som vil spille en rolle hos oss i prosessen:

  • Github : kildekontroll ha repoer for hver mikrotjeneste der ute.
  • Amazon ECR : et Docker-image-register som er delt inn i «repos», representerer hver repo også en mikrotjeneste og inneholder bildene som har blitt presset for tjenesten X og kan brukes eller distribueres til denne tjenesten direkte for å få den til å fungere.
  • Amazon ECS / EC2 / EKS : det er her våre mikrotjenester bor, sammen med sine omgivelser, er ECS delt inn i klynger, hver klynge har en rekke tjenester hver har oppgavedefinisjon som inneholder informasjon som miljøvariabler , beregne spesifikasjoner, nettverk osv.

Så vi må finne en måte å binde dem sammen for å gjøre det lettere for oss som dev-team å levere funksjoner og for QC å kontrollere og verifisere disse funksjoner.

Vi skjønte at vi kunne definere en mellommannstjeneste, en tjeneste som er ansvarlig for distribusjon av andre tjenester. Vi hadde to hovedkommandoer vi ønsket at denne tjenesten skulle håndtere:

  • Bygg kommando: we ønsker å kunne bygge et bilde og skyve det til ECR fra hvilken som helst gren / forpliktelse vi ønsker fra en viss GitHub-repo til en viss ECR-repo.
  • Distribuere kommando: vi ønsker å kunne distribuere et bestemt bilde fra en repo på ECR til alle klynger som holder tjeneste X.

La oss ta hver av disse kommandoene under mikroskopet og se hva hver av disse involverer, begynner vi med Bygg Kommando:

  • Først og fremst må vi klone repoen ved den angitte forpliktelsen / grenen.
  • Bygg et dockerbilde ved hjelp av Dockerfile i den repoen.
  • Trykk på bygget bilde til ECR repo med en ny tag om nødvendig eller siste.

Selv om alle disse trinnene absolutt er doab le i vår nye distribusjonstjeneste, men vi fant ut at det er tungvint siden bygging av docker bilder bruker mye ressurser og det vil begrense vår nye tjeneste til noen få samtidige distribusjoner eller gjør det så gigantisk i ressurser.

Vi skjønte at vi kunne i stedet for å gjøre alt dette arbeidet på selve tjenesten, vi kunne starte en ny arbeidsflyt Github på den repoen og overfør til alt oppgavedetaljer som hvilken gren du skal kasse og hvilken ECR repo du skal presse til, når den endelig er ferdig, vil den signalisere brukeren tilbake ved hjelp av en nettkrok . Selvfølgelig er det andre løsninger for det, for eksempel Jenkins for bedre sikkerhet for å sikre at koden din bygger på maskiner du administrerer.

Som endret arbeidsflyten vi nevnte ovenfor, går den nå som følger:

  • Motta byggdetaljer fra brukeren.
  • Utløs en Github handling på spesifisert repo.
  • Github-handlinger vil spinne en ny maskin som vil varsle oss om byggestatus når gjort, vil den også merke forpliktelsen med Jira-kortnummer du jobber med.

Andre kommando er Depoly kommando, som er langt enklere enn build-kommandoen, vi her trenger bare å:

  • Motta detaljer om distribusjon fra brukeren.
  • Start en ny distribusjonsoppgave på hver klynge som fortsetter tjenesten og gir image url i ECR.

arbeidsflyt for distribusjon

Det er virkelig det for distribusjon! bare en tilretteleggingsjobb mellom to AWS-produkter, la oss sammenligne denne arbeidsflyten med det vi hadde før, og se hvordan utgivelsesstrategien vår endret seg.

Bruk av den nye prosessen for å distribuere koden din på noen av trinnene (prod, dev, staging) krever ingen form for fusjoner , -koden er helt uavhengig av distribusjon , vi kunne ha 20 funksjoner klare på hovedgrenen og velger bare å distribuere 10 av dem.

Men dette innebærer også at vi bare kan ha en funksjon som testet på dev-grenen med mindre to devs ble enige om å rebase på hverandre.

Distribusjonshistorikk og tagging

Dette ga oss også en bedre tilbakeføring strategi mot produksjonsproblemer. Nå har vi en merket hovedgren for hver funksjon / oppgave vi hadde, når vi står overfor et produksjonsproblem og ønsker å tilbakestille en funksjon, kan vi enkelt navigere tilbake til der denne funksjonen startet, og tilbakestille til kommisjonen før den hvis mulig.

Også som tillot oss å slå sammen alle fungerende funksjoner i hovedgrenen, selv om de ikke skal distribueres, kan vi fremdeles ha dem på master klare for neste serie funksjoner som skal være i produksjon når det er nødvendig, som sikkert vil hjelpe vår teamfokus på å levere oppgaver uten å bekymre seg for når den oppgaven blir slått sammen til master som skal distribueres, her slår vi sammen først og deretter bekymrer oss for distribusjoner.

Neste trinn

Vi jobber for tiden med å automatisere prosessen vår bedre, inkludert miljøvariabler og maskinspesifikasjoner, vil de alle være tilgjengelige som kode når vi endrer spesifikasjonene, som automatisk reflekterer ect på maskinene våre på AWS i den respektive Miljø , ikke nødvendig å håndkode disse verdiene hver gang på AWS.

Med dette vil vi ha bedre kontroll og synlighet på alle våre tjenestekonfigurasjoner, vil alt i infrastrukturen være i kode og ett klikk unna for å oppdatere! også som gjør endring av infrastrukturen uavhengig av tjenesteleverandøren, kan vi for eksempel bytte fra AWS til Google Cloud og trenger bare å endre kommandoene som brukes av distribusjonstjenesten for å distribuere infrastrukturen vår på den nye tjenesteleverandøren.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *