IK.AM

@making's tech note


Tanzu Application PlatformでJavaアプリのイメージをビルドする際にPrivate Maven Repositoryを参照するメモ

🗃 {Dev/CaaS/Kubernetes/TAP}
🏷 Kubernetes 🏷 Tanzu 🏷 TAP 🏷 Tanzu Build Service 🏷 kpack 🏷 Maven 
🗓 Updated at 2023-01-25T14:41:22Z  🗓 Created at 2022-12-14T04:12:34Z   🌎 English Page

⚠️ 本記事の内容はVMwareによってサポートされていません。 記事の内容で生じた問題については自己責任で対応し、 VMwareサポート窓口には問い合わせないでください

TAPでJavaアプリをデプロイする際にPrivate Maven Repositoryを使いたいときのメモ。 キャッシュ用途や社内ライブラリのホストなどに使用する想定。

参考ドキュメントはこちら https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.3/tap/GUID-tanzu-build-service-tbs-workload-config.html

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

✒️️ Edit  ⏰ History  🗑 Delete