13

我有一个多模块 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 中的特定子模块或子项目指定触发器和作业?

4

3 回答 3

3

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

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

我现在在 .Net 世界中使用自定义 nuget 提要执行此操作,结果与您正在做的类似,因为构建发生并且构建服务器的资源不会被源代码包括和重新编译这些模块浪费一秒钟时间。

于 2016-10-11T11:19:40.470 回答
3

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
于 2019-08-27T12:32:56.020 回答
1

Gitlab 有几个选项来构建你的 CI/CD:

  • 基本的
  • 有向无环图
  • 孩子/父母

你可以混合它们。它们不是相互排斥的。

您对孩子/父母感兴趣

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/*

然后你必须包括ab项目的管道。您可以在他们的文档中找到更多信息

于 2021-10-31T23:53:53.127 回答