Ubuntu 16.04でSonarQubeを使用してコード品質を確保する方法

著者は、Write for DOnationsプログラムの一部として寄付を受け取るためにElectronic Frontier Foundationを選択しました。

前書き

Code qualityは、特定のコードがどれほど有用で保守可能かを概算したものです。 品質の高いコードは、アプリケーションの保守と拡張のタスクを簡単にします。 これにより、将来必要な変更を加えたときに、発生するバグが少なくなります。

SonarQubeは、コード品質の分析とレポート作成を支援するオープンソースツールです。 ソースコードをスキャンして潜在的なバグ、脆弱性、保守性の問題を探し、レポートに結果を表示します。これにより、アプリケーションの潜在的な問題を特定できます。

SonarQubeツールは2つのサブアプリケーションで構成されます。開発者のマシンにローカルにインストールされる分析エンジンと、記録保持とレポート作成のための集中サーバーです。 1つのSonarQubeサーバーインスタンスで複数のスキャナーをサポートできるため、多くの開発者からのコード品質レポートを1か所で集中管理できます。

このガイドでは、SonarQubeサーバーとスキャナーを展開して、コードを分析し、コード品質レポートを作成します。 次に、SonarQubeツールでスキャンして、マシンでテストを実行します。

前提条件

このガイドを始める前に、次のものが必要です。

[[step-1 -—-インストールの準備]] ==ステップ1—インストールの準備

SonarQubeをインストールする前に、いくつかの手順を実行する必要があります。 SonarQubeはサービスとして実行されるJavaアプリケーションであり、rootユーザーとしてサービスを実行することは確かに理想的ではないため、SonarQubeサービスを実行するために特別に別のシステムユーザーを作成します。 次に、インストールディレクトリを作成して権限を設定し、SonarQubeのMySQLデータベースとユーザーを作成します。

まず、sonarqubeユーザーを作成します。

sudo adduser --system --no-create-home --group --disabled-login sonarqube

このユーザーはSonarQubeサービスの実行にのみ使用するため、サーバーに直接ログインできないシステムユーザーを作成します。

次に、SonarQubeファイルを保持するディレクトリを作成します。

sudo mkdir /opt/sonarqube

ディレクトリが作成されたら、sonarqubeユーザーがこのディレクトリ内のファイルを読み書きできるように、アクセス許可を更新します。

sudo chown -R sonarqube:sonarqube /opt/sonarqube

SonarQubeリリースはzip形式でパッケージ化されているため、パッケージマネージャーを使用してunzipユーティリティをインストールし、配布ファイルを抽出できるようにします。

sudo apt-get install unzip

次に、SonarQubeが使用するデータベースと資格情報を作成する必要があります。 rootユーザーとしてMySQLサーバーにログインします。

mysql -u root -p

次に、SonarQubeデータベースを作成します。

CREATE DATABASE sonarqube;
EXIT;

次に、SonarQubeがデータベースへのアクセスに使用する資格情報を作成します。

CREATE USER [email protected]'localhost' IDENTIFIED BY 'some_secure_password';
GRANT ALL ON sonarqube.* to [email protected]'localhost';

次に、新しく作成されたユーザーがSonarQubeデータベースに変更を加えることができるように、アクセス許可を付与します。

GRANT ALL ON sonarqube.* to [email protected]'localhost';

次に、パーミッションの変更を適用して、MySQLコンソールを終了します。

FLUSH PRIVILEGES;
EXIT;

ユーザーとディレクトリが用意できたので、SonarQube自体をダウンロードしてインストールします。

ステップ2-SonarQubeのダウンロードとインストール

現在の作業ディレクトリをSonarQubeインストールディレクトリに変更することから始めます。

cd /opt/sonarqube

次に、SonarQube downloads pageに移動し、SonarQube7.0のダウンロードリンクを取得します。 SonarQubeには2つのバージョンがページからダウンロードできますが、この特定のチュートリアルではSonarQube 7.0を使用します。

リンクを取得したら、ファイルをダウンロードします。

sudo wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-7.0.zip

次に、ファイルを解凍します。

sudo unzip sonarqube-7.0.zip

