From 73e67f1a126f7d59b2872d99d5c38d74a7008c31 Mon Sep 17 00:00:00 2001 From: Evgeni Golov Date: Fri, 28 Apr 2017 11:38:38 +0200 Subject: [PATCH] conditional_publisher: add support for Matrix Aggregation Change-Id: Ic206b3a29c918b63e5b5db47b6629721eab14bd5 Signed-off-by: Evgeni Golov Signed-off-by: Thanh Ha --- jenkins_jobs/modules/publishers.py | 62 +++++++++++++------ ...conditional-publisher005.plugins_info.yaml | 3 + .../fixtures/conditional-publisher005.xml | 25 ++++++++ .../fixtures/conditional-publisher005.yaml | 10 +++ 4 files changed, 82 insertions(+), 18 deletions(-) create mode 100644 tests/publishers/fixtures/conditional-publisher005.plugins_info.yaml create mode 100644 tests/publishers/fixtures/conditional-publisher005.xml create mode 100644 tests/publishers/fixtures/conditional-publisher005.yaml diff --git a/jenkins_jobs/modules/publishers.py b/jenkins_jobs/modules/publishers.py index 1e29452ab..45362bf00 100644 --- a/jenkins_jobs/modules/publishers.py +++ b/jenkins_jobs/modules/publishers.py @@ -5608,6 +5608,12 @@ def conditional_publisher(registry, xml_parent, data): :arg str condition-kind: Condition kind that must be verified before the action is executed. Valid values and their additional attributes are described in the conditions_ table. + :arg bool condition-aggregation: If true Matrix Aggregation will be + enabled. (default false) + :arg str condition-aggregation-kind: Condition Aggregation kind that + must be verified before the + action is executed. Valid values and their additional attributes are + described in the conditions_ table. :arg str on-evaluation-failure: What should be the outcome of the build if the evaluation of the condition fails. Possible values are `fail`, `mark-unstable`, `run-and-mark-unstable`, `run` and `dont-run`. @@ -5674,8 +5680,8 @@ def conditional_publisher(registry, xml_parent, data): <../../tests/publishers/fixtures/conditional-publisher002.yaml>` """ - def publish_condition(cdata): - kind = cdata['condition-kind'] + def publish_condition_tag(cdata, prefix, condition_tag): + kind = cdata['%s-kind' % prefix] ctag = XML.SubElement(cond_publisher, condition_tag) class_pkg = 'org.jenkins_ci.plugins.run_condition' @@ -5688,12 +5694,13 @@ def conditional_publisher(registry, xml_parent, data): elif kind == "boolean-expression": ctag.set('class', class_pkg + '.core.BooleanCondition') - XML.SubElement(ctag, "token").text = cdata['condition-expression'] + XML.SubElement(ctag, + "token").text = cdata['%s-expression' % prefix] elif kind == "current-status": ctag.set('class', class_pkg + '.core.StatusCondition') wr = XML.SubElement(ctag, 'worstResult') - wr_name = cdata['condition-worst'] + wr_name = cdata['%s-worst' % prefix] if wr_name not in hudson_model.THRESHOLDS: raise JenkinsJobsException( "threshold must be one of %s" % @@ -5706,7 +5713,7 @@ def conditional_publisher(registry, xml_parent, data): str(wr_threshold['complete']).lower() br = XML.SubElement(ctag, 'bestResult') - br_name = cdata['condition-best'] + br_name = cdata['%s-best' % prefix] if br_name not in hudson_model.THRESHOLDS: raise JenkinsJobsException( "threshold must be one of %s" % @@ -5720,22 +5727,23 @@ def conditional_publisher(registry, xml_parent, data): elif kind == "shell": ctag.set('class', class_pkg + '.contributed.ShellCondition') - XML.SubElement(ctag, "command").text = cdata['condition-command'] + XML.SubElement(ctag, "command").text = cdata['%s-command' % prefix] elif kind == "windows-shell": ctag.set('class', class_pkg + '.contributed.BatchFileCondition') - XML.SubElement(ctag, "command").text = cdata['condition-command'] + XML.SubElement(ctag, "command").text = cdata['%s-command' % prefix] elif kind == "regexp": ctag.set('class', class_pkg + '.core.ExpressionCondition') XML.SubElement(ctag, - "expression").text = cdata['condition-expression'] - XML.SubElement(ctag, "label").text = cdata['condition-searchtext'] + "expression").text = cdata['%s-expression' % prefix] + XML.SubElement(ctag, + "label").text = cdata['%s-searchtext' % prefix] elif kind == "file-exists": ctag.set('class', class_pkg + '.core.FileExistsCondition') - XML.SubElement(ctag, "file").text = cdata['condition-filename'] - basedir = cdata.get('condition-basedir', 'workspace') + XML.SubElement(ctag, "file").text = cdata['%s-filename' % prefix] + basedir = cdata.get('%s-basedir', 'workspace') basedir_tag = XML.SubElement(ctag, "baseDir") if "workspace" == basedir: basedir_tag.set('class', @@ -5749,8 +5757,15 @@ def conditional_publisher(registry, xml_parent, data): class_pkg + '.common.' 'BaseDirectory$JenkinsHome') else: - raise JenkinsJobsException('%s is not a valid condition-kind ' - 'value.' % kind) + raise JenkinsJobsException('%s is not a valid %s-kind ' + 'value.' % (kind, prefix)) + + def publish_condition(cdata): + return publish_condition_tag(cdata, 'condition', condition_tag) + + def publish_aggregation_condition(cdata): + return publish_condition_tag(cdata, 'condition-aggregation', + aggregation_condition_tag) def publish_action(parent, action): for edited_node in create_publishers(registry, action): @@ -5767,6 +5782,7 @@ def conditional_publisher(registry, xml_parent, data): root_tag = XML.SubElement(xml_parent, flex_publisher_tag) publishers_tag = XML.SubElement(root_tag, "publishers") condition_tag = "condition" + aggregation_condition_tag = "aggregationCondition" evaluation_classes_pkg = 'org.jenkins_ci.plugins.run_condition' evaluation_classes = { @@ -5779,9 +5795,24 @@ def conditional_publisher(registry, xml_parent, data): 'dont-run': evaluation_classes_pkg + '.BuildStepRunner$DontRun', } + plugin_info = registry.get_plugin_info("Flexible Publish Plugin") + # Note: Assume latest version of plugin is preferred config format + version = pkg_resources.parse_version( + plugin_info.get('version', str(sys.maxsize))) + + # Support for MatrixAggregator was added in v0.11 + # See JENKINS-14494 + has_matrix_aggregator = version >= pkg_resources.parse_version("0.11") + for cond_action in data: cond_publisher = XML.SubElement(publishers_tag, cond_publisher_tag) publish_condition(cond_action) + condition_aggregation = cond_action.get('condition-aggregation', False) + if condition_aggregation and has_matrix_aggregator: + publish_aggregation_condition(cond_action) + elif condition_aggregation: + raise JenkinsJobsException("Matrix Aggregation is not supported " + "in your plugin version.") evaluation_flag = cond_action.get('on-evaluation-failure', 'fail') if evaluation_flag not in evaluation_classes.keys(): raise JenkinsJobsException('on-evaluation-failure value ' @@ -5797,11 +5828,6 @@ def conditional_publisher(registry, xml_parent, data): action_parent = cond_publisher - plugin_info = registry.get_plugin_info("Flexible Publish Plugin") - # Note: Assume latest version of plugin is preferred config format - version = pkg_resources.parse_version( - plugin_info.get('version', str(sys.maxsize))) - # XML tag changed from publisher to publisherList in v0.13 # check the plugin version to determine further operations use_publisher_list = version >= pkg_resources.parse_version("0.13") diff --git a/tests/publishers/fixtures/conditional-publisher005.plugins_info.yaml b/tests/publishers/fixtures/conditional-publisher005.plugins_info.yaml new file mode 100644 index 000000000..775a02a42 --- /dev/null +++ b/tests/publishers/fixtures/conditional-publisher005.plugins_info.yaml @@ -0,0 +1,3 @@ +- longName: 'Flexible Publish Plugin' + shortName: 'flexible-publish' + version: "0.13" diff --git a/tests/publishers/fixtures/conditional-publisher005.xml b/tests/publishers/fixtures/conditional-publisher005.xml new file mode 100644 index 000000000..c926661c6 --- /dev/null +++ b/tests/publishers/fixtures/conditional-publisher005.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + **/** + true + false + false + true + true + false + + + + + + + diff --git a/tests/publishers/fixtures/conditional-publisher005.yaml b/tests/publishers/fixtures/conditional-publisher005.yaml new file mode 100644 index 000000000..b13e14b41 --- /dev/null +++ b/tests/publishers/fixtures/conditional-publisher005.yaml @@ -0,0 +1,10 @@ +publishers: + - conditional-publisher: + - condition-kind: never + condition-aggregation: True + condition-aggregation-kind: always + action: + - archive: + artifacts: '**/**' + allow-empty: 'true' +