プロジェクト

全般

プロフィール

バグ #20

未完了

Jenkins Warnings pluginで警告が拾えない

高橋 徹 さんが9年以上前に追加. 9年以上前に更新.

ステータス:
進行中
優先度:
通常
担当者:
カテゴリ:
-
対象バージョン:
-
開始日:
2014/09/09
期日:
進捗率:

50%

予定工数:
重要度:

説明

JenkinsでJavaのソースをビルドするプロジェクトを作成し、Warnings pluginを入れたが警告が拾えない。

対象とするJavaプロジェクト(NetBeans Ant)は次
source:swe_primus|learn/java/lambda/HelloLambda

高橋 徹 さんが9年以上前に更新

  • ステータス新規 から 進行中 に変更
  • 進捗率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個

高橋 徹 さんが9年以上前に更新

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)コンパイルオプションに

高橋 徹 さんが9年以上前に更新

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";
と決め打ちになっている。

高橋 徹 さんが9年以上前に更新

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

ここにいろいろ書かれているのを見てからにした方がよいかもしれない

他の形式にエクスポート: Atom PDF