Хак для разработчика, который превратился в 3-минутное ожидание в 30 секунд

Хак для разработчика, который превратился в 3-минутное ожидание в 30 секунд

31 июля 2025 г.

Когда -либо ждалPR Предварительный просмотр средчтобы вращаться? Да, я тоже. Вот образец, который изменил игру для нашей команды: предварительно сфигурированоСлоты развертыванияс детерминированным маршрутизацией.

Проблема

Традиционные рабочие процессы PR предварительного просмотра делают что -то вроде этого:

  1. Открытый Pr
  2. CI/CD положения новая среда
  3. Подожди ... ⏳
  4. Развернуть код
  5. Подожди еще немного ... ⏳
  6. Наконец -то получите 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, ваш предварительный просмотр исчезает.

На практике это работает для многих команд, потому что:

  1. Разработчики обычно работают над недавними PRS
  2. Срок действия старого пиар -предварительного просмотра истекает
  3. Вы всегда можете запустить перераспределение, чтобы освежить

Когда слоты не работают хорошо:Большие команды, высокая скорость PR или когда нескольким людям нужно просмотреть один и тот же PR одновременно.

База данных и государственные услуги

Самая большая проблема с любой средой предварительного просмотра - это обрабатывать базы данных и государственные услуги. С слотами у вас есть несколько вариантов:

  • Общая база данных:Быстро и дешево, но миграция схемы от одного пиара может сломать другие
  • База данных за слот:Лучшая изоляция, но требует данных по посевам для каждого слота
  • Услуги ветвления базы данных:Инструменты, такие как Neon, предлагают мгновенные филиалы базы данных (Premium Option)

Для простых приложений без сохранения это не проблема. Для сложных приложений с базами данных это основная задача реализации.

Заметки безопасности

  • Используйте секретные секреты для каждого слота
  • Рассмотрите возможность добавления базовой аудитории для предварительного просмотра доменов
  • Внедрить автоматическую очистку для устаревших развертываний

Помимо основных предварительных просмотров

Этот шаблон разблокирует некоторые классные возможности:

Постоянные испытательные среды: QA может добавить конкретные слоты для тестирования.

A/B тестирование: Карта функций флагов для слотов для мгновенного переключения.

Географическое тестирование: На самом деле развернуть слоты в разные регионы.

Попробуйте сами

Начало работы довольно просто:

  1. Установите действие:

    - uses: kriasoft/pr-codename@v1
      id: pr
    
  2. Используйте кодовое имя в вашем развертывании:

    deploy --env ${{ steps.pr.outputs.codename }}
    
  3. Наслаждайтесь мгновенными пиарщиками 🚀

Полный источник включенGitHubЕсли вы хотите настроить алгоритм слова или алгоритм хэширования.

Слоты против требования: быстрое сравнение

Прежде чем погрузиться в погружение, стоит понять, как предварительно сконфигурированные схемы слотов складываются с традиционными эфемерными средами по требованию. Хотя этот пост фокусируется на слотах, знание компромиссов поможет вам сделать правильный выбор для вашей команды.

Фактор

Предварительно сконфигурированные слоты

По требованию эфемерный

Скорость установки

⭐⭐⭐⭐⭐ Мгновенный (предварительно наряженный)

⭐⭐⭐ занимает минуты (подготовка)

Стоимость предсказуемости

⭐⭐⭐⭐⭐ Фиксированная ежемесячная стоимость

⭐⭐ переменные на основе использования

Масштабируемость

⭐⭐ Жесткий ограничение на одновременные PRS

⭐⭐⭐⭐⭐ Шкалы с размером команды

Изоляция

⭐⭐ PRS может перезаписать друг друга

⭐⭐⭐⭐⭐ Каждый пиар получает собственную среду

Производственная версия

⭐⭐⭐ Склонность к дрейфу окружающей среды

⭐⭐⭐⭐⭐ Чистый сланец каждый раз

Обслуживание

⭐⭐⭐⭐ Просто для основных приложений

⭐⭐ Комплекс (сборка) / ⭐⭐⭐⭐ (купить)

Опыт разработчика

⭐⭐ может быть запутанным/разочаровывающим

⭐⭐⭐⭐⭐ Гладкие параллельные рабочие процессы

Лучше всего для слотов:Небольшие команды, простые приложения, ограниченные бюджеты

Лучше всего по требованию:Растущие команды, сложные приложения, ориентированные на качество

Ничто не мешает вам смешивать оба подхода-используйте слоты для быстрого прототипирования и по требованию для критических функций.

Завершая

Иногда лучшая оптимизация - это вообще избегать работы. Предварительно сконфигурирующей слоты развертывания и используя детерминированную маршрутизацию, мы устранили самое большое узкое место в нашем PR-процессе.

Дайте ему шанс и дайте мне знать, как это работает для вашей команды. Счастливого развертывания!


Какие узоры вы использовали для PR предварительного просмотра? Отбросьте комментарий ниже 👇 Всегда любопытно услышать разные подходы!


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE