web-dev-qa-db-ja.com

gitlab ciランナーのMavenアーティファクトキャッシュを有効にする方法

継続的な統合を行うために、共有ランナーでgitlab ciを使用します。ビルドごとに、ランナーは大量のMavenアーティファクトをダウンロードします。

同じアーティファクトが何度もダウンロードされるのを防ぐことでビルドプロセスをスピードアップできるように、これらのアーティファクトをキャッシュするようにgitlab ciを構成する方法はありますか?

43
helt

Gitlab CIでは、ジョブごとまたはビルドごとに、ビルド間でキャッシュされるデータを含む特定のパスを定義できます(詳細については here を参照)。 khmarbaiseの推奨事項と組み合わせて、これを使用して複数のビルド間の依存関係をキャッシュできます。

ビルドのすべてのジョブの依存関係をキャッシュする例:

cache:
  paths:
    - .m2/

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=.m2"

maven_job:
  script:
    - mvn clean install
53
andban

GitLab's issue tracker での会話によると、Mavenのローカルリポジトリパスを変更して./.m2/repository/ディレクトリに配置しました。 CI構成へ:

cache:
  paths:
    - ./.m2/repository
  # keep cache across branch
  key: "$CI_BUILD_REF_NAME"

残念ながら、 このStackOverflowの回答 によると、Mavenローカルリポジトリパスは、-Dmaven.repo.localを使用するか、settings.xmlを編集することで実行するたびにのみ設定できますが、これは面倒な作業ですgitlab-ci設定スクリプト。オプションは、デフォルトのMavenオプションで変数を設定し、実行ごとに渡すことです。

また、ローカルのMavenリポジトリが現在のディレクトリの子であることが重要です。何らかの理由で、それを/cacheまたは/buildsに入れることは、GitLabの誰かがそうすべきだと主張しているにもかかわらず、私にとってはうまくいきませんでした。

Maven + Java用の作業gitlab-ci.yml構成ファイルの例:

image: maven:3-jdk-8

variables:
  MAVEN_OPTS: "-Djava.awt.headless=true -Dmaven.repo.local=./.m2/repository"
  MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version"

cache:
  paths:
    - ./.m2/repository
  # keep cache across branch
  key: "$CI_BUILD_REF_NAME"

stages:
  - build
  - test
  - deploy

build-job:
  stage: build
  script:
    - "mvn clean compile $MAVEN_CLI_OPTS"
  artifacts:
    paths:
      - target/

unittest-job:
  stage: test
  dependencies:
    - build-job
  script:
    - "mvn package $MAVEN_CLI_OPTS"
  artifacts:
    paths:
      - target/

integrationtest-job:
  stage: test
  dependencies:
    - build-job
  script:
    - "mvn verify $MAVEN_CLI_OPTS"
  artifacts:
    paths:
      - target/

deploy-job:
  stage: deploy
  artifacts:
    paths:
      - "target/*.jar"
10
Ondrej Skopek

キャッシュフォルダーをgitlab-ciランナー構成に追加し、mavenに渡すことができます。

/ etc/gitlab-runner/config.toml

[[runners]]
...
  [runners.docker]
  ...
   volumes = ["/cache", "/.m2"]
  ...

。gitlab-ci.yml

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=/.m2"

build:
  script:
    - mvn package
5
Alexey

Gitlab-runnerのエグゼキューターとしてkubernetesを使用している場合、mavenキャッシュも使用できます。私は、k8s PVでNFSに永続キャッシュを使用することを選択しました(ただし、他のボリュームタイプは gitlab-runner でサポートされています)。次の構成では、NFSが提供する永続性のため、 cache gitlab機能を使用しません。

1)クラスタでPersistentVolumeを作成します。ここではNFSを使用します(永続層とオプションに適応します)。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: gitlabrunner-nfs-volume
spec:
  capacity:
    storage: 10Gi
  mountOptions:
    - nolock
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /gitlabrunner
    server: 1.2.3.4

2)PVを参照して、ランナーポッドのボリュームとしてクレームを取得します。

[[runners.kubernetes.volumes.pvc]]
  name = "pvc-1"
  mount_path = "/path/to/mount/point1"

注(03/09/18):これらのパラメーターのコマンドラインオプションはまだ存在しません。未解決 issue があります。

3)gitlab-runnerキャッシュに同じパスを指定します:

[[runners]]
  executor = "kubernetes"
  # ...
  cache_dir = "/path/to/mount/point1"

または

--cache-dir "/path/to/mount/point1"インタラクティブモード

4)-Dmaven.repo.localオプションで「/ path/to/mount/point1」ディレクトリを使用します

1

ホストボリュームを使用して、.m2リポジトリディレクトリを共有できました。これには、settings.xmlファイル(誰もが望むとは限らない)よりも共有できるという利点もありました。上記のcacheソリューションを使用するよりも高速であることがわかりました。

[[runners]]
  [runners.docker]
    volumes = ["/home/<user>/.m2:/root/.m2"]
0
pez

別のアプローチがあります。 gitlabキャッシュを使用せず、カスタム(プロジェクトごと)Dockerイメージを使用しないでください。

いくつかの詳細:

まず、プロジェクトの依存関係に必要なすべて(またはほとんど)が提示されているMavenドッカーイメージを作成する必要があります。レジストリ(gitlabにある)に公開し、mavenを実行しているすべてのジョブに使用します。

このようなイメージを作成するには、通常、手動でトリガーされるCIで追加のジョブを作成します。初期段階およびプロジェクトの依存関係が大幅に変更されたときにトリガーする必要があります。

作業サンプルは次の場所にあります。

https://gitlab.com/alexej.vlasov/syncer/blob/master/.gitlab-ci.yml -このプロジェクトは準備されたイメージを使用しており、このイメージを準備する仕事もあります。

https://gitlab.com/alexej.vlasov/maven/blob/master/Dockerfile -mavenを実行して依存関係を1回ダウンロードするdockerfile。

長所:

  • 依存関係を毎回ダウンロードする必要はありません-それらはdockerイメージ内にあります(そしてdockerレイヤーはランナーにキャッシュされます)
  • ジョブの終了時にアーティファクトをアップロードする必要はありません
  • キャッシュはジョブでダウンロードされませんmavenを使用しないでください
0
Alexey Vlasov