読者です 読者をやめる 読者になる 読者になる

旅するえんじにあ - Engineers to Travel -

旅するエンジニアの気まま備忘録

【MySQL】 createしようとしたらエラー Can't create table

最近は作るだけの仕事をしていたり、前に作った資産についての質問がきたりで 特に新しい事ができていません。 pull型のDeploy等の仕組みを作ったりしてたのですが、それは今後書いていきます。

さて、今のProjectではMigrationにstandalone-migrationsを使っているのですが それもPHP製のPhinxに変えたいなぁと思いつつ。

そんな中テストデータを何度も入れたり消したりするのにmigrationを繰り返していた時 Can't create table と言われ、急にmigrationができなくなってしまいました。

実際には

 Can't create database 'hoge_database' (errno: 28): CREATE DATABASE `hoge_database` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_general_ci`

みたいな感じです。

手前の作業でpull型のDeployについていろいろやってはいたのですが migrationとは関係ないことをしていたくらいで原因がよくわかりませんでしたが 調べてみると容量が原因でした。

dfコマンドで確認してみると

[root@localhost migrations]# df
Filesystem           1K-blocks     Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root
                      51475068 48902376         0 100% /
tmpfs                   961152        0    961152   0% /dev/shm
/dev/sda1               487652    57576    404476  13% /boot
/dev/mapper/VolGroup-lv_home
                     249210780   235868 236309056   1% /home

まぁ容量がないわけで。 結局原因は色々な調査をするのにMysql側で設定したquery logと 色んなソースをチェックしていた各Projectの.git/object/packでした。

Totalで40G近くを食いつぶしてたわけで。 ログと不要なソースを削除することによってmigrationができるようになりました。

面倒くさがってlogrotateしてなかったのが原因ですね。

あと、virtual box 自体の容量が少し少なすぎました。 単一Projectなら問題ないだろうと思ってたのですが、複数ものProjectに色んなツールを使って検証をしていたので そこも原因ですね。

virtualboxの容量拡張とlogrotateでも書いていこうかと思います。

【MySQL】 MySQLインストール後、起動に失敗する

ひょんなことからGCPで新しい環境を構築することになり(といっても昔で言うLAMP環境のようなもの) PHPやらNginx、MySQLをインストールしているのですが どうしてもMySQLのStartで[FAILED]になってしまう。

MySQLyumで入れているし、何か指定が必要だったのかとか考えたのですが 推測で物事を進めると良いことがないのでまずはlogを確認します。

するとserviceを立ち上げた時のログの中にERRORが見受けられました。

/var/log/mysqld.log

2016-11-29 11:08:39 1958 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
2016-11-29 11:08:39 1958 [ERROR] Plugin 'InnoDB' init function returned error.
2016-11-29 11:08:39 1958 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2016-11-29 11:08:39 1958 [ERROR] Unknown/unsupported storage engine: InnoDB
2016-11-29 11:08:39 1958 [ERROR] Aborting

Cannot allocate memory for the buffer pool. よくあるやーつです。

実はGCPの環境については f1-micro(vCPU x 1、メモリ 0.6 GB) という要は最低スペックで作られているので、メモリも600Mちょっとしかなかったのです。

freeコマンドでSWAP領域を確認してみると

# free
             total       used       free     shared    buffers     cached
Mem:        604380     159344     445036        156       2260      19948
-/+ buffers/cache:     137136     467244
Swap:            0          0          0

案の定SWAP領域がありませんでした。

ということで、SWAP領域を作ります。

# dd if=/dev/zero of=/swapfile bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 26.8912 s, 39.9 MB/s

次にSWAP領域を有効にします。

# mkswap /swapfile
# swapon /swapfile

これでMySQLが起動できるようになるはずです。

【python】 pythonのバージョンアップ 2.6系から2.7系へ

Google Cloud Platformってもう最近でもないんですが すごく便利なものが出てきましたね。 AWSのS3みたいなものなんでしょうか。 使ったことないのですがね・・・

さてGoogle Cloud Strageを使おうと色々と設定し、shellを書いたり 自動化したりを進めていたんですが、少し時間がかかってしまい 久々にいじってるのですが(別途この辺は書く予定です) バージョンを確認すると

[root@localhost deploy]# gsutil version
Warning: You are running Python 2.6, which stopped receiving security
patches as of October 2013. gsutil will stop supporting Python 2.6 on
September 1, 2016. Please update your Python installation to 2.7 to
ensure compatibility with future gsutil versions.gsutil version: 4.19

