feat(ci): ephemeral PR preview среди с уникални по репозиторий имена - #1
Open
ydimitrof wants to merge 6 commits into
Open
feat(ci): ephemeral PR preview среди с уникални по репозиторий имена#1ydimitrof wants to merge 6 commits into
ydimitrof wants to merge 6 commits into
Conversation
Описва preview средата за всеки PR: жизнен цикъл, защитни бариери при триене и настройката на `preview` GitHub Environment-а. Ключовото решение е в имената. Този репозиторий, lyubomir-bozhinov/sigma и midt-bg/sigma деплойват preview-тата си в един и същ Cloudflare акаунт, така че схема `sigma-pr-<номер>` се сблъсква при еднакъв номер на PR — вторият деплой презаписва първия, а reaper-ът на всеки репозиторий трие worker-ите на другия. Затова името носи притежателя на репозиторя и се извежда автоматично, вместо да се конфигурира. .env.example допълва и трите липсващи имена на ресурси, които deploy.yml вече изисква за всеки non-prod таргет.
scripts/preview-name.mjs е единственият източник на името на ephemeral preview worker: `sigma-<owner>-pr-<номер на PR>`, изведено от GITHUB_REPOSITORY_OWNER. Deploy, teardown и reaper го внасят оттам — три копия на един regex е начинът, по който преименувано preview остава завинаги неизтрито. Изведено, а не конфигурирано: променлива с fallback към общ default връща същия сблъсък при първия, който забрави да я зададе. PREVIEW_WORKER_PREFIX остава като изричен override и се валидира, вместо да се пренаписва мълчаливо. Дължината се проверява срещу 63-символния DNS label лимит на <име>.<subdomain>.workers.dev — при login от 39 символа изведеното име стига до 54.
preview.yml деплойва web worker-а за всеки отворен PR от същия репозиторий и го трие при затваряне; preview-reap.yml е TTL backstop-ът (03:17 UTC), който хваща idle preview-та и orphan-и от пропаднал teardown. Само web: ETL worker-ът пише в D1 и е cron-only, затова няма per-PR копие. Без миграции: preview-тата споделят dev D1 read-only. Триенето минава през три бариери — allowlist `<префикс>-<цифри>`, denylist от дълготрайните имена, и отказ при липсващ префикс вместо предположение за общ default. Reaper-ът изброява всички worker-и в споделения акаунт, но обработва само тези с префикса на този репозиторий, така че не може да изтрие живо preview на друг fork. Reaper-ът връща (worker, PR) двойки от същия модул, който изгражда името, вместо стъпката за коментар да ги извежда наново — hardcode-нат шаблон там мълчаливо спира да съвпада при друг префикс и PR-ът никога не разбира, че preview-то му е изтрито. scripts/ живеят извън workspace-ите, затова `pnpm test:scripts` (node:test) ги пуска отделно в CI.
Test coverage
✅ No workspace dropped below its baseline (tolerance 0.5pp). |
Пет нови advisory-та, публикувани на 2026-08-03, чупят „Dependency audit" на всеки PR в репозиторя: cross-user disclosure + request smuggling (GHSA-4cwx-7wf7-3272, HIGH), downstream response desync (GHSA-8xcm-r25x-g524), cross-user disclosure по WebSocket (GHSA-jr45-8vmc-qm54), CRLF injection през blob-like body type (GHSA-m8rv-5g2x-5cg5) и cookie-attribute injection (GHSA-v3r7-h72x-cjcm). undici е dev-only transitive (jsdom→vitest, wrangler→miniflare) и не влиза в бъндъла на Worker-а, но 7.29.0 е поправката и override-ът вече съществува за три по-ранни advisory-та по същия път — затова се вдига, вместо да се добавя suppression. Не е свързано с preview средите в този PR; включено тук, за да не остане CI червено.
|
🌐 Preview deployed → https://sigma-ydimitrof-pr-1.midt-platforms.workers.dev Worker |
10 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Какво и защо
Добавя ephemeral preview среда за всеки PR — по един Cloudflare Worker на PR,
трит при затваряне и reap-ван след 5 дни без деплой. Портва pipeline-а от
lyubomir-bozhinov/sigma, но сменя схемата на имената.Причината: този репозиторий,
lyubomir-bozhinov/sigmaиmidt-bg/sigmaдеплойват preview-тата си в един и същ Cloudflare акаунт. При схема
sigma-pr-<номер>PR midt-bg#12 тук и PR midt-bg#12 в другия форк дават едно и също име —вторият деплой мълчаливо презаписва първия, а reaper-ът на всеки репозиторий
трие worker-ите на другия.
Затова името носи притежателя на репозиторя и се извежда, а не се
конфигурира:
PREVIEW_WORKER_PREFIXв оригинала е опционална променлива с fallback към общsigma-pr— тоест връща същия сблъсък при първия, който забрави да я зададе.Тук остава само като изричен override за по-къс URL; незададена вече е
безопасното състояние.
scripts/preview-name.mjsе единственият източник на името. Deploy, teardown иreaper го внасят оттам — три копия на един regex е начинът, по който
преименувано preview остава завинаги неизтрито.
Поправен бъг от оригинала
Стъпката за коментар в
preview-reap.ymlизвежда номера на PR-а с hardcode-нат/^sigma-pr-(\d+)$/. При какъвто и да е друг префикс тя мълчаливо спира дасъвпада: worker-ите се трият, а PR-ът никога не разбира. Reaper-ът тук връща
(worker, PR)двойки от същия модул, който изгражда името.Какво НЕ изолират уникалните имена
namespace_id-тата (1001–1005) са account-scoped целочислениid-та — квотите са общи за всяко preview на всеки форк в акаунта.
*.workers.devpreview URL-ите не са зад Cloudflare Access.И трите са описани в
docs/dev-environments.md.Обхват
пропускат (пак минават обикновеното CI).
Допълнителен обхват: undici
Пет advisory-та за
undici7.28.0, публикувани на 2026-08-03, чупят стъпкатаDependency auditна всеки PR в репозиторя — не само този.mainмина последнона 2026-07-30, преди да съществуват. undici е dev-only transitive
(
jsdom→vitest,wrangler→miniflare) и не влиза в бъндъла на Worker-а.pnpm-workspace.yamlвече имаundicioverride заради три по-ранни advisory-та посъщия път, така че поправката е вдигане на пина до
^7.29.0вместо нов suppression.Това не е свързано с preview средите и по-редното място е отделен PR — включено
е тук съзнателно, за да не остане CI червено. Ако предпочитате, ще го изнеса.
Същият проблем ще удари и
midt-bg/sigmaпри следващия run наmain.Свързан issue
Няма.
Вид промяна
feat— нова функционалностdocs— документацияci/build— поддръжкаКак е тествано
Изведеното име:
Защитните бариери при триене (
--dry-run,GITHUB_REPOSITORY_OWNER=ydimitrof):sigma-pr-12sigma-lyubomir-bozhinov-pr-12sigma,sigma-etl,sigma-devsigma-ydimitrof-pr-12Render-ът end-to-end (
wrangler-render.mjsвърхуapps/web/wrangler.jsonc):Непроверено: dry-run на reaper-а срещу живия акаунт (няма токен локално) —
той е проверката, че вижда само
sigma-ydimitrof-pr-*и нула отsigma-pr-*. Струва си да е първото след настройката на средата.Чеклист
Co-Authored-By:trailerundici(виж „Допълнителен обхват" по-горе), защото то чупи CI на всеки PRpnpm typecheckминаваpnpm test(поне за засегнатите пакети) минаваpnpm lintе чисто.env*или.dev.varsdocs/е обновенаПреди да заработи
Нужен е GitHub Environment
preview(без required reviewers) с Cloudflareтокен за акаунта,
SIGMA_D1_IDзаsigma-devи четиритеSIGMA_*_NAMEпроменливи —
ghкомандите са вdocs/dev-environments-setup.md.