如何在 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 目标都会执行前面的生命周期目标。例如package
或deploy
目标默认也会执行test
目标。因此必须使用skipTests=true
明确排除它。
package
这样的目标仍然会在测试 + 部署时重新执行。
问题:可以进一步优化吗?我的意思是,我不想在每个阶段都重建罐子。我可以告诉 maven 重复使用 jar 并跳过之前的任何目标吗?
我知道单个 deploy
阶段足以让 maven 在后台执行包和测试目标。但是在我的 gitlab 中,我总是在 deploy
阶段失败,而例如 test
目标中的 junit 测试在下面失败了。
【问题讨论】:
【参考方案1】:不,不是真的。 Maven 不是为了支持这一点而构建的。
你可以使用那些插件的skip
参数。
或者,只需对mvn clean test
和mvn 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 目标?的主要内容,如果未能解决你的问题,请参考以下文章