2010-02-18 100 views
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發表評論,感動回答。