По ряду причин я решил зеркалировать свои открытые GitHub-проекты на другие платформы совместной разработки. Сделать это оказалось не так просто. В этой короткой статье описаны трудности, с которыми мне пришлось столкнуться, и итоговое рабочее решение.

Иллюстрация Джона Тенниела
Иллюстрация Джона Тенниела

Ранее я пользовался функцией зеркалирования GitLab, которая называется pull mirroring. Она с определенной периодичностью копировала код, теги и обсуждения в issues и pull requests из моих GitHub-репозиториев в GitLab. Но некоторое время назад я заметил, что мои GitLab-зеркала стали отставать от основных репозиториев. Я вошел в GitLab и увидел вот такой неприятный баннер:

Функция pull mirroring исчезла из некоторых моих репозиториев. Включить ее бесплатно более невозможно:

Покупка премиум-поддержки GitLab (Premium Tier) невозможна в России. GitLab запрещает использовать даже ее бесплатную пробную версию. Поэтому я стал искать другие решения для зеркалирования моих GitHub-проектов:

  • Развертывание своего отдельного сервера разработки GitLab или Forgejo мне не подходило: я не хотел размещать свои open-source проекты на изолированном сервере. Это значительно ограничило бы взаимодействие с сообществом и стало бы препятствием для контрибьюторов.

  • Я проверил китайскую платформу Gitee, и мне не понравилась ее ограниченная поддержка английской локализации.

  • Я посмотрел на Radicle, пиринговую сеть для разработки программного обеспечения. Но ее «мощные функциональные возможности, основанные на блокчейне», показались мне слишком уж радикальными.

  • Затем я посмотрел на Codeberg. Эту платформу коллективной разработки поддерживает одноименная некоммерческая организация, продвигающая идеи свободного программного обеспечения (free software). Эти ребята мне нравятся гораздо больше, чем Microsoft, владеющая GitHub. Но в марте 2020 года они отключили функцию зеркалирования на серверах Codeberg из-за нехватки ресурсов. По их словам, «зеркалированные репозитории легко создаются, но потребляют ресурсы вечно» :(

  • Я также проверил SourceHut (спасибо paulmairo за ссылку). Эта платформа мне не подошла, потому что:

    1. Она предоставляет только платные услуги.

    2. Процесс разработки на ней выглядит несовместимым с GitHub: на платформе SourceHut для работы с задачами и кодом проектов используется электронная почта.

  • Я посмотрел на Salsa (спасибо Mic_92 за идею). Это сервер совместной разработки сообщества Debian, который работает на программном обеспечении GitLab. Сначала я зарегистрировал там учетную запись. Несколько дней спустя администратор Salsa активировал ее, и мне удалось скопировать один из моих проектов из GitHub в Salsa. Но оказалось, что функция pull mirroring в Salsa тоже отключена, как и на gitlab.com в бесплатном режиме. Я задал вопрос об этом в их трекере, но, к сожалению, не получил никакого ответа.

  • Затем я создал зеркала для своих GitHub-проектов на GitFlic. Это небольшая российская платформа коллективной разработки, которая сейчас активно развивается. Их служба поддержки разрешила мне создать публичные репозитории и настроить зеркалирование. Кроме того, они довольно оперативно отвечали на вопросы и давали комментарии по обнаруженным проблемам. К сожалению, в GitFlic нет CI и даже нет возможности копировать информацию из issues и pull requests с GitHub. Очевидно, зеркала на GitFlic не стали для меня окончательным решением.

Схема зеркалирования GitHub -> GitFlic
Схема зеркалирования GitHub -> GitFlic

Кстати, я бы предложил команде GitFlic назвать раздел Issues для проектов на платформе не «Проблемы», а «Задачи».

Подводя итог, я не нашел ни одной популярной платформы для совместной разработки, которая могла бы предоставить полнофункциональные зеркала для моих проектов на GitHub. Поэтому я решил взглянуть на эту задачу с другой стороны: как я могу вручную создать резервную копию обсуждений в своих GitHub-проектах?

Первая идея состояла в том, чтобы сделать эту информацию частью кода. Вскоре я нашел проект gh2md, который это позволяет. Инструмент gh2md выгружает содержимое GitHub issues и pull requests заданного проекта в Markdown-документ.

Под капотом этот инструмент использует интерфейсы GraphQL, предоставляемые GitHub, поэтому для него мне пришлось сгенерировать личный токен доступа GitHub с минимальными привилегиями. Подробности о работе с такими токенами можно найти в документации GitHub.

Токен доступа GitHub
Токен доступа GitHub

Теперь мои проекты содержат файл issues.md с резервной копией всех задач и обсуждений. Можно было бы использовать gh2md в CI, чтобы обновлять issues.md автоматически. Но пока я воздерживаюсь от предоставления скриптам GitHub Actions полного доступа к репозиторию.

В определенный момент мне пришла мысль о CI-скрипте, который генерировал бы pull request с обновлениями файла issues.md. Но вскоре я понял, что это не очень умная идея: такой автоматически созданный запрос приведет к очередному срабатыванию CI-скрипта для обновления issues.md, что создаст еще один pull request, и так далее :) Я решил не изобретать самому себе проблемы и добавил ручное обновление issues.md в список релизных процедур для своих проектов.

