Репликация из Gerrit в GitLab

#gerrit

Вопрос:

Я хочу настроить репликацию из Gerrit в GitLab. Для «бизнес» проектов это работает нормально. Но для «дефолтных» (все проекты и все пользователи) это не работает. Названия «Бизнес» проектов такие же, как и в Gerrit и GitLab — формат «группа / проект».

Мой replication.config файл:

 [gerrit]
    autoReload = true
    replicateOnStartup = true
[remote "GitLab-All-Projects"]
    projects = All-Projects
    url = gitlab@gitlab.local:external-tools/gerrit-All-Projects.git
    push =  refs/heads/*:refs/heads/*
    push =  refs/tags/*:refs/tags/*
    threads = 3
    mirror = true
[remote "GitLab"]
    url = gitlab@gitlab.local:${name}.git
    push =  refs/heads/*:refs/heads/*
    push =  refs/tags/*:refs/tags/*
    threads = 3
 

У меня проблема remote "GitLab-All-Projects" . От replication_log :

 [2021-10-22 19:57:46,038] Replication to gitlab@gitlab.local:All-Projects.git started... [CONTEXT pushOneId="7656717c" ]
[2021-10-22 19:57:46,303] Replication to gitlab@gitlab.local:All-Users.git started... [CONTEXT pushOneId="b6794909" ]
[2021-10-22 19:57:47,027] Created remote repository: gitlab@gitlab.local:All-Projects.git [CONTEXT pushOneId="7656717c" ]
[2021-10-22 19:57:47,027] Missing repository created; retry replication to gitlab@gitlab.local:All-Projects.git [CONTEXT pushOneId="7656717c" ]
[2021-10-22 19:57:47,295] Created remote repository: gitlab@gitlab.local:All-Users.git [CONTEXT pushOneId="b6794909" ]
[2021-10-22 19:57:47,296] Missing repository created; retry replication to gitlab@gitlab.local:All-Users.git [CONTEXT pushOneId="b6794909" ]
 

Конечно, нет репозитория, как gitlab.local:All-Projects.git в GitLab. Но есть gitlab.local:external-tools/gerrit-All-Projects.git и пользователь, используемый для репликации, имеет привилегии уровня master.

Когда я пытаюсь проверить статус репликации, вот что я получаю:

 $ ssh -p 29418 user@gerrit.local replication list --detail --json
{"Remote":"GitLab-All-Projects","Url":["gitlab@gitlab.local:external-tools/gerrit-All-Projects.git"],"Project":["All-Projects"]}
{"Remote":"GitLab","Url":["gitlab@gitlab.local:${name}.git"],"Pending":["(retry 1) [b6794909] push gitlab@gitlab.local:All-Users.git [..all..]","(retry 1) [7656717c] push gitlab@gitlab.local:All-Projects.git [..all..]"]}
 

Я хочу:

  1. настройте репликацию для всех проектов и всех пользователей внутри remote "GitLab-All-Projects"
  2. исключить репликацию для всех проектов и всех пользователей внутри remote "GitLab" (для сохранения чистоты журнала)

Ответ №1:

Вы можете изменить свой replication.config следующим образом:

 [gerrit]
    autoReload = true
    replicateOnStartup = true
[remote "GitLab-All-Projects"]
    projects = All-Projects
    projects = All-Users
    url = gitlab@gitlab.local:external-tools/gerrit-${name}.git
    push =  refs/*:refs/*
    threads = 3
    mirror = true
[remote "GitLab"]
    projects = ^(?:(?!All-(Users|Projects)).)*$
    url = gitlab@gitlab.local:${name}.git
    push =  refs/*:refs/*
    threads = 3
 

Из документации плагина: remote.NAME.projects : Specifies which repositories should be replicated to the remote. It can be provided more than once, and supports three formats: regular expressions, wildcard matching, and single project matching. All three formats match case-sensitive.

Имейте в виду, что All-* проекты не обязательно содержат ссылки в refs/heads пространстве имен, поэтому вам придется реплицировать refs/* . Смотрите пример ниже:

 > pwd
 /tmp/gerrit/git/All-Projects.git
> git show-ref
 4c160a51808ec7ec253f125ea404c96302292940 refs/meta/config
 56a6051ca2b02b04ef92d5150c9ef600403cb1de refs/sequences/changes

> pwd
 /tmp/gerrit/git/All-Users.git
> git show-ref
 14711668d99dc83834cf2a83e6f3416bb1059321 refs/groups/5a/5a1e63b3d5542f55a25adaf390ca745b4335d995
 fdb77a3da3fbe131936161768c38f5d78deb54bd refs/groups/f7/f7ff10a4c7d8b4c3004f843fccdb2ca8decdc330
 278491ec14ecd9d856f194c0a3cc8e571a040bda refs/meta/config
 e2bc4638a57a79d63647a070a9fefcaed7628bae refs/meta/external-ids
 35a98b786adba41afb255a3b831d0bfaf62ac61f refs/meta/group-names
 44b2d5628ae9a825b22c86ed14f0ce6335ea888b refs/sequences/accounts
 e440e5c842586965a7fb77deda2eca68612b1f53 refs/sequences/groups
 c2e273e2356165687fa722fd938a0aeee3f5261e refs/users/00/1000000
 

Комментарии:

1. После изменения url значения на url = gitlab@gitlab.local:external-tools/gerrit-${name}.git (добавленный ${name} заполнитель) в вашей версии это помогло с нежелательными записями в журнале. Но по-прежнему нет репликации All-Projects и All-Users проектов в GitLab.

2. @MaciejSzymonowicz Я обновил конфигурацию. Можете ли вы попробовать новую конфигурацию? Все-* не обязательно содержат ссылки в refs/heads пространстве имен. Смотрите комментарий, который я добавил.

3. Версия с push = refs/*:refs/* не работает, но push = refs/meta/*:refs/meta/* работает, и в файле журнала есть записи, информирующие о репликации. Но в итоге в GitLab изменений нет. Я полагаю, что это может быть связано с тем, что в refs/heads namespace ничего нет. Я думаю, что я отключу эту репликацию для All-* проектов. В любом случае спасибо за вашу помощь!

4. @MaciejSzymonowicz no problem. Вы вручную создавали репозиторий в gitlab? Когда репозиторий не существует, плагин репликации создает его с помощью команды SSH. Поскольку плагин репликации может не иметь SSH-доступа к вашему серверу Gitlab, репозиторий никогда не будет создан. Интересно, ваш ли это случай.

5. Да, я создал репозиторий в GitLab и предоставил пользователю gerrit привилегии уровня Master. Все было сделано так же, как и для других реплицированных репозиториев между Gerrit и GitLab. Остальные (с правилом имен ^(?:(?!All-(Users|Projects)).)*$ ) реплицируются без каких-либо проблем.