如何配置Jenkins Cobertura插件来监控特定的软件包?

如何配置Jenkins Cobertura插件来监控特定的软件包?,jenkins,jenkins-plugins,Jenkins,Jenkins Plugins,我的项目有许多包(“模型”、“控制器”等)。我已经用Cobertura插件设置了Jenkins来生成覆盖率报告,这非常好。如果覆盖率下降到某个阈值以下,我想将构建标记为不稳定的,但仅限于某些包(例如,“控制器”,而不是“模型”)。不过,在配置UI中,我看不到一种明显的方法来实现这一点——看起来阈值是全局的 有办法做到这一点吗?(在这里回答我自己的问题) 据我所知,这是不可能的——我看了几天后什么也没看到。我编写了一个简单的脚本,它可以执行我想要的操作——获取覆盖率输出,解析它,如果特定包的覆盖率

我的项目有许多包(“模型”、“控制器”等)。我已经用Cobertura插件设置了Jenkins来生成覆盖率报告,这非常好。如果覆盖率下降到某个阈值以下,我想将构建标记为不稳定的,但仅限于某些包(例如,“控制器”,而不是“模型”)。不过,在配置UI中,我看不到一种明显的方法来实现这一点——看起来阈值是全局的

有办法做到这一点吗?

(在这里回答我自己的问题)

据我所知,这是不可能的——我看了几天后什么也没看到。我编写了一个简单的脚本,它可以执行我想要的操作——获取覆盖率输出,解析它,如果特定包的覆盖率不满足某些阈值,则生成失败。它很脏,可以清理/扩展,但基本思想就在这里。欢迎评论

#!/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:])
#/usr/bin/env python
'''
Jenkins的Cobertura插件不允许将构建标记为成功或失败
基于单个包的覆盖率失败-仅将项目作为
整体此脚本将解析coverage.xml文件,如果
指定的包不符合给定的阈值
'''
导入系统
从lxml导入etree
PACKAGES\u XPATH=etree.XPATH('/coverage/PACKAGES/package')
def总管(argv):
filename=argv[0]
如果len(argv)>1 else[]
#格式为包名称:覆盖率\u阈值
package_coverage={package:int(coverage)for
包,包中x的[x.split(':')中的覆盖率
xml=open(文件名为'r')。read()
root=etree.fromstring(xml)
packages=packages\u XPATH(根)
失败=错误
对于包中包:
name=package.get('name')
如果名称在包_保险范围内:
#我们关心这个
打印“检查包{}--需要{}%覆盖率”。格式(
名称、包裹\保险范围[名称])
覆盖率=浮动(package.get('line-rate','0.0'))*100
如果保险范围<包裹保险范围[名称]:
打印('失败-包{}的覆盖率为{}%--'
'最小值为{}%'。格式(
名称、保险范围、包裹(保险范围[名称])
失败=真
其他:
打印“通行证”
如果失败:
系统出口(1)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main(sys.argv[1:])