VPN za CI runner: preživi li tunel build?
Dijeljeni CI runner zadržava rute i procese između poslova. Planirajte stanja VPN-a prije, tijekom i nakon posla i očistite samo vezu koju posao posjeduje.
Posao za isporuku se povezuje, kopira svoj artefakt i prijavi uspjeh. Tunel koji je otvorio može još biti aktivan kada sljedeći posao počne, a ruta koju je promijenio pripada cijelom hostu. Rezultat builda opisuje naredbu, a ne stanje koje je ostavio za sobom. Tretirajte VPN kao resurs s trajanjem, a ne kao jedan redak na početku faze.
Što još radi na ovom hostu
Jenkins čvor može pokretati nekoliko izvršitelja odjednom, a posao koji mijenja rute hosta, postavke resolvera ili sistemsku vezu mijenja ih za sve. Hoće li drugi posao to primijetiti zavisi od politike ruta i filtriranja, a ne od općeg pravila o VPN-ovima. Pristup repozitoriju, pristup artefaktima i kontrolni kanal odvojeni su zahtjevi koji su runneru još potrebni. Dodajte ih na popis odredišta isporuke prije nego odaberete puni tunel.
Ako bi kontrolni kanal išao kroz tunel, dizajn to mora svjesno reći. Otkrivanje toga tijekom vraćanja nije plan. Zapišite dva popisa: do čega posao mora doći privatno i do čega runner mora doći bez obzira na sve.
Treba li ovom poslu privatni pristup uopće?
Pitajte prije dodavanja tunela treba li ga faza builda. Privatni agent za isporuku može preuzeti odobreni artefakt i obaviti isporuku, što opću fazu builda drži izvan privatne mreže. Ta je podjela obično jeftinija od učenja svakog koraka builda da ide kroz tunel.
Granicu birajte iz toka posla, a ne iz navike. Ako je odgovor ne, ostatak ove stranice je nepotreban, a to je najbolji ishod koji postoji.
Stanje koje nasljeđuje sljedeći posao
Opišite što treba biti točno prije posla, dok ima privatni pristup, i nakon što završi, uključujući otkazivanje. Završno stanje je ono koje najčešće ostaje neizrečeno, i ono koje nasljeđuje sljedeći posao. Zapišite ga uz pipeline umjesto da ga ostavljate u nečijem sjećanju.
| 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 |
Namjenski ili jednokratni agent olakšava provođenje tih granica. Kontejner ili imenski prostor pomaže samo ako njegov mrežni i privilegirani raspored zaista izolira promjenu.
Zaustavite vezu, a ne program
Koristite put završetka pipelinea da zatvorite vezu koju je ovaj posao pokrenuo i uklonite njegove privremene akreditive. Ne uparujte procese po imenu programa na hostu koji koriste drugi poslovi; zaustavite konkretnu vezu. Dvije naredbe ispod su cijelo čišćenje i nijedna ne ovisi o pronalaženju procesa.
vpn-cli disconnect --profile "$PROFILE"
rm -f "$RUNNER_TEMP/client.key"
Završetak nije izolacija: runner koji umre zadržava tunel koji je otvorio, a proces koji je nasilno zaustavljen preskače blok u potpunosti. Zato naredba za čišćenje sama ne može biti cijeli dizajn. Evo kako to pada u praksi: posao isporuke otkaže se na koraku kopiranja, blok završetka nikad se ne izvrši, a sljedeći posao na istom hostu počinje sa živim tunelom i rutom koja pokazuje na mrežu do koje ne može doći. Kvar izgleda kao problem s 'DNS'-om u sljedećem buildu, satima nakon što je posao koji ga je izazvao završio.
Zabilježite ime profila i putanju akreditiva u izlazu posla. Gola naredba za prekid veze bez identifikatora teško se kasnije revidira. Redak u logu je i ono što dokazuje da je blok radio kada kasnija istraga to zatraži.
Dajte poslu host koji nitko drugi ne koristi
Jednokratna infrastruktura uklanja problem nasljeđivanja umjesto da njime upravlja. Svjež agent po poslu počinje bez rute, bez profila i bez tuđih akreditiva, a njegovo uništenje očisti sve što je posao ostavio. To košta više po buildu i to je poštena cijena granice koja ne ovisi o kodu za čišćenje. Za poslove koji dotiču produkcijske mreže, to je obično jeftinija opcija kada se incidenti prebroje.
Tamo gdje dijeljeni runner mora ostati, testirajte neuspjeh i otkazivanje jednako pažljivo kao uspješno kopiranje. Test treba pokazati što bi sljedeći posao vidio da je ovaj otkazan na pola puta. Posao je gotov kada su njegov pristup i privremeno stanje završili, a ne kada naredba za kopiranje vrati nulu.