Есть и другой способ: можно выгрузить задачи и обсуждения из GitHub в git-хранилище проекта. Это можно сделать с помощью специального трекера git-bug (спасибо Сергею Бронникову за ссылку):

Проект git-bug
Проект git-bug

В итоге после создания резервной копии информации из GitHub issues и pull requests я решил создать копии своих проектов на Codeberg и затем просто выполнять операцию git push одновременно и для GitHub, и для Codeberg. Платформа Codeberg успешно выполнила разовую миграцию моих проектов из GitHub, даже скопировала все обсуждения и задачи. Так что это было бы идеальным решением для меня, если бы в Codeberg было включено зеркалирование… Увы!

Тогда передо мной возник вопрос: что делать с устаревающей информацией в Codeberg issues? В крайнем случае можно было бы вручную удалять и воссоздавать проекты на Codeberg, чтобы поддерживать актуальность, но такое решение мне совсем не нравилось.

Схема зеркалирования GitHub -> Codeberg
Схема зеркалирования GitHub -> Codeberg

Я стал изучать настройки репозиториев и нашел обходной путь: Codeberg позволяет использовать внешний трекер задач! Я задал ссылку на задачи в GitHub и формат нумерации, отключил запросы на слияние в Codeberg, и теперь зеркала моих проектов просто ссылаются на issues и pull requests в GitHub.

Настройка репозитория Codeberg
Настройка репозитория Codeberg

Вот это уже более или менее рабочее решение. Если что-то пойдет не так с GitHub, то я пересоздам репозитории в Codeberg, включу в них внутренний трекер и запросы на слияние, после чего анонсирую для сообщества и дистрибутивов GNU/Linux, что разработка моих открытых проектов переведена на эту платформу.

Финальная схема зеркалирования GitHub -> Codeberg
Финальная схема зеркалирования GitHub -> Codeberg

Спасибо за внимание. Буду рад комментариям и предложениям.

