Как настроить автоматическое зеркалирование Git-репозитория с GitHub на GitLab через CI/CD?

Автоматическое зеркалирование репозитория с GitHub на GitLab позволяет поддерживать актуальную копию кода на обеих платформах без ручного вмешательства. Существует несколько подходов к реализации этой задачи.

## Способ 1: Встроенная функция GitLab Pull Mirroring

GitLab (начиная с версии Premium) поддерживает встроенное зеркалирование:
1. Перейдите в **Settings → Repository → Mirroring repositories**.
2. Укажите URL GitHub-репозитория в формате `https://github.com/user/repo.git`.
3. Выберите направление: **Pull** (GitLab тянет с GitHub).
4. Укажите токен доступа GitHub (Personal Access Token) в поле пароля.
5. Сохраните и запустите первую синхронизацию.

GitLab будет автоматически обновлять репозиторий по расписанию (обычно каждые 5 минут).

## Способ 2: GitHub Actions → GitLab через CI/CD

Если нужно зеркалировать при каждом push в GitHub, используйте GitHub Actions:

yaml
# .github/workflows/mirror.yml
name: Mirror to GitLab
on:
push:
branches: [‘**’]
jobs:
mirror:
runs-on: ubuntu-latest
steps:
— uses: actions/checkout@v3
with:
fetch-depth: 0
— name: Push to GitLab
env:
GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }}
run: |
git remote add gitlab https://oauth2:${GITLAB_TOKEN}@gitlab.com/user/repo.git
git push gitlab —mirror

Добавьте секрет `GITLAB_TOKEN` в настройках GitHub репозитория (**Settings → Secrets and variables → Actions**).

## Способ 3: GitLab CI/CD с периодическим запуском

В GitLab можно настроить pipeline по расписанию:

yaml
# .gitlab-ci.yml
mirror-from-github:
stage: sync
image: alpine/git
script:
— git clone —mirror https://${GITHUB_TOKEN}@github.com/user/repo.git
— cd repo.git
— git remote add gitlab https://oauth2:${GITLAB_TOKEN}@gitlab.com/user/repo.git
— git push —mirror gitlab
only:
— schedules

Затем в GitLab перейдите в **CI/CD → Schedules** и создайте расписание (например, каждый час: `0 * * * *`).

## Важные рекомендации

— **Безопасность**: никогда не храните токены в коде. Используйте только переменные окружения и секреты.
— **Флаг `—mirror`**: передаёт все ветки, теги и refs. Если нужна только одна ветка — используйте `—force`.
— **Конфликты**: при двустороннем зеркалировании возможны конфликты. Определите один источник истины.
— **Права токена**: для GitHub нужен токен с правами `repo`, для GitLab — `write_repository`.

Выбор подхода зависит от вашей инфраструктуры: встроенное зеркалирование GitLab проще, GitHub Actions — гибче и реагирует на события в реальном времени.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.