11

我正在使用Hudson来连续构建Python项目。单元测试和代码覆盖工作的伟大,但钻入的Cobertura覆盖报告我的文件,这些文件单元测试时出现此消息:Hudson“源代码不可用”。

Source code is unavailable.Some possible reasons are: 

* This is not the most recent build (to save on disk space, this plugin only keeps the most recent builds source code). 
* Cobertura found the source code but did not provide enough information to locate the source code. 
* Cobertura could not find the source code, so this plugin has no hope of finding it. 

奇怪的是,该单元的源代码测试被发现并显示。我试图手动将其他.py文件的源文件复制到~/.hudson/jobs/<projectname>/cobertura(单元测试被复制),但它不起作用。

有什么建议吗?

回答

6

这是一个丑陋的黑客地狱,但它是我能想出的唯一的东西,最终使其工作......经过数小时的谷歌搜索和黑客试图获得结果,这是唯一的事情我想出了。

coverage run manage.py test 
coverage xml 
sed 's/filename="/filename="my\/path\//g' coverage.xml > coverage2.xml 

这只是relpacing类XML标签的文件名属性并添加完整路径源文件开头。只要确保将Cobertura xml报告模式更新为coverage2.xml(如果这是您将管道sed的输出到的地方)。

如果Cobertura插件允许您输入类似于Violations插件的源代码路径,那就太好了 - 不幸的是,据我所知,事实并非如此。

我希望这有助于!

+0

这对Jenkins来说不适用于我。我尝试了一个绝对路径到我的源代码,并且它不起作用。我在https://github.com/gotwarlost/istanbul/issues/50上看过,该路径应该与Jenkins工作区Cobdura目录相关。我尝试过,并相对于工作区目录,但都没有工作。谁能帮忙? – Mawg

6

该报告的Cobertura文件(在这一点上是介于$HUDSON/jobs/foo/workspace)需要包含像这样开头:

<sources> 
    <source>/path/to/source</source> 
    <source>/another/path</source> 
</sources> 

它有没有呢?路径指向正确的地方吗?

另一个问题:当它说“最近的构建”时,它实际上意味着“最近的稳定构建”(即状态球是蓝色的,而不是黄色的)。

+0

它没有那个元素。我在元素之前手动添加了元素,但没有更改。这是适当的地方吗?有什么方法可以告诉我们在生成时包含元素?而且,所有版本都是稳定的。 –

+0

+1这些路径是正确的,这很重要。 – Johan

4

对我来说,其他两个方案没有独立工作,但他们两人的结合做的:

... 
coverage xml 
sed 's/<!-- Generated by coverage.py: http:\/\/nedbatchelder.com\/code\/coverage -->/<sources><source>\/path\/to\/sourcefolder<\/source><\/sources>/g' 

这只是替换由coverage.py有关源位置信息插入批注。

1

我们的解决方案是改变我们使用cobertura-report ant任务来包含源目录的完整路径而不是相对路径。

<cobertura-report format="xml" destdir="${coverage.dir}" srcdir="${basedir}/${src.dir}"/> 

基本上,包含在XML的Cobertura报告相对寻路交叉向上哈德森使得的Cobertura插件不能用它来发现的源代码。在我们的案例中,这是Hudson如何进行单模块项目和多模块项目之间差异的表现。

-1

解决此问题的“正确”方法是将您的项目放在PYTHONPATH上,并从您的仓库之外运行测试/覆盖范围。由于它看起来像使用Django,所以django-admin.py test --settings = myproject.settings可以让你这样做。

- 原贴由Pete发表评论,感动回答。