jsr:) с npm: через «длинный» интернет, критичны не только версии рантайма, но и двойной egress, общий DENO_DIR и согласованность deno.lock. Ниже — таблицы для сетевых и комплаенс-чеклистов, копируемый блок переменных, пороги параллелизма оркестратора и FAQ по повторам. Без входа в аккаунт: главная MacPull, список блога; по смежной теме трансграничного CI — Git, npm и Homebrew: зеркала и оптимизация.
Сценарии и боли
Пайплайн ломается там, где встречаются два реестра, один корень кеша и всплеск параллельных HTTP-сессий на перегруженном канале. На общем удалённом Mac несколько job с deno install легко совпадают по времени и конкурируют за диск и TLS.
Боль 1 — двойной выход в интернет: jsr: ходит на инфраструктуру JSR, npm: — на npm-реестр (или зеркало). Allow list и NO_PROXY должны закрывать обе цепочки; иначе «рандомные» таймауты выглядят как баг приложения.
Боль 2 — связанный кеш: общий DENO_DIR без политики ротации даёт «фантомы» частичных загрузок между раннерами, особенно после обрыва tarball.
Боль 3 — lock и отставание зеркала: свежий deno.lock в LAN может не пройти --frozen в CI, если корпоративное зеркало npm отстаёт от апстрима. Это сигнал инфраструктуры, а не повод отключать заморозку.
На практике команда обнаруживает проблему не в самом TypeScript, а в том, что два независимых контура загрузки умножают поверхность отказа: сбой на JSR не компенсируется кешем npm и наоборот. Поэтому runbook должен явно перечислять оба контура и точки наблюдаемости (код ответа, задержка до первого байта, доля повторов). Для сравнения с «классическим» стеком Node полезно держать под рукой материал про зеркала Git, npm и Homebrew — те же идеи прокси, allow list и дисковых квот переносятся на Deno с поправкой на DENO_DIR.
| Критерий | Аренда выделенного удалённого Mac | Оставить общий офисный железный раннер |
|---|---|---|
| Контроль egress | Отдельный пул с фиксированными HTTPS_PROXY / NO_PROXY и аудитом TLS |
Допустимо, если все разработчики в одной LAN с одобренным форвард-прокси |
| Параллелизм и кеш | 2–4 изолированных корня DENO_DIR и предсказуемый бюджет диска на узел |
Один ночной пайплайн и редкие холодные кеши — затраты терпимы |
| Паритет Apple Silicon | Продакшен на arm64 macOS без эмуляции Linux | Linux CI достаточен, если цель деплоя — только серверный Linux |
Сводная таблица путей загрузки Deno и JSR
Используйте строки таблицы как пункты для allow list, PCAP и дизайн-дока — каждая спецификация импорта это отдельная линия комплаенса.
| Стиль спецификатора | Основной реестр / хост | Типовые рычаги в CI | Риски на длинной связи |
|---|---|---|---|
jsr:@scope/pkg |
API и артефакты JSR | HTTPS_PROXY, SSL_CERT_FILE, DENO_DIR |
Всплеск метаданных; сначала снижайте параллелизм воркфлоу, потом увеличивайте число раннеров |
npm:pkg@version |
Реестр npm (зеркало через NPM_CONFIG_REGISTRY / .npmrc) |
Те же переменные, что и для Node-инструментов; единый PEM для MITM | Крупные tarball; зеркало должно поддерживать докачку, если вы полагаетесь на resume |
https://…/mod.ts |
Произвольный HTTPS-источник | Правила прокси, import map в deno.json |
Инвалидация кеша на вашей стороне; фиксируйте версию в URL или карте импортов |
Если вы фиксируете политику «только JSR для новых публичных пакетов, npm для легаси», заранее опишите исключения и процесс обновления lockfile — иначе разработчики снова смешают источники в одном PR, и CI станет лотереей. На удалённом Mac выгодно иметь отдельный пул под Deno-пайплайны с заранее прогретым кешом (но не общим на запись с другими стеками), чтобы холодный старт не съедал весь бюджет таймаута.
Lockfile и каталог кеша: исполняемые параметры
Вынесите блок в пролог shell-шага CI и закрепите пути в runbook рядом с YAML — так SSH-отладка на том же Mac совпадёт с сервисной УЗ.
| Параметр | Пример значения в CI | Назначение |
|---|---|---|
DENO_DIR |
$HOME/Library/Caches/deno-ci-$POOL или с $CI_PIPELINE_ID |
Корень зависимостей, npm-кеша и сгенерированных данных; изоляция на общих Mac |
deno.lock |
В репозитории рядом с deno.json |
Детерминированный граф; в CI пара deno install --frozen / deno cache --frozen |
DENO_NO_PROMPT |
1 |
Без интерактива в unattended job |
DENO_NO_UPDATE_CHECK |
1 |
Убирает лишние сетевые пинги версии в регулируемой среде |
NPM_CONFIG_REGISTRY |
URL зеркала | Перенаправляет npm: без правки каждого импорта |
SSL_CERT_FILE / DENO_TLS_CA_STORE |
Корпоративный PEM или system,mozilla |
TLS при корпоративном MITM без отключения проверки |
Краткая последовательность: (1) обновить lock на доверенной машине отдельным PR; (2) зафиксировать тот же DENO_DIR в CI и при ручной отладке; (3) разделить шаг «загрузка» и «тесты», чтобы регистри ошибся раньше длинных сценариев; (4) curl -I к JSR и npm через боевой прокси; (5) при заполнении диска >80 % планово чистить устаревшие поддеревья кеша.
Import map и deno.json: централизованная карта импортов упрощает смену зеркала или внутреннего прокси без массового редактирования исходников. Зафиксируйте в репозитории, какая команда считается канонической для обновления lock (deno install vs точечный deno cache), и закрепите её в CONTRIBUTING — расхождение команд между ноутбуком и CI — частая причина «плавающего» diff в deno.lock.
Версия Deno: pin через deno.json vendor / официальный installer или контейнер; на Apple Silicon убедитесь, что бинарь arm64, а не Rosetta, если вы сравниваете тайминги с Linux-раннером. Для кросс-командной согласованности полезно вывести deno --version в артефакты job и падать при расхождении с ожидаемой строкой.
Параллелизм в CI и пороги таймаутов
У Deno нет одного «глобального» лимита параллельных HTTP-загрузок для всего рантайма — упирайтесь в число одновременных воркфлоу на хост и в таймауты оркестратора. deno test --parallel ускоряет CPU-bound тесты, но не отменяет конкуренцию за сеть и диск с соседними job.
| Рычаг | Стартовое значение (трансграничная сеть) | Обоснование |
|---|---|---|
| Одновременные воркфлоу на хост | 2 |
Оставляет запас на TLS, fsync и распаковку крупных npm-tarball |
Таймаут шага deno install / deno cache |
20–35 мин |
Холодный граф с JSR и npm на нестабильном канале часто >10 мин |
| Общий таймаут job | 45–90 мин |
Место для тестов после загрузки; сужайте после стабилизации кеша |
| Backoff обёртки повтора | 2 с / 4 с / 8 с, три попытки |
Согласуется с FAQ по устойчивости pull для Git/npm |
Silicon быстрый, аплинк часто узкий: сначала добавляйте раннеры или отдельные узлы, и только потом поднимайте параллелизм на одном хосте.
deno test --parallel хорошо масштабирует CPU-bound наборы, но после холодной загрузки зависимостей диск и страничный кеш ещё «прогреваются» — первый прогон после очистки DENO_DIR закладывайте с большим запасом по времени, последующие можно ужимать. Если оркестратор позволяет, вынесите «install/cache» в отдельный reusable job с собственным кешем артефактов ( tarball DENO_DIR или снимок подпапок), а тесты запускайте на «теплом» дереве; это особенно полезно при десятках транзитивных npm: пакетов.
На уровне организации заведите метрику «время до первого успешного deno install --frozen» по пулу Mac: рост медианы за неделю часто предвещает проблемы с прокси или переполнением диска раньше, чем упадёт доступность реестра по статусу HTTP.
FAQ: повторы при сбоях трансграничной сети
Почему jsr: падает по таймауту, а npm: иногда проходит?
Разные хосты и правила прокси. Проверьте allow list, затем curl -I через тот же прокси. Уменьшите число параллельных job на Mac: перегруз диска и TLS даёт ложные таймауты, не связанные с кодом.
--frozen в CI падает, локально всё зелёное
Сверьте версию Deno, ОС раннера и команду, которой обновляли lock. Проверьте свежесть зеркала npm относительно публичного реестра. Выровняйте окружение генерации lock с CI или задокументируйте расхождение как исключение.
Стоит ли оборачивать deno install в цикл с sleep?
Да, на трансграничных линках разумен небольшой экспоненциальный backoff (например 2/4/8 с) и лимит попыток, плюс отдельная метрика «доля повторов» — она раньше покажет деградацию сети, чем красный main.
Как не смешивать корпоративный npm и публичный JSR в одном кеш-бакете?
Используйте разные суффиксы в DENO_DIR для профилей «публичный CI» и «закрытый контур», либо отдельные раннеры. После смены NPM_CONFIG_REGISTRY не переиспользуйте старый каталог без очистки — иначе возможны коллизии метаданных.
Нужен ли отдельный шаг проверки типов до тестов?
Да: deno check как быстрый gate после deno cache --frozen отделяет ошибки графа от медленных интеграционных тестов и упрощает triage при нестабильной сети (видно, упали ли зависимости или сами тесты).
Итог
Смешение jsr: и npm: на удалённом Mac требует явной матрицы путей, изолированного DENO_DIR, жёсткого deno.lock с --frozen и умеренного параллелизма оркестратора. Аренда удалённого Mac в регионе с предсказуемым egress к JSR и npm снижает число «фантомных» CI-сбоев и ускоряет согласование lockfile с продакшеном на Apple Silicon. Дальше без входа: страница покупки, центр помощи, материал Go modules: GOPROXY и кеш — та же логика прокси и кеша для другого стека.
Нужен стабильный узел под Deno CI?
MacPull предлагает облачные Mac для self-hosted раннеров и длительных pull. Тарифы и документация доступны без авторизации.
Главная Купить удалённый Mac Центр помощи