CI runnerio VPN: ar tunelis pergyvena build'ą?
Bendras CI runneris tarp užduočių išlaiko maršrutus ir procesus. Suplanuokite VPN būsenas prieš užduotį, jos metu ir po jos, o tvarkykite tik tą ryšį, kuris priklauso užduočiai.
Diegimo užduotis prisijungia, nukopijuoja savo artefaktą ir praneša apie sėkmę. Jos atidarytas tunelis gali vis dar būti aktyvus, kai prasideda kita užduotis, o pakeistas maršrutas priklauso visam hostui. Build'o rezultatas aprašo komandą, o ne būseną, kurią paliko. Traktuokite VPN kaip išteklių su gyvavimo trukme, o ne kaip vieną eilutę etapo pradžioje.
Kas dar veikia šiame hoste
Jenkins mazgas gali vienu metu vykdyti kelis vykdytojus, o užduotis, kuri keičia hosto maršrutus, resolverio nustatymus ar sisteminį ryšį, keičia juos visiems. Ar kita užduotis tai pastebės, priklauso nuo maršrutų ir filtravimo politikos, o ne nuo bendros taisyklės apie VPN. Prieiga prie saugyklos, prieiga prie artefaktų ir valdymo kanalas yra atskiri reikalavimai, kurių runneriui vis dar reikia. Įtraukite juos į diegimo tikslų sąrašą prieš rinkdamiesi visą tunelį.
Jei valdymo kanalas kirstų tunelį, dizainas turi tai pasakyti sąmoningai. Atrasti tai atliekant atsukimą nėra planas. Užrašykite du sąrašus: ką užduotis turi pasiekti privačiai ir ką runneris turi pasiekti bet kokiu atveju.
Ar šiai užduočiai apskritai reikia privačios prieigos?
Paklauskite prieš pridėdami tunelį, ar build'o etapui jo reikia. Privatus diegimo agentas gali gauti patvirtintą artefaktą ir atlikti diegimą, o tai laiko bendrą build'o etapą už privačio tinklo ribų. Toks atskyrimas paprastai pigesnis nei mokyti kiekvieną build'o žingsnį maršrutizuoti per tunelį.
Ribą rinkitės iš darbo eigos, o ne iš įpročio. Jei atsakymas yra ne, likusi šio puslapio dalis nereikalinga, ir tai yra geriausias įmanomas rezultatas.
Būsena, kurią paveldi kita užduotis
Aprašykite, kas turi būti tiesa prieš užduotį, kol ji turi privačią prieigą, ir jai pasibaigus, įskaitant atšaukimą. Galutinė būsena yra ta, kuri dažniausiai paliekama nutylėta, ir būtent ją paveldi kita užduotis. Užrašykite ją šalia pipeline, o ne palikite kieno nors atmintyje.
| Moment | What proves it | What leaks if it is skipped |
|---|---|---|
| Job start: pre-flight route check | The route table shows no tunnel from an earlier job, and the profile list is empty | A stale route sends deployment traffic into a dead tunnel |
| Job end: disconnect and shred | The profile is down and the temporary key file is gone | The next job inherits an open tunnel and a usable credential |
| Cancelled job: reboot or disposal | The host is replaced or rebooted before the next job starts | A killed process leaves the tunnel up with no owner |
Skirtas ar vienkartinis agentas palengvina tų ribų laikymąsi. Konteineris ar vardų erdvė padeda tik jei jos tinklo ir teisių išdėstymas tikrai izoliuoja pokytį.
Stabdykite ryšį, o ne programą
Naudokite pipeline užbaigimo kelią, kad uždarytumėte ryšį, kurį pradėjo ši užduotis, ir pašalintumėte jos laikinus prisijungimo duomenis. Nesutapkinkite procesų pagal programos pavadinimą hoste, kurį naudoja kitos užduotys; sustabdykite konkretų ryšį. Dvi komandos žemiau yra visas valymas, ir nė viena nepriklauso nuo proceso radimo.
vpn-cli disconnect --profile "$PROFILE"
rm -f "$RUNNER_TEMP/client.key"
Užbaigimas nėra izoliacija: mirštantis runneris palieka atidarytą tunelį, o jėga sustabdytas procesas visiškai praleidžia bloką. Todėl vien valymo komanda negali būti visas dizainas. Štai kaip tai sugenda praktiškai: diegimo užduotis atšaukiama kopijavimo žingsnyje, užbaigimo blokas niekada neįvyksta, o kita užduotis tame pačiame hoste pradedama su gyvu tuneliu ir maršrutu, rodančiu į tinklą, kurio ji negali pasiekti. Gedimas atrodo kaip 'DNS' problema kitame build'e, valandomis po to, kai pasibaigė jį sukėlusi užduotis.
Įrašykite profilio pavadinimą ir prisijungimo duomenų kelią į užduoties išvestį. Nuoga atsijungimo komanda be identifikatoriaus vėliau sunkiai audituojama. Žurnalo eilutė taip pat yra tai, kas įrodo, kad blokas įvyko, kai vėlesnis tyrimas to paklausia.
Duokite užduočiai hostą, kurio niekas kitas nenaudoja
Vienkartinė infrastruktūra pašalina paveldėjimo problemą, o ne ją valdo. Naujas agentas kiekvienai užduočiai pradedamas be maršruto, be profilio ir be svetimų prisijungimo duomenų, o jo sunaikinimas sutvarko tai, ką užduotis paliko. Tai brangiau už kiekvieną build'ą, ir tai yra sąžininga kaina už ribą, kuri nepriklauso nuo valymo kodo. Užduotims, kurios liečia produkcinius tinklus, tai paprastai pigesnis variantas, kai incidentai suskaičiuojami.
Kur bendras runneris turi likti, testuokite gedimą ir atšaukimą taip pat kruopščiai kaip sėkmingą kopijavimą. Testas turėtų parodyti, ką matytų kita užduotis, jei ši būtų atšaukta pusiaukelėje. Užduotis baigta, kai baigėsi jos prieiga ir laikina būsena, o ne kai kopijavimo komanda grąžina nulį.