Jenkinsでコード行数¶
手段の模索¶
コード行数を計測して可視化するJenkinsのプラグインを調査
- StepCounterとSLOCCountはどちらもほぼ同じ可視化を提供します。
- StepCounterはカテゴリを任意に(解析対象ファイルのパターンで)定義できます。SLOCCounterは言語別固定。
- 対応言語はSLOCCount(cloc)の方が豊富ですが、定義済み拡張子にマッチしないファイルが無視されてしまいます。
- 対応言語で拡張子だけアンマッチな場合は、clocの
--force-lang
オプションで追加拡張子を指定可能。
- StepCounterはプラグインだけ入れれば計測可能ですが、SLOCCountは実行ノードにSLOCCountまたはclocツールをインストールした上でビルド処理にツールの実行を記述する必要があります。
- StepCounter 2.0.0はスレーブノードで実行すると致命的エラー
出力データ¶
StepCounter¶
トップページに掲載される項目
- 実行行合計(ステートメント行数)
- コメント行合計
- 空行合計
- 総計
詳細ページに掲載される項目
- カテゴリ別サマリ(トップページ掲載項目と同じ)
- 各ファイル別詳細(トップページ掲載項目と同じ)
SLOCCount¶
トップページに掲載される項目
- 言語別の実行行合計、実行行の増分、コメント行数合計、コメント行の増分、ファイル数、ファイル数増分
- 総合計
詳細ページに掲載される項目
- 各ファイル別詳細(実行行数、コメント行数)
- 各フォルダー別詳細(同上)
- 各言語別詳細(同上)
CentOS 7にclocをインストール¶
- EPELリポジトリにあるので、yum install cloc でOK
- ビルドコマンドは、プラグインページに例が記載
StepCounterプラグイン2.0.0でスレーブ実行エラー¶
次の環境で、スレーブノードを割当てプロジェクトを実行したところエラーとなった。
Node |
Software and version |
note |
Master |
Jenkins 2.222.4 @ CentOS 8, OpenJDK 1.8.0 |
Slave |
CentOS 7, OpenJDK 1.8.0 |
both ssh and jnlp |
エラー時のコンソール出力を 表示隠す
ユーザーJenkinsが実行
Running as SYSTEM
myslave-centos7-jnlp でビルドします。 ワークスペース: /home/jenkins/slave-jnlp/workspace/Step Counterの動作検証
No credentials specified
> git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
> git config remote.origin.url https://github.com/torutk/spectrum_file_viewer.git # timeout=10
Fetching upstream changes from https://github.com/torutk/spectrum_file_viewer.git
> git --version # timeout=10
> git fetch --tags --progress -- https://github.com/torutk/spectrum_file_viewer.git +refs/heads/*:refs/remotes/origin/* # timeout=10
> git rev-parse refs/remotes/origin/master^{commit} # timeout=10
> git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision e268e7e20cb0b01ff7e7f5c7fdd5ad5ab9c788b3 (refs/remotes/origin/master)
> git config core.sparsecheckout # timeout=10
> git checkout -f e268e7e20cb0b01ff7e7f5c7fdd5ad5ab9c788b3 # timeout=10
Commit message: "Add implementation of all behaviors without help"
> git rev-list --no-walk e268e7e20cb0b01ff7e7f5c7fdd5ad5ab9c788b3 # timeout=10
[stepcounter] category [ALL]
[stepcounter] includes [**/*.java]
[stepcounter] excludes []
[stepcounter] encoding [utf-8]
ERROR: Build step failed with exception
Also: hudson.remoting.Channel$CallSiteStackTrace: Remote call to JNLP4-connect connection from spartacus/192.168.1.240:61718
at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1788)
at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:356)
at hudson.remoting.Channel.call(Channel.java:998)
at hudson.FilePath.act(FilePath.java:1069)
at hudson.FilePath.act(FilePath.java:1058)
at org.jenkinsci.plugins.stepcounter.StepCounter._perform(StepCounter.java:148)
at org.jenkinsci.plugins.stepcounter.StepCounter.perform(StepCounter.java:118)
at hudson.tasks.BuildStepMonitor$2.perform(BuildStepMonitor.java:32)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:741)
at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:690)
at hudson.model.Build$BuildExecution.post2(Build.java:186)
at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:635)
at hudson.model.Run.execute(Run.java:1881)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:428)
java.lang.NullPointerException
at org.jenkinsci.plugins.stepcounter.parser.StepCounterParser.invoke(StepCounterParser.java:58)
at org.jenkinsci.plugins.stepcounter.parser.StepCounterParser.invoke(StepCounterParser.java:22)
at hudson.FilePath$FileCallableWrapper.call(FilePath.java:3069)
at hudson.remoting.UserRequest.perform(UserRequest.java:211)
at hudson.remoting.UserRequest.perform(UserRequest.java:54)
at hudson.remoting.Request$2.run(Request.java:369)
at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at hudson.remoting.Engine$1.lambda$newThread$0(Engine.java:117)
at java.lang.Thread.run(Thread.java:748)
Build step 'Step Counter' marked build as failure
Finished: FAILURE
- エラー発生の直接の原因は StepCounterParser型のtransientフィールドloggerがスレーブ実行時(remoting)にnullとなっており、フィールドloggerへの参照箇所(58行目)で実行時例外NullPointerExceptionが発生していること。
仮対処は、Step Counterプラグインのバージョンを1.4.6にダウングレードすること。
以下はStep Counterプラグインのコード修正案
https://github.com/torutk/stepcounter-plugin/tree/fix_slave_null