どうやらpythonのバージョンが古いようで、8月いっぱいでサポート止めるよとのことです。 そのため、2.6系から2.7系にアップデートが必要なのです。

はいはい、わかりましたそれではアップデートしましょうと 簡単にいくわけにはいかないなぁと。

なぜかと言うと今使っている環境はCentOSなんですが とてもお世話になっているyumコマンド このコマンドpython製なんです。

同じ2系だから互換性はあると思うのですが 本当に大丈夫なのか。

yumに関しては/usr/bin/yumをエディタで開いて 1行目のpythonバージョン指定とかすればいいような気がするんですが その他のpythonは大丈夫なんだろうか。 そういったところで危ないっていう人もいるのですが、調べるとそれだけで設定して問題がない人がいるようなのでその設定で一回様子を見ようと思います。

さて現在インストールされているpythonのバージョンは

# python --version
Python 2.6.6

ちょっと古いようですね。 現時点での2系最新バージョンは2.7.9です。 まずはソースを落としていきます。

# cd /usr/local/src
# curl -O https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz

次に解凍していきます。 余談ですが、解凍というはオジサンらしいです。展開が正しい言い方なのかな。

# tar zxf Python-2.7.9.tgz

さて展開したところでインストールしていきます。

# cd Python-2.7.9
# ./configure
# make && make altinstall

コンパイルが終わるとpythonファイルができています。 バージョンを確認してみましょう。

# /usr/local/src/Python-2.7.9/python --version
Python 2.7.9

バージョン上がってますね。 これをbinに入れていくのですが、既に/usr/bin/以下には既にpythonがいると思います。 注意はこれがシンボリックリンクになっていないかってところでしょうか。

一旦現行バージョンをバックアップして置き換えていきます。

# mv /usr/bin/python /usr/bin/python2.6.6

次に先ほどmakeしたpythonを置き換えていきます。

# cp /usr/local/src/Python-2.7.9/python /usr/bin/python

さてこれで完了と思いきや、冒頭に話したyumの部分ですね。

# vim /usr/bin/yum

#!/usr/bin/python
↓
#!/usr/bin/python2.6.6

これでOKです。 ここに関しては賛否両論あるので、python関係で何かおかしかったら思い出すようにしましょう笑 因みに上記のyumの書き換えをしないとyumが使えなくなるので気をつけましょう。

【Jenkins】 Jenkins権限設定のミスによりログインができなくなった

最近はDeployやらCI環境の構築やらを少しやらせてもらっています。 CIといえばJenkinsですね。 あの紳士なくしてCI環境はと言われるくらいです。

さてそんなJenkinsのバージョンアップ等やっていたのですが グローバルセキュリティの設定を誤って設定してしまった為に、閉めkinsになって どのユーザでログインしても「全体/Read パーミッションがありません。」のようなエラーで鬼kinsになる・・・

要は権限管理を間違えて保存すると、どのユーザでも設定のし直しができなくなる。 要は完全に閉め出されるわけです。

そうなった時の対処法です。 もちろんJenkins Wikiにも対応方法が載っています。

Disable security - Jenkins - Jenkins Wiki

せめてそうなった場合とかってどうしようもなくなるし、そうなることを望む人は少ないと思うので 何か警告とか出してもいいような気がするんだけど・・・

まずはJenkinsを停止させます。

service jenkins stop

もしくは

/etc/init.d/jenkins stop

次にconfig.xmlを編集します。

JENKINS_HOMEは各インストール時に設定していると思いますが デフォルトだと/var/lib/jenkinsがJENKINS_HOMEになっていると思います。

編集の前に何かあったらアレなので、バックアップをとっておきましょう。

config.xmlを編集します。

ここはtrueになっているのでfalseに書き換えます。

更に以下2つのタグ内及びタグ自体を削除します。

Jenkinsを再起動します。

久々に鬼kinsを見ました。 さぁまた権限設定に戻るかなぁ。

【PHP】 PHP製のDeploy tool deployerでdeployを試す

最近はMySQL partitionのPHPUnitテストとか記事にもならないようなニッチなことをやっていたわけで。 PHPUnitでpartition削除とかDBテストでできればいいのにとか思いつつ、ゴリゴリ書いてたわけで。

ちょっと息抜きに。

Capistranoでdeployをすることが多かったのですが、PHP製のDeployも試してみようと思って Deployerを使ってみたので、簡単に紹介したいと思います。

