
Хак для разработчика, который превратился в 3-минутное ожидание в 30 секунд
31 июля 2025 г.Когда -либо ждалPR Предварительный просмотр средчтобы вращаться? Да, я тоже. Вот образец, который изменил игру для нашей команды: предварительно сфигурированоСлоты развертыванияс детерминированным маршрутизацией.
Проблема
Традиционные рабочие процессы PR предварительного просмотра делают что -то вроде этого:
- Открытый Pr
- CI/CD положения новая среда
- Подожди ... ⏳
- Развернуть код
- Подожди еще немного ... ⏳
- Наконец -то получите URL -адрес предварительного просмотра
Постоянный шаг - убийца. Независимо от того, используете ли вы пространства имен Kubernetes, облачные функции или Edge Works, создание ресурсов требует времени.
Решение: предварительно сконфигурированные слоты
Что если мы перевернули сценарий? Вместо того, чтобы создавать среды по требованию, мы предварительно конфигурируем фиксированный набор слотов развертывания:
tokyo 🔗 https://tokyo.example.com
paris 🔗 https://paris.example.com
london 🔗 https://london.example.com
berlin 🔗 https://berlin.example.com
sydney 🔗 https://sydney.example.com
madrid 🔗 https://madrid.example.com
moscow 🔗 https://moscow.example.com
cairo 🔗 https://cairo.example.com
dubai 🔗 https://dubai.example.com
rome 🔗 https://rome.example.com
Затем используйте детерминированный хэш для карты номеров PR на слоты:
- uses: kriasoft/pr-codename@v1
id: pr
- run: wrangler deploy --env ${{ steps.pr.outputs.codename }}
PR #1234 всегда картыtokyo
Полем PR #1235 всегда картыparis
Полем Никакого подготовки, никакого ожидания.
Как это работает
Магия происходит в трех частях:
1. Предварительно сконфигурируйте ваши слоты
Во -первых, установите слоты развертывания. Вот пример работников CloudFlare:
# wrangler.toml
[env.tokyo]
name = "preview-tokyo"
route = "tokyo.example.com/*"
[env.paris]
name = "preview-paris"
route = "paris.example.com/*"
[env.london]
name = "preview-london"
route = "london.example.com/*"
# ... repeat for all slots
2. Детерминистическое картирование
АPR -кодовое действиеиспользует простую хэш -функцию, чтобы последовательно отображать номера пиаров с именами слотов:
const words = ["tokyo", "paris", "london", "berlin" /* ... */];
const index = prNumber % words.length;
return words[index];
Выше всего пример, в действительности он используетFNV-1A HASHING ALGORITHMПолем
3. Развертывание в слот
Ваш рабочий процесс действия GitHub становится мертвым простым:
name: Deploy PR Preview
on:
pull_request:
types: [opened, synchronize]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: kriasoft/pr-codename@v1
id: pr
- name: Deploy to slot
run: |
npm ci
npm run build
wrangler deploy --env ${{ steps.pr.outputs.codename }}
- name: Comment PR
uses: actions/github-script@v7
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '🚀 Preview deployed to https://${{ steps.pr.outputs.codename }}.example.com'
})
Преимущества
Этот шаблон не просто аккуратный трюк; Это принципиально меняет ритм вашего цикла развития.
🚀 Развертывает развертывание нуляСамая большая победа. Устранение шага по подготовке по требованию, развертывания начинаютсянемедленноПолем То, что раньше было 2-3-минутным перерывом в кофе, теперь является 30-секундной задачей. Ваши разработчики остаются в потоке, и ваш трубопровод становится намного быстрее.
🔗 URL -адреса, которыми вы можете поделитьсяЗабудьте длинные, уродливые, сгенерированные автоматические URL. С помощью этого шаблона PR #1234 всегда карты наhttps://tokyo.example.com
Полем Этот URL:
- Запоминающийся:Вы можете вспомнить это.
- Общий доступ:Идеально подходит для того, чтобы сбросить канал Slack, билет на JIRA или даже громко произносить вслух во время зум -звонка. Нет больше "Эй, вы можете найти для меня эту ссылку для предварительного просмотра?"
- В закладки:Тестеры QA и менеджеры по продуктам могут добавить слоты в закладки для функций, которые они отслеживают.
💰 Нет больше неожиданности облачных счетовДинамическая среда печально известна тем, что оставляют позади осильные ресурсы, которые тихо истощают ваш бюджет. С фиксированным количеством слотов ваши затраты на инфраструктуру становятся предсказуемыми. Вы точно знаете, что работает, и вам больше никогда не придется охотиться за забытыми предварительными приложениями.
🧹 Очистка? Какая очистка?Когда PR объединен или закрыт, для запуска нет сложного сценария разрыва. Слот просто становится доступным для следующего PR. У вас даже может быть рабочий процесс, который автоматически развертываетmain
ветвь в слот, чтобы сохранить его свежим. Это система самоочищения.
Реальные соображения
Сколько слотов?
Мы обнаружили, что 10-15 слотов работают хорошо для большинства команд. Математика:
- 10 слотов + 50 открытых PRS = каждый слот обслуживает ~ 5 PRS
- Доступно только последнее развертывание для каждого слота
- Большинство команд только активно рассматривают несколько PRS одновременно
Обработка столкновений
Да, PRS может составить карту с тем же слотом. PR #1 и PR #11 отображают в одной и той же среде с 10 слотами.Это означает, что новые развертывания перезаписывают старые- Так если вы просматриваете PR #1 и кто -то нажимает PR #11, ваш предварительный просмотр исчезает.
На практике это работает для многих команд, потому что:
- Разработчики обычно работают над недавними PRS
- Срок действия старого пиар -предварительного просмотра истекает
- Вы всегда можете запустить перераспределение, чтобы освежить
Когда слоты не работают хорошо:Большие команды, высокая скорость PR или когда нескольким людям нужно просмотреть один и тот же PR одновременно.
База данных и государственные услуги
Самая большая проблема с любой средой предварительного просмотра - это обрабатывать базы данных и государственные услуги. С слотами у вас есть несколько вариантов:
- Общая база данных:Быстро и дешево, но миграция схемы от одного пиара может сломать другие
- База данных за слот:Лучшая изоляция, но требует данных по посевам для каждого слота
- Услуги ветвления базы данных:Инструменты, такие как Neon, предлагают мгновенные филиалы базы данных (Premium Option)
Для простых приложений без сохранения это не проблема. Для сложных приложений с базами данных это основная задача реализации.
Заметки безопасности
- Используйте секретные секреты для каждого слота
- Рассмотрите возможность добавления базовой аудитории для предварительного просмотра доменов
- Внедрить автоматическую очистку для устаревших развертываний
Помимо основных предварительных просмотров
Этот шаблон разблокирует некоторые классные возможности:
Постоянные испытательные среды: QA может добавить конкретные слоты для тестирования.
A/B тестирование: Карта функций флагов для слотов для мгновенного переключения.
Географическое тестирование: На самом деле развернуть слоты в разные регионы.
Попробуйте сами
Начало работы довольно просто:
Установите действие:
- uses: kriasoft/pr-codename@v1 id: pr
Используйте кодовое имя в вашем развертывании:
deploy --env ${{ steps.pr.outputs.codename }}
Наслаждайтесь мгновенными пиарщиками 🚀
Полный источник включенGitHubЕсли вы хотите настроить алгоритм слова или алгоритм хэширования.
Слоты против требования: быстрое сравнение
Прежде чем погрузиться в погружение, стоит понять, как предварительно сконфигурированные схемы слотов складываются с традиционными эфемерными средами по требованию. Хотя этот пост фокусируется на слотах, знание компромиссов поможет вам сделать правильный выбор для вашей команды.
Фактор | Предварительно сконфигурированные слоты | По требованию эфемерный |
---|---|---|
Скорость установки | ⭐⭐⭐⭐⭐ Мгновенный (предварительно наряженный) | ⭐⭐⭐ занимает минуты (подготовка) |
Стоимость предсказуемости | ⭐⭐⭐⭐⭐ Фиксированная ежемесячная стоимость | ⭐⭐ переменные на основе использования |
Масштабируемость | ⭐⭐ Жесткий ограничение на одновременные PRS | ⭐⭐⭐⭐⭐ Шкалы с размером команды |
Изоляция | ⭐⭐ PRS может перезаписать друг друга | ⭐⭐⭐⭐⭐ Каждый пиар получает собственную среду |
Производственная версия | ⭐⭐⭐ Склонность к дрейфу окружающей среды | ⭐⭐⭐⭐⭐ Чистый сланец каждый раз |
Обслуживание | ⭐⭐⭐⭐ Просто для основных приложений | ⭐⭐ Комплекс (сборка) / ⭐⭐⭐⭐ (купить) |
Опыт разработчика | ⭐⭐ может быть запутанным/разочаровывающим | ⭐⭐⭐⭐⭐ Гладкие параллельные рабочие процессы |
Лучше всего для слотов:Небольшие команды, простые приложения, ограниченные бюджеты
Лучше всего по требованию:Растущие команды, сложные приложения, ориентированные на качество
Ничто не мешает вам смешивать оба подхода-используйте слоты для быстрого прототипирования и по требованию для критических функций.
Завершая
Иногда лучшая оптимизация - это вообще избегать работы. Предварительно сконфигурирующей слоты развертывания и используя детерминированную маршрутизацию, мы устранили самое большое узкое место в нашем PR-процессе.
Дайте ему шанс и дайте мне знать, как это работает для вашей команды. Счастливого развертывания!
Какие узоры вы использовали для PR предварительного просмотра? Отбросьте комментарий ниже 👇 Всегда любопытно услышать разные подходы!
Оригинал