Зачастую возникает необходимость синхронизировать ветки между двумя различными репозиториями — например, репозиторий BitBucket и репозиторий GitHub.
Это распространенный сценарий при работе с облачным репозиторием, но повседневная разработка происходит в локальных репозиториях. В этом случае перед развертыванием локальные ветки репозитория должны быть синхронизированы с облаком. Ручная обработка синхронизации создает много проблем, а также отнимает больше времени у команды разработчиков. Лучший вариант — автоматизировать синхронизацию веток между локальным репозиторием и облачным. Можно задействовать полное зеркальное отображение репозитория, но это приведет к синхронизации всего содержимого. Моя цель — синхронизировать только определенные ветки.

В этой статье мы рассмотрим подход к синхронизации веток между репозиторием BitBucket и GitHub через конвейер BitBucket CI/CD. Тот же подход можно с минимальными изменениями применить для синхронизации любых двух репозиториев.
Предусловия
- Репозиторий BitBucket.
- Пустой репозиторий GitHub.
Настройка конвейера Bitbucket
Я создал ветку с именем dev
в репозитории BitBucket. Ветка dev
, когда в нее вносятся какие-либо изменения, должна синхронизироваться с репозиторием GitHub. Ветка dev
появится в репозитории GitHub во время первой синхронизации.
Конвейер будет выполняться при каждом изменении в указанных ветках (например, разработка и синхронизация изменений с удаленным репозиторием GitHub).
Войдите в репозиторий BitBucket, нажмите “Конвейеры” (Pipelines) и нажмите “Создать свой первый конвейер”:

Выберите “Стартовый конвейер”:

Включите приведенные ниже конфигурации в bitbucket-pipelines.yml
и сделайте коммит изменений. Файл будет размещен в корне основной ветки. Скопируйте файл в другие нужные ветки (например, dev
):
image: atlassian/default-image:2
pipelines:
branches:
dev:
- step:
script:
- git remote add sync [email protected]:techforum-repo/test1.git
- git checkout dev
- git pull
- git push sync dev
dev1:
- step:
script:
- git remote add sync [email protected]:techforum-repo/test1.git
- git checkout dev1
- git pull
- git push sync dev1
uat:
- step:
script:
- git remote add sync [email protected]:techforum-repo/test1.git
- git checkout uat
- git pull
- git push sync uat
Измените ссылки на имена ветвей (dev
, dev1
и uat
) в соответствии с вашими конфигурациями. Кроме того, соответствующим образом измените URL-адрес удаленного репозитория (GitHub).
При коммите изменений в ветки dev
, dev1
и uat
запускается конвейер и выполняются нижеописанные сценарии для синхронизации локальных веток (BitBucket) с удаленным репозиторием (GitHub):
git remote add sync [email protected]:techforum-repo/test1.git - добавьте репозиторий GitHub в качестве дополнительного удаленного репозитория и тэг "синхронизация".
git checkout dev - проверьте последние изменения из локальной ветки dev (измените имя ветки, как нужно вам). Этот шаг можно пропустить, так как конвейер BitBucket уже проверил ветку.
latest git pull - извлеките последнее изменение из локальной ветки. Этот шаг можно пропустить, так как конвейер BitBucket уже извлек последнюю ветку.
git push sync dev - переместите локальную ветку(BitBucket) в удаленный репозиторий GitHub (соответствующим образом измените имя ветки)
Генерация ключей SSH
Обычный URL-адрес удаленного Git-репозитория (https://techforum-repo:[email protected]/techforum-repo/test1.git) в комплекте с учетными данными может применяться в конвейере для передачи локальных изменений в удаленный репозиторий (сохраните учетные данные в репозитории или в переменных развертывания и обратитесь к ним через конвейер). Однако лучше будет воспользоваться адресом SSH ([email protected]:techforum-repo/test1.git).
Для включения интеграции на основе SSH необходимо заранее сконфигурировать SSH-ключи. Первым делом сгенерируйте ключи SSH, выполнив приведенную ниже команду (это возможно через GIT-bash). SSH-ключи также можно при необходимости сгенерировать в пользовательском интерфейсе BitBucket.
ssh-keygen -t ed25519 -C "[email protected]"

Это приведет к созданию открытого (id_ed25519.pub
) и закрытого (id_ed25519
) ключей в папке .ssh
.
Настройка SSH-ключей — GitHub
Теперь войдите в репозиторий GitHub и создайте новый ключ развертывания:

Добавьте заголовок к ключу (sync-bitbucket
). Введите открытый ключ из файла id_ed25519.pub
.
Выберите “Разрешить доступ на запись”. Нажмите кнопку “Добавить ключ”:

Настройка SSH-ключей — BitBucket
Войдите в репозиторий BitBucket и нажмите “Настройки репозитория”:

Нажмите “Ключи SSH” и “Использовать мои собственные ключи” (как уже говорилось, вы можете вместо этого создавать закрытые и открытые ключи через кнопку “Генерировать ключи”).
Добавьте закрытый ключ из файла id_ed25519
, потом открытый ключ из файла id_ed25519.pub
и сохраните пару ключей.

Теперь внесите изменения в одну из веток (например, dev
) в BitBucket. Это вызовет соответствующие шаги конвейера:


После того, как конвейер отработает, определенные ветки (например, dev
) из репозитория BitBucket синхронизируются с репозиторием GitHub (соответствующие им ветки, как говорилось выше, будут созданы в GitHub при первой синхронизации):

Конвейер CI/CD может помочь синхронизироваться между репозиториями. Здесь мы синхронизируем ветки из репозитория BitBucket с репозиторием GitHub, но тот же подход можно применить для синхронизации двух полностью разных репозиториев. При необходимости можно задействовать в этом процессе внешние инструменты CI/CD (например, Jenkins).
Читайте также:
- Продвинутый функционал Git: хитрые приемы и команды
- Поддержание документации в актуальном состоянии с помощью Bit и GitHub
- Как на самом деле работает Git
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи: Albin Issac, “A BitBucket CI/CD Pipeline to Sync Branches With GitHub”