その前に今回作った簡単な環境ですが VirtualBoxを2つ立ち上げ、Linuxのlocal環境を2つ用意しました。

192.168.56.10 <--------> 192.168.56.11

192.168.56.10 こちらのサーバをWEBサーバに見立て、deploy先とします。

192.168.56.11 こちらのサーバをdeployサーバとし、deploy元とします。

なので、deployツールを192.168.56.11にインストールしていきます。

deployerインストール

composerのように

wget http://deployer.org/deployer.phar

こんな感じでdeployer.pharをDownloadします。

mv deployer.phar /usr/local/bin/dep

こんな感じでbinへ突っ込んでcommandで使えるようにします。

composerでインストールすることも可能です。

今回は新しいサーバにペロッとインストールしてさくっとdeployしてみたかったのでcomposerではなく、直接ダウンロードしました。

ソースを確認したい場合は以下にてcloneするなりして確認しましょう。 https://github.com/deployphp/deployer

ここからディレクトリを自分で作っていきます。

deployer 設定

自分が作ったディレクトリは以下の通りです。

deploy
├── config
│   ├── parameters.yml
│   └── servers.yml
├── console
└── deploy.php

parameters.ymlファイルとconsleディレクトリは空でいいので作成だけしておくものらしいです。 まず、deployというディレクトリに必要なファイルをまとめることにしました。

1つずつ見ていきます。

servers.yml

localhost:
    host: 192.168.56.10
    port: 22
    user: root
    identity_file:
        public_key: ~/.ssh/id_rsa.pub
        private_key: ~/.ssh/id_rsa
        password: ''
    stage: localhost
    deploy_path: /tmp/project
    branch: master

192.168.56.10、192.168.56.11双方で鍵認証できるように 双方のauthorized_keysを作成し、鍵認証でsshできるようにしておいてください。

因みに今回はid_rsaにはPassword設定はしていません。

ここにはそれぞれサーバ毎の設定を書いていきます。 ここで注意しなきゃいけないのはidentity_fileのpassword部分です。 設定の仕方がさらっと調べただけでは出てこなく、passwordを設定項目に含まない場合 deployの度にパスワードをきかれます。 しかも、実際には鍵認証ができているので空エンターで処理が続行されるのです。

どうすればいいのかわからずに結局build前のソースを読んで解決したのですが、納得いかないです・・・

細かくは書きませんが、設定値の情報はBuilder.phpで実行されるようです。 identityFileを設定した場合は必ずパスワードチェックが走るのです。

因みにidentityFileで指定するpublic_keyとprivate_keyはデフォルト ~/.ssh/id_rsa.pub ~/.ssh/id_rsa となっているので、同じであれば特に設定しなくてもOKです。

stageはコマンドでの引数でEnvironment用にlocalhostとしました deploy_pathはdeploy先(192.168.56.10)のどこにdeployするかのpathです。

これで設定ファイルの記述は完了です。

次にdeploy.phpを記述していきます。

<?php
require 'recipe/composer.php';
serverList('config/servers.yml');
set('repository', 'git@git.example.jp:/xxx.git');

これだけになります。

deployer 実行

早速実行してみましょう。

[root@localhost deploy]# dep deploy localhost
✔ Executing task deploy:prepare
✔ Executing task deploy:release
✔ Executing task deploy:update_code
✔ Executing task deploy:shared
✔ Executing task deploy:vendors
✔ Executing task deploy:symlink
✔ Executing task cleanup
➤ Executing task success
Successfully deployed!
✔ Ok

こんな感じでdeployが完了します。

流れとしては

  • ssh接続
  • リリースディレクトリ作成
  • gitからのcheckout or clone
  • sharedに移すファイルがある場合はファイルもしくはディレクトリを移動 ※これはset('shared_dirs', [application/logs, directory/path]);のような形でsharedディレクトリに退避できる。
  • composer installを実行
  • deployしたディレクトリにシンボリックリンクを貼る
  • 世代管理数を超えるリリースディレクトリ以下のソースを削除する
  • suucessfully deployed!を表示

早速192.168.56.10側のdeploy_pathに指定した/tmp/projectを確認してみると

drwxr-xr-x   4 root root 4096  5月 27 10:31 2016 .
drwxrwxrwt. 11 root root 4096  5月 27 10:31 2016 ..
lrwxrwxrwx   1 root root   36  5月 27 10:31 2016 current -> /tmp/project/releases/20160527011759
drwxr-xr-x   5 root root 4096  5月 27 10:31 2016 releases
drwxr-xr-x   2 root root 4096  5月 26 13:04 2016 shared

