Зачастую возникает необходимость синхронизировать ветки между двумя различными репозиториями  —  например, репозиторий 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).

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи: Albin Issac, “A BitBucket CI/CD Pipeline to Sync Branches With GitHub”

Предыдущая статьяnotebookJS: JavaScript и D3 в Jupyter Notebook
Следующая статьяПростая защита от DoS и брутфорс атак