継続的な統合を行うために、共有ランナーでgitlab ciを使用します。ビルドごとに、ランナーは大量のMavenアーティファクトをダウンロードします。
同じアーティファクトが何度もダウンロードされるのを防ぐことでビルドプロセスをスピードアップできるように、これらのアーティファクトをキャッシュするようにgitlab ciを構成する方法はありますか?
Gitlab CIでは、ジョブごとまたはビルドごとに、ビルド間でキャッシュされるデータを含む特定のパスを定義できます(詳細については here を参照)。 khmarbaiseの推奨事項と組み合わせて、これを使用して複数のビルド間の依存関係をキャッシュできます。
ビルドのすべてのジョブの依存関係をキャッシュする例:
cache:
paths:
- .m2/
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2"
maven_job:
script:
- mvn clean install
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"
キャッシュフォルダーを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
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」ディレクトリを使用します
ホストボリュームを使用して、.m2
リポジトリディレクトリを共有できました。これには、settings.xml
ファイル(誰もが望むとは限らない)よりも共有できるという利点もありました。上記のcache
ソリューションを使用するよりも高速であることがわかりました。
[[runners]]
[runners.docker]
volumes = ["/home/<user>/.m2:/root/.m2"]
別のアプローチがあります。 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。
長所: