Запускать команды Git в микросервисе - PullRequest
0 голосов
/ 15 мая 2018

Я реализую микросервис (в Spring Cloud), который действует как фасад для операций Git, вызываемых слоем пользовательского интерфейса. Я пытаюсь использовать jgit, но проблема в том, что для этого требуется файловая система. Поэтому я должен клонировать удаленный репозиторий в локальную файловую систему. Проблема в том, что тогда микросервис не остается без гражданства, а также возникают другие проблемы:

  • клонирование перед каждой операцией занимает слишком много времени, поэтому это не вариант
  • Наличие нескольких экземпляров такого микросервиса может привести к различным репозиториям (push занимает некоторое время)
  • фиксация на разных узлах одновременно может привести к конфликтам

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

Я хотел бы добавить, что поиск решения довольно сложен, потому что фраза "Git microservice" встречается довольно часто, но в другом смысле (хранение источников в репозитории).

Редактировать: я только что нашел Есть ли какие-нибудь успокоительные интерфейсы для git? но любые другие идеи были бы хороши

1 Ответ

0 голосов
/ 04 июля 2018

Попробуйте заблокированную рабочую копию из scm4j API . Он может создать заблокированную папку в общей сетевой папке, которая не может использоваться другими микросервисами до выпуска. Делать любые проверки и другие работы в пределах рабочей копии. Затем он будет использован повторно, если будет предоставлен тот же URL-адрес хранилища, поэтому вам нужно выполнить только switch + pull, а не clone. Если другой микросервис в настоящее время работает с рабочей копией, будет взята и заблокирована другая доступная или будет создана и заблокирована новая, и т. Д.

public static final String WORKSPACE_DIR = System.getProperty("java.io.tmpdir") + "scm4j-vcs-workspaces"; // or provide network shared folder path
public static void main(String[] args) {
    IVCSWorkspace workspace = new VCSWorkspace(WORKSPACE_DIR);
    String repoUrl = "https://github.com/scm4j/scm4j-vcs-api";
    IVCSRepositoryWorkspace repoWorkspace = workspace.getVCSRepositoryWorkspace(repoUrl);
    try (IVCSLockedWorkingCopy wc = repoWorkspace.getVCSLockedWorkingCopy()) {
        // wc.getFolder() is locked folder where you can do any checkouts. Another microservices can not use this folder
    }
    // here folder is unlocked and can be reused if the same repository url is provided

}

...