Android
Jenkins
gradle

Jenkinsを利用したAndroidコード品質の見える化

More than 3 years have passed since last update.


目的

CIツールの一つであるJenkinsを利用してAndroidコードの静的解析結果の見える化を行う。コード品質を数値化することでバグを未然に防ぎ、また品質改善へのモチベーションへとつなげる。

具体的なゴールとして、Jenkinsの環境構築(今回はUbuntu Server上に構築)、Androidプロジェクトのビルドを行うジョブの作成、下記ツールを用いた解析結果をJenkinsでグラフ化するまでとする。


  • Lint

  • Checkstyle

  • FindBugs

  • JUnitによるテスト

  • テストのコードカバレッジ率

なお、今回はUbuntu Server上にJenkins環境を構築したが、目的はあくまでコード品質の見える化であり、個人で開発をしておりサーバー環境の必要がない方にも、ローカルにJenkins環境を立ち上げることの価値は十分にある。

下図のようなグラフがJenkinsのジョブページに表示される。

jenkins_report.png


環境


  • Ubuntu Server 14.04.1 LTS

  • Jenkins 1.594


Jenkinsのインストール

下記コマンドでUbuntu ServerにJDKをインストール

$sudo -E add-apt-repository ppa:webupd8team/java

$sudo apt-get update
$sudo apt-get install oracle-java7-installer

下記コマンドでJenkinsをインストール

wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -

sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins

この時点でブラウザから[IPアドレス]:8080でJenkinsにアクセスできるようになる。

また、macのローカルにJenkinsを立ち上げる場合は$brew install jenkinsでインストール後、ブラウザからlocalhost:8080にアクセスすればよい。


Jenkinsの初期設定

インストール後、まずは唯一のadminアカウントを設定し、また、自由にアカウントを作成することを禁止する。ここの設定は任意で。


ログイン認証の追加


  • Jenkinsの管理 > グローバルセキュリティの設定


    • セキュリティを有効化 にチェック

    • アクセス制御 > ユーザー情報 > Jenkins のユーザーデータベース > ユーザーにサインアップを許可 にチェック

    • アクセス制御 > 権限管理 > ログイン済みユーザーに許可 にチェック



  • 保存


ユーザ作成


  • アカウント登録 > サインアップ

  • ユーザー名、パスワード、パスワードの確認、フルネーム、メールアドレス を入力してサインアップ


ログイン認証の設定変更


  • Jenkinsの管理 > グローバルセキュリティの設定


    • アクセス制御 > ユーザー情報 > ユーザーにサインアップを許可 のチェックオフ

    • アクセス制御 > ユーザー情報 > 権限管理 > 行列による権限設定 にチェック

    • 登録済みユーザー名(自分)を入力して、追加

    • ユーザー名(自分) の行のチェックを全てオン

    • 匿名ユーザー の行のチェックを全てオフ



  • 保存

  • ここで一度Jnekinsからログアウトを行い、下記の状態になっていれば設定完了


    • ログインパネルのみ表示されて、新規のサインアップが出来なくなっている

    • 自分のユーザー名、パスワードでログインできる




AndroidSDKのインストール

次にJenkinsを立ち上げたマシンでAndroidをビルドできるようにAndroidSDKをセットアップする。コマンドラインだと以下の手順でセットアップできる。


Android SDKのインストール


  • 最新のAndroid SDKをダウンロードする


    • $wget http://dl.google.com/android/android-sdk_r24.0.2-linux.tgz



  • 解凍後、/var/lib/ へ移動する

  • 下記コマンドでパッケージの一覧を確認する


    • $/var/lib/android-sdk-linux/tools/android list sdk --all



  • 必要そうなパッケージを下記コマンドでインストールする


    • $/var/lib/android-sdk-linux/tools/android update sdk -u -a -t [パッケージ番号]

    • [パッケージ番号]はカンマ区切りで複数指定できる

    • 必要そうなパッケージは以下


      • Android SDK Build-tools

      • SDK Platform

      • Android Support Repository

      • Android Support Library





  • 試しにビルドを行うため、ANDROID_HOMEを環境変数に追加する


    • $export ANDROID_HOME=/var/lib/android-sdk-linux/



  • コードをレポジトリからクローンして、$./gradlew buildでビルドしてみる


