По ряду причин я решил зеркалировать свои открытые 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 за ссылку). Эта платформа мне не подошла, потому что:
Она предоставляет только платные услуги.
Процесс разработки на ней выглядит несовместимым с GitHub: на платформе SourceHut для работы с задачами и кодом проектов используется электронная почта.
Я посмотрел на Salsa (спасибо Mic_92 за идею). Это сервер совместной разработки сообщества Debian, который работает на программном обеспечении GitLab. Сначала я зарегистрировал там учетную запись. Несколько дней спустя администратор Salsa активировал ее, и мне удалось скопировать один из моих проектов из GitHub в Salsa. Но оказалось, что функция pull mirroring в Salsa тоже отключена, как и на gitlab.com в бесплатном режиме. Я задал вопрос об этом в их трекере, но, к сожалению, не получил никакого ответа.
Затем я создал зеркала для своих GitHub-проектов на GitFlic. Это небольшая российская платформа коллективной разработки, которая сейчас активно развивается. Их служба поддержки разрешила мне создать публичные репозитории и настроить зеркалирование. Кроме того, они довольно оперативно отвечали на вопросы и давали комментарии по обнаруженным проблемам. К сожалению, в GitFlic нет CI и даже нет возможности копировать информацию из issues и pull requests с GitHub. Очевидно, зеркала на GitFlic не стали для меня окончательным решением.
Кстати, я бы предложил команде GitFlic назвать раздел Issues для проектов на платформе не «Проблемы», а «Задачи».
Подводя итог, я не нашел ни одной популярной платформы для совместной разработки, которая могла бы предоставить полнофункциональные зеркала для моих проектов на GitHub. Поэтому я решил взглянуть на эту задачу с другой стороны: как я могу вручную создать резервную копию обсуждений в своих GitHub-проектах?
Первая идея состояла в том, чтобы сделать эту информацию частью кода. Вскоре я нашел проект gh2md, который это позволяет. Инструмент gh2md выгружает содержимое GitHub issues и pull requests заданного проекта в Markdown-документ.
Под капотом этот инструмент использует интерфейсы GraphQL, предоставляемые 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 (спасибо Сергею Бронникову за ссылку):
В итоге после создания резервной копии информации из GitHub issues и pull requests я решил создать копии своих проектов на Codeberg и затем просто выполнять операцию git push
одновременно и для GitHub, и для Codeberg. Платформа Codeberg успешно выполнила разовую миграцию моих проектов из GitHub, даже скопировала все обсуждения и задачи. Так что это было бы идеальным решением для меня, если бы в Codeberg было включено зеркалирование… Увы!
Тогда передо мной возник вопрос: что делать с устаревающей информацией в Codeberg issues? В крайнем случае можно было бы вручную удалять и воссоздавать проекты на Codeberg, чтобы поддерживать актуальность, но такое решение мне совсем не нравилось.
Я стал изучать настройки репозиториев и нашел обходной путь: Codeberg позволяет использовать внешний трекер задач! Я задал ссылку на задачи в GitHub и формат нумерации, отключил запросы на слияние в Codeberg, и теперь зеркала моих проектов просто ссылаются на issues и pull requests в GitHub.
Вот это уже более или менее рабочее решение. Если что-то пойдет не так с GitHub, то я пересоздам репозитории в Codeberg, включу в них внутренний трекер и запросы на слияние, после чего анонсирую для сообщества и дистрибутивов GNU/Linux, что разработка моих открытых проектов переведена на эту платформу.
Спасибо за внимание. Буду рад комментариям и предложениям.
Комментарии (17)
aborouhin
02.02.2023 01:02+5Не очень понимаю, почему зеркалирование на собственный сервер не устроило, а зеркалирование на платформы, пользующиеся, мягко говоря, скромной популярностью, устроило :) И туда, и туда в случае чего за Вами придут только те, кому реально ну очень надо.
И да, а что с GitLab for Open Source Prorgam, присоединиться к которой GitLab предлагает на первой же картинке в посте? Вроде, у Вас проекты open source, обещают бесплатно все фишки Ultimate подписки. Если там тоже дело в России - так, вроде, паспорт не просят, не обязательно при регистрации вдаваться в лишние подробности...
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".
Что обнаружил:
Все детали по заявке проверяет их "доверенный партнер", компания SheerID, которая имеет право запросить у тебя любую дополнительную информацию.
Такую проверку ты должен проходить каждый год.
Помимо требований по открытости лицензий ты подписываешь обязательства "NOT SEEKING PROFIT" для всех проектов в namespace.
В конце формы регистрации стоит вот эта главная фраза:
Решил не ввязываться в эту муть.
К тому же, как показала моя практика, GitLab может на ходу поменять свои правила.
SergeyMax
02.02.2023 07:15+1как показала моя практика, GitLab может на ходу поменять свои правила
А что, есть кто-то, кто не может поменять свои правила?
a13xp0p0v Автор
02.02.2023 22:27+1Нет, конечно, все меняют правила.
Но тот же Codeberg, когда закрыл функцию pull mirroring, при этом не отказался от обслуживания уже созданных пользователями зеркал. Мое уважение.
А GitLab в аналогичной ситуации просто сломал зеркалирование в моих репозиториях. На мой вкус, это некомильфо.
TvoygitRu
02.02.2023 22:18+2Добрый день. У Codeberg общая кодовая база с https://tvoygit.ru (один родитель - gitea.io), одна из целей площадки - "Зеркало в России для интересных проектов GitHub", функцию зеркалирования отключим, тогда, когда столкнёмся с той же проблемой, что и у Codeberg. А пока можно пользоваться. Сайт существует на взносы пользующихся и открыт для всех.
staticmain
02.02.2023 05:10+2А почему не рассматривали BitBucket?
Fenist
02.02.2023 22:19+2Atlassian же ушел из России.
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
r0bomurlok
03.02.2023 14:43я когда то пользовался notabug.org, чтото вроде внебрачного сына gitea и gog, но комьюнити хвалит за продвижение идей fsf в массы
nronnie
02.02.2023 14:59Мне кажется, что можно было бы взять GitHub СLI и GitLab CLI и написать руками скрипт для переноса. CI, конечно, придется так или иначе руками делать.
snakers4
03.02.2023 11:04Если поставить Gitee на свой сервер, проблем с китайским языком нет. Issues, wiki и собственно код нормально копируются, но там немного неочеивидно, что при переносе issues нельзя включить зеркалирование, а можно только сделать разовый полный архив.
fftcc
03.02.2023 11:54Думаю стоит поумничать????, а может и нет????
Forgejo разрабатывается Codeberg, это соффорк Gitea
на Codeberg есть миррор (для собственных проектов) в настройках репозитория, работает в обе стороны и подтягивает и пушит
Я пользуюсь SourceHut бесплатно(Edit: ????я выпросил бесплатную подписку на год у создателя Дрю), это возможно пока идёт альфа версия. Да, потом будет введена платная подписка за 2 или 20 долларов в месяц, по функционалу эти подписки не отличаются. 2 доллара в месяц мне кажется это не много. Но тем не менее, когда заканчивается срок подписки, сервис не сразу прекращает доступ к аккаунту, а через несколько недель, тактично, несколько раз напомнив об оплате по эл.почте. В случае неуплаты полностью доступ к аккаунту не теряется, просто запрещён пуш и проекты всегда можно перенести в другое место.
вот ещё публичный гит хостинг - https://repo.or.cz довольно старый.
fftcc
03.02.2023 12:14Вот настройка миррора на codeberg( и всех инстансах gitea, может и forgejo, но не уверен)
Рекомендую почитать политику codeberg????tl;dr Админы говорят что не собираются блокировать/удалять аккаунты/репозитории по политическим или иным причинам.
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.
Brogahnl
В GitHub Actions можно поставить триггер почти на все с почти любыми условиями и сливать пойманное в отдельный бранч. Не понимаю в чем проблема.
a13xp0p0v Автор
Безусловно, проблемы нет.
Пока что не хочется без крайней надобности использовать в GitHub Actions токен с разрешением коммитить в репозиторий.
Pull request с обновлениями
issues.md
в свою очередь сам изменяетissues.md
:)Поэтому решил не заморачиваться с преждевременной автоматизацией.
select26
Посмотрите SECRETS. Нет нужды хранить сами секреты в коде - можно получать их из безопасного хранилища прямо во время выполнения Actions.