ファイルが解凍されたら、ダウンロードしたzipファイルが不要になったため削除します。

sudo rm sonarqube-7.0.zip

すべてのファイルが配置されたので、SonarQubeを構成します。

ステップ3-SonarQubeサーバーの構成

SonarQube構成ファイルでいくつかを編集する必要があります。 すなわち:

  • SonarQubeサーバーがデータベース接続に使用するユーザー名とパスワードを指定する必要があります。

  • SonarQubeにバックエンドデータベースにMySQLを使用するように指示する必要もあります。

  • SonarQubeにサーバーモードで実行するように指示すると、パフォーマンスが向上します。

  • また、リバースプロキシを使用するため、SonarQubeにローカルネットワークアドレスのみでリッスンするように指示します。

SonarQube構成ファイルを開くことから始めます。

sudo nano sonarqube-7.0/conf/sonar.properties

まず、SonarQubeがデータベースへのアクセスに使用するユーザー名とパスワードを、MySQL用に作成したユーザー名とパスワードに変更します。

/opt/sonarqube/sonarqube-7.0/conf/sonar.properties

    ...

    sonar.jdbc.username=sonarqube
    sonar.jdbc.password=some_secure_password

    ...

次に、MySQLをデータベースドライバーとして使用するようSonarQubeに指示します。

/opt/sonarqube/sonarqube-7.0/conf/sonar.properties

    ...

    sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

    ...

最後に、SonarQubeにサーバーモードで実行し、ローカルアドレスのみをリッスンするように指示します。

/opt/sonarqube/sonarqube-7.0/conf/sonar.properties

    ...

    sonar.web.host=127.0.0.1
    sonar.web.javaAdditionalOpts=-server

これらのフィールドが更新されたら、ファイルを保存して閉じます。

次に、SonarQubeサーバーをサービスとして実行するように設定し、サーバーの再起動時に自動的に起動するようにします。

サービスファイルを作成します。

sudo nano /etc/systemd/system/sonarqube.service

SonarQubeサービスを開始および停止する方法を指定する次のコンテンツをファイルに追加します。

/etc/systemd/system/sonarqube.service

[Unit]
Description=SonarQube service
After=syslog.target network.target

[Service]
Type=forking

ExecStart=/opt/sonarqube/sonarqube-7.0/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/sonarqube-7.0/bin/linux-x86-64/sonar.sh stop

User=sonarqube
Group=sonarqube
Restart=always

[Install]
WantedBy=multi-user.target

systemdユニットファイルの詳細については、Understanding Systemd Units and Unit Filesを参照してください。

ファイルを閉じて保存し、SonarQubeサービスを開始します。

sudo service sonarqube start

SonarQubeサービスのステータスをチェックして、サービスが開始され、期待どおりに実行されていることを確認します。

service sonarqube status

サービスが正常に開始されると、次のような「アクティブ」という行が表示されます。

