Duolingo → Codespaces: от часов настройки до трёх минут
Как Duolingo перенёс разработку в облако и сократил онбординг с дней до минут через GitHub Codespaces и Tailscale
Первоисточник
How we made developer onboarding a breeze with GitHub CodespacesDuolingo Engineering, 2023
Контекст: монолит, микросервисы и сотни окружений
Duolingo — приложение для изучения языков с сотнями миллионов пользователей. Инженерная команда мигрировала с монолита на микросервисы, и число репозиториев росло быстрее, чем кто-то успевал документировать. За неделю один разработчик переключался между тремя-четырьмя сервисами с разными зависимостями, версиями языков и инструментами.
Код Duolingo хостится на GitHub. Инженеры пишут в VS Code. Инфраструктура — в AWS.
Проблема: «ритуал посвящения» вместо онбординга
Настройка рабочего окружения занимала у новичков от нескольких часов до нескольких дней. Поставить зависимости, сконфигурировать инструменты, найти и исправить несовместимости, сходить за помощью к коллегам — и так каждый раз. Инструкции устаревали быстрее, чем находился человек их обновить, поэтому каждый новый инженер натыкался на свежие поломки.
Локальная машина превращалась в свалку конфликтующих рантаймов: Python 3.8 для одного сервиса, Python 3.11 для другого, отдельные версии Node.js, Go, Java. Время уходило на борьбу с окружением.
Переключение между проектами добивало картину. Инженер с Go-сервиса хотел внести правку в Python-сервис — приходилось поднимать локальное Python-окружение часами и рисковать сломать уже настроенное Go.
Решение: GitHub Codespaces + Tailscale + duo CLI
Платформенная команда Duolingo выбрала GitHub Codespaces и перенесла разработку в облако. Выбор сложился из трёх факторов: код уже на GitHub, инженеры уже в VS Code, а Codespaces разворачивает описанное в devcontainer.json окружение за минуты.
Архитектурная проблема: сеть
Codespaces поднимает окружения в Azure, а сервисы Duolingo живут в AWS. Разработчикам нужен доступ к внутренним ресурсам: базам данных, API, staging-средам. Решение — интеграция с Tailscale.
Схема такая. В VPC AWS работает Tailscale relay node. При старте каждого codespace внутри поднимается Tailscale-клиент. Разработчик запускает duo vpn (обёртка над tailscale up), проходит Google SSO и получает доступ к внутренним ресурсам. Соединение переживает перезапуски: на следующий день codespace открывается, а VPN уже на месте. По наблюдениям команды Duolingo, такая схема работает надёжнее корпоративного VPN.
Многослойная автоматизация
Duolingo построил систему hook-скриптов поверх lifecycle commands из спецификации Dev Containers. В каждом репозитории есть devcontainer.json, где postStartCommand указывает на bash-скрипт из базового образа. Скрипт зовёт нужную команду duo CLI, а CLI выполняет repo-специфичный .devcontainer/postStart, если такой есть.
duo CLI — внутренний инструмент, написанный для инженеров Duolingo. Важная деталь: CLI обновляется при каждом запуске codespace. Если платформенная команда меняет процесс настройки, изменение разъезжается по всем разработчикам со следующим запуском — без ручных действий и без пулл-реквестов в сотни репозиториев.
Скрипты ставят зависимости, поднимают Tailscale, выставляют переменные окружения, подключают сервисы. Для основного монолитного репозитория весь цикл занимает около восьми минут.
Результаты
Инженер из команды Content Tooling описал свой опыт: «Получил новый ноутбук и через три минуты мог разрабатывать». Три минуты ушли на открытие браузера, переход на GitHub и запуск codespace. Настройка окружения шла ещё несколько минут в фоне, но в это время разработчик уже занимался другими задачами первого дня.
Раньше — часы установки, дни отладки, постоянные обращения к коллегам. Теперь — восьмиминутный автоматический процесс.
Побочные выигрыши:
- Переключение между проектами стало дешёвым. Новый codespace для другого сервиса — и через несколько минут чистое окружение без конфликтов зависимостей.
- Feedback loop сжался до секунд: облачные машины мощнее среднего ноутбука.
- Привязка к устройству исчезла. Любое устройство с браузером — рабочее.
- Дрейф конфигурации прекратился.
duoCLI обновляется в одном месте, и инженеры получают актуальную настройку.
Уроки
Сеть — первый шаг. Облачное окружение живёт за пределами периметра компании. Без доступа к внутренним сервисам codespace бесполезен для бэкенд-разработчика. Duolingo закрыл вопрос через Tailscale. Альтернативы — VPN-шлюзы, SSH-туннели, service mesh. Главное — решить задачу до того, как codespaces попадут в руки инженерам, иначе первое впечатление будет испорчено.
devcontainer.json — правильная точка входа. Duolingo сделал ставку на открытую спецификацию Dev Containers, а не на проприетарный формат. Переход с Codespaces на DevPod или Gitpod Flex не сломает конфигурацию. Открытый стандарт снижает vendor lock-in.
Автообновление инструментов обязательно. Setup-скрипт, который чинят руками в каждом репозитории, устаревает через месяц. Логика настройки в Duolingo вынесена в duo CLI с автообновлением: одно изменение — и оно доезжает до всех.
Сначала замерить. Метрика time-to-first-commit покажет, сколько у вас сейчас уходит на настройку окружения. Замерить, записать, автоматизировать, замерить снова. Разница между «днями» и «минутами» — аргумент, понятный любому руководителю.