SonarQubeコンテナを7.1-alpineから7.5-communityに移行した話

## Alpineベースのビルドは現在サポートされていない
SonarQubeでJava 11を解析するにあたってサポート状況等々を調べていた<sup>※</sup>ところ、
Alpineベースのイメージが SonarQube 7.1 以降提供されていないことに気づきました。

このあたりにコメントがありました。
https://github.com/SonarSource/docker-sonarqube/issues/182#issuecomment-443990870
https://github.com/SonarSource/docker-sonarqube/issues/191#issuecomment-443145321

> * we don't support Alpine-based builds. As of today, OpenJDK 8 does not officially support Alpine. 
> * We don't officially support these images (they won't be listed on the hub), because OpenJDK on Alpine is not officially supported,

そのためsonarqube:7.1-alpine から sonarqube:7.5-community への移行を行ったのですが、
そもそものベースイメージを変えたり、SonarQube自体にもアップデートが数多く入っていますので
気になった変更点や手順などをまとめておきます。


## 7.1→7.5 における新機能や重大な変更点等
個人的に気になった箇所をあげます。その他の詳細は以下から参照できます。

**Release Upgrade Notes**
https://docs.sonarqube.org/latest/setup/upgrade-notes/

### Community Editionで解析可能な言語が増加
* 7.2で [**Go**](https://www.sonarqube.org/sonarqube-7-2/)をサポート
* 7.3で [**CSS、Kotlin**](https://www.sonarqube.org/sonarqube-7-3/) をサポート
* 7.4で [**Ruby**](https://www.sonarqube.org/sonarqube-7-4/) をサポート& [**VB.NET**](https://jira.sonarsource.com/browse/SONAR-11389) がCommunity Editionで利用可能に
* 7.5で [**Scala**](https://jira.sonarsource.com/browse/SONAR-11403)をサポート

ちなみに7.5から [**Apex**](https://jira.sonarsource.com/browse/SONAR-11590) がEnterprise Edition 以上で利用可能になっています。

### SonarQube 7.4
* [**PostgreSQLで任意のスキーマを指定可能に**](https://jira.sonarsource.com/browse/SONAR-11196)
    * sonar.jdbc.url で currentSchema パラメータ使用して指定することができるようになった 

```shell-session 
sonar.jdbc.url = jdbc:postgresql://localhost/sonarqube?currentSchema=my_schema

# これまではDBユーザーに search_pathプロパティを設定する必要があったが不要に
psql> ALTER USER mySonarUser SET search_path to mySonarQubeSchema
```

### SonarQube 7.3
* [**PostgreSQL 9.3未満がサポート対象外に**](https://jira.sonarsource.com/browse/SONAR-10668)
    * PostgreSQL 9.3 未満に接続しようとすると、SonarQubeが起動しないため、注意が必要

### SonarQube 7.2
* [**Security Analysis**](https://docs.sonarqube.org/latest/analysis/pull-request/)
    * Java/C# で各種Injectionの検知が可能（有償エディションのみ）
* [**Analysis of Pull Requests**](https://docs.sonarqube.org/latest/analysis/pull-request/)
    * プルリクエストコードに対する分析、GHE/TFSとの統合（有償エディションのみ）
* [**パッケージ配布方法の変更**](https://jira.sonarsource.com/browse/SONAR-10687)
    * 各エディション毎にパッケージが配布されるようになった
        * アップグレードが簡単になった一方で、[**Marketplaceからのエディション変更が不可**](https://jira.sonarsource.com/browse/SONAR-10696)に
* **バンドルプラグインの配置パス変更**
    * バンドルプラグインは /opt/sonarqube/extensions/plugins に配置されるように
        * 変更前の/opt/sonarqube/lib/bundled-plugins をDocker Volume化していた場合は不要になる
        * 関連して、[**LDAPプラグインもバンドル**](https://jira.sonarsource.com/browse/SONAR-10688) されるようになったのが地味に嬉しい

このあたりの大幅な変更を受けてか、7.2および7.3のDockerイメージは提供されていない。
https://community.sonarsource.com/t/sonarqube-7-2-released/302
> There’s no Docker image (on purpose, we didn’t forget!) for this version.


## 参考手順
ベースイメージの変更や、7.2おけるプラグイン周りの変更、小規模利用であること等々を鑑みて
今回はバックアップ取得後に思い切ってボリュームは再作成しました。
分析済みのデータはデータベースに保管されているので、
データベースバージョンの互換が保てていれば問題ないかなと思います。

公式のアップグレードガイドの記載内容も事前に確認しておきます。

**Upgrade the Server**
https://docs.sonarqube.org/latest/setup/upgrading/

特にデフォルト以外のプラグインを利用している場合は、Plugin Version Matrixを参照し、
SonarQube 7.5と互換性のあるバージョンを利用する必要があります。
単純に古いバージョンのコンテナからプラグインをコピーしてしまうと、互換性の問題や
プラグインの重複によってSonarQubeが正常に起動しない可能性があります。

**Plugin Version Matrix**
https://docs.sonarqube.org/display/PLUG/Plugin+Version+Matrix

### コンテナの再作成
```shell-session
# docker-composeで複数コンテナを起動している場合、SonarQubeコンテナだけを停止し、
# コンテナ削除、ボリューム削除の順に実施
docker-compose stop sonarqube
docker rm -v sonar
docker volume rm sq_bundled-plugins sq_conf sq_data sq_extensions
# 更新済みのdocker-compose.ymlでSonarQubeコンテナの再作成
docker-compose up -d
```

実際よりはかなり端折っていますが、compose-fileは以下のようなイメージです。
AD連携やコンテキストパスの変更が不要であればrun.shのオプションは不要です。

```docker-compose.yml
version: '3.7'

services:
  sonarqube:
    image: sonarqube:7.5-community
    container_name: sonar
    environment:
      - SONARQUBE_JDBC_USERNAME=user
      - SONARQUBE_JDBC_URL=jdbc:postgresql://db_hostname:port/sonar?currentSchema=my_schema
      - SONARQUBE_JDBC_PASSWORD=mypassword
    volumes:
      - sq_conf:/opt/sonarqube/conf
      - sq_data:/opt/sonarqube/data
      - sq_extensions:/opt/sonarqube/extensions
      - sq_logs:/opt/sonarqube/logs
    command: >
      bash -c 
      "./bin/run.sh 
      -Dsonar.security.realm=LDAP 
      -Dldap.url=$$LDAP_HOST 
      -Dldap.bindDn=$$LDAP_BIND_DN 
      -Dldap.bindPassword=$$LDAP_BIND_PASSWORD 
      -Dldap.user.baseDn=$$LDAP_USER_BASE_DN 
      -Dldap.user.request=$$LDAP_USER_REQUEST 
      -Dldap.user.realNameAttribute=displayname 
      -Dldap.user.emailAttribute=mail
      -Dsonar.web.context=/sonarqube"

networks:
  my_network:
    external: true

volumes:
  sq_conf:
  sq_data:
  sq_extensions:
  sq_logs:
```

### データベースのマイグレーション
新しいSonarQubeコンテナを起動したら、
`http://yourSonarQubeServerURL/setup`
にアクセスし、画面の指示に従ってDBのマイグレーションを実行します。
1-Clickで完了しますが、念の為作業前にバックアップを取得すべきです。
その後、必要に応じてインデックス再構築などDB側のメンテナンスも実施します。

## ※備考: SonarQube の Java 11 対応状況について
[別記事にまとめました。](https://qiita.com/hayao_k/items/2cd81161f8dffd3a178b)