簡體   English   中英

如何在 gitlab-ci build 中跳過前面的 maven 目標?

[英]How to skip preceding maven goals in gitlab-ci build?

我有一個 java webservice,想在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這樣的目標仍然會在測試 + 部署時重新執行。

問題:這可以進一步優化嗎? 我的意思是,我不想在每個階段都重建 jar。 我可以告訴 Maven 重用 jar,並跳過任何前面的目標嗎?

我知道單個deploy階段足以讓 maven 在后台執行包和測試目標。 但是在我的 gitlab 中,我總是在deploy階段失敗,而例如, test目標中的 junit 測試在下面失敗了。

不,不是真的。 Maven 不是為支持這一點而構建的。

您可以使用具有它們的插件的skip參數。

或者,只需使用mvn clean testmvn deploy -DskipTests=true兩個步驟,這應該不會比單個mvn clean deploy花費更長的時間。

您可以使用作業工件來訪問前一階段的結果(在本例中為已編譯的類)。 此外,緩存本地存儲庫以便僅下載一次依賴項也是合理的。 例子:

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 管道

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM