GitLab CI如何在maven多模块项目中为子模块触发管道

GitLab CI如何在maven多模块项目中为子模块触发管道,maven,git-submodules,gitlab-ci,multi-module,runner,Maven,Git Submodules,Gitlab Ci,Multi Module,Runner,我有一个多模块Maven项目: root SubmoduleA src pom.xml SubmoduleB src pom.xml pom.xml .gitlab-ci.yml 当有人签入只影响子模块的代码时,我有没有办法只在子模块上触发CI管道? 例如,有人在子模中做了一个改变。一旦他们提交并推送,我想只在子模块上自动运行build->test->deploy,因为子模块B没有变化

我有一个多模块Maven项目:

root
    SubmoduleA
        src
        pom.xml      
    SubmoduleB
        src
        pom.xml
    pom.xml
    .gitlab-ci.yml
当有人签入只影响子模块的代码时,我有没有办法只在子模块上触发CI管道? 例如,有人在子模中做了一个改变。一旦他们提交并推送,我想只在子模块上自动运行build->test->deploy,因为子模块B没有变化


有没有一种方法可以为repo中的特定子模块或子项目指定触发器和作业?

我认为您需要为该子模块创建一个gitlab项目,并且该子模块需要自己的.gitlab-ci.yml。到那时,它将可以在gitlab ci运行程序内部构建

我不是Maven(或Java)方面的专家,但我认为在更大的项目中,您的子模块可以成为单独的二进制构建库,存储在您自己的内部存储库中。您可以在构建中生成和使用JAR,并使用Maven本身为其提供服务。Maven然后可以使用其内置的依赖项解析和包获取功能为您下载,并且在大型Java项目构建场景中使用它可能比使用git子模块更好


我现在在.Net世界中使用自定义nuget提要执行此操作,其结果与您所做的类似,即生成发生,生成服务器的资源不会因源代码(包括并再次重新编译这些模块)而浪费。

Gitlab可以触发目录更改作业:

对于此解决方案:

  • 您应该启用gitlab cache for 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