3

私のプロジェクトには、多数のパッケージ (「モデル」、「コントローラー」など) があります。Cobertura プラグインを使用して Jenkins をセットアップし、カバレッジ レポートを生成しました。これは素晴らしいことです。カバレッジが特定のしきい値を下回った場合、ビルドを不安定としてマークしたいと思いますが、特定のパッケージ (たとえば、「モデル」ではなく「コントローラー」) でのみです。ただし、構成 UI でこれを行う明確な方法はわかりません。しきい値がグローバルであるように見えます。

これを行う方法はありますか?

4

1 に答える 1

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:])
于 2012-05-30T01:24:27.013 に答える