Hudson“源代码不可用”。

时间:2010-02-18 01:16:26

标签: python continuous-integration hudson code-coverage cobertura

我正在使用 Hudson 来不断构建 Python 项目。单元测试和代码覆盖率工作得很好,但是在 Cobertura覆盖率报告中钻取单元测试的文件时会出现此消息:

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(单元测试被复制的地方),但它没有用。

有什么建议吗?

5 个答案:

答案 0 :(得分:7)

Cobertura报告文件(此时位于$HUDSON/jobs/foo/workspace中的某个位置)需要在开头包含类似的内容:

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

有吗?路径是否指向正确的位置?

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

答案 1 :(得分:6)

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

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

这只是重新扩展类xml标记的filename属性,并在开头添加源文件的完整路径。只需确保将Cobertura xml报告模式更新为coverage2.xml(如果这是您将sed的输出路由到的地方)。

如果Cobertura插件允许您输入类似于Violations插件的源路径,那将是很好的 - 不幸的是,据我所知,它没有。

我希望这有帮助!

答案 2 :(得分:5)

对我来说,其他两个解决方案并不是独立的,但两者的结合确实是:

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

这只是将coverage.py插入的注释替换为有关源位置的信息。

答案 3 :(得分:1)

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

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

基本上,cobertura xml报告中包含的相对路径跨越了Hudson,因此Cobertura插件无法使用它来查找源代码。在我们的案例中,这是Hudson如何处理单个模块项目和多模块项目之间的差异的表现。

答案 4 :(得分:-1)

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

- 最初由Pete发表在评论中,转而回答。