Комментарии (17)


  1. Brogahnl
    02.02.2023 00:46
    +3

    В определенный момент мне пришла мысль о CI-скрипте, который генерировал бы pull request с обновлениями файла issues.md.

    В GitHub Actions можно поставить триггер почти на все с почти любыми условиями и сливать пойманное в отдельный бранч. Не понимаю в чем проблема.


    1. a13xp0p0v Автор
      02.02.2023 01:19
      +2

      Безусловно, проблемы нет.

      1. Пока что не хочется без крайней надобности использовать в GitHub Actions токен с разрешением коммитить в репозиторий.

      2. Pull request с обновлениями issues.md в свою очередь сам изменяет issues.md :)

      Поэтому решил не заморачиваться с преждевременной автоматизацией.


      1. select26
        02.02.2023 09:21
        -1

        Посмотрите SECRETS. Нет нужды хранить сами секреты в коде - можно получать их из безопасного хранилища прямо во время выполнения Actions.


  1. aborouhin
    02.02.2023 01:02
    +5

    Не очень понимаю, почему зеркалирование на собственный сервер не устроило, а зеркалирование на платформы, пользующиеся, мягко говоря, скромной популярностью, устроило :) И туда, и туда в случае чего за Вами придут только те, кому реально ну очень надо.

    И да, а что с GitLab for Open Source Prorgam, присоединиться к которой GitLab предлагает на первой же картинке в посте? Вроде, у Вас проекты open source, обещают бесплатно все фишки Ultimate подписки. Если там тоже дело в России - так, вроде, паспорт не просят, не обязательно при регистрации вдаваться в лишние подробности...


    1. a13xp0p0v Автор
      02.02.2023 02:23
      +6

      Не очень понимаю, почему зеркалирование на собственный сервер не устроило, а зеркалирование на платформы, пользующиеся, мягко говоря, скромной популярностью, устроило :)

      По моим наблюдениям, именно на Codeberg переезжают разработчики, которых не устроила покупка платформы GitHub, юридические проблемы с GitHub Copilot и ряд других событий.

      Безусловно, Codeberg сильно меньше, чем GitHub. И все-таки переезд туда в случае ЧП для меня дает точно больше плюсов, чем переезд на изолированный сервер.

      Кроме того, чем больше будет проектов (ну хотя бы зеркал проектов) на Codeberg и российском GitFlic, тем более популярными они будут становиться. А иначе вообще без шансов.

      И да, а что с GitLab for Open Source Prorgam, присоединиться к которой GitLab предлагает на первой же картинке в посте? Вроде, у Вас проекты open source, обещают бесплатно все фишки Ultimate подписки.

      Это правильная мысль, и я в первую очередь посмотрел на эту их "GitLab for Open Source Program".

      Что обнаружил:

      1. Все детали по заявке проверяет их "доверенный партнер", компания SheerID, которая имеет право запросить у тебя любую дополнительную информацию.

      2. Такую проверку ты должен проходить каждый год.

      3. Помимо требований по открытости лицензий ты подписываешь обязательства "NOT SEEKING PROFIT" для всех проектов в namespace.

      4. В конце формы регистрации стоит вот эта главная фраза:

      Решил не ввязываться в эту муть.

      К тому же, как показала моя практика, GitLab может на ходу поменять свои правила.


      1. SergeyMax
        02.02.2023 07:15
        +1

        как показала моя практика, GitLab может на ходу поменять свои правила

        А что, есть кто-то, кто не может поменять свои правила?


        1. a13xp0p0v Автор
          02.02.2023 22:27
          +1

          Нет, конечно, все меняют правила.

          Но тот же Codeberg, когда закрыл функцию pull mirroring, при этом не отказался от обслуживания уже созданных пользователями зеркал. Мое уважение.

          А GitLab в аналогичной ситуации просто сломал зеркалирование в моих репозиториях. На мой вкус, это некомильфо.


    1. TvoygitRu
      02.02.2023 22:18
      +2

      Добрый день. У Codeberg общая кодовая база с https://tvoygit.ru (один родитель - gitea.io), одна из целей площадки - "Зеркало в России для интересных проектов GitHub", функцию зеркалирования отключим, тогда, когда столкнёмся с той же проблемой, что и у Codeberg. А пока можно пользоваться. Сайт существует на взносы пользующихся и открыт для всех.


  1. staticmain
    02.02.2023 05:10
    +2

    А почему не рассматривали BitBucket?


    1. Fenist
      02.02.2023 22:19
      +2

      Atlassian же ушел из России.


      1. a13xp0p0v Автор
        03.02.2023 00:08
        +1

        Помимо этого, похоже, Bitbucket не умеет импортировать информацию из issues и pull requests на GitHub:
        https://community.atlassian.com/t5/Bitbucket-questions/We-want-to-migrate-from-github-to-bitbucket-with-PR-s-issues-e-t/qaq-p/1748902


    1. r0bomurlok
      03.02.2023 14:43

      я когда то пользовался notabug.org, чтото вроде внебрачного сына gitea и gog, но комьюнити хвалит за продвижение идей fsf в массы


  1. nronnie
    02.02.2023 14:59

    Мне кажется, что можно было бы взять GitHub СLI и GitLab CLI и написать руками скрипт для переноса. CI, конечно, придется так или иначе руками делать.


  1. snakers4
    03.02.2023 11:04

    Если поставить Gitee на свой сервер, проблем с китайским языком нет. Issues, wiki и собственно код нормально копируются, но там немного неочеивидно, что при переносе issues нельзя включить зеркалирование, а можно только сделать разовый полный архив.


  1. fftcc
    03.02.2023 11:54

    Думаю стоит поумничать????, а может и нет????

    • Forgejo разрабатывается Codeberg, это соффорк Gitea

    • на Codeberg есть миррор (для собственных проектов) в настройках репозитория, работает в обе стороны и подтягивает и пушит

    • Я пользуюсь SourceHut бесплатно(Edit: ????я выпросил бесплатную подписку на год у создателя Дрю), это возможно пока идёт альфа версия. Да, потом будет введена платная подписка за 2 или 20 долларов в месяц, по функционалу эти подписки не отличаются. 2 доллара в месяц мне кажется это не много. Но тем не менее, когда заканчивается срок подписки, сервис не сразу прекращает доступ к аккаунту, а через несколько недель, тактично, несколько раз напомнив об оплате по эл.почте. В случае неуплаты полностью доступ к аккаунту не теряется, просто запрещён пуш и проекты всегда можно перенести в другое место.

    • вот ещё публичный гит хостинг - https://repo.or.cz довольно старый.


    1. fftcc
      03.02.2023 12:14

      Вот настройка миррора на codeberg( и всех инстансах gitea, может и forgejo, но не уверен)

      Рекомендую почитать политику codeberg????tl;dr Админы говорят что не собираются блокировать/удалять аккаунты/репозитории по политическим или иным причинам.


      1. a13xp0p0v Автор
        03.02.2023 16:38

        На вашем снимке экрана настройка push-mirroring. Это зеркалирование с Codeberg куда-то.

        А для зеркалирования с GitHub на Codeberg нужна функция pull mirroring. Она отключена.

        Вот, что Codeberg ответил мне в mastodon по поводу ее включения:

        @a13xp0p0v We're still planning to reenable it, but it would require
        a per-user / project setting, or better moderation tools.
        Still looking for more human resources to address both.