Продвинутые сценарии локализации в CI/CD: выбор рабочего процесса, проверка полноты переводов и разрешение merge-конфликтов.
Выбор рабочего процесса#
Четыре сценария рабочего процесса подходят для большинства команд. У каждого — свои компромиссы в плане автоматизации, объёма проверки и чистоты истории веток.
| Рабочий процесс | Лучше всего подходит для | Компромисс |
|---|---|---|
| Коммит в main | Небольших команд и быстрых обновлений без лишних шагов | Нет отдельного этапа проверки переводов |
| PR из main | Команд, которым важно проверять переводы | Требуется ручное одобрение PR |
| Коммит в feature-ветку | Долгоживущих feature-веток | Коммиты с переводами остаются в истории ветки |
| PR из feature-ветки | Максимального контроля на уровне каждой фичи | Для каждой фичи приходится вести несколько PR |
На GitHub Lingo.dev GitHub App берёт на себя большинство этих паттернов на стороне сервера: реагирует на пуши и PR, коммитит переводы и не требует ни раннера, ни секретов. CLI-паттерны ниже — для тех, кто запускает локализацию внутри собственного пайплайна.
Если сомневаетесь, начните с варианта "Коммит в main". Это самый простой рабочий процесс, и он полностью исключает merge-конфликты, потому что ветки не расходятся.
Проверка полноты переводов#
Команда lingo check проверяет, что весь контент переведён, но не создаёт новые переводы. Если какой-то контент отсутствует, она завершается с ненулевым кодом выхода:
lingo checkИспользуйте это как условие деплоя, чтобы непереведённый контент не попал в продакшн. Установите CLI через npm install -g @lingo.dev/cli (Node 22+) и аутентифицируйте раннер с помощью переменной окружения LINGO_API_KEY.
name: Check translations
on: [push, pull_request]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm install -g @lingo.dev/cli
- run: lingo check
env:
LINGO_API_KEY: ${{ secrets.LINGO_API_KEY }}Разрешение merge-конфликтов#
Merge-конфликты возникают, когда файл .lingo/lock.json расходится между ветками — обычно если переводы независимо обновлялись в разных ветках.
Как предотвратить#
Если коммитить переводы напрямую в main (а не вести их через feature-ветки), конфликтов lockfile можно избежать полностью.
Разрешение через merge#
Начните merge
git merge <branch-name>Удалите конфликтующий lockfile
rm .lingo/lock.jsonЗавершите merge
git add .
git merge --continueСгенерируйте lockfile заново
lingo pushПри запуске lingo push пересобирает .lingo/lock.json из текущего состояния исходных файлов — это часть обычной синхронизации.
Разрешение через rebase#
То же работает и с rebase: удалите .lingo/lock.json на каждом шаге конфликта, продолжите rebase, а в конце запустите lingo push, чтобы пересоздать lockfile:
git rebase <branch-name>
# On each conflict: rm .lingo/lock.json && git add . && git rebase --continue
lingo push