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であれば簡単にできます。