
Наш самы складаны скразны тэст мог чакаць агента сорак хвілін. Першая версія давала яму тайм-аўт на восемдзесят хвілін. Калі запуск пераставаў рабіць карысную працу, я часта чакаў большую частку гэтага часу, перш чым пра гэта даведваўся.
Я ўвесь час думаў пра Дуцзян’янь. ЮНЕСКА апісвае арашальную сістэму, якую пачалі будаваць у трэцім стагоддзі да нашай эры і якая рэгулюе плынь ракі без плаціны. Ёю карыстаюцца і сёння — пры належным доглядзе.
Гэтае параўнанне спатрэбілася мне для аднаго рашэння ў тэсце. Мне патрэбны быў сігнал ад працэсу, які ідзе, а не чарговая здагадка пра тое, колькі ён мусіць доўжыцца.
Тэст кіруе OwlMeans праз браўзер. Ён рэгіструе карыстальніка, адпраўляе запыт, чакае спецыфікацыю і пацвярджае яе. Для праекта стартуе новая пясочніца ў Kubernetes. Потым агент распрацоўвае першую карыстальніцкую гісторыю.
У запусках, на якіх грунтаваўся гэты чэрвеньскі артыкул, апошні крок займаў ад дзесяці да сарака хвілін.
Калі б я замяніў мадэль заглушкай, тэст адказваў бы на іншае пытанне. Тут я хацеў ведаць, ці здольныя браўзер, канвеер і асяроддзе праекта разам прайсці ўвесь сцэнарый.
Браўзерная абвязка выкарыстоўвае @owlmeans/test-ui паверх Playwright. Тэставы ўваход у ёй ідзе праз наш механізм супервізара, таму менавіта гэты тэст не даказвае, што сапраўдны ўваход праз Google працуе.
Пясочніцу дае пакет @owlmeans/kephemeral. Ён стварае часовую прастору імён, сховішча, працоўную нагрузку і сеткавую палітыку. А яшчэ сочыць за нагрузкай і можа аднавіць под, які ўпаў.
Такое аднаўленне дапамагае асяроддзю заставацца даступным. Але яно не кажа тэсту, ці правільны адказ агента.
Цыкл чакання
Пакуль агент працуе, ён спажывае токены. Змены ў запісаным балансе я выкарыстаў як знак таго, што запуск яшчэ актыўны.
Тэст правяраў гэты баланс кожныя дваццаць секунд. Калі ён працягваў мяняцца, дэтэктар дазваляў чакаць далей. Калі дзесяць хвілін ён стаяў на месцы, дэтэктар лічыў запуск патэнцыйна завіслым і завяршаў яго з памылкай.
Гэта была эўрыстыка для нашага канвеера: ці жывы яшчэ запуск. Баланс, які мяняецца, можа азначаць і непрадуктыўную працу. А баланс, які стаіць на месцы, можа азначаць і апраўданае чаканне, і затрымку ўліку, і праблему па-за мадэллю.
Мне ўсё роўна патрэбныя былі праверкі чаканага стану карыстальніцкай гісторыі і паводзін браўзера. Адным спажываннем токенаў гэтых праверак не пройдзеш.
Парогі я выбраў для чэрвеньскага сцэнарыя і раіць іх іншай камандзе як значэнні па змаўчанні не стаў бы. Запішы, што насамрэч выдае твая працяглая аперацыя, а потым вырашы, колькі павінна доўжыцца цішыня, каб яе варта было расследаваць.
Рэкамендацыі Playwright па тэставанні таксама падкрэсліваюць ізаляцыю тэстаў. Наша павольнае чаканне было толькі адной з крыніц ненадзейных запускаў.
Пакінутая пясочніца
Перапыні тэст пасля таго, як ён разгарнуў рэсурсы, — і ад яго можа застацца праект. Тады наступны запуск сустракае асяроддзе, якое тэст ствараць не збіраўся.
Мы раз за разам выкарыстоўвалі адзін тэставы профіль. Перад кожным запускам і пасля яго абвязка знішчала тэставыя праекты гэтага профілю. Прыборка перад запускам была важная, бо папярэдні працэс мог так і не дайсці да згортвання.
Межы выдалення павінны заставацца вузкімі. Прыборка, якая дацягнулася б да старонніх праектаў, была б праблемай куды горшай за нестабільны тэст.
Паведамляй пра збоі прыборкі. Калі рэсурсы засталіся, а наступны тэст стартуе так, быццам прыборка прайшла паспяхова, карысныя доказы хаваюцца. Перш чым ісці далей, правер фактычны пачатковы стан.
Так у гэтай канфігурацыі знікла крыніца перашкод, якія ўвесь час паўтараліся. Пазнейшыя збоі ўсё адно даводзілася расследаваць.
Дарога дадому

Кластар працаваў на хатнім серверы, за падключэннем ад інтэрнэт-правайдара, якое не давала прыдатнага ўваходнага публічнага адраса.
Наш маршрут складаўся з воблачнай віртуальнай машыны з зарэзерваваным публічным IP, проксі Nginx і WireGuard. Трафік ішоў ад Cloudflare да рэтранслятара, праз зашыфраваны тунэль да хатняга сервера, а потым да сэрвісу Kubernetes.
Гэта была наша схема з рэтранслятарам. Не блытай яе з варыянтам, дзе ўвесь транспарт забяспечвае канектар Cloudflare Tunnel.
Маршрут наладжвалі Terraform, Ansible і shell-скрыпты. Вартавы працэс кожныя шэсцьдзясят секунд правяраў правілы брандмаўэра і выпраўляў адхіленні, якія распазнаваў. Ён умеў аднаўляць пэўныя правілы. А сетка ўсё ж магла адмовіць.
Зарэзерваваны адрас павінен быў заставацца нязменным пры тых згортваннях, якія апісвала схема. Стан у правайдара, уліковыя даныя і канфігурацыю ўсё роўна трэба было падтрымліваць.
Цяпер сеткавы збой павінен паказваць мне менавіта сеткавы збой, які можна даследаваць. Даўжэйшае чаканне агента не паправіць зламаны маршрут да яго асяроддзя.
Пасля гэтай працы прычыны збояў тэсту стала прасцей знаходзіць. Я мог адрозніць агента, які маўчыць, пакінутую пясочніцу і зламаны шлях у кластар, а не даваць усім тром яшчэ гадзіну.
Спрошчаны ўваход, бібліятэка для разгортвання асяроддзя, дазволы на прыборку, улік токенаў і сеткавая канфігурацыя па-ранейшаму патрабуюць падтрымкі. Змена ў любым з іх можа зрабіць памылковым нейкае дапушчэнне ў тэсце.
Паслугі OwlMeans могуць уключаць такую інфраструктуру для пастаўкі і тэставання. Праца павінна адпавядаць рэальнаму стэку і рэальным відам збояў; чэрвеньская схема — не абяцанне разгарнуць любую сістэму за некалькі дзён.
Я абмяняў час, які сыходзіў на чаканне, на час, які сыходзіць на падтрымку абвязкі. Для гэтага сцэнарыя такі абмен апраўдаўся.
Упершыню апублікавана 23 чэрвеня 2026 г. Перагледжана 15 кастрычніка 2026 г.: дэтэктар «ці жывы запуск» аддзелены ад праверак правільнасці, а сцверджанні пра інфраструктуру атрымалі агаворкі.