● sonarqube.service - SonarQube service
   Loaded: loaded (/etc/systemd/system/sonarqube.service; enabled; vendor preset
   Active: active (running) since Sun 2018-03-04 01:29:44 UTC; 1 months 14 days

次に、ブート時にSonarQubeサービスが自動的に開始するように構成します。

sudo systemctl enable sonarqube

他のほとんどのJavaアプリケーションと同様に、SonarQubeは初期化に時間がかかります。 初期化プロセスが完了したら、次の手順に進むことができます。

手順4-リバースプロキシの構成

SonarQubeサーバーを実行したので、SoginQubeインスタンスのリバースプロキシおよびHTTPSターミネーターであるNginxを構成します。

サイトの新しいNginx構成ファイルを作成することから始めます。

sudo nano /etc/nginx/sites-enabled/sonarqube

Nginxが受信トラフィックをSonarQubeにルーティングできるように、この構成を追加します。

/etc/nginx/sites-enabled/sonarqube

server {
    listen 80;
    server_name sonarqube.example.com;

    location / {
        proxy_pass http://127.0.0.1:9000;
    }
}

ファイルを保存して閉じます。

次に、構成ファイルに構文エラーがないことを確認します。

sudo nginx -t

エラーが表示された場合は、エラーを修正して、sudo nginx -tを再度実行してください。 エラーがなければ、Nginxを再起動します。

sudo service nginx restart

簡単なテストのために、Webブラウザでhttp://sonarqube.example.comにアクセスできるようになりました。 SonarQube Webインターフェースが表示されます。

次に、Let's Encryptを使用してインストール用のHTTPS証明書を作成し、サーバーとローカルマシン間でデータが安全に転送されるようにします。 certbotを使用して、Nginxの証明書を作成します。

sudo certbot --nginx -d sonarqube.example.com

Let's Encrypt証明書を初めて要求する場合、CertbotはメールアドレスとEULA契約を求めます。 電子メールを入力し、EULAに同意します。

その後、Certbotはセキュリティ設定の構成方法を尋ねます。 すべてのリクエストをHTTPSにリダイレクトするオプションを選択して、サーバーに送信されるリクエストが暗号化されるようにします。

リバースプロキシの設定が完了したので、SonarQubeサーバーのセキュリティ保護に進みます。

ステップ5-SonarQubeの保護

SonarQubeには、デフォルトの管理者ユーザー名とパスワードadminが付属しています。 このデフォルトのパスワードは安全ではないため、適切なセキュリティ対策としてより安全なものに更新する必要があります。

インストールのURLにアクセスして開始し、デフォルトの資格情報を使用してログインします。

ログインしたら、[Administration]タブをクリックし、ドロップダウンリストからSecurityを選択して、Usersを選択します。

SonarQube users administration tab

ここから、「管理者」アカウント行の右側にある小さな歯車をクリックし、「パスワードの変更」をクリックします。 パスワードは覚えやすいが推測しにくいものに変更してください。

次に、プロジェクトを作成し、同じページからサーバーに分析結果を送信するために使用できる通常のユーザーを作成します。 ページの右上にあるCreate Userボタンをクリックします:
SonarQube new user dialog

次に、「トークン」列のボタンをクリックして、このトークンに名前を付けて、特定のユーザーのトークンを作成します。 後でコードスキャナーを呼び出すときにこのトークンが必要になるため、必ず安全な場所に書き留めてください。

最後に、SonarQubeインスタンスは世界中に広く公開されており、誰でも分析結果とソースコードを表示できることに気付くかもしれません。
この設定は非常に安全ではないため、ログに記録されるだけを許可するようにSonarQubeを構成します-ユーザーがダッシュボードにアクセスします。 同じ管理タブから、左側のペインでConfigurationをクリックしてから、Securityをクリックします。 ユーザー認証を要求するには、このページのスイッチを切り替えます。

SonarQube Force authentication switch

サーバーのセットアップが完了したので、スキャナーをセットアップしましょう。

ステップ6-コードスキャナーのセットアップ

SonarQubeのコードスキャナーは、ローカル開発ワークステーションや継続的配信サーバーなど、SonarQubeサーバーを実行しているマシンとは異なるマシンにインストールできる個別のパッケージです。 SonarQube web siteで見つけることができるWindows、MacOS、およびLinuxで利用可能なパッケージがあります

このチュートリアルでは、SonarQubeサーバーをホストするサーバーにコードスキャナーをインストールします。

スキャナーのディレクトリを作成し、新しいディレクトリに変更することから始めます。

sudo mkdir /opt/sonarscanner
cd /opt/sonarscanner

次に、wgetを使用してLinux用のSonarQubeスキャナーをダウンロードします。

sudo wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778-linux.zip

スキャナーを抽出し、zipアーカイブファイルを削除します。

sudo unzip sonar-scanner-cli-3.0.3.778-linux.zip
sudo rm sonar-scanner-cli-3.0.3.778-linux.zip

その後、スキャナーをサーバーのインストールで動作させるために、いくつかの設定を変更する必要があります。 編集のために構成ファイルを開きます。

sudo nano sonar-scanner-3.0.3.778-linux/conf/sonar-scanner.properties

まず、スキャナーにコード分析結果の送信先を指示します。 sonar.host.urlで始まる行のコメントを解除し、SonarQubeサーバーのURLに設定します。

/opt/sonarscanner/sonar-scanner-3.0.3.778-linux/conf/sonar.properties

    sonar.host.url=https://sonarqube.example.com

ファイルを保存して閉じます。 スキャナーのバイナリを実行可能にします:

sudo chmod +x sonar-scanner-3.0.3.778-linux/bin/sonar-scanner

次に、パスを指定せずにスキャナーを呼び出すことができるように、シンボリックリンクを作成します。

sudo ln -s /opt/sonarscanner/sonar-scanner-3.0.3.778-linux/bin/sonar-scanner /usr/local/bin/sonar-scanner

スキャナーがセットアップされたので、最初のコードスキャンを実行する準備が整いました。

手順7-テストスキャンの実行

SonarQubeをいじって何ができるかを確認したい場合は、SonarQube example projectsでテストスキャンを実行することを検討してください。 これらは、SonarQubeチームが作成したサンプルプロジェクトで、SonarQubeが検出して報告する多くの問題が含まれています。

ホームディレクトリに新しい作業ディレクトリを作成してから、ディレクトリに移動します。

cd ~
mkdir sonar-test && cd sonar-test

サンプルプロジェクトをダウンロードします。

wget https://github.com/SonarSource/sonar-scanning-examples/archive/master.zip

プロジェクトを解凍し、アーカイブファイルを削除します。

unzip master.zip
rm master.zip

次に、サンプルプロジェクトディレクトリに切り替えます。

cd sonar-scanning-examples-master/sonarqube-scanner

前に作成したトークンを渡して、スキャナーを実行します。

sonar-scanner -D sonar.login=your_token_here

スキャンが完了すると、コンソールに次のようなものが表示されます。

INFO: Task total time: 9.834 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 14.076s
INFO: Final Memory: 47M/112M
INFO: ------------------------------------------------------------------------

サンプルプロジェクトのレポートは、SonarQubeダッシュボードに次のように表示されます。

SonarQube Dashboard

SonarQubeサーバーとスキャナーの両方が期待どおりに動作することを確認したので、SonarQubeを使用して独自のコードを分析できます。

プロジェクトをサーバーに転送するか、手順6の手順に従って、ワークステーションにSonarQubeスキャナーをインストールおよび構成し、SonarQubeサーバーを指すように構成します。

次に、プロジェクトのルートディレクトリでSonarQube構成ファイルを作成します。

nano sonar-project.properties

このファイルを使用して、SonarQubeにプロジェクトに関するいくつかのことを伝えます。

まず、プロジェクトの一意のIDであるproject keyを定義します。 好きなものを使用できますが、このIDはSonarQubeインスタンスに対して一意である必要があります。

sonar-project.properties

    # Unique ID for this project
    sonar.projectKey=foobar:hello-world

    ...

次に、SonarQubeがこの情報をダッシュ​​ボードに表示できるように、プロジェクト名とバージョンを指定します。

sonar-project.properties

    ...

    sonar.projectName=Hello World Project
    sonar.projectVersion=1.0

    ...

最後に、コードファイル自体を検索する場所をSonarQubeに伝えます。 これは、構成ファイルが存在するディレクトリに関連していることに注意してください。 現在のディレクトリに設定します。

sonar-project.properties

    # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
    sonar.sources=.

ファイルを閉じて保存します。

独自のコードでコード品質分析を実行する準備が整いました。 sonar-scannerを再度実行し、トークンを渡します。

sonar-scanner -D sonar.login=your_token_here

スキャンが完了すると、次のような概要画面が表示されます。

INFO: Task total time: 5.417 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 9.659s
INFO: Final Memory: 39M/112M
INFO: ------------------------------------------------------------------------

そして、プロジェクトのコード品質レポートがSonarQubeダッシュボードに表示されます。

結論

このチュートリアルでは、コード品質分析のためにSonarQubeサーバーとスキャナーをセットアップしました。 スキャンを実行するだけで、コードのメンテナンスとメンテナンスが簡単にできるようになりました-SonarQubeは潜在的な問題がどこにあるかを教えてくれます!

ここから、SonarQube Scanner documentationを読んで、ローカル開発マシンで、またはビルドプロセスの一部として分析を実行する方法を学ぶことができます。

Related