Для команд, которые гоняют Deno на удалённом Mac и смешивают JSR (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 vs общий офисный узел
Критерий Аренда выделенного удалённого 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 без отключения проверки
export DENO_DIR="${DENO_DIR:-$HOME/Library/Caches/deno-ci-${CI_POOL_ID:-local}}" export DENO_NO_PROMPT=1 export DENO_NO_UPDATE_CHECK=1 # при необходимости зеркала npm для npm:: # export NPM_CONFIG_REGISTRY="https://your.npm.mirror" deno install --frozen # прогрев без смены lock (по вашим entrypoint): # deno cache --frozen main.ts src/**/*.ts

Краткая последовательность: (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 Центр помощи
Выбор региона
SSH / VNC
Гибкий срок