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, tokom i poslije posla i poč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 komandu, a ne stanje koje je ostavio za sobom. Tretirajte VPN kao resurs s trajanjem, a ne kao jedan red na početku faze.
Šta još radi na ovom hostu
Jenkins čvor može pokretati nekoliko izvršilaca 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 su odvojeni zahtjevi koji su runneru još potrebni. Dodajte ih na listu odredišta isporuke prije nego odaberete puni tunel.
Ako bi kontrolni kanal išao kroz tunel, dizajn to mora svjesno reći. Otkrivanje toga tokom vraćanja nije plan. Zapišite dvije liste: 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 da li je fazi builda potreban. Privatni agent za isporuku može preuzeti odobreni artefakt i obaviti isporuku, što opću fazu builda drži izvan privatne mreže. Ta podjela je 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 šta treba biti tač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 pored pipeline-a 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 privilegovani raspored zaista izoluje promjenu.
Zaustavite vezu, a ne program
Koristite put završetka pipeline-a 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 komande ispod su cijelo čišćenje i nijedna ne zavisi od pronalaženja 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 komanda za čišćenje sama ne može biti cijeli dizajn. Evo kako to pada u praksi: posao isporuke se otkaže na koraku kopiranja, blok završetka se nikad 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 komanda za prekid veze bez identifikatora teško se kasnije revidira. Red 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 počisti sve što je posao ostavio. To košta više po buildu i to je poštena cijena granice koja ne zavisi od koda 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 šta 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 komanda za kopiranje vrati nulu.