VPN za CI runner: ali tunel preživi build?
Deljeni CI runner med opravili ohranja poti in procese. Načrtujte stanja VPN pred opravilom, med njim in po njem ter počistite samo povezavo, ki jo ima opravilo.
Opravilo uvajanja se poveže, kopira svoj artefakt in sporoči uspeh. Tunel, ki ga je odprlo, je lahko še vedno aktiven, ko se začne naslednje opravilo, in pot, ki jo je spremenilo, pripada celemu gostitelju. Rezultat builda opisuje ukaz, ne stanja, ki ga je pustil za seboj. Obravnavajte VPN kot vir z življenjsko dobo, ne kot eno vrstico na začetku faze.
Kaj še teče na tem gostitelju
Vozlišče Jenkins lahko hkrati izvaja več izvajalcev, opravilo, ki spremeni poti gostitelja, nastavitve razreševalnika ali sistemsko povezavo, pa jih spremeni za vse. Ali bo drugo opravilo to opazilo, je odvisno od politike poti in filtriranja, ne od splošnega pravila o VPN. Dostop do repozitorija, dostop do artefaktov in krmilni kanal so ločene zahteve, ki jih runner še vedno potrebuje. Dodajte jih na seznam ciljev uvajanja, preden izberete polni tunel.
Če naj bi krmilni kanal šel skozi tunel, mora načrt to povedati zavestno. Odkriti to med vračanjem ni načrt. Zapišite oba seznama: do česa mora opravilo priti zasebno in do česa mora runner priti ne glede na vse.
Ali to opravilo sploh potrebuje zasebni dostop?
Preden dodate tunel, vprašajte, ali ga faza builda potrebuje. Zasebni agent za uvajanje lahko pridobi odobreni artefakt in izvede uvajanje, kar splošno fazo builda drži zunaj zasebnega omrežja. Takšna delitev je običajno cenejša od učenja vsakega koraka builda, da gre skozi tunel.
Mejo izberite iz delovnega postopka, ne iz navade. Če je odgovor ne, je preostanek te strani nepotreben, in to je najboljši razpoložljivi izid.
Stanje, ki ga podeduje naslednje opravilo
Opišite, kaj mora veljati pred opravilom, dokler ima zasebni dostop, in po njegovem koncu, vključno s preklicem. Končno stanje je tisto, ki najpogosteje ostane neizrečeno, in prav njega podeduje naslednje opravilo. Zapišite ga ob pipeline, namesto da ga puščate v nekem spominu.
| 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 |
Namenski ali enkratni agent olajša uveljavljanje teh meja. Vsebnik ali imenski prostor pomaga le, če njegova omrežna in privilegijska ureditev spremembo res izolira.
Ustavite povezavo, ne programa
Uporabite pot dokončanja pipeline za zaprtje povezave, ki jo je začelo to opravilo, in za odstranitev njenih začasnih poverilnic. Ne povezujte procesov po imenu programa na gostitelju, ki ga uporabljajo druga opravila; ustavite konkretno povezavo. Ukaza spodaj sta celotno čiščenje in noben ne temelji na iskanju procesa.
vpn-cli disconnect --profile "$PROFILE"
rm -f "$RUNNER_TEMP/client.key"
Dokončanje ni izolacija: runner, ki umre, obdrži tunel, ki ga je odprl, proces, ki je prisilno ustavljen, pa blok povsem preskoči. Zato ukaz za čiščenje sam ne more biti celoten načrt. Tako odpove v praksi: opravilo uvajanja je preklicano pri koraku kopiranja, blok dokončanja se ne izvede nikoli in naslednje opravilo na istem gostitelju se začne z živim tunelom in potjo, ki kaže v omrežje, do katerega ne more priti. Napaka je videti kot težava z 'DNS' v naslednjem buildu, ure po tem, ko se je opravilo, ki jo je povzročilo, končalo.
Zabeležite ime profila in pot do poverilnic v izhod opravila. Goli ukaz za prekinitev povezave brez identifikatorja je pozneje težko revidirati. Vrstica v dnevniku je tudi tisto, kar dokaže, da se je blok izvedel, ko to zahteva poznejša preiskava.
Dajte opravilu gostitelja, ki ga nihče drug ne uporablja
Enkratna infrastruktura odpravi težavo dedovanja, namesto da bi jo upravljala. Svež agent za vsako opravilo se začne brez poti, brez profila in brez tujih poverilnic, njegovo uničenje pa počisti, kar je opravilo pustilo. To stane več na build in to je poštena cena meje, ki ni odvisna od kode za čiščenje. Za opravila, ki se dotikajo produkcijskih omrežij, je to običajno cenejša možnost, ko se incidenti preštejejo.
Kjer mora deljeni runner ostati, preizkusite odpoved in preklic enako skrbno kot uspešno kopiranje. Preizkus naj pokaže, kaj bi naslednje opravilo videlo, če bi bilo to preklicano na pol poti. Opravilo je končano, ko so njegov dostop in začasno stanje končani, ne ko ukaz za kopiranje vrne nič.