Ubuntu ServerへのJenkinsユーザーのアクセス権設定

以下のコマンドでUbuntu Server上のjenkinsがアクセスするディレクトリにアクセス権を割り振る。

$sudo chown -Rf jenkins /var/lib/jenkins/

$sudo chgrp -Rf jenkins /var/lib/jenkins/
$sudo chown -Rf jenkins /var/lib/android-sdk-linux/
$sudo chgrp -Rf jenkins /var/lib/android-sdk-linux/


Jenkins上でAndroidをgradleビルド

次にJenkins上でgitからソースを取得し、gradleビルドを行うジョブを作成する。


  • Jenkinsの管理 > システムの設定 > グローバル プロパティ > 環境変数 に ANDROID_HOME を追加

  • Jenkinsの管理 > プラグインの管理 で Git Plugin を追加

  • 新規ジョブ作成 を選択

  • ジョブ名 を入力後、フリースタイル・プロジェクトのビルド を選択

  • ソースコード管理システム からソースコードを置いている場所を指定

  • ソースコード管理システム > Additional Behaviors に Clean before checkout を追加

  • ビルド > シェルの実行 で./gradlew buildを追加

  • ビルド後の処理の追加 > 成果物の保存 を選択し、**/*.apkを追加

ジョブの実行を行うことでapkが作成されることを確認する。


Jenkinsでコード解析結果の見える化


JUnitのレポート



  • こちらの記事からテストの環境を構築しておく

  • [ジョブ] > 設定 > ビルド後の処理の追加 > JUnitテスト結果の集計 を追加


lintのレポート


  • Jenkinsの管理 > プラグインの管理 で Android Lint Plugin を追加

  • [ジョブ] > 設定 > ビルド後の処理の追加 > Publish Android Lint results を追加


Checkstyleのレポート



  • こちらの記事からCheckstyleの環境を構築しておく

  • Jenkinsの管理 > プラグインの管理 で Checkstyle Plug-in を追加

  • [ジョブ] > 設定 > ビルド後の処理の追加 > Ceckstyle警告の集計 を追加


FindBugsのレポート



  • こちらの記事からFindBugsの環境を構築しておく

  • Jenkinsの管理 > プラグインの管理 で FindBugs Plug-in を追加

  • [ジョブ] > 設定 > ビルド後の処理の追加 > Ceckstyle警告の集計 を追加


JaCoCoのレポート



  • こちらの記事からJaCoCoの環境を構築しておく

  • Jenkinsの管理 > プラグインの管理 で JaCoCo plugin を追加

  • [ジョブ] > 設定 > ビルド後の処理の追加 > JaCoCoカバレッジレポートを記録 を追加


    • Path to exec files に**/**.execを設定

    • Path to class directories に**/build/intermediates/classes/debugを設定

    • Path to source directories に**/src/main/javaを設定

    • Exclusions に**/R.class,**/R$*.class,**/BuildConfig.classを設定




ビルドステータスの設定

各種レポートの設定はプロジェクトの方針や好みに応じて変更していけばよいが、下図のように設定しておくと、その解析に何か問題が起きた場合にビルド結果が黄色になり分かりやすくお勧め。

report_setting.png


問題の解決

問題が起きた場合は解析結果のグラフをクリックすると詳細を見ることができるので、それぞれのエラーを解析し、修正していく。また、エラーではないものやプロジェクトとして修正しないものはconfigファイルやignore設定などを更新していき検出されないように設定させる。

report_result.png

カバレッジ率に関してもグラフやパッケージごとのカバレッジ率の表示ができるので、何かしらの目標を持って達成するように心がけることでコードの品質を保つ目安、モチベーションになることが期待できる。