見たことあるような感じでdeployされていますね。

何度かdeployしてみたのですが releaseを見る限り

drwxr-xr-x 5 root root 4096  5月 27 10:31 2016 .
drwxr-xr-x 4 root root 4096  5月 27 10:31 2016 ..
drwxr-xr-x 8 root root 4096  5月 26 19:42 2016 20160526102859
drwxr-xr-x 8 root root 4096  5月 26 20:05 2016 20160526105235
drwxr-xr-x 8 root root 4096  5月 27 10:31 2016 20160527011759

デフォルトで3世代管理されているようですね。

ここの世代管理を変更する場合は

deploy.php

set('keep_releases', 5);

keep_releasesの値を設定してあげると変更されます。

以後、deployerがCapistranoと同様に使えるのかを少しずつ追っていきたいと思います。

【Windows】 IPv6よりもIPv4を優先させる設定

自宅からノートPCは全てMacなんですが、今開発端末でWindowsを使っています。 そこでたまに困る事があるんです。

指定されたGitlabへ接続するのにVPNに接続してcloneしようとしても名前解決ができない。

鍵登録してるし、VPN繋いでるし何が悪いんだと思ってローカルに作ったVirtualboxからではなく Windowsコマンドプロンプトを使ってpingを打ってみると、見事にIPv6で表示されている。

今使っているWindows7ではどうやらIPv4よりもIPv6が優先されてしまっているようです。

前まではIPv6を無効にするみたいなことをしていたのですが、時期が時期ですし、Microsoftも非推奨。 さらにいつの間にかIPv4が枯渇してしまい、サービスがIPv6に変わっていたなんて事も考えると無効にするのはナンセンスなので 優先順位を変える対応をしたいと思います。

Windowsコマンドプロンプトを管理者として実行し以下のコマンドを実行

netsh interface ipv6 show prefixpolicies

すると

C:\Windows\system32>netsh interface ipv6 show prefixpolicies
アクティブ状態を照会しています...

優先順位   ラベル  プレフィックス
----------  -----  --------------------------------
        50      0  ::1/128
        40      1  ::/0
        30      2  2002::/16
        20      3  ::/96
        10      4  ::ffff:0:0/96
         5      5  2001::/32

こんな感じで表示されました。

40      1  ::/0

上記がIPv6です。

10      4  ::ffff:0:0/96

そしてこれがIPv4

この順番を変更してあげます。

netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 50 0
netsh interface ipv6 set prefixpolicy ::1/128 40 1
netsh interface ipv6 set prefixpolicy ::/0 30 2
netsh interface ipv6 set prefixpolicy 2002::/16 20 3
netsh interface ipv6 set prefixpolicy ::/96 10 4

上記コマンドを一つずつ叩いていくと一回毎に「OK」という表示が出てきます。

全て打ち終えたら再度確認します。

C:\Windows\system32>netsh interface ipv6 show prefixpolicies
アクティブ状態を照会しています...

優先順位   ラベル  プレフィックス
----------  -----  --------------------------------
        50      0  ::ffff:0:0/96
        40      1  ::1/128
        30      2  ::/0
        20      3  2002::/16
        10      4  ::/96
         5      5  2001::/32

このような形でIPv4を優先にしてあげればIPv4が優先となり、pingを打つとIPv4で名前解決されると思います。

IPv6がいつ始まるのかと数年前からそわそわしてますが、こういうところにも弊害が出てくるんですね。

一応覚書として。

【PHP】 PHPでの静的解析 SonarQubeを使ってみた

最近ネタもなく、日々テストとLibraryの作成を行っていました。 という言い訳で更新しないのは悪だと思っているので、ちょっと心いれかえて。

今回はPHPの静的解析についてです。 前々から静的解析ツールについては良い物が見当たらず、もちろんあるっちゃあるのですが コレジャナイ感が強かったのですが、勧められたツールがあったのでそれを今回は導入していきたいと思います。

静的解析って?

まずは静的解析とは何か。

静的解析とはプログラムを実行せずに、コードの問題点を見つける。 特定のコーディングパターンに違反している箇所を指摘する。

というのもになります。 少人数で開発していたとしてもレガシーなコードは増えていきます。 コピーして同じロジックが出来上がっていたり、コーディング規約に沿った書き方でない部分 動くけど、これっていいのかな?って思う部分を指摘してくれるわけです。

静的解析ツール

