VPN для CI-ранера: ці перажыве тунель зборку?
Агульны CI-ранер захоўвае маршруты і працэсы паміж задачамі. Плануйце станы VPN да задачы, падчас яе і пасля, і прыбірайце толькі тое злучэнне, якім валодае задача.
Задача разгортвання падключаецца, капіюе свой артэфакт і паведамляе пра поспех. Тунель, які яна адкрыла, можа ўсё яшчэ існаваць, калі пачынаецца наступная задача, а маршрут, які яна змяніла, належыць усяму хосту. Вынік зборкі апісвае каманду, а не стан, які яна пакінула пасля сябе. Стаўцеся да VPN як да рэсурсу з часам жыцця, а не як да аднаго радка ў пачатку этапа.
Што яшчэ працуе на гэтым хосце
Вузел Jenkins можа адначасова запускаць некалькі выканаўцаў, і задача, якая змяняе маршруты хоста, налады рэзалвера або сістэмнае злучэнне, змяняе іх для ўсіх. Ці заўважыць гэта іншая задача, залежыць ад палітыкі маршрутызацыі і фільтрацыі, а не ад агульнага правіла пра VPN. Доступ да рэпазіторыя, доступ да артэфактаў і канал кіравання — гэта асобныя патрабаванні, якія ранер усё яшчэ мае. Дадайце іх у спіс прызначэнняў разгортвання перад выбарам поўнага тунеля.
Калі канал кіравання будзе праходзіць праз тунель, дызайн павінен сказаць пра гэта свядома. Выявіць гэта падчас адкату — не план. Запішыце два спісы: чаго задача павінна дасягаць прыватна і чаго ранер павінен дасягаць у любым выпадку.
Ці патрэбен гэтай задачы прыватны доступ наогул?
Спытайце перад даданнем тунеля, ці патрэбны ён этапу зборкі. Прыватны агент разгортвання можа атрымаць зацверджаны артэфакт і выканаць разгортванне, што трымае агульны этап зборкі па-за прыватнай сеткай. Такое раздзяленне звычайна таннейшае, чым вучыць кожны крок зборкі маршрутызавацца праз тунель.
Выбірайце мяжу з працэсу працы, а не з прывычкі. Калі адказ адмоўны, астатняя частка гэтай старонкі непатрэбная, і гэта найлепшы з даступных вынікаў.
Стан, які атрымлівае наступная задача
Апішыце, што павінна быць праўдай перад задачай, пакуль яна мае прыватны доступ, і пасля таго, як яна скончыцца, уключна з адменай. Канчатковы стан — гэта тое, што часцей за ўсё пакідаюць нямым, і менавіта яго атрымлівае наступная задача. Запішыце яго побач з канвеерам, а не пакідайце ў чыёйсьці памяці.
| 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 |
Выдзелены або аднаразовы агент робіць гэтыя межы прасцейшымі для забеспячэння. Кантэйнер або прастора імён дапамагае толькі калі яго сеткавае і прывілеяванае ўладкаванне сапраўды ізалюе змену.
Спыніце злучэнне, а не праграму
Выкарыстайце шлях завяршэння канвеера, каб зачыніць злучэнне, якое пачала гэтая задача, і выдаліць яе часовыя ўліковыя даныя. Не супастаўляйце працэсы па назве праграмы на хосце, які выкарыстоўваюць іншыя задачы; спыніце канкрэтнае злучэнне. Дзве каманды ніжэй — гэта ўсё ачышчэнне, і ні адна не залежыць ад пошуку працэсу.
vpn-cli disconnect --profile "$PROFILE"
rm -f "$RUNNER_TEMP/client.key"
Завяршэнне — гэта не ізаляцыя: ранер, які памірае, пакідае тунель адкрытым, а працэс, які спынілі сілай, цалкам прапускае блок. Таму каманда ачышчэння сама па сабе не можа быць усім дызайнам. Вось як гэта зрываецца на практыцы: задачу разгортвання адмяняюць на кроку капіравання, блок завяршэння ніколі не выконваецца, і наступная задача на тым жа хосце пачынаецца з жывым тунелем і маршрутам, які паказвае на сетку, да якой яна не дастае. Збой выглядае як праблема 'DNS' у наступнай зборцы, праз гадзіны пасля завяршэння задачы, якая яго выклікала.
Запішыце імя профілю і шлях да ўліковых даных у вывад задачы. Голая каманда адключэння без ідэнтыфікатара цяжка паддаецца аўдыту потым. Радок лога таксама даказвае, што блок выканаўся, калі позняе расследаванне гэтага запатрабуе.
Дайце задачы хост, якім не карыстаецца ніхто іншы
Аднаразовая інфраструктура прыбірае праблему спадчыны, а не кіруе ёй. Свежы агент на кожную задачу пачынае без маршруту, без профілю і без чужых уліковых даных, а яго знішчэнне прыбірае ўсё, што задача пакінула. Гэта каштуе больш на кожную зборку, і гэта сумленная цана мяжы, якая не залежыць ад кода ачышчэння. Для задач, якія закранаюць вытворчыя сеткі, гэта звычайна таннейшы варыянт, калі палічыць інцыдэнты.
Там, дзе агульны ранер павінен застацца, правярайце збой і адмену так жа старанна, як паспяховае капіраванне. Тэст павінен паказаць, што ўбачыла б наступная задача, калі б гэтую адмянілі на паўдарозе. Задача скончана, калі скончыліся яе доступ і часовы стан, а не калі каманда капіравання вяртае нуль.