如何在GitLab-CI中使用Maven分离测试和构建阶段?

7
我希望您能够将maven的阶段分为buildtestdeploy
问题:我是不是把事情搞得太复杂了?也许我应该只使用一个mvn clean package阶段,因为compiletestpackage阶段期间由maven隐式执行? .gitlab-ci.yml文件内容如下:
stages:
  - build
  - test
  - deploy

build:
  stage: build
  script: mvn clean compile

test:
  stage: test
  script: mvn clean test

deploy:
  stage: deploy
  script: mvn clean package -Dmaven.test.skip=true
  #...continue with docker deployment...

最终你是对的,因为正如你自己提到的那样,诸如“编译”和“测试”之类的事情都是由“打包”运行的...此外,如果你执行“mvn clean deploy”,也会完成编译、测试和打包...问题是为什么你喜欢将这些事情分开呢? - khmarbaise
1
因为gitlab-ci有这3个默认阶段,当构建和项目变得更大时,人们可以直接看到失败是在编译、测试还是打包阶段,而无需查看日志。 - membersound
如果出现问题,您需要阅读日志...使事情比必要的更复杂不会有所帮助... - khmarbaise
2个回答

0

这篇文章中有两个问题。

如何在GitLab-CI中使用Maven分离测试和构建阶段?

这是可能的,可以像GitLab maven example中提到的那样完成:

image: maven:latest

variables:
  MAVEN_OPTS: >-
    -Dhttps.protocols=TLSv1.2
    -Dmaven.repo.local=.m2/repository
    -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN
    -Dorg.slf4j.simpleLogger.showDateTime=true
    -Djava.awt.headless=true

  MAVEN_CLI_OPTS: >-
    -s .gitlab-ci_settings.xml
    --batch-mode
    --errors
    --fail-at-end
    --show-version
    -DinstallAtEnd=true
    -DdeployAtEnd=true
    -Dstyle.color=always

cache:
  paths:
    - .m2/repository/
    - target/

mvn-compile-job:
  stage: mvn-compile
  script:
    - mvn $MAVEN_CLI_OPTS compile

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

mvn-deploy-job:
  stage: mvn-deploy
  script:
    - mvn $MAVEN_CLI_OPTS deploy
  only:
    - master

问题:我在这里是否过于复杂了?
这实际上取决于需要完成什么任务以及您想要实现什么目标。例如,如果您想在不同的分支上运行不同的阶段(在上面的示例中,我们仅在主分支上运行mvn deploy),那么这是一个很好的解决方案。
然而,在单个分支上,与从开始就只运行mvn deploy相比,运行单独的阶段需要在docker runner上花费更多的时间,因为每次GitLab作业运行都需要拉取镜像。这只是在配置maven存储库的CI/CD时需要考虑的一些事情。

0
如果有人偶然发现这篇文章,这里有一个关于工件如何工作的好介绍,我在尝试类似操作时也是通过这个理解的。
stages:
  - build
  - test

build hello:
  stage: build
  image: alpine:latest
  script:
    - echo "Hello $PWD" > hello.txt
  artifacts:
    paths:
      - ./hello.txt
    expire_in: 1 hour

build goodbye:
  stage: build
  image: alpine:latest
  script:
    - echo "Goodbye $PWD" > Goodbye.txt
  artifacts:
    paths:
      - ./Goodbye.txt
    expire_in: 1 hour

test goodbye:
  stage: test
  image: alpine:latest
  script:
    - test "`cat Goodbye.txt`" == "Goodbye $PWD"
  dependencies:
    - build goodbye


test hello:
  stage: test
  image: alpine:latest
  script:
    - test "`cat hello.txt`" == "Hello $PWD"
  dependencies:
    - build hello

test both:
  stage: test
  image: alpine:latest
  script:
    - test "`cat hello.txt`" == "Hello $PWD"
    - test "`cat Goodbye.txt`" == "Goodbye $PWD"

test fail_hello:
  stage: test
  image: alpine:latest
  script:
    - test "`cat Goodbye.txt`" == "Goodbye $PWD"
  dependencies:
    - build hello

test fail_goodbye:
  stage: test
  image: alpine:latest
  script:
    - test "`cat hello.txt`" == "Hello $PWD"
  dependencies:
    - build goodbye

测试失败的作业将会失败。

其他作业将会成功。

基本上,您可以指定一个艺术品路径,在一定的时间内保留它,以后可以使用它。(甚至可以从Web GUI下载)

它的工作方式是在创建它们的作业中指定 artifacts:数组。

然后,在您想要使用它们的作业中,如果您没有指定 dependencies:数组,则将拥有所有先前创建的艺术品。

如果您只想访问某些作业的艺术品,则可以指定 dependencies:数组,其中将保存这些作业的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接