diff options
29 files changed, 378 insertions, 64 deletions
diff --git a/jenkins_jobs/local_yaml.py b/jenkins_jobs/local_yaml.py index c22fc3c6..9aeeb9af 100644 --- a/jenkins_jobs/local_yaml.py +++ b/jenkins_jobs/local_yaml.py @@ -203,6 +203,7 @@ import io import logging import os import re +import copy import jinja2 import yaml @@ -598,6 +599,11 @@ class LazyLoader(CustomLoader): def __repr__(self): return "%s %s" % (self._cls.yaml_tag, self._node.value) + def __deepcopy__(self, memodict={}): + return LazyLoader( + (copy.deepcopy(self._cls), self._loader, copy.deepcopy(self._node)) + ) + def format(self, *args, **kwargs): node = yaml.ScalarNode( tag=self._node.tag, value=self._node.value.format(*args, **kwargs) diff --git a/jenkins_jobs/modules/helpers.py b/jenkins_jobs/modules/helpers.py index 10945c71..258b13cb 100644 --- a/jenkins_jobs/modules/helpers.py +++ b/jenkins_jobs/modules/helpers.py @@ -19,6 +19,7 @@ import xml.etree.ElementTree as XML from jenkins_jobs.errors import InvalidAttributeError from jenkins_jobs.errors import JenkinsJobsException from jenkins_jobs.errors import MissingAttributeError +from jenkins_jobs.modules import hudson_model def build_trends_publisher(plugin_name, xml_element, data): @@ -613,6 +614,26 @@ def trigger_project(tconfigs, project_def, param_order=None): ) +def trigger_threshold( + parent_element, element_name, threshold_name, supported_thresholds=None +): + """Generate a resultThreshold XML element for build/join triggers""" + element = XML.SubElement(parent_element, element_name) + + try: + threshold = hudson_model.THRESHOLDS[threshold_name.upper()] + except KeyError: + if not supported_thresholds: + supported_thresholds = hudson_model.THRESHOLDS.keys() + raise JenkinsJobsException( + "threshold must be one of %s" % ", ".join(supported_thresholds) + ) + XML.SubElement(element, "name").text = threshold["name"] + XML.SubElement(element, "ordinal").text = threshold["ordinal"] + XML.SubElement(element, "color").text = threshold["color"] + return element + + def convert_mapping_to_xml(parent, data, mapping, fail_required=True): """Convert mapping to XML diff --git a/jenkins_jobs/modules/project_matrix.py b/jenkins_jobs/modules/project_matrix.py index ebd566f5..01bc431d 100644 --- a/jenkins_jobs/modules/project_matrix.py +++ b/jenkins_jobs/modules/project_matrix.py @@ -162,9 +162,10 @@ class Matrix(jenkins_jobs.modules.base.Base): strategy = data.get(strategy_name, {}) if strategy_name == "execution-strategy": - XML.SubElement(root, "combinationFilter").text = str( - strategy.get("combination-filter", "") - ).rstrip() + if "combination-filter" in strategy: + XML.SubElement(root, "combinationFilter").text = str( + strategy.get("combination-filter", "") + ).rstrip() XML.SubElement(ex_r, "runSequentially").text = str( strategy.get("sequential", False) ).lower() diff --git a/jenkins_jobs/modules/project_multibranch.py b/jenkins_jobs/modules/project_multibranch.py index 93b5f380..49b5f8e3 100644 --- a/jenkins_jobs/modules/project_multibranch.py +++ b/jenkins_jobs/modules/project_multibranch.py @@ -60,10 +60,18 @@ Plugins required: (default '-1, forever') * **script-path** (`str`): Path to Jenkinsfile, relative to workspace. (default 'Jenkinsfile') + * **script-id** (`str`): Script id from the global Jenkins script store + provided by the config-file provider plugin. Mutually exclusive with + **script-path** option. + * **sandbox** (`bool`): This option is strongly recommended if the + Jenkinsfile is using load to evaluate a groovy source file from an + SCM repository. Usable only with **script-id** option. (default 'false') Job examples: -.. literalinclude:: /../../tests/multibranch/fixtures/multibranch_defaults.yaml +.. literalinclude:: /../../tests/multibranch/fixtures/multibranch_defaults_id_mode.yaml + +.. literalinclude:: /../../tests/multibranch/fixtures/multibranch_defaults_path_mode.yaml .. literalinclude:: /../../tests/multibranch/fixtures/multi_scm_full.yaml @@ -85,8 +93,39 @@ logger = logging.getLogger(str(__name__)) class WorkflowMultiBranch(jenkins_jobs.modules.base.Base): sequence = 0 multibranch_path = "org.jenkinsci.plugins.workflow.multibranch" + multibranch_defaults_path = "org.jenkinsci.pipeline.workflow.multibranch" jenkins_class = "".join([multibranch_path, ".WorkflowMultiBranchProject"]) - jenkins_factory_class = "".join([multibranch_path, ".WorkflowBranchProjectFactory"]) + jenkins_factory = { + "script_path": { + "class": "".join([multibranch_path, ".WorkflowBranchProjectFactory"]) + }, + "script_id": { + "class": "".join( + [ + multibranch_defaults_path, + ".defaults.PipelineBranchDefaultsProjectFactory", + ] + ), + "plugin": "pipeline-multibranch-defaults", + }, + } + + @staticmethod + def _factory_opts_check(data): + + sandbox = data.get("sandbox", None) + script_id = data.get("script-id", None) + script_path = data.get("script-path", None) + + if script_id and script_path: + error_msg = "script-id and script-path are mutually exclusive options" + raise JenkinsJobsException(error_msg) + elif not script_id and sandbox: + error_msg = ( + "Sandbox mode is applicable only for multibranch with defaults" + "project type used with script-id option" + ) + raise JenkinsJobsException(error_msg) def root_xml(self, data): xml_parent = XML.Element(self.jenkins_class) @@ -268,28 +307,50 @@ class WorkflowMultiBranch(jenkins_jobs.modules.base.Base): # Factory # ########### - factory = XML.SubElement( - xml_parent, "factory", {"class": self.jenkins_factory_class} - ) + self._factory_opts_check(data) + + if data.get("script-id"): + mode = "script_id" + fopts_map = ( + ("script-id", "scriptId", None), + ("sandbox", "useSandbox", None), + ) + else: + mode = "script_path" + fopts_map = (("script-path", "scriptPath", "Jenkinsfile"),) + + factory = XML.SubElement(xml_parent, "factory", self.jenkins_factory[mode]) XML.SubElement( factory, "owner", {"class": self.jenkins_class, "reference": "../.."} ) - XML.SubElement(factory, "scriptPath").text = data.get( - "script-path", "Jenkinsfile" - ) + + # multibranch default + + helpers.convert_mapping_to_xml(factory, data, fopts_map, fail_required=False) return xml_parent class WorkflowMultiBranchDefaults(WorkflowMultiBranch): - jenkins_class = ( - "org.jenkinsci.plugins.pipeline.multibranch" - ".defaults.PipelineMultiBranchDefaultsProject" - ) - jenkins_factory_class = ( - "org.jenkinsci.plugins.pipeline.multibranch" - ".defaults.PipelineBranchDefaultsProjectFactory" + multibranch_path = "org.jenkinsci.plugins.workflow.multibranch" + multibranch_defaults_path = "org.jenkinsci.plugins.pipeline.multibranch" + jenkins_class = "".join( + [multibranch_defaults_path, ".defaults.PipelineMultiBranchDefaultsProject"] ) + jenkins_factory = { + "script_path": { + "class": "".join([multibranch_path, ".WorkflowBranchProjectFactory"]), + "plugin": "workflow-multibranch", + }, + "script_id": { + "class": "".join( + [ + multibranch_defaults_path, + ".defaults.PipelineBranchDefaultsProjectFactory", + ] + ) + }, + } def bitbucket_scm(xml_parent, data): @@ -804,7 +865,7 @@ def github_scm(xml_parent, data): (default 'contributors') :arg str discover-pr-origin: Discovers pull requests where the origin repository is the same as the target repository. - Valid options: merge-current, current, both. (default 'merge-current') + Valid options: merge-current, current, both, false. (default 'merge-current') :arg bool discover-tags: Discovers tags on the repository. (default false) :arg list build-strategies: Provides control over whether to build a branch @@ -946,18 +1007,19 @@ def github_scm(xml_parent, data): XML.SubElement(dprf, "trust").attrib["class"] = trust_map[trust] dpro_strategy = data.get("discover-pr-origin", "merge-current") - dpro = XML.SubElement( - traits, "".join([github_path_dscore, ".OriginPullRequestDiscoveryTrait"]) - ) - dpro_strategy_map = {"merge-current": "1", "current": "2", "both": "3"} - if dpro_strategy not in dpro_strategy_map: - raise InvalidAttributeError( - "discover-pr-origin", dpro_strategy, dpro_strategy_map.keys() + if dpro_strategy: + dpro = XML.SubElement( + traits, "".join([github_path_dscore, ".OriginPullRequestDiscoveryTrait"]) ) - dpro_mapping = [ - ("discover-pr-origin", "strategyId", "merge-current", dpro_strategy_map) - ] - helpers.convert_mapping_to_xml(dpro, data, dpro_mapping, fail_required=True) + dpro_strategy_map = {"merge-current": "1", "current": "2", "both": "3"} + if dpro_strategy not in dpro_strategy_map: + raise InvalidAttributeError( + "discover-pr-origin", dpro_strategy, dpro_strategy_map.keys() + ) + dpro_mapping = [ + ("discover-pr-origin", "strategyId", "merge-current", dpro_strategy_map) + ] + helpers.convert_mapping_to_xml(dpro, data, dpro_mapping, fail_required=True) if data.get("head-filter-regex", None): rshf = XML.SubElement(traits, "jenkins.scm.impl.trait.RegexSCMHeadFilterTrait") @@ -1193,7 +1255,27 @@ def property_strategies(xml_parent, data): max-survivability (optional) Requires the :jenkins-plugins:`Pipeline Multibranch Plugin <workflow-multibranch>` - + * **trigger-build-on-pr-comment** (str): The comment body to + trigger a new build for a PR job when it is received. This + is compiled as a case insensitive regular expression, so + use ``".*"`` to trigger a build on any comment whatsoever. + (optional) + Requires the :jenkins-plugins:`GitHub PR Comment Build Plugin + <github-pr-comment-build>` + * **trigger-build-on-pr-review** (bool): This property will + cause a job for a pull request ``(PR-*)`` to be triggered + immediately when a review is made on the PR in GitHub. + This has no effect on jobs that are not for pull requests. + (optional) + Requires the :jenkins-plugins:`GitHub PR Comment Build Plugin + <github-pr-comment-build>` + * **trigger-build-on-pr-update** (bool): This property will + cause a job for a pull request ``(PR-*)`` to be triggered + immediately when the PR title or description is edited in + GitHub. This has no effect on jobs that are not for pull + requests. (optional) + Requires the :jenkins-plugins:`GitHub PR Comment Build Plugin + <github-pr-comment-build>` * **named-branches** (dict): Named branches get different properties. Comprised of a list of defaults and a list of property strategy exceptions for use with specific branches. @@ -1210,6 +1292,27 @@ def property_strategies(xml_parent, data): max-survivability (optional) Requires the :jenkins-plugins:`Pipeline Multibranch Plugin <workflow-multibranch>` + * **trigger-build-on-pr-comment** (str): The comment body to + trigger a new build for a PR job when it is received. This + is compiled as a case insensitive regular expression, so + use ``".*"`` to trigger a build on any comment whatsoever. + (optional) + Requires the :jenkins-plugins:`GitHub PR Comment Build Plugin + <github-pr-comment-build>` + * **trigger-build-on-pr-review** (bool): This property will + cause a job for a pull request ``(PR-*)`` to be triggered + immediately when a review is made on the PR in GitHub. + This has no effect on jobs that are not for pull requests. + (optional) + Requires the :jenkins-plugins:`GitHub PR Comment Build Plugin + <github-pr-comment-build>` + * **trigger-build-on-pr-update** (bool): This property will + cause a job for a pull request ``(PR-*)`` to be triggered + immediately when the PR title or description is edited in + GitHub. This has no effect on jobs that are not for pull + requests. (optional) + Requires the :jenkins-plugins:`GitHub PR Comment Build Plugin + <github-pr-comment-build>` * **exceptions** (list): A list of branch names and the property strategies to be used on that branch, instead of any listed @@ -1375,6 +1478,7 @@ def apply_property_strategies(props_elem, props_list): basic_property_strategies = "jenkins.branch" workflow_multibranch = "org.jenkinsci.plugins.workflow.multibranch" + pr_comment_build = "com.adobe.jenkins.github__pr__comment__build" # Valid options for the pipeline branch durability override. pbdo_map = collections.OrderedDict( [ @@ -1384,6 +1488,13 @@ def apply_property_strategies(props_elem, props_list): ] ) + pcb_bool_opts = collections.OrderedDict( + [ + ("trigger-build-on-pr-review", ".TriggerPRReviewBranchProperty"), + ("trigger-build-on-pr-update", ".TriggerPRUpdateBranchProperty"), + ] + ) + for dbs_list in props_list: if dbs_list.get("suppress-scm-triggering", False): @@ -1404,3 +1515,19 @@ def apply_property_strategies(props_elem, props_list): {"plugin": "workflow-multibranch"}, ) XML.SubElement(pbdo_elem, "hint").text = pbdo_map.get(pbdo_val) + + tbopc_val = dbs_list.get("trigger-build-on-pr-comment", None) + if tbopc_val: + tbopc_elem = XML.SubElement( + props_elem, + "".join([pr_comment_build, ".TriggerPRCommentBranchProperty"]), + {"plugin": "github-pr-comment-build"}, + ) + XML.SubElement(tbopc_elem, "commentBody").text = tbopc_val + for opt in pcb_bool_opts: + if dbs_list.get(opt, False): + XML.SubElement( + props_elem, + "".join([pr_comment_build, pcb_bool_opts.get(opt)]), + {"plugin": "github-pr-comment-build"}, + ) diff --git a/jenkins_jobs/modules/publishers.py b/jenkins_jobs/modules/publishers.py index 68b93e73..48bb420c 100755 --- a/jenkins_jobs/modules/publishers.py +++ b/jenkins_jobs/modules/publishers.py @@ -608,20 +608,12 @@ def trigger(registry, xml_parent, data): tconfig = XML.SubElement(xml_parent, "hudson.tasks.BuildTrigger") childProjects = XML.SubElement(tconfig, "childProjects") childProjects.text = data["project"] - tthreshold = XML.SubElement(tconfig, "threshold") threshold = data.get("threshold", "SUCCESS") supported_thresholds = ["SUCCESS", "UNSTABLE", "FAILURE"] - if threshold not in supported_thresholds: - raise JenkinsJobsException( - "threshold must be one of %s" % ", ".join(supported_thresholds) - ) - tname = XML.SubElement(tthreshold, "name") - tname.text = hudson_model.THRESHOLDS[threshold]["name"] - tordinal = XML.SubElement(tthreshold, "ordinal") - tordinal.text = hudson_model.THRESHOLDS[threshold]["ordinal"] - tcolor = XML.SubElement(tthreshold, "color") - tcolor.text = hudson_model.THRESHOLDS[threshold]["color"] + helpers.trigger_threshold( + tconfig, "threshold", threshold, supported_thresholds=supported_thresholds + ) def clone_workspace(registry, xml_parent, data): @@ -3501,11 +3493,13 @@ def join_trigger(registry, xml_parent, data): Trigger a job after all the immediate downstream jobs have completed. Requires the Jenkins :jenkins-plugins:`Join Plugin <join>`. - :arg bool even-if-unstable: if true jobs will trigger even if some - downstream jobs are marked as unstable (default false) :arg list projects: list of projects to trigger :arg list publishers: list of triggers from publishers module that defines projects that need to be triggered + :arg str threshold: result threshold to trigger jobs (optional). + Valid values are "success", "unstable", "failure", and "aborted". + :arg bool even-if-unstable: if true jobs will trigger even if some + downstream jobs are marked as unstable (default false) (DEPRECATED) Example: @@ -3523,8 +3517,13 @@ def join_trigger(registry, xml_parent, data): for edited_node in create_publishers(registry, pub): publishers.append(edited_node) - unstable = str(data.get("even-if-unstable", "false")).lower() - XML.SubElement(jointrigger, "evenIfDownstreamUnstable").text = unstable + unstable = str(data.get("even-if-unstable", "")).lower() + if unstable: + XML.SubElement(jointrigger, "evenIfDownstreamUnstable").text = unstable + + threshold = data.get("threshold", "") + if threshold: + helpers.trigger_threshold(jointrigger, "resultThreshold", threshold) def jabber(registry, xml_parent, data): diff --git a/tests/cmd/fixtures/multi-path/output_recursive/job4 b/tests/cmd/fixtures/multi-path/output_recursive/job4 index dd47f962..20f4d7fc 100644 --- a/tests/cmd/fixtures/multi-path/output_recursive/job4 +++ b/tests/cmd/fixtures/multi-path/output_recursive/job4 @@ -3,7 +3,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes/> <actions/> <description><!-- Managed by Jenkins Job Builder --></description> diff --git a/tests/general/fixtures/custom-workspace002.xml b/tests/general/fixtures/custom-workspace002.xml index a3a266b6..3535e187 100644 --- a/tests/general/fixtures/custom-workspace002.xml +++ b/tests/general/fixtures/custom-workspace002.xml @@ -3,7 +3,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes/> <actions/> <keepDependencies>false</keepDependencies> diff --git a/tests/general/fixtures/matrix-axis-yaml.xml b/tests/general/fixtures/matrix-axis-yaml.xml index 33724b97..02ef44a0 100644 --- a/tests/general/fixtures/matrix-axis-yaml.xml +++ b/tests/general/fixtures/matrix-axis-yaml.xml @@ -3,7 +3,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes> <org.jenkinsci.plugins.yamlaxis.YamlAxis> <name>python</name> diff --git a/tests/general/fixtures/matrix-axis001.xml b/tests/general/fixtures/matrix-axis001.xml index da2c6c0d..25929b6b 100644 --- a/tests/general/fixtures/matrix-axis001.xml +++ b/tests/general/fixtures/matrix-axis001.xml @@ -3,7 +3,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes> <ca.silvermaplesolutions.jenkins.plugins.daxis.DynamicAxis> <name>config</name> diff --git a/tests/general/fixtures/matrix-axis002.xml b/tests/general/fixtures/matrix-axis002.xml index fa00869b..1f6363bf 100644 --- a/tests/general/fixtures/matrix-axis002.xml +++ b/tests/general/fixtures/matrix-axis002.xml @@ -3,7 +3,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes> <ca.silvermaplesolutions.jenkins.plugins.daxis.DynamicAxis> <name>config</name> diff --git a/tests/general/fixtures/matrix-axis003.xml b/tests/general/fixtures/matrix-axis003.xml index 538337cc..1541278d 100644 --- a/tests/general/fixtures/matrix-axis003.xml +++ b/tests/general/fixtures/matrix-axis003.xml @@ -3,7 +3,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes> <jenkins.plugins.shiningpanda.matrix.PythonAxis> <name>PYTHON</name> diff --git a/tests/general/fixtures/matrix-axis004.xml b/tests/general/fixtures/matrix-axis004.xml index 1c055910..ce276723 100644 --- a/tests/general/fixtures/matrix-axis004.xml +++ b/tests/general/fixtures/matrix-axis004.xml @@ -3,7 +3,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes> <hudson.matrix.JDKAxis> <name>jdk</name> diff --git a/tests/general/fixtures/matrix-axis005.xml b/tests/general/fixtures/matrix-axis005.xml index 69122611..753e4d10 100644 --- a/tests/general/fixtures/matrix-axis005.xml +++ b/tests/general/fixtures/matrix-axis005.xml @@ -3,7 +3,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes> <ca.silvermaplesolutions.jenkins.plugins.daxis.DynamicAxis> <name>config</name> diff --git a/tests/general/fixtures/project-type002.xml b/tests/general/fixtures/project-type002.xml index ede8bc0a..ae27ec89 100644 --- a/tests/general/fixtures/project-type002.xml +++ b/tests/general/fixtures/project-type002.xml @@ -3,7 +3,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes/> <actions/> <keepDependencies>false</keepDependencies> diff --git a/tests/multibranch/fixtures/multibranch_defaults.xml b/tests/multibranch/fixtures/multibranch_defaults_id_mode.xml index 94859b22..8136ab90 100644 --- a/tests/multibranch/fixtures/multibranch_defaults.xml +++ b/tests/multibranch/fixtures/multibranch_defaults_id_mode.xml @@ -58,6 +58,7 @@ </sources> <factory class="org.jenkinsci.plugins.pipeline.multibranch.defaults.PipelineBranchDefaultsProjectFactory"> <owner class="org.jenkinsci.plugins.pipeline.multibranch.defaults.PipelineMultiBranchDefaultsProject" reference="../.."/> - <scriptPath>Jenkinsfile</scriptPath> + <scriptId>my-pipeline</scriptId> + <useSandbox>true</useSandbox> </factory> </org.jenkinsci.plugins.pipeline.multibranch.defaults.PipelineMultiBranchDefaultsProject> diff --git a/tests/multibranch/fixtures/multibranch_defaults_id_mode.yaml b/tests/multibranch/fixtures/multibranch_defaults_id_mode.yaml new file mode 100644 index 00000000..b7b52f1a --- /dev/null +++ b/tests/multibranch/fixtures/multibranch_defaults_id_mode.yaml @@ -0,0 +1,9 @@ +name: 'demo-multibranch-defaults' +project-type: multibranch-defaults +script-id: my-pipeline +sandbox: true +scm: + - github: + repo: 'foo' + repo-owner: 'johndoe' + credentials-id: 'secret' diff --git a/tests/multibranch/fixtures/multibranch_defaults_path_mode.xml b/tests/multibranch/fixtures/multibranch_defaults_path_mode.xml new file mode 100644 index 00000000..c8a0070e --- /dev/null +++ b/tests/multibranch/fixtures/multibranch_defaults_path_mode.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8"?> +<org.jenkinsci.plugins.pipeline.multibranch.defaults.PipelineMultiBranchDefaultsProject plugin="workflow-multibranch"> + <properties/> + <views> + <hudson.model.AllView> + <name>All</name> + <filterExecutors>false</filterExecutors> + <filterQueue>false</filterQueue> + <properties class="hudson.model.View$PropertyList"/> + <owner class="org.jenkinsci.plugins.pipeline.multibranch.defaults.PipelineMultiBranchDefaultsProject" reference="../../.."/> + </hudson.model.AllView> + </views> + <viewsTabBar class="hudson.views.DefaultViewsTabBar"/> + <folderViews class="jenkins.branch.MultiBranchProjectViewHolder" plugin="branch-api"> + <owner class="org.jenkinsci.plugins.pipeline.multibranch.defaults.PipelineMultiBranchDefaultsProject" reference="../.."/> + </folderViews> + <healthMetrics> + <com.cloudbees.hudson.plugins.folder.health.WorstChildHealthMetric plugin="cloudbees-folder"> + <nonRecursive>false</nonRecursive> + </com.cloudbees.hudson.plugins.folder.health.WorstChildHealthMetric> + </healthMetrics> + <icon class="jenkins.branch.MetadataActionFolderIcon" plugin="branch-api"> + <owner class="org.jenkinsci.plugins.pipeline.multibranch.defaults.PipelineMultiBranchDefaultsProject" reference="../.."/> + </icon> + <orphanedItemStrategy class="com.cloudbees.hudson.plugins.folder.computed.DefaultOrphanedItemStrategy" plugin="cloudbees-folder"> + <pruneDeadBranches>true</pruneDeadBranches> + <daysToKeep>-1</daysToKeep> + <numToKeep>-1</numToKeep> + </orphanedItemStrategy> + <triggers/> + <sources class="jenkins.branch.MultiBranchProject$BranchSourceList" plugin="branch-api"> + <data> + <jenkins.branch.BranchSource> + <source class="org.jenkinsci.plugins.github_branch_source.GitHubSCMSource" plugin="github-branch-source"> + <id>gh-johndoe-foo</id> + <repoOwner>johndoe</repoOwner> + <repository>foo</repository> + <credentialsId>secret</credentialsId> + <traits> + <org.jenkinsci.plugins.github__branch__source.BranchDiscoveryTrait> + <strategyId>1</strategyId> + </org.jenkinsci.plugins.github__branch__source.BranchDiscoveryTrait> + <org.jenkinsci.plugins.github__branch__source.ForkPullRequestDiscoveryTrait> + <strategyId>1</strategyId> + <trust class="org.jenkinsci.plugins.github_branch_source.ForkPullRequestDiscoveryTrait$TrustContributors"/> + </org.jenkinsci.plugins.github__branch__source.ForkPullRequestDiscoveryTrait> + <org.jenkinsci.plugins.github__branch__source.OriginPullRequestDiscoveryTrait> + <strategyId>1</strategyId> + </org.jenkinsci.plugins.github__branch__source.OriginPullRequestDiscoveryTrait> + <jenkins.plugins.git.traits.WipeWorkspaceTrait> + <extension class="hudson.plugins.git.extensions.impl.WipeWorkspace"/> + </jenkins.plugins.git.traits.WipeWorkspaceTrait> + </traits> + </source> + </jenkins.branch.BranchSource> + </data> + <owner class="org.jenkinsci.plugins.pipeline.multibranch.defaults.PipelineMultiBranchDefaultsProject" reference="../.."/> + </sources> + <factory class="org.jenkinsci.plugins.workflow.multibranch.WorkflowBranchProjectFactory" plugin="workflow-multibranch"> + <owner class="org.jenkinsci.plugins.pipeline.multibranch.defaults.PipelineMultiBranchDefaultsProject" reference="../.."/> + <scriptPath>Jenkinsfile</scriptPath> + </factory> +</org.jenkinsci.plugins.pipeline.multibranch.defaults.PipelineMultiBranchDefaultsProject> diff --git a/tests/multibranch/fixtures/multibranch_defaults.yaml b/tests/multibranch/fixtures/multibranch_defaults_path_mode.yaml index 51e41beb..51e41beb 100644 --- a/tests/multibranch/fixtures/multibranch_defaults.yaml +++ b/tests/multibranch/fixtures/multibranch_defaults_path_mode.yaml diff --git a/tests/multibranch/fixtures/scm_github_full.xml b/tests/multibranch/fixtures/scm_github_full.xml index 2d914b2b..6a52b72a 100644 --- a/tests/multibranch/fixtures/scm_github_full.xml +++ b/tests/multibranch/fixtures/scm_github_full.xml @@ -107,6 +107,11 @@ <org.jenkinsci.plugins.workflow.multibranch.DurabilityHintBranchProperty plugin="workflow-multibranch"> <hint>MAX_SURVIVABILITY</hint> </org.jenkinsci.plugins.workflow.multibranch.DurabilityHintBranchProperty> + <com.adobe.jenkins.github__pr__comment__build.TriggerPRCommentBranchProperty plugin="github-pr-comment-build"> + <commentBody>Ci build!</commentBody> + </com.adobe.jenkins.github__pr__comment__build.TriggerPRCommentBranchProperty> + <com.adobe.jenkins.github__pr__comment__build.TriggerPRReviewBranchProperty plugin="github-pr-comment-build"/> + <com.adobe.jenkins.github__pr__comment__build.TriggerPRUpdateBranchProperty plugin="github-pr-comment-build"/> </a> </properties> </strategy> diff --git a/tests/multibranch/fixtures/scm_github_full.yaml b/tests/multibranch/fixtures/scm_github_full.yaml index 42350c67..591e0fd8 100644 --- a/tests/multibranch/fixtures/scm_github_full.yaml +++ b/tests/multibranch/fixtures/scm_github_full.yaml @@ -20,6 +20,9 @@ scm: all-branches: - suppress-scm-triggering: true - pipeline-branch-durability-override: max-survivability + - trigger-build-on-pr-comment: "Ci build!" + - trigger-build-on-pr-review: true + - trigger-build-on-pr-update: true build-strategies: - tags: ignore-tags-newer-than: 1 diff --git a/tests/multibranch/fixtures/scm_github_no_origin_pr_discovery.xml b/tests/multibranch/fixtures/scm_github_no_origin_pr_discovery.xml new file mode 100644 index 00000000..d700a816 --- /dev/null +++ b/tests/multibranch/fixtures/scm_github_no_origin_pr_discovery.xml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="utf-8"?> +<org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject plugin="workflow-multibranch"> + <properties/> + <views> + <hudson.model.AllView> + <name>All</name> + <filterExecutors>false</filterExecutors> + <filterQueue>false</filterQueue> + <properties class="hudson.model.View$PropertyList"/> + <owner class="org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject" reference="../../.."/> + </hudson.model.AllView> + </views> + <viewsTabBar class="hudson.views.DefaultViewsTabBar"/> + <folderViews class="jenkins.branch.MultiBranchProjectViewHolder" plugin="branch-api"> + <owner class="org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject" reference="../.."/> + </folderViews> + <healthMetrics> + <com.cloudbees.hudson.plugins.folder.health.WorstChildHealthMetric plugin="cloudbees-folder"> + <nonRecursive>false</nonRecursive> + </com.cloudbees.hudson.plugins.folder.health.WorstChildHealthMetric> + </healthMetrics> + <icon class="jenkins.branch.MetadataActionFolderIcon" plugin="branch-api"> + <owner class="org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject" reference="../.."/> + </icon> + <orphanedItemStrategy class="com.cloudbees.hudson.plugins.folder.computed.DefaultOrphanedItemStrategy" plugin="cloudbees-folder"> + <pruneDeadBranches>true</pruneDeadBranches> + <daysToKeep>-1</daysToKeep> + <numToKeep>-1</numToKeep> + </orphanedItemStrategy> + <triggers/> + <sources class="jenkins.branch.MultiBranchProject$BranchSourceList" plugin="branch-api"> + <data> + <jenkins.branch.BranchSource> + <source class="org.jenkinsci.plugins.github_branch_source.GitHubSCMSource" plugin="github-branch-source"> + <id>gh-johndoe-foo</id> + <repoOwner>johndoe</repoOwner> + <repository>foo</repository> + <traits> + <org.jenkinsci.plugins.github__branch__source.BranchDiscoveryTrait> + <strategyId>1</strategyId> + </org.jenkinsci.plugins.github__branch__source.BranchDiscoveryTrait> + <org.jenkinsci.plugins.github__branch__source.ForkPullRequestDiscoveryTrait> + <strategyId>1</strategyId> + <trust class="org.jenkinsci.plugins.github_branch_source.ForkPullRequestDiscoveryTrait$TrustContributors"/> + </org.jenkinsci.plugins.github__branch__source.ForkPullRequestDiscoveryTrait> + <jenkins.plugins.git.traits.WipeWorkspaceTrait> + <extension class="hudson.plugins.git.extensions.impl.WipeWorkspace"/> + </jenkins.plugins.git.traits.WipeWorkspaceTrait> + </traits> + </source> + </jenkins.branch.BranchSource> + </data> + <owner class="org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject" reference="../.."/> + </sources> + <factory class="org.jenkinsci.plugins.workflow.multibranch.WorkflowBranchProjectFactory"> + <owner class="org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject" reference="../.."/> + <scriptPath>Jenkinsfile</scriptPath> + </factory> +</org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject> diff --git a/tests/multibranch/fixtures/scm_github_no_origin_pr_discovery.yaml b/tests/multibranch/fixtures/scm_github_no_origin_pr_discovery.yaml new file mode 100644 index 00000000..7852137e --- /dev/null +++ b/tests/multibranch/fixtures/scm_github_no_origin_pr_discovery.yaml @@ -0,0 +1,7 @@ +name: 'demo-multibranch-github-no-fork-prs' +project-type: multibranch +scm: + - github: + repo: 'foo' + repo-owner: 'johndoe' + discover-pr-origin: no diff --git a/tests/publishers/fixtures/join-trigger002.xml b/tests/publishers/fixtures/join-trigger002.xml new file mode 100644 index 00000000..9df79716 --- /dev/null +++ b/tests/publishers/fixtures/join-trigger002.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<project> + <publishers> + <hudson.tasks.BuildTrigger> + <childProjects>project-1,project-2</childProjects> + <threshold> + <name>FAILURE</name> + <ordinal>2</ordinal> + <color>RED</color> + </threshold> + </hudson.tasks.BuildTrigger> + <join.JoinTrigger> + <joinProjects>cleanup</joinProjects> + <joinPublishers/> + <resultThreshold> + <name>FAILURE</name> + <ordinal>2</ordinal> + <color>RED</color> + </resultThreshold> + </join.JoinTrigger> + </publishers> +</project> diff --git a/tests/publishers/fixtures/join-trigger002.yaml b/tests/publishers/fixtures/join-trigger002.yaml new file mode 100644 index 00000000..80940e47 --- /dev/null +++ b/tests/publishers/fixtures/join-trigger002.yaml @@ -0,0 +1,8 @@ +publishers: + - trigger: + project: project-1,project-2 + threshold: failure + - join-trigger: + projects: + - cleanup + threshold: failure diff --git a/tests/wrappers/fixtures/matrix-tie-parent.xml b/tests/wrappers/fixtures/matrix-tie-parent.xml index 9d2c65b8..f88d63b5 100644 --- a/tests/wrappers/fixtures/matrix-tie-parent.xml +++ b/tests/wrappers/fixtures/matrix-tie-parent.xml @@ -3,7 +3,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes/> <buildWrappers> <matrixtieparent.BuildWrapperMtp> diff --git a/tests/yamlparser/fixtures/custom_distri.xml b/tests/yamlparser/fixtures/custom_distri.xml index a12900d8..cf9e6467 100644 --- a/tests/yamlparser/fixtures/custom_distri.xml +++ b/tests/yamlparser/fixtures/custom_distri.xml @@ -3,7 +3,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes> <hudson.matrix.TextAxis> <name>distribution</name> diff --git a/tests/yamlparser/fixtures/expand-yaml-for-template-job/dimensionality-test001.xml b/tests/yamlparser/fixtures/expand-yaml-for-template-job/dimensionality-test001.xml index 8d582dba..0923b125 100644 --- a/tests/yamlparser/fixtures/expand-yaml-for-template-job/dimensionality-test001.xml +++ b/tests/yamlparser/fixtures/expand-yaml-for-template-job/dimensionality-test001.xml @@ -3,7 +3,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes> <hudson.matrix.TextAxis> <name>PLATFORM</name> @@ -32,7 +31,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes> <hudson.matrix.TextAxis> <name>PLATFORM</name> @@ -61,7 +59,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes> <hudson.matrix.TextAxis> <name>PLATFORM</name> diff --git a/tests/yamlparser/fixtures/project-matrix002.xml b/tests/yamlparser/fixtures/project-matrix002.xml index a31faada..e9fe8630 100644 --- a/tests/yamlparser/fixtures/project-matrix002.xml +++ b/tests/yamlparser/fixtures/project-matrix002.xml @@ -9,7 +9,6 @@ <color>BLUE</color> </touchStoneResultCondition> </executionStrategy> - <combinationFilter/> <axes/> <actions/> <description><!-- Managed by Jenkins Job Builder --></description> diff --git a/tests/yamlparser/fixtures/trigger_parameterized_builds/parameter-override-ordering-003.xml b/tests/yamlparser/fixtures/trigger_parameterized_builds/parameter-override-ordering-003.xml index f2bf89fa..18637ea3 100644 --- a/tests/yamlparser/fixtures/trigger_parameterized_builds/parameter-override-ordering-003.xml +++ b/tests/yamlparser/fixtures/trigger_parameterized_builds/parameter-override-ordering-003.xml @@ -3,7 +3,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes> <hudson.matrix.TextAxis> <name>foo_bar</name> @@ -45,7 +44,6 @@ <executionStrategy class="hudson.matrix.DefaultMatrixExecutionStrategyImpl"> <runSequentially>false</runSequentially> </executionStrategy> - <combinationFilter/> <axes> <hudson.matrix.TextAxis> <name>foo_bar</name> |