TAPでJavaアプリをデプロイする際にPrivate Maven Repositoryを使いたいときのメモ。 キャッシュ用途や社内ライブラリのホストなどに使用する想定。
Maven Repositoryのインストール
ここではPrivate Maven Repositoryとして軽量な https://github.com/jenkins-x/bucketrepo を使用する
Helm Chartを使ってインストールする。
helm repo add jx3 https://jenkins-x-charts.github.io/repo
helm repo update
helm templateコマンドでマニフェストを生成
helm template bucketrepo jx3/bucketrepo -n bucketrepo --set secrets.adminUser.username=admin --set secrets.adminUser.password=changeme > bucketrepo.yaml
bucketrepoのデプロイ
kubectl create ns bucketrepo
kubectl apply -n bucketrepo -f bucketrepo.yaml
Podの確認
$ kubectl get pod -n bucketrepo
NAME READY STATUS RESTARTS AGE
bucketrepo-bucketrepo-5f8fcd86f7-xxkgz 1/1 Running 0 32s
Serviceの確認
$ kubectl get svc -n bucketrepo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bucketrepo ClusterIP 10.96.131.38 <none> 80/TCP 87s
settings.xmlの用意
ここではmirror repositoryとしてbucketrepoを使用する設定をsettings.xmlに記述し、それを次の形式のSecretに設定する。
cat <<EOF > settings-xml.yaml
apiVersion: v1
kind: Secret
metadata:
name: settings-xml
type: service.binding/maven
stringData:
type: maven
settings.xml: |
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>bucketrepo</id>
<username>admin</username>
<password>changeme</password>
</server>
</servers>
<mirrors>
<mirror>
<id>bucketrepo</id>
<name>bucketrepo</name>
<url>http://bucketrepo.bucketrepo.svc.cluster.local/bucketrepo</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
</settings>
EOF
Workloadを作成するnamespaceにこのSecretを作成する。
kubectl apply -f settings-xml.yaml -n demo
Workloadの作成
buildServiceBindings
paramでsettings.xmlを設定したSecretを参照する。
tanzu apps workload apply tanzu-java-web-app \
-n demo\
--git-repo https://github.com/vmware-tanzu/application-accelerator-samples \
--git-branch main \
--sub-path tanzu-java-web-app \
--type web \
--app tanzu-java-web-app \
--param-yaml buildServiceBindings='[{"name": "settings-xml", "kind": "Secret"}]' \
--annotation autoscaling.knative.dev/minScale=1 \
-y
初回はbucketrepoにキャッシュがないため、mirror repositoryなしの通常ビルドを同じくらいの時間がかかる。
$ kubectl logs -n demo tanzu-java-web-app-build-1-build-pod -c build | grep 'BUILD SUCCESS' -B 1 -A 4
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:17 min
[INFO] Finished at: 2022-12-14T04:00:19Z
[INFO] ------------------------------------------------------------------------
Build Serviceによるキャッシュが消えるように、Workloadを一度削除する。
tanzu apps workload delete -n demo tanzu-java-web-app -y
もう一度Workloadを作成
tanzu apps workload apply tanzu-java-web-app \
-n demo\
--git-repo https://github.com/vmware-tanzu/application-accelerator-samples \
--git-branch main \
--sub-path tanzu-java-web-app \
--type web \
--app tanzu-java-web-app \
--param-yaml buildServiceBindings='[{"name": "settings-xml", "kind": "Secret"}]' \
--annotation autoscaling.knative.dev/minScale=1 \
-y
Build Serviceによるキャッシュがなくても、10秒でビルド完了。速い!
$ kubectl logs -n demo tanzu-java-web-app-build-1-build-pod -c build | grep 'BUILD SUCCESS' -B 1 -A 4
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.674 s
[INFO] Finished at: 2022-12-14T04:09:05Z
[INFO] ------------------------------------------------------------------------
テスト時にもこのsettings.xmlを使用するには別途Tekton(Pipeline)側の設定が必要。
こんな感じ
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: maven-test-pipeline
labels:
apps.tanzu.vmware.com/pipeline: test
apps.tanzu.vmware.com/language: java
spec:
params:
- name: source-url
- name: source-revision
tasks:
- name: test
params:
- name: source-url
value: $(params.source-url)
- name: source-revision
value: $(params.source-revision)
taskSpec:
volumes:
- name: settings-xml
secret:
secretName: settings-xml
params:
- name: source-url
- name: source-revision
steps:
- name: test
image: eclipse-temurin:17
volumeMounts:
- mountPath: /opt/maven
name: settings-xml
readOnly: true
script: |-
set -ex
cd `mktemp -d`
curl -s $(params.source-url) | tar -m -xzvf -
./mvnw clean test -V -s /opt/maven/settings.xml