読者です 読者をやめる 読者になる 読者になる

Jenkinsの結果がUNSTABLEになる

Jenkins でビルドに JUnit を連携させてる場合に、UNSTABLE で終了した。
原因は mocha のテストに console.log() を記述したままになっていたからだけど、なぜそうなるのかわかりにくかったため書いとく。

Jenkins ジョブのコンソール出力

(略)
Build step 'Publish JUnit test result report' changed build result to UNSTABLE
Finished: UNSTABLE

エラー内容

Jenkins ではビルドの結果としてテストで失敗と表示された。

テスト結果 (1個の失敗 / +1)
test-report.xml.<init>

スタックトレースを見てみると Content is not allowed in prolog. というエラー。

Failed to read test report file /var/lib/jenkins/jobs/sample/workspace/sample/test-report.xml
org.dom4j.DocumentException: Error on line 1 of document file:///var/lib/jenkins/jobs/sample/workspace/sample/test-report.xml : Content is not allowed in prolog. Nested exception: Content is not allowed in prolog.
    at org.dom4j.io.SAXReader.read(SAXReader.java:482)
    at org.dom4j.io.SAXReader.read(SAXReader.java:264)
    at hudson.tasks.junit.SuiteResult.parse(SuiteResult.java:123)
    at hudson.tasks.junit.TestResult.parse(TestResult.java:273)
    at hudson.tasks.junit.TestResult.parsePossiblyEmpty(TestResult.java:229)
    at hudson.tasks.junit.TestResult.parse(TestResult.java:164)
    at hudson.tasks.junit.TestResult.parse(TestResult.java:147)
    at hudson.tasks.junit.TestResult.<init>(TestResult.java:123)
    at hudson.tasks.junit.JUnitParser$ParseResultCallable.invoke(JUnitParser.java:117)
    at hudson.tasks.junit.JUnitParser$ParseResultCallable.invoke(JUnitParser.java:90)
    at hudson.FilePath.act(FilePath.java:920)
    at hudson.FilePath.act(FilePath.java:893)
    at hudson.tasks.junit.JUnitParser.parse(JUnitParser.java:87)
    at hudson.tasks.junit.JUnitResultArchiver.parse(JUnitResultArchiver.java:121)
    at hudson.tasks.junit.JUnitResultArchiver.perform(JUnitResultArchiver.java:133)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
    at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:740)
    at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:710)
    at hudson.model.Build$BuildExecution.post2(Build.java:182)
    at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:659)
    at hudson.model.Run.execute(Run.java:1728)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:231)
Caused by: org.xml.sax.SAXParseException; systemId: file:///var/lib/jenkins/jobs/sample/workspace/sample/test-report.xml; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.

直接 test-report.xml を vi で開いてみると、XMLファイルの先頭行に XML 形式ではない文字列が書き込まれていた。

1407895993
<testsuite name="Mocha Tests" tests="1570" failures="0" errors="0" skipped="7" timestamp="Wed, 13 Aug 2014 02:01:51 GMT" time="64.689">
<testcase classname="sample" name="should get sample" time="0.003"/>
<testcase classname="sample" name="should send sample api" time="0.002"/>
<testcase classname="sample" name="should be error as error.sample" time="0.001"/>
(以下略)

ここでは Data.now() の結果を console.log() で出力していたが、コミット時に取り除くのを忘れていた。
それが text-report.xml に混入してしまい、Content is not allowed in prolog. になった。

結論

console.log() はコミットに含めないこと。