如何在 gitlab-ci build 中跳过前面的 maven 目标?

Posted

技术标签:

【中文标题】如何在 gitlab-ci build 中跳过前面的 maven 目标?【英文标题】:How to skip preceding maven goals in gitlab-ci build? 【发布时间】:2021-02-11 22:16:27 【问题描述】:

我有一个 java web 服务,想在gitlab-ci 中设置单独的测试/构建/部署阶段。 流程可能如下所示:

stages:
  - test
  - build
  - deploy

test:
  stage: clean test
  script:
    - mvn $MAVEN_CLI_OPTS test

build:
  stage: build
  script:
    - mvn $MAVEN_CLI_OPTS package -DskipTests=true

deploy:
  stage: deploy
  script:
    - mvn $MAVEN_CLI_OPTS package -DskipTests=true

问题:每个 maven 目标都会执行前面的生命周期目标。例如packagedeploy 目标默认也会执行test 目标。因此必须使用skipTests=true 明确排除它。

package 这样的目标仍然会在测试 + 部署时重新执行。

问题:可以进一步优化吗?我的意思是,我不想在每个阶段都重建罐子。我可以告诉 maven 重复使用 jar 并跳过之前的任何目标吗?

我知道单个 deploy 阶段足以让 maven 在后台执行包和测试目标。但是在我的 gitlab 中,我总是在 deploy 阶段失败,而例如 test 目标中的 junit 测试在下面失败了。

【问题讨论】:

【参考方案1】:

不,不是真的。 Maven 不是为了支持这一点而构建的。

你可以使用那些插件的skip参数。

或者,只需对mvn clean testmvn deploy -DskipTests=true 使用两个步骤,这实际上不会比单个mvn clean deploy 花费更长的时间。

【讨论】:

【参考方案2】:

您可以使用job artifacts 访问先前阶段的结果(在本例中为已编译的类)。此外,缓存本地存储库以便仅下载一次依赖项也是合理的。示例:

default:
  image: maven:3

variables:
  MAVEN_CLI_OPTS: "--batch-mode"
  MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository"

cache:
  paths:
    - .m2/repository

test-compile:
  stage: build
  script: mvn $MAVEN_CLI_OPTS test-compile
  artifacts:
    paths:
      - target/

test:
  stage: test
  script: mvn $MAVEN_CLI_OPTS test
  # maven-compiler-plugin outputs "Nothing to compile - all classes are up to date"
  artifacts:
    when: always
    reports:
      junit:
        - target/surefire-reports/TEST-*.xml

deploy:
  stage: deploy
  script: mvn $MAVEN_CLI_OPTS package -DskipTests

也可以通过这种方式并行运行单元测试和集成测试:

【讨论】:

以上是关于如何在 gitlab-ci build 中跳过前面的 maven 目标?的主要内容,如果未能解决你的问题,请参考以下文章

如何在推送事件中跳过 GitHub Actions 作业?

如何在循环中跳过项目

如何根据某些条件在 MSSQL 游标中跳过一行(迭代)?

如何在 Moshi 中跳过 JSON 属性?

PRISMA:如何在 prisma 常规类型中跳过 id 字段?

WPF - 如何在标签导航中跳过标签?