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
проекты. Вы можете найти больше в их документации