GitLab CI Java Maven流水线:mvn install前置脚本合理性咨询
关于GitLab CI中
mvn install执行时机的问题 1. 在before_script中执行mvn install不合理,原因如下:
mvn install会触发Maven完整的构建生命周期:从validate开始,依次执行compile、test、package、install等所有阶段。这和你单独拆分的compile、test阶段完全重复,会导致编译、测试步骤被执行两次,浪费CI资源和时间。before_script是每个Job都会执行的脚本,如果放在这里,你的compile和三个并行的testJob都会先跑一遍mvn install,属于完全冗余的操作。- 你当前
compile阶段用了手动javac命令,和mvn install自带的编译步骤会产生冲突,可能导致构建产物混乱。
2. 测试阶段的mvn clean test前不需要执行mvn install
mvn clean test本身会先执行clean清空之前的构建产物,然后自动触发test阶段之前的所有前置生命周期步骤:包括依赖下载(dependency:resolve)、源码编译(compile)、测试代码编译(test-compile)等,完全不需要提前执行install。- 退一步说,就算你在测试前执行了
mvn install,clean也会把install生成的target目录清空,等于白做。
给你的流水线配置优化建议
结合你的需求,合理的GitLab CI配置应该是这样的:
stages: - compile - test - install # 使用指定镜像 image: java-tests-repository:latest compile_job: stage: compile # 建议用Maven原生编译命令替代手动javac,避免classpath维护问题 script: - mvn compile # 三个并行测试Job registration_test: stage: test script: - mvn clean test -Dtest=registration -Ddata_sets=users payments_test: stage: test script: - mvn clean test -Dtest=payments -Ddata_sets=users orders_test: stage: test script: - mvn clean test -Dtest=orders -Ddata_sets=users # 单独的install阶段,在测试通过后执行 install_job: stage: install script: - mvn install
如果坚持要用手动javac编译,那需要确保依赖已经下载,可以在compile Job里先执行mvn dependency:copy-dependencies来获取JUnit等依赖,而不是用mvn install:
compile_job: stage: compile script: - mvn dependency:copy-dependencies -DoutputDirectory=/lib - javac -d /src/tests/suites/ -cp /lib/junit-4.12.jar /data/sets/users.java
内容的提问来源于stack exchange,提问作者Emanuele Di Molfetta
相关产品推荐
相关产品推荐

