VPN pro CI runner: přežije tunel build?
Sdílený CI runner si mezi úlohami drží trasy i procesy. Naplánujte stavy VPN před úlohou, během ní a po ní a uklízejte jen spojení, které úloze patří.
Úloha nasazení se připojí, zkopíruje svůj artefakt a ohlásí úspěch. Tunel, který otevřela, může být stále aktivní, když začne další úloha, a trasa, kterou změnila, patří celému hostiteli. Výsledek buildu popisuje příkaz, ne stav, který po sobě zanechal. Berte VPN jako prostředek s životností, ne jako jeden řádek na začátku fáze.
Co dalšího na tomto hostiteli běží
Uzel Jenkins může spouštět několik exekutorů najednou a úloha, která mění trasy hostitele, nastavení resolveru nebo systémové spojení, je mění pro všechny. Zda si toho jiná úloha všimne, závisí na politice tras a filtrování, ne na obecném pravidle o VPN. Přístup k repozitáři, přístup k artefaktům a řídicí kanál jsou samostatné požadavky, které runner stále potřebuje. Přidejte je do seznamu cílů nasazení, než zvolíte plný tunel.
Pokud by řídicí kanál měl procházet tunelem, návrh to musí říct vědomě. Objevit to při návratu zpět není plán. Zapište oba seznamy: čeho musí úloha dosáhnout soukromě a čeho musí runner dosáhnout bez ohledu na to.
Potřebuje tato úloha vůbec soukromý přístup?
Než tunel přidáte, zeptejte se, zda ho fáze buildu potřebuje. Soukromý agent pro nasazení může stáhnout schválený artefakt a provést nasazení, což drží obecnou fázi buildu mimo soukromou síť. Takové rozdělení je obvykle levnější než učit každý krok buildu směrovat přes tunel.
Hranici vybírejte z pracovního postupu, ne ze zvyku. Pokud je odpověď ne, zbytek této stránky je zbytečný, a to je nejlepší dostupný výsledek.
Stav, který zdědí další úloha
Popište, co má platit před úlohou, dokud má soukromý přístup, a po jejím skončení, včetně zrušení. Koncový stav je ten, který nejčastěji zůstává nevyslovený, a právě ten dědí další úloha. Zapište ho vedle pipeline, místo abyste ho nechávali v něčí paměti.
| 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 |
Vyhrazený nebo jednorázový agent usnadňuje prosazení těchto hranic. Kontejner nebo jmenný prostor pomůže jen tehdy, když jeho síťové a privilegované uspořádání změnu skutečně izoluje.
Zastavte spojení, ne program
Použijte cestu dokončení pipeline k uzavření spojení, které tato úloha zahájila, a k odstranění jejích dočasných přihlašovacích údajů. Nepárujte procesy podle názvu programu na hostiteli, který používají jiné úlohy; zastavte konkrétní spojení. Dva příkazy níže jsou celé čištění a ani jeden nezávisí na nalezení procesu.
vpn-cli disconnect --profile "$PROFILE"
rm -f "$RUNNER_TEMP/client.key"
Dokončení není izolace: runner, který zemře, si otevřený tunel ponechá, a proces násilně zastavený blok úplně přeskočí. Proto samotný příkaz pro čištění nemůže být celý návrh. Takto to v praxi selhává: úloha nasazení se zruší u kroku kopírování, blok dokončení se nikdy nespustí a další úloha na stejném hostiteli začne s živým tunelem a trasou, která míří do sítě, kam se nedostane. Selhání vypadá jako problém s 'DNS' v dalším buildu, hodiny poté, co úloha, která ho způsobila, skončila.
Zaznamenejte název profilu a cestu k přihlašovacím údajům do výstupu úlohy. Holý příkaz pro odpojení bez identifikátoru se později těžko audituje. Řádek v logu je také to, co prokáže, že blok proběhl, když se na to pozdější vyšetřování zeptá.
Dejte úloze hostitele, kterého nikdo jiný nepoužívá
Jednorázová infrastruktura problém dědictví odstraňuje, místo aby ho řídila. Nový agent pro každou úlohu začíná bez trasy, bez profilu a bez cizích přihlašovacích údajů a jeho zničení uklidí, co úloha zanechala. To stojí víc na build a je to poctivá cena hranice, která nezávisí na úklidovém kódu. U úloh, které se dotýkají produkčních sítí, je to obvykle levnější varianta, jakmile se incidenty spočítají.
Tam, kde sdílený runner musí zůstat, testujte selhání a zrušení stejně pečlivě jako úspěšné kopírování. Test má ukázat, co by další úloha viděla, kdyby tato byla zrušena v polovině. Úloha je hotová, když skončil její přístup a dočasný stav, ne když příkaz pro kopírování vrátí nulu.