VPN за CI раннер: да ли тунел надживљава build?
Дељени CI раннер задржава руте и процесе између послова. Планирајте стања VPN-а пре посла, током њега и после, и очистите само везу коју посао поседује.
Посао за објављивање повеже се, копира свој артефакт и пријави успех. Тунел који је отворио може и даље бити активан када почне следећи посао, а рута коју је променио припада целом хосту. Резултат build-а описује команду, а не стање које је оставио за собом. Третирајте VPN као ресурс са животним веком, а не као један ред на почетку фазе.
Шта још ради на овом хосту
Чвор Jenkins-а може да покрене више извршилаца одједном, а посао који мења руте хоста, подешавања resolver-а или системску везу мења их за све. Да ли ће други посао то приметити зависи од политике рута и филтрирања, а не од општег правила о VPN-овима. Приступ репозиторијуму, приступ артефактима и контролни канал су одвојени захтеви који су раннеру и даље потребни. Додајте их на листу одредишта за објављивање пре него што изаберете пуни тунел.
Ако би контролни канал ишао кроз тунел, дизајн то мора свесно да каже. Откривање тога током враћања уназад није план. Запишите две листе: до чега посао мора да стигне приватно и до чега раннер мора да стигне без обзира на све.
Да ли је овом послу приватни приступ уопште потребан?
Питајте пре него што додате тунел да ли је фази build-а потребан. Приватни агент за објављивање може да преузме одобрени артефакт и обави објављивање, што општу фазу build-а држи ван приватне мреже. Та подела је обично јефтинија од тога да сваки корак build-а учите да иде кроз тунел.
Границу бирајте из радног тока, а не из навике. Ако је одговор не, остатак ове странице је непотребан, а то је најбољи доступни исход.
Стање које наслеђује следећи посао
Опишите шта треба да буде тачно пре посла, док има приватни приступ, и након што се заврши, укључујући отказивање. Завршно стање је оно које најчешће остаје неизречено, и оно које наслеђује следећи посао. Запишите га поред pipeline-а уместо да га остављате у нечијем сећању.
| 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 |
Наменски или једнократни агент олакшава спровођење тих граница. Контејнер или именски простор помаже само ако његов мрежни и привилеговани распоред заиста изолује промену.
Зауставите везу, а не програм
Користите пут завршетка pipeline-а да затворите везу коју је овај посао започео и уклоните његове привремене акредитиве. Не упарујте процесе по имену програма на хосту који користе други послови; зауставите конкретну везу. Две команде испод су цело чишћење и ниједна не зависи од проналажења процеса.
vpn-cli disconnect --profile "$PROFILE"
rm -f "$RUNNER_TEMP/client.key"
Завршетак није изолација: раннер који умре задржава тунел који је отворио, а процес који је насилно заустављен прескаче блок у потпуности. Зато команда за чишћење сама не може бити цео дизајн. Ево како то пада у пракси: посао за објављивање се откаже на кораку копирања, блок завршетка се никада не изврши, а следећи посао на истом хосту почиње са живим тунелом и рутом која показује на мрежу до које не може да дође. Квар изгледа као проблем са 'DNS'-ом у следећем build-у, сатима након што је посао који га је изазвао завршио.
Забележите име профила и путању акредитива у излазу посла. Гола команда за прекид везе без идентификатора тешко се касније ревидира. Ред у логу је и оно што доказује да је блок радио када каснија истрага то затражи.
Дајте послу хост који нико други не користи
Једнократна инфраструктура уклања проблем наслеђивања уместо да њиме управља. Свеж агент по послу почиње без руте, без профила и без туђих акредитива, а његово уништење очисти све што је посао оставио. То кошта више по build-у и то је поштена цена границе која не зависи од кода за чишћење. За послове који додирују продукционе мреже, то је обично јефтинија опција када се инциденти преброје.
Тамо где дељени раннер мора да остане, тестирајте неуспех и отказивање једнако пажљиво као успешно копирање. Тест треба да покаже шта би следећи посао видео да је овај отказан на пола пута. Посао је готов када су његов приступ и привремено стање завршени, а не када команда за копирање врати нулу.