・Scrutinizer

・CodeClimate

・PHPMD

等があるのだが、どうもどれもぱっとしない。 Scrutinizerは使いやすかったけど、なんかいまいち欲しい機能がなかったり、解析速度が遅かったり 1人で使う分にはいいんだけど、実は無料版だと1ヶ月しか解析結果を保持してくれなかったり。

そんな時に見つけたのがSonarQube

対応言語も豊富でユニットテスト連携可(これは他も一緒ですが)、細かく解析が可能な上に、結構WEBが見やすい。 さらにライセンスがLGPLで公開されているので、無料で拡張までできる優れものです。

ということで早速インストールして解析してみました。

ローカル環境

Java jdk jdk-8u45-linux-x64 (jdk1.8.0_45) mysql Ver 14.14 Distrib 5.5.46, for Linux (x86_64) using readline 5.1 sonarqube-5.4 sonar-scanner-2.5

まずはJavaのインストールです。

ソースは基本/usr/local/srcにdownloadするものとします。 wgetにてJDKをダウンロード

cd /usr/local/src

wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.tar.gz"
tar xvf jdk-8u45-linux-x64.tar.gz

解凍したフィアルを移動 /usr/local/javaがない場合は作成

mkdir /usr/local/java
mv /usr/local/src/jdk1.8.0_45 /usr/local/java/

わかりやすいようにシンボリックリンクを張る

ln -s /usr/local/java/jdk1.8.0_45 latest

環境変数JAVA_HOMEを設定する

touch /etc/profile.d/javaenv.sh
touch /etc/profile.d/javaenv.csh
vim /etc/profile.d/javaenv.sh

export JAVA_HOME=/usr/local/java/latest
export PATH=$PATH:$JAVA_HOME/bin
vim /etc/profile.d/javaenv.csh

setenv JAVA_HOME=/usr/local/java/latest
setenv PATH=$PATH:$JAVA_HOME/bin

mysql設定

既にmysqlはインストール済を想定しています ユーザ作成及び権限付与

CREATE USER 'sonar'@'localhost' IDENTIFIED by 'sonar';
GRANT ALL PRIVILEGES ON sonar.* TO 'sonar'@'localhost';

SonarQube用のDatabase作成

CREATE DATABASE sonar;
FLUSH PRIVILEGES;

SonarQubeインストール及び設定

ソースディレクトリに移動してwgetでSonarQubeをダウンロード、解凍

cd /usr/local/src
wget "http://dist.sonar.codehaus.org/sonarqube-5.4.zip"
unzip sonarqube-5.4.zip

解凍したフィアルを移動 移動先ディレクトリは/usr/local/sonarqubeとし、ディレクトリがない場合は作成し、わかりやすいようにシンボリックリンクを張る

mkdir /usr/local/sonarqube
mv /usr/local/src/sonarqube-5.4 /usr/local/src/sonarqube/
ln -s /usr/local/src/sonarqube-5.4 sonar

JAVA同様に環境変数SONAR_HOMEを設定します。

touch /etc/profile.d/sonarenv.sh
touch /etc/profile.d/sonarenv.csh
vim /etc/profile.d/sonarenv.sh
export SONAR_HOME=/usr/local/sonarqube/sonar
export PATH=$PATH:$SONAR_HOME/bin/linux-x86-64
vim /etc/profile.d/sonarenv.csh
setenv SONAR_HOME=/usr/local/sonarqube/sonar
setenv PATH=$PATH:$SONAR_HOME/bin/linux-x86-64

SonarQubeでMySQLを使うので、SonarQubeの設定を書き換えます。

vim /usr/local/sonarqube/sonar/conf/sonar.properties

 #--------------------------------------------------------------------------------------------------
 # DATABASE
 #
 # IMPORTANT: the embedded H2 database is used by default. It is recommended for tests but not for
 # production use. Supported databases are MySQL, Oracle, PostgreSQL and Microsoft SQLServer.

 # User credentials.
 # Permissions to create tables, indices and triggers must be granted to JDBC user.
 # The schema must be created first.
 sonar.jdbc.username=sonar // mysqlのユーザ
 sonar.jdbc.password=sonar // mysqlのパスワード

 #----- Embedded Database (default)
 # H2 embedded database server listening port, defaults to 9092
 #sonar.embeddedDatabase.port=9092


 #----- MySQL 5.x
 # Only InnoDB storage engine is supported (not myISAM).
 # Only the bundled driver is supported. It can not be changed.
 sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance // コメントアウトを外す

