Fix legacy plugin version comparison; Remove cap on setuptools version

LegacyVersion class is removed from newer setuptools package. But
support for legacy versions is added in python-jenkins 1.8.2.
Switch to that implementation.

Fix broken plugin version comparison for legacy versions.

Assume latest plugin version if no plugin version is found.

Story: 2010990
Story: 2009943
Story: 2009819
Story: 2010842
Task: 49236
Task: 44852
Task: 44396
Task: 48448

Change-Id: Id7f0be1c42357454bd9bedcdee3fefb174943d81
This commit is contained in:
Vsevolod Fedorov 2023-12-12 12:50:23 +03:00
parent e2cf69b4f4
commit 67645a46eb
21 changed files with 203 additions and 229 deletions

View File

@ -37,7 +37,6 @@ Example::
""" """
import logging import logging
import sys
import xml.etree.ElementTree as XML import xml.etree.ElementTree as XML
import six import six
@ -48,7 +47,6 @@ from jenkins_jobs.errors import JenkinsJobsException
from jenkins_jobs.errors import MissingAttributeError from jenkins_jobs.errors import MissingAttributeError
import jenkins_jobs.modules.base import jenkins_jobs.modules.base
import jenkins_jobs.modules.helpers as helpers import jenkins_jobs.modules.helpers as helpers
import pkg_resources
from jenkins_jobs.modules import hudson_model from jenkins_jobs.modules import hudson_model
from jenkins_jobs.modules.publishers import ssh from jenkins_jobs.modules.publishers import ssh
from jenkins_jobs.modules.publishers import cifs from jenkins_jobs.modules.publishers import cifs
@ -2885,11 +2883,9 @@ def cmake(registry, xml_parent, data):
] ]
helpers.convert_mapping_to_xml(cmake, data, mapping, fail_required=True) helpers.convert_mapping_to_xml(cmake, data, mapping, fail_required=True)
info = registry.get_plugin_info("CMake plugin") plugin_ver = registry.get_plugin_version("CMake plugin")
# Note: Assume latest version of plugin is preferred config format
version = pkg_resources.parse_version(info.get("version", str(sys.maxsize)))
if version >= pkg_resources.parse_version("2.0"): if plugin_ver >= "2.0":
mapping_20 = [ mapping_20 = [
("preload-script", "preloadScript", None), # Optional parameter ("preload-script", "preloadScript", None), # Optional parameter
("working-dir", "workingDir", ""), ("working-dir", "workingDir", ""),
@ -4701,8 +4697,7 @@ def xunit(registry, xml_parent, data):
:language: yaml :language: yaml
""" """
info = registry.get_plugin_info("xunit") plugin_ver = registry.get_plugin_version("xunit")
plugin_version = pkg_resources.parse_version(info.get("version", str(sys.maxsize)))
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
xunit = XML.SubElement(xml_parent, "org.jenkinsci.plugins.xunit.XUnitBuilder") xunit = XML.SubElement(xml_parent, "org.jenkinsci.plugins.xunit.XUnitBuilder")
@ -4744,7 +4739,7 @@ def xunit(registry, xml_parent, data):
# Generate XML for each of the supported framework types # Generate XML for each of the supported framework types
# Note: versions 3+ are now using the 'tools' sub-element instead of 'types' # Note: versions 3+ are now using the 'tools' sub-element instead of 'types'
if plugin_version < pkg_resources.parse_version("3.0.0"): if plugin_ver < "3.0.0":
types_name = "types" types_name = "types"
else: else:
types_name = "tools" types_name = "tools"

View File

@ -14,7 +14,6 @@
from functools import wraps from functools import wraps
import logging import logging
import sys
import xml.etree.ElementTree as XML import xml.etree.ElementTree as XML
@ -23,8 +22,6 @@ from jenkins_jobs.errors import JenkinsJobsException
from jenkins_jobs.errors import MissingAttributeError from jenkins_jobs.errors import MissingAttributeError
from jenkins_jobs.modules import hudson_model from jenkins_jobs.modules import hudson_model
import pkg_resources
def build_trends_publisher(plugin_name, xml_element, data): def build_trends_publisher(plugin_name, xml_element, data):
"""Helper to create various trend publishers.""" """Helper to create various trend publishers."""
@ -515,8 +512,7 @@ def trigger_get_parameter_order(registry, plugin):
def trigger_project(tconfigs, project_def, registry, param_order=None): def trigger_project(tconfigs, project_def, registry, param_order=None):
info = registry.get_plugin_info("parameterized-trigger") plugin_ver = registry.get_plugin_version("parameterized-trigger")
plugin_version = pkg_resources.parse_version(info.get("version", str(sys.maxsize)))
logger = logging.getLogger("%s:trigger_project" % __name__) logger = logging.getLogger("%s:trigger_project" % __name__)
pt_prefix = "hudson.plugins.parameterizedtrigger." pt_prefix = "hudson.plugins.parameterizedtrigger."
@ -554,7 +550,7 @@ def trigger_project(tconfigs, project_def, registry, param_order=None):
("fail-on-missing", "failTriggerOnMissing", False), ("fail-on-missing", "failTriggerOnMissing", False),
] ]
if plugin_version >= pkg_resources.parse_version("2.35.2"): if plugin_ver >= "2.35.2":
property_file_mapping.append( property_file_mapping.append(
("property-multiline", "textParamValueOnNewLine", False) ("property-multiline", "textParamValueOnNewLine", False)
) )

View File

