Tanzu BuildpackでSonarQubeのテストと統合する
Tanzu Java Buildpackのビルド時にSonarQubeの静的コード解析と組み合わせて実施することも可能です。
はじめに
Tanzu Java Buildpackというより、kpackは様々なカスタマイズができるようになっています。この回でも紹介しましたが、3rd Party連携などもできます。
厳密にいうと、これはCloud Native BuildpacksのBindingsという機能が可能にしています。
https://paketo.io/docs/buildpacks/configuration/#what-is-a-binding
今回はこれをもう少し遊んでみて、maven経由でSonarQubeの静的コード解析をTanzu Build Serviceのイメージビルド中に呼び出してみたいと思います。
https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-maven/
環境
Tanzu Build Service 1.1.1
SonarQubeはTBSと同じKubernetes上に同居させています。 手順はこのHelmチャートをインストールするだけ。
https://github.com/Oteemo/charts/tree/master/charts/sonarqube
コマンドでいうと以下です。
1kubectl create ns sonar
2helm repo add oteemocharts https://oteemo.github.io/charts
3helm install sonar oteemocharts/sonarqube -n sonar
試す
以下クィックに試します。 なお、やり方ですが、この回でも紹介したkpackのService Bindings機能から実施します。
https://github.com/pivotal/kpack/blob/master/docs/servicebindings.md
そして、この際呼び出すのは、maven packeto-buildpacksです。
https://github.com/paketo-buildpacks/maven
SonarQube側でTokenを取得
SonarQubeのUIからTokenを取得します。ここは大した手順ではないので割愛。
Imageリソースを生成
以下のようなYamlファイルを作成します。なおtag
に入る値は環境によって異なるので設定を変えてください。
1apiVersion: kpack.io/v1alpha1
2kind: Image
3metadata:
4 name: spring-petclinic-sonar
5spec:
6 builder:
7 kind: ClusterBuilder
8 name: default
9 source:
10 git:
11 revision: main
12 url: https://github.com/spring-projects/spring-petclinic
13 tag: <REPO>/<LIBRARY>/<IMAGE>
14 build:
15 env:
16 - name: "BP_MAVEN_BUILD_ARGUMENTS"
17 value: "-Dmaven.test.skip=true verify sonar:sonar"
18 bindings:
19 - name: settings
20 secretRef:
21 name: settings-xml
22 metadataRef:
23 name: settings-binding-metadata
24---
25apiVersion: v1
26kind: Secret
27metadata:
28 name: settings-xml
29type: Opaque
30stringData:
31 settings.xml: |
32 <settings>
33 <pluginGroups>
34 <pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
35 </pluginGroups>
36 <profiles>
37 <profile>
38 <id>sonar</id>
39 <activation>
40 <activeByDefault>true</activeByDefault>
41 </activation>
42 <properties>
43 <sonar.login>
44 XXXXXXXXXXXXXXXXXX
45 </sonar.login>
46 <sonar.host.url>
47 http://sonar-sonarqube.sonar.svc.cluster.local:9000
48 </sonar.host.url>
49 </properties>
50 </profile>
51 </profiles>
52 </settings>
53---
54apiVersion: v1
55kind: ConfigMap
56metadata:
57 name: settings-binding-metadata
58data:
59 kind: maven
60 provider: sonar
なお、以下の値は環境に合わせて変更すること。sonar.host.url
はTBSと同一のKubernetesクラスターかつ、Helmチャートでインストールしている場合、このままで大丈夫です。もし、別の方法でいれたらな正しい値にアップデートすること。sonar.login
には、前手順で取得したTokenを入れます。
1 <sonar.login>
2 XXXXXXXXXXXXXXXXXX
3 </sonar.login>
4 <sonar.host.url>
5 http://sonar-sonarqube.sonar.svc.cluster.local:9000
6 </sonar.host.url>
適用
そして上のYamlファイルを適用します。
1kubectl apply -f <Yaml名> -n <Namespace名>
以上です。あとは動作を確認します。
動作確認
しばらくすると、いかのように成功したJobが出現します。
1kubectl get po -n petclinic-build
2NAME READY STATUS RESTARTS AGE
3spring-petclinic-sonar-build-3-rn5gs-build-pod 0/1 Completed 0 98m
まずBuildフェーズのログの最後の箇所をみると、sonarqubeへのコード解析をしているのがわかります。
1# kubectl logs spring-petclinic-sonar-build-3-rn5gs-build-pod -n petclinic-build -c build
2...
3[INFO] ANALYSIS SUCCESSFUL, you can browse http://sonar-sonarqube.sonar.svc.cluster.local:9000/dashboard?id=org.springframework.samples%3Aspring-petclinic
4[INFO] Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report
5[INFO] More about the report processing at http://sonar-sonarqube.sonar.svc.cluster.local:9000/api/ce/task?id=AXf7USO50EPOcLxf9tIV
SonarQube側で確認
SonarQube側をみると確かにテストが走っているのが確認できます。
テスト結果もみれます。
これが役に立つかの是非はあるかと思いますが、かならずイメージビルドの際に静的コード解析を通すというガバナンスは適用できるかと思います。いわゆるSecure by Defaultですね。
個人的にはなによりもCloud Native BuildPackpackがkpackがこういったことが柔軟的にできる点がよいとおもいました。
まとめ
イメージビルドの際にSonarQubeなどの静的コード解析を組みわせることはTanzu Buildpacksであれば簡単にできます。