GitLab CI Как запустить конвейер для подмодулей в многомодульном проекте Maven

У меня есть мультимодульный проект Maven:

root
    SubmoduleA
        src
        pom.xml      
    SubmoduleB
        src
        pom.xml
    pom.xml
    .gitlab-ci.yml

Есть ли способ, которым я могу запустить конвейер CI только на SubmoduleA, когда кто-то проверяет код, который влияет только на SubmoduleA? Например, кто-то вносит изменения в SubmoduleA. Как только они фиксируют и отправляют, я хочу автоматически запустить build->test->deploy только в SubmoduleA, так как в SubmoduleB не было никаких изменений.

Есть ли способ указать триггеры и задания для конкретных подмодулей или подпроектов в репо?

3 ответа

Gitlab может запускать задание при изменении каталога: https://docs.gitlab.com/ee/ci/yaml/

Для этого решения:

  • вы должны включить кеш gitlab для репозитория maven, чтобы сохранить предыдущие модули сборки.
  • тогда вы можете определить задание для изменения пути
stages:
  - modules
  - build

moduleB:
  stage: modules
  script: 
    - mvn $MAVEN_OPTS -pl projectB clean install --also-make $MAVEN_CLI_OPTS
  only:
    changes:
      - projectB/**

master_job:
  stage: build
  dependencies:
    - projectB
  script:
    - >
      mvn $MAVEN_OPTS -pl projectA clean install $MAVEN_CLI_OPTS

Я считаю, что вам нужно создать проект gitlab для этого подмодуля, и этому подмодулю нужен собственный.gitlab-ci.yml. В этот момент он будет встроен внутри самого gitlab-ci-runner.

Я не эксперт в Maven (или Java), но я полагаю, что в более крупных проектах ваши подмодули могут стать отдельными двоичными библиотеками, хранящимися в ваших собственных внутренних репозиториях. Вы оба производите и потребляете банки в своей сборке, и вы обслуживаете их, используя сам Maven. Затем Maven может загрузить его для вас, используя встроенные функции разрешения зависимостей и извлечения пакетов, и что, возможно, вам будет лучше в сценарии сборки большого проекта Java с этим, чем с подмодулями git.

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

В Gitlab есть несколько вариантов создания вашего CI / CD:

  • Базовый
  • DAG
  • Ребенок / Родитель

Вы можете их смешать. Они не исключают друг друга.

Вас интересует Ребенок / Родитель

      stages:
  - triggers

trigger_a:
  stage: triggers
  trigger:
    include: a/.gitlab-ci.yml
  rules:
    - changes:
        - a/*

trigger_b:
  stage: triggers
  trigger:
    include: b/.gitlab-ci.yml
  rules:
    - changes:
        - b/*

Затем вы должны включить конвейеры для a а также bпроекты. Вы можете найти больше в их документации

Другие вопросы по тегам