2012-05-25 49 views
3

我的项目有一些包(“模型”,“控制器”等)。我使用Cobertura插件创建了Jenkins以生成覆盖率报告,这非常棒。如果覆盖率下降到某个阈值以下,但是仅限于某些包(例如“控制器”,而不是“模型”),我希望将构建标记为不稳定。但是,在配置界面中我看不到一个明显的方法 - 它看起来像阈值是全局的。如何配置Jenkins Cobertura插件来监视特定的包?

有没有办法做到这一点?

回答

2

(这里回答我的问题)

据我所知,这是不可能的 - 我的后找了几天都没有见过。我编写了一个简单的脚本,它可以做我想做的事情 - 获取覆盖率输出,解析它,并在特定软件包的覆盖率未达到特定阈值时构建失败。它很脏,可以清理/扩展,但基本的想法在这里。欢迎评论。

#!/usr/bin/env python 

''' 
Jenkins' Cobertura plugin doesn't allow marking a build as successful or 
failed based on coverage of individual packages -- only the project as a 
whole. This script will parse the coverage.xml file and fail if the coverage of 
specified packages doesn't meet the thresholds given 

''' 

import sys 

from lxml import etree 

PACKAGES_XPATH = etree.XPath('/coverage/packages/package') 


def main(argv): 
    filename = argv[0] 
    package_args = argv[1:] if len(argv) > 1 else [] 
    # format is package_name:coverage_threshold 
    package_coverage = {package: int(coverage) for 
     package, coverage in [x.split(':') for x in package_args]} 

    xml = open(filename, 'r').read() 
    root = etree.fromstring(xml) 

    packages = PACKAGES_XPATH(root) 

    failed = False 
    for package in packages: 
     name = package.get('name') 
     if name in package_coverage: 
      # We care about this one 
      print 'Checking package {} -- need {}% coverage'.format(
       name, package_coverage[name]) 
      coverage = float(package.get('line-rate', '0.0')) * 100 
      if coverage < package_coverage[name]: 
       print ('FAILED - Coverage for package {} is {}% -- ' 
         'minimum is {}%'.format(
         name, coverage, package_coverage[name])) 
       failed = True 
      else: 
       print "PASS" 

    if failed: 
     sys.exit(1) 

if __name__ == '__main__': 
    main(sys.argv[1:]) 
相关问题