Задача за распоредување се поврзува, ја копира својата артефакт и пријавува успех. Тунелот што го отворила може сè уште да биде активен кога започнува следната задача, а рутата што ја сменила припаѓа на целиот хост. Резултатот од build опишува команда, а не состојбата што ја оставила. Третирајте го VPN како ресурс со животен век, а не како еден ред на почетокот на етапа.

Што друго работи на овој хост

Јазол на Jenkins може истовремено да извршува неколку извршители, а задача што менува рути на хостот, поставки на resolver или системска врска ги менува за сите. Дали друга задача ќе го забележи зависи од политиката за рути и филтрирање, а не од општо правило за VPN. Пристапот до складиштето, пристапот до артефактите и контролниот канал се одделни барања што на runner-от сè уште му се потребни. Додајте ги на списокот цели за распоредување пред да изберете целосен тунел.

Ако контролниот канал треба да го премине тунелот, дизајнот мора свесно да го каже тоа. Откривањето за време на враќање не е план. Запишете ги двата списка: до што задачата мора да стигне приватно и до што runner-от мора да стигне во секој случај.

Дали на оваа задача ѝ треба приватен пристап воопшто?

Прашајте пред да го додадете тунелот дали на етапата на build ѝ е потребен. Приватен агент за распоредување може да донесе одобрен артефакт и да го изврши распоредувањето, што ја држи општата етапа на build надвор од приватната мрежа. Таквото разделување обично е поевтино отколку да се учи секој чекор на build да рутира низ тунел.

Изберете ја границата од работниот тек, а не од навиката. Ако одговорот е не, остатокот од оваа страница е непотребен, и тоа е најдобриот достапен исход.

Состојбата што ја наследува следната задача

Опишете што треба да биде точно пред задачата, додека има приватен пристап и откако ќе заврши, вклучително и откажување. Завршната состојба е онаа што најчесто останува неизречена, и токму неа ја наследува следната задача. Запишете ја до pipeline наместо да ја оставате во нечија меморија.

MomentWhat proves itWhat leaks if it is skipped
Job start: pre-flight route checkThe route table shows no tunnel from an earlier job, and the profile list is emptyA stale route sends deployment traffic into a dead tunnel
Job end: disconnect and shredThe profile is down and the temporary key file is goneThe next job inherits an open tunnel and a usable credential
Cancelled job: reboot or disposalThe host is replaced or rebooted before the next job startsA killed process leaves the tunnel up with no owner

Посветен или еднократен агент ги прави тие граници полесно спроведливи. Контејнер или именски простор помага само ако неговиот мрежен и привилегиран распоред навистина ја изолира промената.

Запрете ја врската, а не програмата

Користете ја патеката за завршување на pipeline за да ја затворите врската што ја започнала оваа задача и да ги отстраните нејзините привремени акредитиви. Не споредувајте процеси по име на програма на хост што го користат други задачи; запрете ја конкретната врска. Двете команди подолу се целото чистење и ниту една не зависи од наоѓање процес.

vpn-cli disconnect --profile "$PROFILE"
rm -f "$RUNNER_TEMP/client.key"

Завршувањето не е изолација: runner што ќе умре го задржува отворениот тунел, а процес присилно запрен целосно го прескокнува блокот. Затоа само командата за чистење не може да биде целиот дизајн. Еве како тоа пропаѓа во практика: задача за распоредување се откажува на чекорот за копирање, блокот за завршување никогаш не се извршува, и следната задача на истиот хост започнува со жив тунел и рута што покажува на мрежа до која не може да стигне. Дефектот изгледа како проблем со 'DNS' во следниот build, часови откако завршила задачата што го предизвикала.

Запишете го името на профилот и патеката до акредитивите во излезот на задачата. Гола команда за исклучување без идентификатор тешко се ревидира подоцна. Редот во логот е и она што докажува дека блокот се извршил кога подоцнежна истрага го праша.

Дајте ѝ на задачата хост што никој друг не го користи

Еднократната инфраструктура го отстранува проблемот со наследство наместо да го управува. Нов агент за секоја задача започнува без рута, без профил и без туѓи акредитиви, а неговото уништување го чисти сето што задачата го оставила. Тоа чини повеќе по build, и тоа е чесната цена на граница што не зависи од код за чистење. За задачи што допираат производствени мрежи, тоа обично е поевтината опција кога инцидентите ќе се избројат.

Каде што споделен runner мора да остане, тестирајте го неуспехот и откажувањето исто толку внимателно како успешното копирање. Тестот треба да покаже што би видела следната задача ако оваа била откажана на половина пат. Задачата е готова кога нејзиниот пристап и привремената состојба завршиле, а не кога командата за копирање враќа нула.

Поврзани статии