バグ #20
未完了Jenkins Warnings pluginで警告が拾えない
50%
説明
JenkinsでJavaのソースをビルドするプロジェクトを作成し、Warnings pluginを入れたが警告が拾えない。
対象とするJavaプロジェクト(NetBeans Ant)は次
source:swe_primus|learn/java/lambda/HelloLambda
高橋 徹 さんが10年以上前に更新
- ステータス を 新規 から 進行中 に変更
- 進捗率 を 0 から 50 に変更
Linux上のJenkinsで確認¶
試行1)コンパイルオプションに-Xlintを指定しないとき¶
コンパイルオプションの指定なしでビルドを実施した。警告の集計は0件であった。
このときのコンパイル出力は次。
[javac] 注意:/var/lib/jenkins/jobs/SakuraVPS_Git_Lambda_Java/workspace/learn/java/lambda/HelloLambda/src/hellolambda/HelloImpl.javaは非推奨のAPIを使用またはオーバーライドしています。 [javac] 注意:詳細は、-Xlint:deprecationオプションを指定して再コンパイルしてください。 [javac] 注意:/var/lib/jenkins/jobs/SakuraVPS_Git_Lambda_Java/workspace/learn/java/lambda/HelloLambda/src/hellolambda/HelloImpl.javaの操作は、未チェックまたは安全ではありません。 [javac] 注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。
試行2)コンパイルオプションに-Xlintを指定したとき¶
コンパイルオプションに-Xlint指定してビルドを実施した。警告の集計は6件であった。
このときのコンパイル出力は次。
[javac] /var/lib/jenkins/jobs/SakuraVPS_Git_Lambda_Java/workspace/learn/java/lambda/HelloLambda/src/hellolambda/HelloImpl.java:20: 警告: [deprecation] DateのgetDate()は非推奨になりました [javac] int date = new Date().getDate(); [javac] ^ [javac] /var/lib/jenkins/jobs/SakuraVPS_Git_Lambda_Java/workspace/learn/java/lambda/HelloLambda/src/hellolambda/HelloImpl.java:30: 警告: [rawtypes] raw型が見つかりました: List [javac] List list = (List) new ArrayList(); [javac] ^ [javac] 汎用クラスList<E>の型引数がありません [javac] Eが型変数の場合: [javac] インタフェース Listで宣言されているEはObjectを拡張します [javac] /var/lib/jenkins/jobs/SakuraVPS_Git_Lambda_Java/workspace/learn/java/lambda/HelloLambda/src/hellolambda/HelloImpl.java:30: 警告: [rawtypes] raw型が見つかりました: ArrayList [javac] List list = (List) new ArrayList(); [javac] ^ [javac] 汎用クラスArrayList<E>の型引数がありません [javac] Eが型変数の場合: [javac] クラス ArrayListで宣言されているEはObjectを拡張します [javac] /var/lib/jenkins/jobs/SakuraVPS_Git_Lambda_Java/workspace/learn/java/lambda/HelloLambda/src/hellolambda/HelloImpl.java:31: 警告: [unchecked] raw型Listのメンバーとしてのadd(E)への無検査呼出しです [javac] list.add("Alfa"); [javac] ^ [javac] Eが型変数の場合: [javac] インタフェース Listで宣言されているEはObjectを拡張します [javac] /var/lib/jenkins/jobs/SakuraVPS_Git_Lambda_Java/workspace/learn/java/lambda/HelloLambda/src/hellolambda/HelloImpl.java:17: 警告: [serial] 直列化可能なクラスHelloImplには、serialVersionUIDが定義されていません [javac] public class HelloImpl implements Hello, Serializable { [javac] ^ [javac] /var/lib/jenkins/jobs/SakuraVPS_Git_Lambda_Java/workspace/learn/java/lambda/HelloLambda/src/hellolambda/HelloImpl.java:24: 警告: [fallthrough] caseにfall-throughする可能性があります [javac] case 1: [javac] ^ [javac] 警告6個
高橋 徹 さんが10年以上前に更新
Windows上のJenkinsで確認¶
試行3)コンパイルオプションに-Xlintを指定したとき¶
コンパイルオプションに-Xlint指定してビルドを実施した。警告の集計は0件であった。
このときのコンパイル出力は次。
[javac] C:\Users\toru\.jenkins\jobs\SakuraVPS_Git_Lambda_Java\workspace\learn\java\lambda\HelloLambda\src\hellolambda\HelloImpl.java:20: 警告: [deprecation] DateのgetDate()は非推奨になりました [javac] int date = new Date().getDate(); [javac] ^ [javac] C:\Users\toru\.jenkins\jobs\SakuraVPS_Git_Lambda_Java\workspace\learn\java\lambda\HelloLambda\src\hellolambda\HelloImpl.java:30: 警告: [rawtypes] raw型が見つかりました: List [javac] List list = (List) new ArrayList(); [javac] ^ [javac] 汎用クラスList<E>の型引数がありません [javac] Eが型変数の場合: [javac] インタフェース Listで宣言されているEはObjectを拡張します [javac] C:\Users\toru\.jenkins\jobs\SakuraVPS_Git_Lambda_Java\workspace\learn\java\lambda\HelloLambda\src\hellolambda\HelloImpl.java:30: 警告: [rawtypes] raw型が見つかりました: ArrayList [javac] List list = (List) new ArrayList(); [javac] ^ [javac] 汎用クラスArrayList<E>の型引数がありません [javac] Eが型変数の場合: [javac] クラス ArrayListで宣言されているEはObjectを拡張します [javac] C:\Users\toru\.jenkins\jobs\SakuraVPS_Git_Lambda_Java\workspace\learn\java\lambda\HelloLambda\src\hellolambda\HelloImpl.java:31: 警告: [unchecked] raw型Listのメンバーとしてのadd(E)への無検査呼出しです [javac] list.add("Alfa"); [javac] ^ [javac] Eが型変数の場合: [javac] インタフェース Listで宣言されているEはObjectを拡張します [javac] C:\Users\toru\.jenkins\jobs\SakuraVPS_Git_Lambda_Java\workspace\learn\java\lambda\HelloLambda\src\hellolambda\HelloImpl.java:17: 警告: [serial] 直列化可能なクラスHelloImplには、serialVersionUIDが定義されていません [javac] public class HelloImpl implements Hello, Serializable { [javac] ^ [javac] C:\Users\toru\.jenkins\jobs\SakuraVPS_Git_Lambda_Java\workspace\learn\java\lambda\HelloLambda\src\hellolambda\HelloImpl.java:24: 警告: [fallthrough] caseにfall-throughする可能性があります [javac] case 1: [javac] ^ [javac] 警告6個
試行4)コンパイルオプションに¶
高橋 徹 さんが10年以上前に更新
Windows上でJenkins 1.579をデバッグ受け入れオプションを指定して起動
$ java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8086,suspend=n -jar jenkins-1.579.war
NetBeansで[デバッグ]メニュー > [デバッガのアタッチ]で、ポート8086を指定
AntJavacParser.java:47 にブレークポイント設置(boolean isLineInteresting(final String line)メソッド)
ブラウザで、localhost:8080に接続、ビルドを実行
ブレークポイントで停止、そのときのスタックトレースは、
"Executor #1 for master : executing SakuraVPS_Git_Lambda_Java #14" hudson.plugins.warnings.parser.AntJavacParser.isLineInteresting(AntJavacParser.java:47) hudson.plugins.warnings.parser.RegexpLineParser.parse(RegexpLineParser.java:86) hudson.plugins.warnings.parser.ParserRegistry.parse(ParserRegistry.java:318) hudson.plugins.warnings.parser.ParserRegistry.parse(ParserRegistry.java:297) hudson.plugins.warnings.WarningsPublisher.parseConsoleLog(WarningsPublisher.java:399) hudson.plugins.warnings.WarningsPublisher.perform(WarningsPublisher.java:321) hudson.plugins.analysis.core.HealthAwareRecorder.perform(HealthAwareRecorder.java:319) hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20) hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:770) hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:734) hudson.model.Build$BuildExecution.post2(Build.java:183) hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:683) hudson.model.Run.execute(Run.java:1770) hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43) hudson.model.ResourceController.execute(ResourceController.java:89) hudson.model.Executor.run(Executor.java:240)
このときの引数の値は、
���[�U�[anonymous�����s
ユニコードエスケープされた表記は次
\ufffd\ufffd\ufffd[\ufffdU\ufffd[anonymous\ufffd\ufffd\ufffd\ufffd\ufffdsこの文字列の出所は、ParserRegistry.java の createReader メソッドでファイルから読み出したもの。
- ParserRegistroy#createReader
@edu.umd.cs.findbugs.annotations.SuppressWarnings("OBL") protected Reader createReader(final File file) throws FileNotFoundException { return createReader(new FileInputStream(file)); } : protected Reader createReader(final InputStream inputStream) { return new InputStreamReader(new BOMInputStream(inputStream), defaultCharset); }
ここで、ParserRegistryクラスのインスタンスフィールドdefaultCharsetをデバッガで確認すると、UTF_8となっていた。
プロジェクトの設定(Configure)で、コンパイラ警告の集計(Scan for compiler warnings)の高度な設定(Advanced)ボタンを押すと、デフォルトのエンコーディング(Default Encoding)があるので、そこに"windows-31j"を指定していた。
ここをブランクにして設定を保存し、ビルドを実行してみたが、UTF_8であった。
ここをeuc-jp-linuxにして設定を保存し、ビルドを実行してみたが、UTF_8であった。
ここをUTF-16にして設定を保存し、ビルドを実行してみたが、UTF_8であった。
defaultCharsetに値を設定しているのは、ParserRegistryのコンストラクタ
public ParserRegistry(final List<? extends AbstractWarningsParser> parsers, final String defaultEncoding,
final String includePattern, final String excludePattern) {
defaultCharset = EncodingValidator.defaultCharset(defaultEncoding);
このメソッドが呼ばれるスタックトレース
"Executor #0 for master : executing SakuraVPS_Git_Lambda_Java #18" hudson.plugins.warnings.parser.ParserRegistry.<init>(ParserRegistry.java:267) hudson.plugins.warnings.WarningsPublisher.parseConsoleLog(WarningsPublisher.java:399) hudson.plugins.warnings.WarningsPublisher.perform(WarningsPublisher.java:321) hudson.plugins.analysis.core.HealthAwareRecorder.perform(HealthAwareRecorder.java:319) hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20) hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:770) hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:734) hudson.model.Build$BuildExecution.post2(Build.java:183) hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:683) hudson.model.Run.execute(Run.java:1770) hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43) hudson.model.ResourceController.execute(ResourceController.java:89) hudson.model.Executor.run(Executor.java:240)
WarningsPublisher#parseConsoleLog がParserRegistryのコンストラクタ引数で渡しているエンコーディングは、private static final String CONSOLE_LOG_ENCODING = "UTF-8";
と決め打ちになっている。
高橋 徹 さんが10年以上前に更新
WarningsPublisherTestにこの問題を追加することを検討
- WarningsPublisherのコンストラクタ、引数がはんぱねぇ~
public WarningsPublisher(final String healthy, final String unHealthy, final String thresholdLimit, final String defaultEncoding, final boolean useDeltaValues, final String unstableTotalAll, final String unstableTotalHigh, final String unstableTotalNormal, final String unstableTotalLow, final String unstableNewAll, final String unstableNewHigh, final String unstableNewNormal, final String unstableNewLow, final String failedTotalAll, final String failedTotalHigh, final String failedTotalNormal, final String failedTotalLow, final String failedNewAll, final String failedNewHigh, final String failedNewNormal, final String failedNewLow, final boolean canRunOnFailed, final boolean useStableBuildAsReference, final boolean shouldDetectModules, final boolean canComputeNew, final String includePattern, final String excludePattern, final boolean canResolveRelativePaths, final List<ParserConfiguration> parserConfigurations, final List<ConsoleParser> consoleParsers) {
ブレークポイントを仕掛けて(コンストラクタに仕掛けたがアタッチしてからでは取れなかったので、別メソッドparseConsoleLogに仕掛けて)調査
healthy : "" unHealthy : "" thresholdLimit : "low" defaultEncoding : "" useDeltaValues : false unstableTotalAll : "" unstableTotalHigh : "" unstableTotalNormal : "" unstableTotalLow : "" unstableNewAll : null unstableNewHight : null unstableNewNormal : null unstableNewLow : null failedTotalAll : "" failedTotalHigh : "" failedTotalNormal : "" failedTotalLow : "" failedNewAll : null failedNewHight : null failedNewNormal : null failedNewLow : null canRunOnFailed : false useStableBUildAsReference : false shouldDetectModules : false canComputeNew : false includePattern : null excludePattern : null canResolveRelativePaths : false parserConfigurations : size = 0のArrayList consoleParsers : size = 1のArrayList、"Java Compiler (javac)" 次に、WarningsPublisher.performの引数を調査 h4. Jenkinsのユニットテスト https://wiki.jenkins-ci.org/display/JENKINS/Unit+Test ここにいろいろ書かれているのを見てからにした方がよいかもしれない