SonarQubeを7.5に上げた

# はじめに
6.3 -> 7.5にバージョン上げたら色々忘れてたので残しておきます。
インストール方法が少しだけ変わってるのでそこら辺も触れておきます。

ついでに今回js(Vue.js)のチェックもできるようにしたので触れておきます。

# インストール方法で変わったこと

入れるるだけなら[ここに書いたもの](https://qiita.com/sh-ogawa/items/4966afaaed72b444ab80)と同じですが、
6.3以降のどこかで追加になったElasticsearchのおかげで１つやることが増えました。
※Elasticsearchを外してSonarQubeを使用することはできません。

これやらないと動きません。

上記リンクのやり方通りに入っている前提で書いておくと、

```/opt/tools/sonar/latest/bin/linux-x86-64/sonar.sh
#RUN_AS_USER=
↓↓↓↓
RUN_AS_USER=sonar
```

にする必要があります。
また、sonarが入っているディレクトリにsonarユーザーがアクセスできるようにしておく。

これはElasticsearchがrootで実行できないため、こういうことをしておく必要があります。
もともとrootで動かすようなことをしていなければ不要です。

# アップデート方法
はじめ6.3 -> 7.5に直接アップデートをしようとしたら、
バージョン古すぎるから１回直近のLTSに上げてから7.5にしてくれって怒られたので、

6.3 -> 6.7.x -> 7.5と順を追ってやっていきます。

## SonarQubeを停止しておく

> service sonar stop

## DBバックアップを取る<br>

## SonarQubeはバージョンを上げるとDBマイグレーションで色々テーブル構成が変わります。

バックアップを取っておかないと、元には戻せなくなるので必ずやります。
自分の手元はMySQLなので、こんなのでやっておきます。

> mysqldump -u root -p --all-databases --single-transaction > dump.all

## SonarQube 6.7ダウンロード＆展開

SonarQubeのサイトから6.7の最新がzipで取れるので取って展開してシンボリックリンクを貼り代えます。

## SonarQubeを起動

> service sonar start

※私の場合は、これをやる前にRUN_AS_USERの設定を追加した

## ブラウザで/setupにアクセスする

これやるとDBマイグレーションが走って、終われば6.7になってます。

## 7.5版で同じことを繰り返す

これでバージョンアップの一兆上がりです。

ちなみにJenkinsと相乗りさせてるので、/sonarとかしてましたが、ここの変え方を忘れていて３０分くらいはまってました。
同じことしている人は以下を追加すればOK。

```/opt/tools/sonar/latest/conf/sonar.properties
sonar.web.context=/sonar
```

# 品質測定する
測定自体はJenkins Pipeline使って測定させるのでJenkinsfileを書きます。

## ソフトの構成
* Laravel 5.7
* Vue 2.5
* PHPUnit
* vue-test-utils(mocha + karma)

Laravel Mix 4が出てwebpack4が使えるようになったから、フロントエンド弱者の自分でもjsのテストコード書けるようになった。
（3だと古すぎて何使えるのか全く判らない）

```Jenkinsfile

node {
    try{
        stage('update'){
            withCredentials([[$class: 'UsernamePasswordMultiBinding', 
                    credentialsId: 'test',
                    usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
                        git([url: 'https://hogehoge/hoge.git', branch: 'develop', credentialsId: 'test'])
            }
        }
        stage('dependency resolution'){
            sh 'composer install'
            sh 'yarn install'
        }
        stage('run test'){
            sh 'sh tests/run-php-test.sh | echo "ignore failure"'
            sh 'sh tests/run-js-test.sh | echo "ignore failure"'
        }
        stage('sonar anliyze'){
            sh '/opt/tools/sonar/analyzer/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=sh-ogawa:kroyeeg -Dsonar.projectName=kroyeeg -Dsonar.projectVersion=1.0 -Dsonar.sources=app,resources/js -Dsonar.exclusions=**/vendor/** -Dsonar.tests=tests/Unit,js-test/unit/specs -Dsonar.php.coverage.reportPaths=reports/coverage/clover.xml -Dsonar.javascript.lcov.reportPaths=js-test/reports/lcov.info -Dsonar.login=hogehoge_token'
        }
    }catch(error){
        notifyMsg = "ビルドが失敗しました。${error}"
        
    }finally{
        notigication(notifyMsg)
    }
}

```

こんな感じ。
これのリポジトリURLとかをちゃんとしたものにすると動きます。

軽く解説しておくと、SonarQube自体にphpunitやjsのテストをする機能はなくて、結果レポートを取込みさせる必要があります。
sonar.propertiesに色々書いても良いのですが、プロジェクトが増えると取り回しが利かなくなるので、
基本はscriptのパラメータとして与えるようにしてます。（好みの問題）

run testのフェーズで | echo "ignore failure"で繋いでいるのは、テストがこけても結果を保存したいためです。
よくやるTIPSってヤツですね。

karma-conf.jsの設定だけ晒しておきます。

```js-test/karma-conf.js
let webpackConfig = require('../build/js/webpack.test.conf')

module.exports = function (config) {
  config.set({
    browsers: ['jsdom'],
    frameworks: ['mocha', 'sinon-chai'],
    files: [
      './index.js'
    ],

    preprocessors: {
      './index.js': ['webpack', 'sourcemap']
    },

    webpack: webpackConfig,

    reporters: ['coverage'],

    coverageReporter: {
      type: 'lcov',
      dir: './reports',
      subdir: './'
    }
  })
}

```

ちなみにwebpackの設定はvue-cli3で初期化される設定をそのまま持ってきて、
Laravelのディレクトリにはめ込んでもおかしくないように適当にローカライズして使ってます。
（これが一番楽だったから）

# おわりに
画面は自重させてもらいますが、バージョンアップ方法とPHPとjsのマルチ言語プロジェクトの品質測定はこれで可能です。
手元のCI環境では動いていますが文章だけだし、判らないこともあると思うので、これどおりにやっても動かなかったら言っていただければ多少サポートはします。