Ubuntu16.04でSonarQubeを使用してコード品質を確保する方法
著者は、 Electronic Frontier Foundation を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
コード品質は、特定のコードがどれほど有用で保守可能かを概算したものです。 高品質のコードを使用すると、アプリケーションの保守と拡張のタスクが簡単になります。 これにより、将来必要な変更を加えたときに発生するバグを減らすことができます。
SonarQube は、コード品質の分析とレポート作成を支援するオープンソースツールです。 ソースコードをスキャンして潜在的なバグ、脆弱性、保守性の問題を探し、その結果をレポートに表示して、アプリケーションの潜在的な問題を特定できるようにします。
SonarQubeツールは、2つのサブアプリケーションで構成されています。1つは開発者のマシンにローカルにインストールされる分析エンジンで、もう1つは記録管理とレポート用の集中型サーバーです。 1つのSonarQubeサーバーインスタンスで複数のスキャナーをサポートできるため、多くの開発者からのコード品質レポートを1か所にまとめることができます。
このガイドでは、SonarQubeサーバーとスキャナーをデプロイして、コードを分析し、コード品質レポートを作成します。 次に、SonarQubeツールでマシンをスキャンして、マシンでテストを実行します。
前提条件
このガイドを開始する前に、次のものが必要です。
- 2GB以上のメモリを備えた1台のUbuntu16.04サーバーは、この Ubuntu 16.04初期サーバーセットアップチュートリアルに従ってセットアップされます。これには、sudo非rootユーザーとファイアウォールが含まれます。
- サーバーにインストールされたOracleJava8は、このOracleJDKインストールチュートリアルのOracleJDKセクションに従って構成されます。
- このLEMPインストールガイドのNginxおよびMySQLセクションに従って構成されたNginxおよびMySQL。
- Ubuntu 16.04でNginxサーバーブロックを使用してLet'sEncryptを設定する方法に従って構成されたCertbot(Let's Encryptクライアント)。
- 完全修飾ドメイン名と、SonarQubeをインストールするサーバーを指すAレコード。 DigitalOceanのDNSサービスを使用している場合は、このDNSレコード設定ガイドがその設定に役立ちます。 このチュートリアルでは
sonarqube.example.com
を使用します。
ステップ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 sonarqube@'localhost' IDENTIFIED BY 'some_secure_password'; GRANT ALL ON sonarqube.* to sonarqube@'localhost';
次に、新しく作成されたユーザーがSonarQubeデータベースに変更を加えることができるようにアクセス許可を付与します。
GRANT ALL ON sonarqube.* to sonarqube@'localhost';
次に、権限の変更を適用して、MySQLコンソールを終了します。
FLUSH PRIVILEGES; EXIT;
ユーザーとディレクトリが配置されたので、SonarQube自体をダウンロードしてインストールしましょう。
ステップ2-SonarQubeのダウンロードとインストール
現在の作業ディレクトリをSonarQubeインストールディレクトリに変更することから始めます。
cd /opt/sonarqube
次に、 SonarQubeダウンロードページに移動し、SonarQube7.0のダウンロードリンクを取得します。 このページからダウンロードできるSonarQubeには2つのバージョンがありますが、この特定のチュートリアルでは、SonarQube7.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サーバーがデータベース接続に使用するユーザー名とパスワードを指定する必要があります。
- また、バックエンドデータベースにMySQLを使用するようにSonarQubeに指示する必要があります。
- 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ユニットファイルの詳細については、Systemdユニットとユニットファイルについてをご覧ください。
ファイルを閉じて保存してから、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サーバーが実行されたので、次はNginxを構成します。これは、SonarQubeインスタンスのリバースプロキシおよびHTTPSターミネーターになります。
サイトの新しい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
にアクセスできるようになりました。 SonarQubeWebインターフェイスが表示されます。
次に、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にアクセスすることから始め、デフォルトの資格情報を使用してログインします。
ログインしたら、管理タブをクリックし、ドロップダウンリストからセキュリティを選択して、ユーザーを選択します。
ここから、「管理者」アカウント行の右側にある小さな歯車をクリックしてから、「パスワードの変更」をクリックします。 パスワードは、覚えやすいが推測しにくいものに変更してください。
次に、プロジェクトを作成し、同じページからサーバーに分析結果を送信するために使用できる通常のユーザーを作成します。 ページの右上にあるユーザーの作成ボタンをクリックします。
次に、[トークン]列のボタンをクリックし、このトークンに名前を付けて、特定のユーザーのトークンを作成します。 このトークンは、後でコードスキャナーを呼び出すときに必要になるため、安全な場所に書き留めておいてください。
最後に、SonarQubeインスタンスは世界中に広く公開されており、誰でも分析結果とソースコードを表示できることに気付くかもしれません。 この設定は非常に安全ではないため、ログインしたユーザーのみがダッシュボードにアクセスできるようにSonarQubeを構成します。 同じ管理タブで、左側のペインの構成、セキュリティの順にクリックします。 このページのスイッチを切り替えると、ユーザー認証が必要になります。
サーバーのセットアップが完了したので、スキャナーをセットアップしましょう。
ステップ6-コードスキャナーを設定する
SonarQubeのコードスキャナーは、ローカル開発ワークステーションや継続的デリバリーサーバーなど、SonarQubeサーバーを実行しているマシンとは別のマシンにインストールできる別個のパッケージです。 Windows、MacOS、およびLinuxで利用可能なパッケージがあり、SonarQubeWebサイトで見つけることができます。
このチュートリアルでは、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サンプルプロジェクトでテストスキャンを実行することを検討してください。 これらは、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サーバーとスキャナーの両方が期待どおりに機能することを確認したので、SonarQubeを使用して独自のコードを分析することができます。
プロジェクトをサーバーに転送するか、手順6の手順に従って、ワークステーションにSonarQubeスキャナーをインストールして構成し、SonarQubeサーバーを指すように構成します。
次に、プロジェクトのルートディレクトリに、SonarQube構成ファイルを作成します。
nano sonar-project.properties
このファイルを使用して、SonarQubeにプロジェクトに関するいくつかのことを伝えます。
まず、プロジェクトの一意のIDであるプロジェクトキーを定義します。 好きなものを使用できますが、この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スキャナーのドキュメントを読んで、ローカル開発マシンで、またはビルドプロセスの一部として分析を実行する方法を学ぶことができます。