GitLab CI 如何在 Maven 多模块项目中触发子模块的管道
Posted
技术标签:
【中文标题】GitLab CI 如何在 Maven 多模块项目中触发子模块的管道【英文标题】:GitLab CI How to trigger pipeline for submodules in maven multi-module project 【发布时间】:2017-01-31 13:51:12 【问题描述】:我有一个多模块 Maven 项目:
root
SubmoduleA
src
pom.xml
SubmoduleB
src
pom.xml
pom.xml
.gitlab-ci.yml
当有人签入仅影响 SubmoduleA 的代码时,有什么方法可以仅在 SubmoduleA 上触发 CI 管道? 例如,有人在 SubmoduleA 中进行了更改。一旦他们提交并推送,我想只在 SubmoduleA 上自动运行 build->test->deploy,因为 SubmoduleB 没有任何更改。
有没有办法为 repo 中的特定子模块或子项目指定触发器和作业?
【问题讨论】:
【参考方案1】:我相信您需要为该子模块创建一个 gitlab 项目,并且该子模块需要自己的 .gitlab-ci.yml。届时,它将可以在 gitlab-ci-runner 本身内构建。
我不是 Maven(或 Java)方面的专家,但我想在更大的项目中,您的子模块可以成为存储在您自己的内部存储库中的单独的二进制构建库。您在构建中生产和使用 jar,并使用 Maven 本身为它们提供服务。然后 Maven 可以使用其内置的依赖解析和包获取功能为您下载,并且在大型 Java 项目构建场景中使用它可能会比使用 git 子模块更好。
我现在在 .Net 世界中使用自定义 nuget 提要执行此操作,结果与您正在执行的操作相似,因为构建发生并且构建服务器的资源不会被源包含和重新编译这些资源浪费第二次模块。
【讨论】:
【参考方案2】:Gitlab 可以在目录更改时触发作业:https://docs.gitlab.com/ee/ci/yaml/#onlychanges
对于这个解决方案:
您应该为 Maven 存储库启用 gitlab 缓存以保留以前的构建模块。 然后您可以定义作业以更改路径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
【讨论】:
【参考方案3】: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
项目的管道。您可以在their documentation中找到更多信息
【讨论】:
以上是关于GitLab CI 如何在 Maven 多模块项目中触发子模块的管道的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Gitlab CI 构建 Java Maven 项目?
如何在 gitlab-ci build 中跳过前面的 maven 目标?
你能在 GitLab CI/CD 中添加外部 Maven 库吗
如何在 Maven GitLab CI/CD 管道中将 JaCoCo 报告 HTML 转换为 PDF