serviceから起動できるように、"/usr/local/sonarqube/sonar/conf/wrapper.conf"を編集

vim /usr/local/sonarqube/sonar/conf/wrapper.conf
wrapper.java.command=/usr/local/java/latest/bin/java

init.d以下にシンボリックリンクを張る

ln -s /usr/local/sonarqube/sonar/bin/linux-x86-64/sonar.sh /etc/init.d/sonar

サービス開始とサービス停止

service sonar start
service sonar stop

SonarQubeへ接続 http://192.168.56.10:9000/

初期ユーザはID/PASS共にadminです。

これで下準備及びWEB画面の設定が完了です。

ここから解析をしていくのですが、冒頭でも説明したように、SonarQubeは色々な言語をサポートしています。 PHPに関してはPluginを導入する必要があります。 一緒に日本語パッケージもあるのでインストールしましょう。

SonarQubeに今回解析の対象となるPHPPluginを導入 Administration > System > Update Center

以下Pluginを導入 ・PHP ・Japanese Pack

これが導入されればPHPの解析及び日本語化が可能となります。

更に解析にはSonar scannerというツールが必要になります。 このScannerで解析した結果をMySQLに突っ込んで、それをWEBから見るという仕組みになります。

それではScannerのインストールです。

cd /usr/local/src/
wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-2.5.zip
unzip sonar-scanner-2.5.zip

コピーを取って/usr/lcoalへ移動、リンクを貼る

cp -R sonar-scanner-2.5 /usr/local/sonarqube/
cd /usr/local/sonarqube/
ln -s sonar-scanner-2.5 sonar-scanner

※srcディレクトリに不要だと思ったらmvでも良いと思います。 自分は何をインストールしたのかを見ておきたいので、容量が圧迫されない限りsrcディレクトリはDLしたファイルそのまま残ってます。。。

対象のソース配下にprojectファイルを設置することによって解析が可能となります。

vim /var/www/app/src/sonar-project.properties
sonar-project.properties
# Required metadata
sonar.projectKey=org.sonarqube:php-test-scanner
sonar.projectName=PHP :: test php project :: SonarQube Scanner
sonar.projectVersion=1.0
# Comma-separated paths to directories with sources (required)
sonar.sources=src
# Language
sonar.language=php
# Encoding of the source files
sonar.sourceEncoding=UTF-8
# exclusions
sonar.exclusions=src/vendor/**,src/tests/**

内容は見ればわかると思いますが、解析するディレクトリ、プロジェクト名(任意の名前)、言語の設定やファイルのエンコード、exclusionsは除外ディレクトリですね。

List Distributions
sonar.exclusions 除外設定
sonar.language 対象言語。 省略化するとマルチ言語として処理
sonar.projectKey プロジェクトを識別するためのキー。使用している環境で一意(ユニーク)にならなければならない。使用可能文字は アルファベットの小文字、数字、'-'、'_'、'.'、':' の記号。ただし、数字のみは不可。
sonar.projectName プロジェクト名。 Web 上でのプロジェクトの表示名となる。
sonar.projectVersion プロジェクトのバージョン
sonar.sourceEncoding ソースファイルの文字コード
sonar.sources ソースのあるフォルダー。プロジェクトファイルからの相対パスで指定
sonar.exclusions 除外するディレクトリ及びファイル

解析の時には対象のディレクトリまで移動し、sonar-runnerを実行します。

cd /var/www/app/src/
/usr/local/sonarqube/sonar-scanner/bin/sonar-runner
INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report
INFO: More about the report processing at http://localhost:9000/api/ce/task?id=AVODDZ_yE0cjnG_A0amQ
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 43.834s
INFO: Final Memory: 43M/255M
INFO: ------------------------------------------------------------------------

上記SUCCESSが出力されれれば完了となります。

先ほども書きましたが、SonarQubeはソースをSonarQube Scannerで読み取り、DBに保存、SonarQubeでDBから解析情報を取得し、表示するというのが一連の流れです。

ScannerがSUCCESSとなった後はWEB画面にsonar-project.propertiesで設定したプロジェクト名が表示されているはずです。

これでDuplication(重複コード)や規約に添っていない危険なコードの検出ができているので、確認しながら潰していくようにします。 CIとの連携はまた別途!

WEBで管理できる上に該当部分だけピックアップしてくれ、担当者やコメント、ステータス管理までできるから重宝しています!

もしPHPの静的解析が必要な場合は、一度試してみてください!