@ -74,7 +74,6 @@ Example:
# and this object is passed to the HipChat() class initialiser. # and this object is passed to the HipChat() class initialiser.
import logging import logging
import pkg_resources
import sys import sys
import xml.etree.ElementTree as XML import xml.etree.ElementTree as XML
@ -137,10 +136,9 @@ class HipChat(jenkins_jobs.modules.base.Base):
logger.warning("'room' is deprecated, please use 'rooms'") logger.warning("'room' is deprecated, please use 'rooms'")
hipchat["rooms"] = [hipchat["room"]] hipchat["rooms"] = [hipchat["room"]]
plugin_info = self.registry.get_plugin_info("Jenkins HipChat Plugin") plugin_ver = self.registry.get_plugin_version("Jenkins HipChat Plugin")
version = pkg_resources.parse_version(plugin_info.get("version", "0"))
if version >= pkg_resources.parse_version("0.1.9"): if plugin_ver >= "0.1.9":
publishers = xml_parent.find("publishers") publishers = xml_parent.find("publishers")
if publishers is None: if publishers is None:
publishers = XML.SubElement(xml_parent, "publishers") publishers = XML.SubElement(xml_parent, "publishers")
@ -173,7 +171,7 @@ class HipChat(jenkins_jobs.modules.base.Base):
hipchat.get("notify-start", hipchat.get("start-notify", False)) hipchat.get("notify-start", hipchat.get("start-notify", False))
).lower() ).lower()
if version >= pkg_resources.parse_version("0.1.5"): if plugin_ver >= "0.1.5":
mapping = [ mapping = [
("notify-success", "notifySuccess", False), ("notify-success", "notifySuccess", False),
("notify-aborted", "notifyAborted", False), ("notify-aborted", "notifyAborted", False),
@ -191,7 +189,7 @@ class HipChat(jenkins_jobs.modules.base.Base):
publishers = XML.SubElement(xml_parent, "publishers") publishers = XML.SubElement(xml_parent, "publishers")
hippub = XML.SubElement(publishers, "jenkins.plugins.hipchat.HipChatNotifier") hippub = XML.SubElement(publishers, "jenkins.plugins.hipchat.HipChatNotifier")
if version >= pkg_resources.parse_version("0.1.8"): if plugin_ver >= "0.1.8":
XML.SubElement(hippub, "buildServerUrl").text = self.jenkinsUrl XML.SubElement(hippub, "buildServerUrl").text = self.jenkinsUrl
XML.SubElement(hippub, "sendAs").text = self.sendAs XML.SubElement(hippub, "sendAs").text = self.sendAs
else: else:

View File

@ -82,7 +82,6 @@ CFP Example:
.. literalinclude:: /../../tests/general/fixtures/project-maven003.yaml .. literalinclude:: /../../tests/general/fixtures/project-maven003.yaml
""" """
import pkg_resources
import xml.etree.ElementTree as XML import xml.etree.ElementTree as XML
from jenkins_jobs.errors import InvalidAttributeError from jenkins_jobs.errors import InvalidAttributeError
@ -106,8 +105,7 @@ class Maven(jenkins_jobs.modules.base.Base):
return xml_parent return xml_parent
# determine version of plugin # determine version of plugin
plugin_info = self.registry.get_plugin_info("Maven Integration plugin") plugin_ver = self.registry.get_plugin_version("Maven Integration plugin")
version = pkg_resources.parse_version(plugin_info.get("version", "0"))
if "root-module" in data["maven"]: if "root-module" in data["maven"]:
root_module = XML.SubElement(xml_parent, "rootModule") root_module = XML.SubElement(xml_parent, "rootModule")
@ -160,9 +158,7 @@ class Maven(jenkins_jobs.modules.base.Base):
XML.SubElement(xml_parent, "fingerprintingDisabled").text = str( XML.SubElement(xml_parent, "fingerprintingDisabled").text = str(
not data["maven"].get("automatic-fingerprinting", True) not data["maven"].get("automatic-fingerprinting", True)
).lower() ).lower()
if version > pkg_resources.parse_version( if plugin_ver < "2.0.1":
"0"
) and version < pkg_resources.parse_version("2.0.1"):
XML.SubElement(xml_parent, "perModuleEmail").text = str( XML.SubElement(xml_parent, "perModuleEmail").text = str(
data.get("per-module-email", True) data.get("per-module-email", True)
).lower() ).lower()

View File

@ -33,7 +33,6 @@ Example::
""" """
import logging import logging
import pkg_resources
import xml.etree.ElementTree as XML import xml.etree.ElementTree as XML
from jenkins_jobs.errors import InvalidAttributeError from jenkins_jobs.errors import InvalidAttributeError
@ -479,10 +478,9 @@ def inject(registry, xml_parent, data):
helpers.convert_mapping_to_xml(info, data, mapping, fail_required=False) helpers.convert_mapping_to_xml(info, data, mapping, fail_required=False)
# determine version of plugin # determine version of plugin
plugin_info = registry.get_plugin_info("Groovy") plugin_ver = registry.get_plugin_version("Groovy")
version = pkg_resources.parse_version(plugin_info.get("version", "0"))
if version >= pkg_resources.parse_version("2.0.0"): if plugin_ver >= "2.0.0":
secure_groovy_script = XML.SubElement(info, "secureGroovyScript") secure_groovy_script = XML.SubElement(info, "secureGroovyScript")
mapping = [ mapping = [
("groovy-content", "script", None), ("groovy-content", "script", None),
@ -654,17 +652,16 @@ def priority_sorter(registry, xml_parent, data):
/../../tests/properties/fixtures/priority_sorter002.yaml /../../tests/properties/fixtures/priority_sorter002.yaml
:language: yaml :language: yaml
""" """
plugin_info = registry.get_plugin_info("PrioritySorter") plugin_ver = registry.get_plugin_version("PrioritySorter")
version = pkg_resources.parse_version(plugin_info.get("version", "0"))
if version >= pkg_resources.parse_version("3.0"): if plugin_ver >= "3.0":
priority_sorter_tag = XML.SubElement( priority_sorter_tag = XML.SubElement(
xml_parent, xml_parent,
"jenkins.advancedqueue.jobinclusion." "strategy.JobInclusionJobProperty", "jenkins.advancedqueue.jobinclusion." "strategy.JobInclusionJobProperty",
) )
mapping = [("use", "useJobGroup", True), ("priority", "jobGroupName", None)] mapping = [("use", "useJobGroup", True), ("priority", "jobGroupName", None)]
elif version >= pkg_resources.parse_version("2.0"): elif plugin_ver >= "2.0":
priority_sorter_tag = XML.SubElement( priority_sorter_tag = XML.SubElement(
xml_parent, "jenkins.advancedqueue.priority." "strategy.PriorityJobProperty" xml_parent, "jenkins.advancedqueue.priority." "strategy.PriorityJobProperty"
) )
@ -954,10 +951,9 @@ def slack(registry, xml_parent, data):
""" """
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
plugin_info = registry.get_plugin_info("Slack Notification Plugin") plugin_ver = registry.get_plugin_version("Slack Notification Plugin")
plugin_ver = pkg_resources.parse_version(plugin_info.get("version", "0"))
if plugin_ver >= pkg_resources.parse_version("2.0"): if plugin_ver >= "2.0":
logger.warning("properties section is not used with plugin version >= 2.0") logger.warning("properties section is not used with plugin version >= 2.0")
mapping = ( mapping = (

View File

@ -26,8 +26,6 @@ the build is complete.
""" """
import logging import logging
import pkg_resources
import sys
import xml.etree.ElementTree as XML import xml.etree.ElementTree as XML
import six import six
@ -1842,8 +1840,7 @@ def xunit(registry, xml_parent, data):
:language: yaml :language: yaml
""" """
info = registry.get_plugin_info("xunit") plugin_ver = registry.get_plugin_version("xunit")
plugin_version = pkg_resources.parse_version(info.get("version", str(sys.maxsize)))
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
xunit = XML.SubElement(xml_parent, "xunit") xunit = XML.SubElement(xml_parent, "xunit")
@ -1885,7 +1882,7 @@ def xunit(registry, xml_parent, data):
# Generate XML for each of the supported framework types # Generate XML for each of the supported framework types
# Note: versions 3+ are now using the 'tools' sub-element instead of 'types' # Note: versions 3+ are now using the 'tools' sub-element instead of 'types'
if plugin_version < pkg_resources.parse_version("3.0.0"): if plugin_ver < "3.0.0":
types_name = "types" types_name = "types"
else: else:
types_name = "tools" types_name = "tools"
@ -2475,21 +2472,20 @@ def base_email_ext(registry, xml_parent, data, ttype):
xml_parent, "hudson.plugins.emailext.plugins.trigger." + ttype xml_parent, "hudson.plugins.emailext.plugins.trigger." + ttype
) )
info = registry.get_plugin_info("email-ext") plugin_ver = registry.get_plugin_version("email-ext")
plugin_version = pkg_resources.parse_version(info.get("version", str(sys.maxsize)))
email = XML.SubElement(trigger, "email") email = XML.SubElement(trigger, "email")
if plugin_version < pkg_resources.parse_version("2.39"): if plugin_ver < "2.39":
XML.SubElement(email, "recipientList").text = "" XML.SubElement(email, "recipientList").text = ""
XML.SubElement(email, "subject").text = "$PROJECT_DEFAULT_SUBJECT" XML.SubElement(email, "subject").text = "$PROJECT_DEFAULT_SUBJECT"
XML.SubElement(email, "body").text = "$PROJECT_DEFAULT_CONTENT" XML.SubElement(email, "body").text = "$PROJECT_DEFAULT_CONTENT"
if plugin_version >= pkg_resources.parse_version("2.39"): if plugin_ver >= "2.39":
XML.SubElement(email, "replyTo").text = "$PROJECT_DEFAULT_REPLYTO" XML.SubElement(email, "replyTo").text = "$PROJECT_DEFAULT_REPLYTO"
XML.SubElement(email, "contentType").text = "project" XML.SubElement(email, "contentType").text = "project"
if "send-to" in data: if "send-to" in data:
recipient_providers = None recipient_providers = None
if plugin_version < pkg_resources.parse_version("2.39"): if plugin_ver < "2.39":
XML.SubElement(email, "sendToDevelopers").text = str( XML.SubElement(email, "sendToDevelopers").text = str(
"developers" in data["send-to"] "developers" in data["send-to"]
).lower() ).lower()
@ -2572,7 +2568,7 @@ def base_email_ext(registry, xml_parent, data, ttype):
"hudson.plugins.emailext.plugins.recipients.UpstreamComitterRecipientProvider", "hudson.plugins.emailext.plugins.recipients.UpstreamComitterRecipientProvider",
).text = "" ).text = ""
else: else:
if plugin_version < pkg_resources.parse_version("2.39"): if plugin_ver < "2.39":
XML.SubElement(email, "sendToRequester").text = "false" XML.SubElement(email, "sendToRequester").text = "false"
XML.SubElement(email, "sendToDevelopers").text = "false" XML.SubElement(email, "sendToDevelopers").text = "false"
XML.SubElement(email, "includeCulprits").text = "false" XML.SubElement(email, "includeCulprits").text = "false"
@ -2587,7 +2583,7 @@ def base_email_ext(registry, xml_parent, data, ttype):
if ttype == "ScriptTrigger": if ttype == "ScriptTrigger":
XML.SubElement(trigger, "triggerScript").text = data["trigger-script"] XML.SubElement(trigger, "triggerScript").text = data["trigger-script"]
if plugin_version >= pkg_resources.parse_version("2.39"): if plugin_ver >= "2.39":
mappings = [ mappings = [
("attachments", "attachmentsPattern", ""), ("attachments", "attachmentsPattern", ""),
("attach-build-log", "attachBuildLog", False), ("attach-build-log", "attachBuildLog", False),
@ -2687,8 +2683,7 @@ def email_ext(registry, xml_parent, data):
xml_parent, "hudson.plugins.emailext.ExtendedEmailPublisher" xml_parent, "hudson.plugins.emailext.ExtendedEmailPublisher"
) )
info = registry.get_plugin_info("email-ext") plugin_ver = registry.get_plugin_version("email-ext")
plugin_version = pkg_resources.parse_version(info.get("version", str(sys.maxsize)))
if "recipients" in data: if "recipients" in data:
XML.SubElement(emailext, "recipientList").text = data["recipients"] XML.SubElement(emailext, "recipientList").text = data["recipients"]
@ -2754,7 +2749,7 @@ def email_ext(registry, xml_parent, data):
("reply-to", "replyTo", "$DEFAULT_REPLYTO"), ("reply-to", "replyTo", "$DEFAULT_REPLYTO"),
] ]
if plugin_version >= pkg_resources.parse_version("2.39"): if plugin_ver >= "2.39":
mappings.append(("from", "from", "")) mappings.append(("from", "from", ""))
helpers.convert_mapping_to_xml(emailext, data, mappings, fail_required=True) helpers.convert_mapping_to_xml(emailext, data, mappings, fail_required=True)
@ -3127,13 +3122,11 @@ def groovy_postbuild(registry, xml_parent, data):
) )
data = {"script": data} data = {"script": data}
# There are incompatible changes, we need to know version # There are incompatible changes, we need to know version
info = registry.get_plugin_info("groovy-postbuild") plugin_ver = registry.get_plugin_version("groovy-postbuild")
# Note: Assume latest version of plugin is preferred config format
version = pkg_resources.parse_version(info.get("version", str(sys.maxsize)))
# Version specific predicates # Version specific predicates
matrix_parent_support = version >= pkg_resources.parse_version("1.9") matrix_parent_support = plugin_ver >= "1.9"
security_plugin_support = version >= pkg_resources.parse_version("2.0") security_plugin_support = plugin_ver >= "2.0"
extra_classpath_support = version >= pkg_resources.parse_version("1.6") extra_classpath_support = plugin_ver >= "1.6"
root_tag = "org.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildRecorder" root_tag = "org.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildRecorder"
groovy = XML.SubElement(xml_parent, root_tag) groovy = XML.SubElement(xml_parent, root_tag)
@ -4495,16 +4488,14 @@ def postbuildscript(registry, xml_parent, data):
xml_parent, "org.jenkinsci.plugins.postbuildscript.PostBuildScript" xml_parent, "org.jenkinsci.plugins.postbuildscript.PostBuildScript"
) )
info = registry.get_plugin_info("postbuildscript") plugin_ver = registry.get_plugin_version("postbuildscript")
# Note: Assume latest version of plugin is preferred config format if plugin_ver >= "2.0":
version = pkg_resources.parse_version(info.get("version", str(sys.maxsize)))
if version >= pkg_resources.parse_version("2.0"):
pbs_xml = XML.SubElement(pbs_xml, "config") pbs_xml = XML.SubElement(pbs_xml, "config")
mapping = [("mark-unstable-if-failed", "markBuildUnstable", False)] mapping = [("mark-unstable-if-failed", "markBuildUnstable", False)]
helpers.convert_mapping_to_xml(pbs_xml, data, mapping, fail_required=True) helpers.convert_mapping_to_xml(pbs_xml, data, mapping, fail_required=True)
if version >= pkg_resources.parse_version("2.0"): if plugin_ver >= "2.0":
def add_execute_on(bs_data, result_xml): def add_execute_on(bs_data, result_xml):
valid_values = ("matrix", "axes", "both") valid_values = ("matrix", "axes", "both")
@ -6756,13 +6747,11 @@ def conditional_publisher(registry, xml_parent, data):
"dont-run": evaluation_classes_pkg + ".BuildStepRunner$DontRun", "dont-run": evaluation_classes_pkg + ".BuildStepRunner$DontRun",
} }
plugin_info = registry.get_plugin_info("Flexible Publish Plugin") plugin_ver = registry.get_plugin_version("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 # Support for MatrixAggregator was added in v0.11
# See JENKINS-14494 # See JENKINS-14494
has_matrix_aggregator = version >= pkg_resources.parse_version("0.11") has_matrix_aggregator = plugin_ver >= "0.11"
for cond_action in data: for cond_action in data:
cond_publisher = XML.SubElement(publishers_tag, cond_publisher_tag) cond_publisher = XML.SubElement(publishers_tag, cond_publisher_tag)
@ -6792,7 +6781,7 @@ def conditional_publisher(registry, xml_parent, data):
# XML tag changed from publisher to publisherList in v0.13 # XML tag changed from publisher to publisherList in v0.13
# check the plugin version to determine further operations # check the plugin version to determine further operations
use_publisher_list = version >= pkg_resources.parse_version("0.13") use_publisher_list = plugin_ver >= "0.13"
if use_publisher_list: if use_publisher_list:
action_parent = XML.SubElement(cond_publisher, "publisherList") action_parent = XML.SubElement(cond_publisher, "publisherList")
@ -7703,11 +7692,7 @@ def slack(registry, xml_parent, data):
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
plugin_info = registry.get_plugin_info("Slack Notification Plugin") plugin_ver = registry.get_plugin_version("Slack Notification Plugin")
# Note: Assume latest version of plugin is preferred config format
plugin_ver = pkg_resources.parse_version(
plugin_info.get("version", str(sys.maxsize))
)
mapping = ( mapping = (
("team-domain", "teamDomain", ""), ("team-domain", "teamDomain", ""),
@ -7746,10 +7731,10 @@ def slack(registry, xml_parent, data):
slack = XML.SubElement(xml_parent, "jenkins.plugins.slack.SlackNotifier") slack = XML.SubElement(xml_parent, "jenkins.plugins.slack.SlackNotifier")
if plugin_ver >= pkg_resources.parse_version("2.0"): if plugin_ver >= "2.0":
mapping = mapping + mapping_20 mapping = mapping + mapping_20
if plugin_ver < pkg_resources.parse_version("2.0"): if plugin_ver < "2.0":
for yaml_name, _, default_value in mapping: for yaml_name, _, default_value in mapping:
# All arguments that don't have a default value are mandatory for # All arguments that don't have a default value are mandatory for
# the plugin to work as intended. # the plugin to work as intended.

View File

@ -30,9 +30,7 @@ Example::
""" """
import logging import logging
import pkg_resources
import re import re
import sys
import xml.etree.ElementTree as XML import xml.etree.ElementTree as XML
import six import six
@ -198,7 +196,7 @@ def build_gerrit_triggers(xml_parent, data, plugin_ver):
("exclude-private", "excludePrivateState", False), ("exclude-private", "excludePrivateState", False),
("exclude-wip", "excludeWipState", False), ("exclude-wip", "excludeWipState", False),
] ]
if plugin_ver >= pkg_resources.parse_version("2.32.0"): if plugin_ver >= "2.32.0":
mapping.append( mapping.append(
( (
"commit-message-contains-regex", "commit-message-contains-regex",
@ -241,7 +239,7 @@ def build_gerrit_skip_votes(xml_parent, data, plugin_ver):
("unstable", "onUnstable"), ("unstable", "onUnstable"),
("notbuilt", "onNotBuilt"), ("notbuilt", "onNotBuilt"),
] ]
if plugin_ver >= pkg_resources.parse_version("2.32.0"): if plugin_ver >= "2.32.0":
outcomes.append(("aborted", "onAborted")) outcomes.append(("aborted", "onAborted"))
skip_vote_node = XML.SubElement(xml_parent, "skipVote") skip_vote_node = XML.SubElement(xml_parent, "skipVote")
@ -252,7 +250,7 @@ def build_gerrit_skip_votes(xml_parent, data, plugin_ver):
def build_cancellation_policy(xml_parent, data, plugin_ver): def build_cancellation_policy(xml_parent, data, plugin_ver):
if plugin_ver >= pkg_resources.parse_version("2.32.0"): if plugin_ver >= "2.32.0":
options = [ options = [
("abort-new-patchsets", "abortNewPatchsets"), ("abort-new-patchsets", "abortNewPatchsets"),
("abort-manual-patchsets", "abortManualPatchsets"), ("abort-manual-patchsets", "abortManualPatchsets"),
@ -272,7 +270,7 @@ def build_cancellation_policy(xml_parent, data, plugin_ver):
def build_gerrit_parameter_modes(xml_parent, data, plugin_ver): def build_gerrit_parameter_modes(xml_parent, data, plugin_ver):
if plugin_ver < pkg_resources.parse_version("2.18.0"): if plugin_ver < "2.18.0":
for parameter_name in ( for parameter_name in (
"commit-message", "commit-message",
"name-and-email", "name-and-email",
@ -661,10 +659,7 @@ def gerrit(registry, xml_parent, data):
gerrit_handle_legacy_configuration(data) gerrit_handle_legacy_configuration(data)
plugin_info = registry.get_plugin_info("Gerrit Trigger") plugin_ver = registry.get_plugin_version("Gerrit Trigger")
plugin_ver = pkg_resources.parse_version(
plugin_info.get("version", str(sys.maxsize))
)
projects = data.get("projects", []) projects = data.get("projects", [])
gtrig = XML.SubElement( gtrig = XML.SubElement(
@ -797,9 +792,7 @@ def gerrit(registry, xml_parent, data):
XML.SubElement(gtrig, "triggerInformationAction").text = str( XML.SubElement(gtrig, "triggerInformationAction").text = str(
data.get("trigger-information-action", "") data.get("trigger-information-action", "")
) )
if (plugin_ver >= pkg_resources.parse_version("2.11.0")) and ( if plugin_ver >= "2.11.0" and plugin_ver < "2.14.0":
plugin_ver < pkg_resources.parse_version("2.14.0")
):
XML.SubElement(gtrig, "allowTriggeringUnreviewedPatches").text = str( XML.SubElement(gtrig, "allowTriggeringUnreviewedPatches").text = str(
data.get("trigger-for-unreviewed-patches", False) data.get("trigger-for-unreviewed-patches", False)
).lower() ).lower()
@ -848,7 +841,7 @@ def gerrit(registry, xml_parent, data):
), ),
] ]
if plugin_ver >= pkg_resources.parse_version("2.31.0"): if plugin_ver >= "2.31.0":
votes.append( votes.append(
( (
"gerrit-build-aborted-verified-value", "gerrit-build-aborted-verified-value",
@ -876,7 +869,7 @@ def gerrit(registry, xml_parent, data):
("custom-url", "customUrl", ""), ("custom-url", "customUrl", ""),
("server-name", "serverName", "__ANY__"), ("server-name", "serverName", "__ANY__"),
] ]
if plugin_ver >= pkg_resources.parse_version("2.31.0"): if plugin_ver >= "2.31.0":
message_mappings.append(("aborted-message", "buildAbortedMessage", "")) message_mappings.append(("aborted-message", "buildAbortedMessage", ""))
helpers.convert_mapping_to_xml(gtrig, data, message_mappings, fail_required=True) helpers.convert_mapping_to_xml(gtrig, data, message_mappings, fail_required=True)
@ -1573,14 +1566,9 @@ def gitlab_merge_request(registry, xml_parent, data):
xml_parent, "org.jenkinsci.plugins.gitlab." "GitlabBuildTrigger" xml_parent, "org.jenkinsci.plugins.gitlab." "GitlabBuildTrigger"
) )
plugin_info = registry.get_plugin_info("Gitlab Merge Request Builder") plugin_ver = registry.get_plugin_version("Gitlab Merge Request Builder")
# Note: Assume latest version of plugin is preferred config format if plugin_ver >= "2.0.0":
plugin_ver = pkg_resources.parse_version(
plugin_info.get("version", str(sys.maxsize))
)
if plugin_ver >= pkg_resources.parse_version("2.0.0"):
mapping = [ mapping = [
("cron", "spec", None), ("cron", "spec", None),
("project-path", "projectPath", None), ("project-path", "projectPath", None),
@ -1725,15 +1713,11 @@ def gitlab(registry, xml_parent, data):
xml_parent, "com.dabsquared.gitlabjenkins.GitLabPushTrigger" xml_parent, "com.dabsquared.gitlabjenkins.GitLabPushTrigger"
) )
plugin_info = registry.get_plugin_info("GitLab Plugin") plugin_ver = registry.get_plugin_version("GitLab Plugin")
# Note: Assume latest version of plugin is preferred config format
plugin_ver = pkg_resources.parse_version(
plugin_info.get("version", str(sys.maxsize))
)
valid_merge_request = ["never", "source", "both"] valid_merge_request = ["never", "source", "both"]
if plugin_ver >= pkg_resources.parse_version("1.1.26"): if plugin_ver >= "1.1.26":
mapping = [ mapping = [
( (
"trigger-open-merge-request-push", "trigger-open-merge-request-push",
@ -1749,7 +1733,7 @@ def gitlab(registry, xml_parent, data):
] ]
helpers.convert_mapping_to_xml(gitlab, data, mapping, fail_required=True) helpers.convert_mapping_to_xml(gitlab, data, mapping, fail_required=True)
if plugin_ver < pkg_resources.parse_version("1.2.0"): if plugin_ver < "1.2.0":
if data.get("branch-filter-type", "") == "All": if data.get("branch-filter-type", "") == "All":
data["branch-filter-type"] = "" data["branch-filter-type"] = ""
valid_filters = ["", "NameBasedFilter", "RegexBasedFilter"] valid_filters = ["", "NameBasedFilter", "RegexBasedFilter"]

View File

@ -23,8 +23,6 @@ Wrappers can alter the way the build is run as well as the build output.
""" """
import logging import logging
import pkg_resources
import sys
import xml.etree.ElementTree as XML import xml.etree.ElementTree as XML
from jenkins_jobs.errors import InvalidAttributeError from jenkins_jobs.errors import InvalidAttributeError
@ -336,12 +334,9 @@ def timeout(registry, xml_parent, data):
prefix = "hudson.plugins.build__timeout." prefix = "hudson.plugins.build__timeout."
twrapper = XML.SubElement(xml_parent, prefix + "BuildTimeoutWrapper") twrapper = XML.SubElement(xml_parent, prefix + "BuildTimeoutWrapper")
plugin_info = registry.get_plugin_info("Build Timeout") plugin_ver = registry.get_plugin_version(
if "version" not in plugin_info: "Build Timeout", "Jenkins build timeout plugin"
plugin_info = registry.get_plugin_info("Jenkins build timeout plugin") )
version = plugin_info.get("version", None)
if version:
version = pkg_resources.parse_version(version)
valid_strategies = [ valid_strategies = [
"absolute", "absolute",
@ -353,7 +348,7 @@ def timeout(registry, xml_parent, data):
# NOTE(toabctl): if we don't know the version assume that we # NOTE(toabctl): if we don't know the version assume that we
# use a newer version of the plugin # use a newer version of the plugin
if not version or version >= pkg_resources.parse_version("1.14"): if plugin_ver >= "1.14":
strategy = data.get("type", "absolute") strategy = data.get("type", "absolute")
if strategy not in valid_strategies: if strategy not in valid_strategies:
InvalidAttributeError("type", strategy, valid_strategies) InvalidAttributeError("type", strategy, valid_strategies)
@ -438,7 +433,7 @@ def timeout(registry, xml_parent, data):
all_actions = ["fail", "abort"] all_actions = ["fail", "abort"]
actions = [] actions = []
if version is not None and version >= pkg_resources.parse_version("1.17"): if plugin_ver >= "1.17":
all_actions.append("abort-and-restart") all_actions.append("abort-and-restart")
for action in all_actions: for action in all_actions:
@ -966,12 +961,9 @@ def rvm_env(registry, xml_parent, data):
ro_class = "Jenkins::Plugin::Proxies::BuildWrapper" ro_class = "Jenkins::Plugin::Proxies::BuildWrapper"
plugin_info = registry.get_plugin_info("RVM Plugin") plugin_ver = registry.get_plugin_version("RVM Plugin")
plugin_ver = pkg_resources.parse_version(
plugin_info.get("version", str(sys.maxsize))
)
if plugin_ver >= pkg_resources.parse_version("0.5"): if plugin_ver >= "0.5":
ro_class = "Jenkins::Tasks::BuildWrapperProxy" ro_class = "Jenkins::Tasks::BuildWrapperProxy"
ro = XML.SubElement(rpo, "ruby-object", {"ruby-class": ro_class, "pluginid": "rvm"}) ro = XML.SubElement(rpo, "ruby-object", {"ruby-class": ro_class, "pluginid": "rvm"})
@ -1821,8 +1813,7 @@ def pre_scm_buildstep(registry, xml_parent, data):
:language: yaml :language: yaml
""" """
# Get plugin information to maintain backwards compatibility # Get plugin information to maintain backwards compatibility
info = registry.get_plugin_info("preSCMbuildstep") plugin_ver = registry.get_plugin_version("preSCMbuildstep")
version = pkg_resources.parse_version(info.get("version", "0"))
bsp = XML.SubElement( bsp = XML.SubElement(
xml_parent, "org.jenkinsci.plugins.preSCMbuildstep." "PreSCMBuildStepsWrapper" xml_parent, "org.jenkinsci.plugins.preSCMbuildstep." "PreSCMBuildStepsWrapper"
@ -1833,7 +1824,7 @@ def pre_scm_buildstep(registry, xml_parent, data):
for step in stepList: for step in stepList:
for edited_node in create_builders(registry, step): for edited_node in create_builders(registry, step):
bs.append(edited_node) bs.append(edited_node)
if version >= pkg_resources.parse_version("0.3") and not isinstance(data, list): if plugin_ver >= "0.3" and not isinstance(data, list):
mapping = [("failOnError", "failOnError", False)] mapping = [("failOnError", "failOnError", False)]
helpers.convert_mapping_to_xml(bsp, data, mapping, fail_required=True) helpers.convert_mapping_to_xml(bsp, data, mapping, fail_required=True)
@ -2049,10 +2040,7 @@ def ssh_agent_credentials(registry, xml_parent, data):
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
plugin_info = registry.get_plugin_info("SSH Agent Plugin") plugin_ver = registry.get_plugin_version("SSH Agent Plugin")
plugin_ver = pkg_resources.parse_version(
plugin_info.get("version", str(sys.maxsize))
)
entry_xml = XML.SubElement( entry_xml = XML.SubElement(
xml_parent, "com.cloudbees.jenkins.plugins.sshagent.SSHAgentBuildWrapper" xml_parent, "com.cloudbees.jenkins.plugins.sshagent.SSHAgentBuildWrapper"
@ -2063,7 +2051,7 @@ def ssh_agent_credentials(registry, xml_parent, data):
user_list = list() user_list = list()
if "users" in data: if "users" in data:
user_list += data["users"] user_list += data["users"]
if plugin_ver >= pkg_resources.parse_version("1.5.0"): if plugin_ver >= "1.5.0":
user_parent_entry_xml = XML.SubElement(entry_xml, "credentialIds") user_parent_entry_xml = XML.SubElement(entry_xml, "credentialIds")
xml_key = "string" xml_key = "string"
if "user" in data: if "user" in data:
@ -2288,8 +2276,8 @@ def nodejs_installator(registry, xml_parent, data):
xml_parent, "jenkins.plugins.nodejs." "NodeJSBuildWrapper" xml_parent, "jenkins.plugins.nodejs." "NodeJSBuildWrapper"
) )
version = registry.get_plugin_info("nodejs").get("version", "0") plugin_ver = registry.get_plugin_version("nodejs", default="0")
npm_node.set("plugin", "nodejs@" + version) npm_node.set("plugin", "nodejs@" + plugin_ver)
mapping = [("name", "nodeJSInstallationName", None)] mapping = [("name", "nodeJSInstallationName", None)]
helpers.convert_mapping_to_xml(npm_node, data, mapping, fail_required=True) helpers.convert_mapping_to_xml(npm_node, data, mapping, fail_required=True)
@ -2601,11 +2589,9 @@ def artifactory_generic(registry, xml_parent, data):
helpers.artifactory_common_details(details, data) helpers.artifactory_common_details(details, data)
# Get plugin information to maintain backwards compatibility # Get plugin information to maintain backwards compatibility
info = registry.get_plugin_info("artifactory") plugin_ver = registry.get_plugin_version("artifactory")
# Note: Assume latest version of plugin is preferred config format
version = pkg_resources.parse_version(info.get("version", str(sys.maxsize)))
if version >= pkg_resources.parse_version("2.3.0"): if plugin_ver >= "2.3.0":
deploy_release_repo = XML.SubElement(details, "deployReleaseRepository") deploy_release_repo = XML.SubElement(details, "deployReleaseRepository")
mapping = [ mapping = [
("key-from-text", "keyFromText", ""), ("key-from-text", "keyFromText", ""),

View File

@ -19,11 +19,13 @@ import inspect
import logging import logging
import operator import operator
import pkg_resources import pkg_resources
import re import sys
import types import types
from pkg_resources.extern.packaging.version import InvalidVersion
from six import PY2 from six import PY2
from jenkins.plugins import PluginVersion
from jenkins_jobs.errors import JenkinsJobsException from jenkins_jobs.errors import JenkinsJobsException
from jenkins_jobs.expander import Expander, ParamsExpander from jenkins_jobs.expander import Expander, ParamsExpander
from jenkins_jobs.yaml_objects import BaseYamlObject from jenkins_jobs.yaml_objects import BaseYamlObject
@ -50,9 +52,10 @@ class ModuleRegistry(object):
self._params_expander = ParamsExpander(jjb_config) self._params_expander = ParamsExpander(jjb_config)
if plugins_list is None: if plugins_list is None:
self.plugins_dict = {} self._plugin_version = {}
else: else:
self.plugins_dict = self._get_plugins_info_dict(plugins_list) # PluginVersion by short and long plugin name.
self._plugin_version = self._get_plugins_versions(plugins_list)
for entrypoint in pkg_resources.iter_entry_points(group="jenkins_jobs.modules"): for entrypoint in pkg_resources.iter_entry_points(group="jenkins_jobs.modules"):
Mod = entrypoint.load() Mod = entrypoint.load()
@ -63,60 +66,38 @@ class ModuleRegistry(object):
self.modules_by_component_type[mod.component_type] = entrypoint self.modules_by_component_type[mod.component_type] = entrypoint
@staticmethod @staticmethod
def _get_plugins_info_dict(plugins_list): def _get_plugins_versions(plugins_list):
def mutate_plugin_info(plugin_info): plugin_version = {}
"""
We perform mutations on a single member of plugin_info here, then
return a dictionary with the longName and shortName of the plugin
mapped to its plugin info dictionary.
"""
version = plugin_info.get("version", "0")
plugin_info["version"] = re.sub(
r"(.*)-(?:SNAPSHOT|BETA).*", r"\g<1>.preview", version
)
if isinstance( for plugin_info in plugins_list:
pkg_resources.parse_version(plugin_info["version"]), short_name = plugin_info.get("shortName")
pkg_resources.extern.packaging.version.LegacyVersion, long_name = plugin_info.get("longName")
):
plugin_info["version"] = plugin_info["version"].replace("-", "+") version = plugin_info["version"]
if isinstance( if version == None: # noqa: E711; should call PluginInfo.__eq__.
pkg_resources.parse_version(plugin_info["version"]), # Ensure that plugin_info always has version and it is instance of PluginVersion.
pkg_resources.extern.packaging.version.LegacyVersion, plugin_info["version"] = str(sys.maxsize)
): version = plugin_info["version"]
plugin_name = plugin_info.get(
"shortName", plugin_info.get("longName", None) try:
) pkg_resources.parse_version(version)
except InvalidVersion:
plugin_name = short_name or long_name
if plugin_name: if plugin_name:
logger.warning( logger.warning(
"Version %s for plugin %s is being treated as a LegacyVersion" "Version %s for plugin %s does not conform to PEP440",
% (plugin_info["version"], plugin_name) version,
plugin_name,
) )
else: else:
logger.warning( logger.warning("Version %s does not conform to PEP440", version)
"Version %s is being treated as a LegacyVersion"
% plugin_info["version"]
)
aliases = [] if short_name:
for key in ["longName", "shortName"]: plugin_version[short_name] = version
value = plugin_info.get(key, None) if long_name:
if value is not None: plugin_version[long_name] = version
aliases.append(value)
plugin_info_dict = {} return plugin_version
for name in aliases:
plugin_info_dict[name] = plugin_info
return plugin_info_dict
list_of_dicts = [mutate_plugin_info(v) for v in plugins_list]
plugins_info_dict = {}
for d in list_of_dicts:
plugins_info_dict.update(d)
return plugins_info_dict
@staticmethod @staticmethod
def _filter_kwargs(func, **kwargs): def _filter_kwargs(func, **kwargs):
@ -126,17 +107,21 @@ class ModuleRegistry(object):
del kwargs[name] del kwargs[name]
return kwargs return kwargs
def get_plugin_info(self, plugin_name): def get_plugin_version(self, plugin_name, alt_plugin_name=None, default=None):
"""Provide information about plugins within a module's impl of Base.gen_xml. """Provide plugin version to be used from a module's impl of Base.gen_xml.
The return value is a dictionary with data obtained directly from a The return value is a plugin version obtained directly from a running
running Jenkins instance. Jenkins instance.
This allows module authors to differentiate generated XML output based This allows module authors to differentiate generated XML output based
on information such as specific plugin versions. on it.
:arg str plugin_name: Either the shortName or longName of a plugin :arg str plugin_name: Either the shortName or longName of a plugin
as see in a query that looks like: as seen in a query that looks like:
``http://<jenkins-hostname>/pluginManager/api/json?pretty&depth=2`` ``http://<jenkins-hostname>/pluginManager/api/json?pretty&depth=2``
:arg str alt_plugin_name: Alternative plugin name. Used if plugin_name
is missing in plugin list.
:arg str default: Default value. Used if plugin name is missing in
plugin list.
During a 'test' run, it is possible to override JJB's query to a live During a 'test' run, it is possible to override JJB's query to a live
Jenkins instance by passing it a path to a file containing a YAML list Jenkins instance by passing it a path to a file containing a YAML list
@ -151,7 +136,19 @@ class ModuleRegistry(object):
.. literalinclude:: /../../tests/cmd/fixtures/plugins-info.yaml .. literalinclude:: /../../tests/cmd/fixtures/plugins-info.yaml
""" """
return self.plugins_dict.get(plugin_name, {}) try:
return self._plugin_version[plugin_name]
except KeyError:
pass
if alt_plugin_name:
try:
return self._plugin_version[alt_plugin_name]
except KeyError:
pass
if default is not None:
return PluginVersion(default)
# Assume latest version of plugin is preferred config format.
return PluginVersion(str(sys.maxsize))
def registerHandler(self, category, name, method): def registerHandler(self, category, name, method):
cat_dict = self.handlers.get(category, {}) cat_dict = self.handlers.get(category, {})

View File

@ -1,12 +1,11 @@
# The order of packages is significant, because pip processes them in the order # The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration # of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later. # process, which may cause wedges in the gate later.
setuptools<=65.7.0
six>=1.9.0 # MIT six>=1.9.0 # MIT
PyYAML>=3.13 # MIT PyYAML>=3.13 # MIT
pbr>=1.8 # Apache-2.0 pbr>=1.8 # Apache-2.0
stevedore>=1.17.1,<2; python_version < '3.0' # Apache-2.0 stevedore>=1.17.1,<2; python_version < '3.0' # Apache-2.0
stevedore>=1.17.1; python_version >= '3.0' # Apache-2.0 stevedore>=1.17.1; python_version >= '3.0' # Apache-2.0
python-jenkins>=0.4.15 python-jenkins>=1.8.2
fasteners fasteners
Jinja2 Jinja2

View File

@ -6,6 +6,7 @@ from pathlib import Path
import pytest import pytest
import yaml import yaml
from jenkins.plugins import Plugin
from jenkins_jobs.alphanum import AlphanumSort from jenkins_jobs.alphanum import AlphanumSort
from jenkins_jobs.config import JJBConfig from jenkins_jobs.config import JJBConfig
from jenkins_jobs.loader import Loader from jenkins_jobs.loader import Loader
@ -72,7 +73,8 @@ def input(scenario, jjb_config):
def plugins_info(scenario): def plugins_info(scenario):
if not scenario.plugins_info_path.exists(): if not scenario.plugins_info_path.exists():
return None return None
return yaml.safe_load(scenario.plugins_info_path.read_text()) plugin_dict_list = yaml.safe_load(scenario.plugins_info_path.read_text())
return [Plugin(**plugin_dict) for plugin_dict in plugin_dict_list]
@pytest.fixture @pytest.fixture

View File

@ -0,0 +1,3 @@
- longName: 'Jenkins HipChat Plugin'
shortName: 'hipchat'
version: "0.1"

View File

@ -155,6 +155,7 @@ echo &quot;Doing somethin cool with zsh&quot;
</info> </info>
</EnvInjectBuilder> </EnvInjectBuilder>
</buildSteps> </buildSteps>
<failOnError>false</failOnError>
</org.jenkinsci.plugins.preSCMbuildstep.PreSCMBuildStepsWrapper> </org.jenkinsci.plugins.preSCMbuildstep.PreSCMBuildStepsWrapper>
<com.michelin.cio.hudson.plugins.copytoslave.CopyToSlaveBuildWrapper> <com.michelin.cio.hudson.plugins.copytoslave.CopyToSlaveBuildWrapper>
<includes>file1,file2*.txt</includes> <includes>file1,file2*.txt</includes>

View File

@ -1,9 +1,10 @@
import pkg_resources import sys
from collections import namedtuple from collections import namedtuple
from operator import attrgetter from operator import attrgetter
import pytest import pytest
from jenkins.plugins import Plugin, PluginVersion
from jenkins_jobs.config import JJBConfig from jenkins_jobs.config import JJBConfig
from jenkins_jobs.registry import ModuleRegistry from jenkins_jobs.registry import ModuleRegistry
@ -35,6 +36,18 @@ scenarios = [
Scenario("s17", v1="1.0.1-1.v1", op="__lt__", v2="1.0.2"), Scenario("s17", v1="1.0.1-1.v1", op="__lt__", v2="1.0.2"),
Scenario("s18", v1="1.0.2-1.v1", op="__gt__", v2="1.0.1"), Scenario("s18", v1="1.0.2-1.v1", op="__gt__", v2="1.0.1"),
Scenario("s19", v1="1.0.2-1.v1", op="__gt__", v2="1.0.1-2"), Scenario("s19", v1="1.0.2-1.v1", op="__gt__", v2="1.0.1-2"),
# 'Groovy' plugin in 'inject' property.
Scenario("s20", v1="453.vcdb_a_c5c99890", op="__ge__", v2="2.0.0"),
# 'postbuildscript' plugin in 'postbuildscript' publisher.
Scenario("s21", v1="3.2.0-460.va_fda_0fa_26720", op="__ge__", v2="2.0"),
# Same, from story: 2009943.
Scenario("s22", v1="3.1.0-375.v3db_cd92485e1", op="__ge__", v2="2.0"),
# 'Slack Notification Plugin' in 'slack' publisher, from story: 2009819.
Scenario("s23", v1="602.v0da_f7458945d", op="__ge__", v2="2.0"),
# 'preSCMbuildstep' plugin in 'pre_scm_buildstep' wrapper.
Scenario("s24", v1="44.v6ef4fd97f56e", op="__ge__", v2="0.3"),
# 'SSH Agent Plugin' plugin in 'ssh_agent_credentials' wrapper.
Scenario("s25", v1="295.v9ca_a_1c7cc3a_a_", op="__ge__", v2="1.5.0"),
] ]
@ -66,65 +79,69 @@ def registry(config, scenario):
"version": scenario.v1, "version": scenario.v1,
}, },
] ]
return ModuleRegistry(config, plugin_info) return ModuleRegistry(config, [Plugin(**d) for d in plugin_info])
def test_get_plugin_info_dict(registry): def test_get_plugin_version_by_short_name(scenario, registry):
""" """
The goal of this test is to validate that the plugin_info returned by Plugin version should be available by it's short name
ModuleRegistry.get_plugin_info is a dictionary whose key 'shortName' is
the same value as the string argument passed to
ModuleRegistry.get_plugin_info.
""" """
plugin_name = "JankyPlugin1" plugin_name = "JankyPlugin1"
plugin_info = registry.get_plugin_info(plugin_name) version = registry.get_plugin_version(plugin_name)
assert isinstance(plugin_info, dict) assert isinstance(version, PluginVersion)
assert plugin_info["shortName"] == plugin_name assert version == scenario.v1
def test_get_plugin_info_dict_using_longName(registry): def test_get_plugin_version_by_long_name(scenario, registry):
""" """
The goal of this test is to validate that the plugin_info returned by Plugin version should be available by it's long name
ModuleRegistry.get_plugin_info is a dictionary whose key 'longName' is
the same value as the string argument passed to
ModuleRegistry.get_plugin_info.
""" """
plugin_name = "Blah Blah Blah Plugin" plugin_name = "Not A Real Plugin"
plugin_info = registry.get_plugin_info(plugin_name) version = registry.get_plugin_version(plugin_name)
assert isinstance(plugin_info, dict) assert isinstance(version, PluginVersion)
assert plugin_info["longName"] == plugin_name assert version == scenario.v1
def test_get_plugin_info_dict_no_plugin(registry): def test_get_plugin_version_by_alternative_name(scenario, registry):
version = registry.get_plugin_version("Non-existent name", "Not A Real Plugin")
assert version == scenario.v1
def test_get_plugin_version_default_value(registry):
version = registry.get_plugin_version("Non-existent name", default="1.2.3")
assert isinstance(version, PluginVersion)
assert version == "1.2.3"
def test_get_plugin_version_for_missing_plugin(registry):
""" """
The goal of this test case is to validate the behavior of The goal of this test case is to validate the behavior of
ModuleRegistry.get_plugin_info when the given plugin cannot be found in ModuleRegistry.get_plugin_version when the given plugin cannot be found in
ModuleRegistry's internal representation of the plugins_info. ModuleRegistry's internal representation of the plugins_info.
""" """
plugin_name = "PluginDoesNotExist" plugin_name = "PluginDoesNotExist"
plugin_info = registry.get_plugin_info(plugin_name) version = registry.get_plugin_version(plugin_name)
assert isinstance(plugin_info, dict) assert isinstance(version, PluginVersion)
assert plugin_info == {} assert version == str(sys.maxsize)
def test_get_plugin_info_dict_no_version(registry): def test_get_plugin_version_for_missing_version(registry):
""" """
The goal of this test case is to validate the behavior of The goal of this test case is to validate the behavior of
ModuleRegistry.get_plugin_info when the given plugin shortName returns ModuleRegistry.get_plugin_version when the given plugin shortName returns
plugin_info dict that has no version string. In a sane world where plugin_info dict that has no version string. In a sane world where
plugin frameworks like Jenkins' are sane this should never happen, but plugin frameworks like Jenkins' are sane this should never happen, but
I am including this test and the corresponding default behavior I am including this test and the corresponding default behavior
because, well, it's Jenkins. because, well, it's Jenkins.
""" """
plugin_name = "HerpDerpPlugin" plugin_name = "HerpDerpPlugin"
plugin_info = registry.get_plugin_info(plugin_name) version = registry.get_plugin_version(plugin_name)
assert isinstance(plugin_info, dict) assert isinstance(version, PluginVersion)
assert plugin_info["shortName"] == plugin_name assert version == str(sys.maxsize)
assert plugin_info["version"] == "0"
def test_plugin_version_comparison(registry, scenario): def test_plugin_version_comparison(registry, scenario):
@ -134,13 +151,12 @@ def test_plugin_version_comparison(registry, scenario):
where 'op' is the equality operator defined for the scenario. where 'op' is the equality operator defined for the scenario.
""" """
plugin_name = "JankyPlugin1" plugin_name = "JankyPlugin1"
plugin_info = registry.get_plugin_info(plugin_name) v1 = registry.get_plugin_version(plugin_name)
v1 = plugin_info.get("version")
op = getattr(pkg_resources.parse_version(v1), scenario.op) op = getattr(v1, scenario.op)
test = op(pkg_resources.parse_version(scenario.v2)) test = op(scenario.v2)
assert test, ( assert test, (
f"Unexpectedly found {v1} {scenario.v2} {scenario.op} == False" f"Unexpectedly found {v1} {scenario.op} {scenario.v2} == False"
" when comparing versions!" " when comparing versions!"
) )

View File

@ -153,6 +153,7 @@ echo &quot;Doing somethin cool with zsh&quot;
</info> </info>
</EnvInjectBuilder> </EnvInjectBuilder>
</buildSteps> </buildSteps>
<failOnError>false</failOnError>
</org.jenkinsci.plugins.preSCMbuildstep.PreSCMBuildStepsWrapper> </org.jenkinsci.plugins.preSCMbuildstep.PreSCMBuildStepsWrapper>
<com.michelin.cio.hudson.plugins.copytoslave.CopyToSlaveBuildWrapper> <com.michelin.cio.hudson.plugins.copytoslave.CopyToSlaveBuildWrapper>
<includes>file1,file2*.txt</includes> <includes>file1,file2*.txt</includes>

View File

@ -14,6 +14,9 @@
<EnvInjectJobProperty> <EnvInjectJobProperty>
<info> <info>
<loadFilesFromMaster>false</loadFilesFromMaster> <loadFilesFromMaster>false</loadFilesFromMaster>
<secureGroovyScript>
<sandbox>false</sandbox>
</secureGroovyScript>
</info> </info>
<on>true</on> <on>true</on>
<keepJenkinsSystemVariables>true</keepJenkinsSystemVariables> <keepJenkinsSystemVariables>true</keepJenkinsSystemVariables>

View File

@ -11,6 +11,9 @@
<EnvInjectJobProperty> <EnvInjectJobProperty>
<info> <info>
<loadFilesFromMaster>false</loadFilesFromMaster> <loadFilesFromMaster>false</loadFilesFromMaster>
<secureGroovyScript>
<sandbox>false</sandbox>
</secureGroovyScript>
</info> </info>
<on>true</on> <on>true</on>
<keepJenkinsSystemVariables>true</keepJenkinsSystemVariables> <keepJenkinsSystemVariables>true</keepJenkinsSystemVariables>
@ -55,6 +58,7 @@ echo &quot;Doing somethin cool with zsh&quot;
</info> </info>
</EnvInjectBuilder> </EnvInjectBuilder>
</buildSteps> </buildSteps>
<failOnError>false</failOnError>
</org.jenkinsci.plugins.preSCMbuildstep.PreSCMBuildStepsWrapper> </org.jenkinsci.plugins.preSCMbuildstep.PreSCMBuildStepsWrapper>
<com.michelin.cio.hudson.plugins.copytoslave.CopyToSlaveBuildWrapper> <com.michelin.cio.hudson.plugins.copytoslave.CopyToSlaveBuildWrapper>
<includes>file1,file2*.txt</includes> <includes>file1,file2*.txt</includes>

View File

@ -20,6 +20,7 @@ echo &quot;Unicode! ☃&quot;
</command> </command>
</hudson.tasks.Shell> </hudson.tasks.Shell>
</buildSteps> </buildSteps>
<failOnError>false</failOnError>
</org.jenkinsci.plugins.preSCMbuildstep.PreSCMBuildStepsWrapper> </org.jenkinsci.plugins.preSCMbuildstep.PreSCMBuildStepsWrapper>
</buildWrappers> </buildWrappers>
</project> </project>

View File

@ -11,6 +11,9 @@
<EnvInjectJobProperty> <EnvInjectJobProperty>
<info> <info>
<loadFilesFromMaster>false</loadFilesFromMaster> <loadFilesFromMaster>false</loadFilesFromMaster>
<secureGroovyScript>
<sandbox>false</sandbox>
</secureGroovyScript>
</info> </info>
<on>true</on> <on>true</on>
<keepJenkinsSystemVariables>true</keepJenkinsSystemVariables> <keepJenkinsSystemVariables>true</keepJenkinsSystemVariables>
@ -55,6 +58,7 @@ echo &quot;Doing somethin cool with zsh&quot;
</info> </info>
</EnvInjectBuilder> </EnvInjectBuilder>
</buildSteps> </buildSteps>
<failOnError>false</failOnError>
</org.jenkinsci.plugins.preSCMbuildstep.PreSCMBuildStepsWrapper> </org.jenkinsci.plugins.preSCMbuildstep.PreSCMBuildStepsWrapper>
<com.michelin.cio.hudson.plugins.copytoslave.CopyToSlaveBuildWrapper> <com.michelin.cio.hudson.plugins.copytoslave.CopyToSlaveBuildWrapper>
<includes>file1,file2*.txt</includes> <includes>file1,file2*.txt</includes>

View File

@ -13,6 +13,9 @@
<propertiesContent>FILE_LIST=/path/to/file1,/path/to/file2,/path/to/file3,/path/to/file4,/path/to/file5,/path/to/file6,/path/to/file7,/path/to/file8,/path/to/file9,/path/to/file10,/path/to/file11,/path/to/file12,/path/to/file13,/path/to/file14,/path/to/file15,/path/to/file16,/path/to/file17,/path/to/file18,/path/to/file19,/path/to/file20 <propertiesContent>FILE_LIST=/path/to/file1,/path/to/file2,/path/to/file3,/path/to/file4,/path/to/file5,/path/to/file6,/path/to/file7,/path/to/file8,/path/to/file9,/path/to/file10,/path/to/file11,/path/to/file12,/path/to/file13,/path/to/file14,/path/to/file15,/path/to/file16,/path/to/file17,/path/to/file18,/path/to/file19,/path/to/file20
</propertiesContent> </propertiesContent>
<loadFilesFromMaster>false</loadFilesFromMaster> <loadFilesFromMaster>false</loadFilesFromMaster>
<secureGroovyScript>
<sandbox>false</sandbox>
</secureGroovyScript>
</info> </info>
<on>true</on> <on>true</on>
<keepJenkinsSystemVariables>true</keepJenkinsSystemVariables> <keepJenkinsSystemVariables>true</keepJenkinsSystemVariables>
@ -48,6 +51,9 @@ echo &quot;${INPUT_DATA}&quot;
<propertiesContent>FILE_LIST=/another/different/path/to/file1,/another/different/path/to/file2,/another/different/path/to/file3,/another/different/path/to/file4,/another/different/path/to/file5,/another/different/path/to/file6,/another/different/path/to/file7,/another/different/path/to/file8,/another/different/path/to/file9,/another/different/path/to/file10,/another/different/path/to/file11,/another/different/path/to/file12,/another/different/path/to/file13,/another/different/path/to/file14,/another/different/path/to/file15,/another/different/path/to/file16,/another/different/path/to/file17,/another/different/path/to/file18,/another/different/path/to/file19,/another/different/path/to/file20 <propertiesContent>FILE_LIST=/another/different/path/to/file1,/another/different/path/to/file2,/another/different/path/to/file3,/another/different/path/to/file4,/another/different/path/to/file5,/another/different/path/to/file6,/another/different/path/to/file7,/another/different/path/to/file8,/another/different/path/to/file9,/another/different/path/to/file10,/another/different/path/to/file11,/another/different/path/to/file12,/another/different/path/to/file13,/another/different/path/to/file14,/another/different/path/to/file15,/another/different/path/to/file16,/another/different/path/to/file17,/another/different/path/to/file18,/another/different/path/to/file19,/another/different/path/to/file20
</propertiesContent> </propertiesContent>
<loadFilesFromMaster>false</loadFilesFromMaster> <loadFilesFromMaster>false</loadFilesFromMaster>
<secureGroovyScript>
<sandbox>false</sandbox>
</secureGroovyScript>
</info> </info>
<on>true</on> <on>true</on>
<keepJenkinsSystemVariables>true</keepJenkinsSystemVariables> <keepJenkinsSystemVariables>true</keepJenkinsSystemVariables>

View File

@ -20,6 +20,7 @@ echo &quot;Unicode! ☃&quot;
</command> </command>
</hudson.tasks.Shell> </hudson.tasks.Shell>
</buildSteps> </buildSteps>
<failOnError>false</failOnError>
</org.jenkinsci.plugins.preSCMbuildstep.PreSCMBuildStepsWrapper> </org.jenkinsci.plugins.preSCMbuildstep.PreSCMBuildStepsWrapper>
</buildWrappers> </buildWrappers>
</project> </project>