Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

SonarQubeをDockerContainerにしてみた話

More than 1 year has passed since last update.

はじめに

WebサービスのJava11対応をしてみた話 のコード解析ツール SonarQube に関する部分です。

経緯

Javaのコード解析ツールはcheckstyle、FindBugs、SpotBugs、fb-contrib等多々ありますが、私のプロジェクトでは、SonarQubeを利用していました。

Java8からJava11へのアップグレード対応を進めていた中で、コードがある程度完成したところでSonarQubeを実行したところまさかの以下のエラー・・・

java.lang.IllegalArgumentException: Unsupported class file major version 55

SonarQube(厳密にはSonarJavaPlugin)もJava11対応へのアップグレードが必要なことが判明した瞬間でした。

SonarQubeアップグレードの課題

SonarQubeアップグレードにあたり、調査したところ環境面、運用面の課題がいくつかあり、今回の対応の中で合わせて対応した方がよいと判断しました。

課題1. SonarQubeおよびSonarQube用のDBが個別サーバで管理されている上、OSやソフトウェアのパッチ適用が運用開始当初(少なくとも1年以上)から実施されていない
課題2. Java11対応のSonarJavaはSonarQube7.x以上でないと上手く動かない可能性がある(運用しているSonarQubeが6.xのためメジャーバージョンアップが必要)
課題3. ネットワーク等の制限から開発者が開発端末上ではSonarQubeが利用できずプルリクエストやマージ直前までコード解析が行えず作業の手戻りが多発していた

SonarQubeアップグレード課題解決策

課題1. 個別サーバで管理しているのが問題 -> DockerContainer化して他用途で運用されている開発用のサーバに集約しよう
課題2. 古いSonarQubeを利用しているのが問題 -> SonarQubeのDockerContainerイメージでは新バージョンが公開されているので利用しよう
課題3. 開発端末上で実行できるSonarQubeがないことが問題 -> DockerContainer化して配布しよう

DockerContainerにすることで全ての課題が解決するのではないかと考え、SonarQubeのDockerContainer化を開始することにしました。

SonarQubeのDokcerContainer化

DockerHubで公開されているSonarQubeをお借りして、 docker-compose.yml を以下のように作成しました。

version: '2'
services:
  mysql-sonarqube:
    container_name: mysql-sonarqube
    image: mysql:5.7.24
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - "./data/mysql/init:/docker-entrypoint-initdb.d"
      - "./data/mysql/db:/var/lib/mysql"
    ports:
      - "3306:3306"
    networks:
      - sonarqube-server-network
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=sonar
      - MYSQL_USER=sonar
      - MYSQL_PASSWORD=sonar

  # SonarQube Server
  sonarqube-server:
    container_name: sonarqube-server
    image: sonarqube:7.4-community
    command: -Dsonar.web.context=/sonarqube
    links:
      - mysql-sonarqube:mysql
    volumes:
      - ./data/sonarqube/extensions/plugin:/opt/sonarqube/extensions/plugins
    ports:
      - "9000:9000"
      - "9092:9092"
    networks:
      - sonarqube-server-network
    environment:
      - SONARQUBE_JDBC_USERNAME=sonar
      - SONARQUBE_JDBC_PASSWORD=sonar
      - "SONARQUBE_JDBC_URL=jdbc:mysql://mysql:3306/sonar?useUnicode=true&characterEncoding=utf8&useSSL=false"

networks:
  sonarqube-server-network:

実際の運用について

  • 実行環境
    開発用のサーバとしてCI/CD用に高スペックなものが存在したので、該当サーバ上でDockerContainerを起動して運用。起動・終了等はジョブ化して運用手離れをしています。

  • DockerContainerイメージの配布
    docker-compose.yml をgitリポジトリ管理し、変更起因で実行環境で起動するような配布をしています。また開発者のgitリポジトリを参照することで開発端末上で自由にSonarQubeを利用できるようになりました。

  • SonarQubeの解析ルールの展開
    SonarQubeの解析ルールのカスタマイズ等は、SonarQube上のDBに格納されているため、DBのデータをエクスポートし、以下部分で起動時にロードすることで皆同じ解析ルールで実行できるようになりました。

volumes:
  - "./data/mysql/init:/docker-entrypoint-initdb.d"
  • SonarQubeの時系列解析 DBがDockerContainerになったのことで過去データを利用した時系列解析のデータが揮発性になりましたが、私のいるプロジェクトでは最新のものを対象に確認しているので実害はありませんでした。 必要になったところで、以下のDBのボリューム部分を永続化できる場所に移動したら良いかなと考えています。
volumes:
  - "./data/mysql/db:/var/lib/mysql"

感想

別の対応から始まったSonarQubeのDockerContainer化ですが、周囲からは管理対象サーバ減少や開発端末上でのコード解析ができる点から概ね好評でした。
また、DockerContainer化で資源管理もリポジトリ化でき見えるかもできたのが良かったと思っています。

本記事の対応は以下のgithubリポジトリに公開していますので興味ありましたら参考にしてください。
https://github.com/awakuwaku/sonar-qube-docker

参考

awakuwaku
その辺にいるガジェット好きなエンジニアです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away