diff --git a/jenkinsapi/job.py b/jenkinsapi/job.py index 00df4714..573f35ba 100644 --- a/jenkinsapi/job.py +++ b/jenkinsapi/job.py @@ -531,14 +531,26 @@ def load_config(self): def get_scm_type(self): element_tree = self._get_config_element_tree() scm_element = element_tree.find("scm") + multibranch_scm_prefix = "properties/org.jenkinsci.plugins.\ + workflow.multibranch.BranchJobProperty/branch/" + pipeline_scm_prefix = "definition/" + alt_scm_elems = [ + { + "prefix": multibranch_scm_prefix, # multibranch pipeline. + "path": multibranch_scm_prefix + "scm", + }, + { + "prefix": pipeline_scm_prefix, # standard pipeline. + "path": pipeline_scm_prefix + "scm", + }, + ] if not scm_element: - multibranch_scm_prefix = "properties/org.jenkinsci.plugins.\ - workflow.multibranch.BranchJobProperty/branch/" - multibranch_path = multibranch_scm_prefix + "scm" - scm_element = element_tree.find(multibranch_path) - if scm_element: - # multibranch pipeline. - self._scm_prefix = multibranch_scm_prefix + for scm_elm_conf in alt_scm_elems: + scm_element = element_tree.find(scm_elm_conf["path"]) + if scm_element: + # SCM Element found. + self._scm_prefix = scm_elm_conf["prefix"] + break scm_class = scm_element.get("class") if scm_element else None scm = self._scm_map.get(scm_class) if not scm: diff --git a/jenkinsapi_tests/systests/job_configs.py b/jenkinsapi_tests/systests/job_configs.py index 35fa782e..b64b3fe5 100644 --- a/jenkinsapi_tests/systests/job_configs.py +++ b/jenkinsapi_tests/systests/job_configs.py @@ -339,3 +339,27 @@ """.strip() + +PIPELINE_SCM_CONF_TEST_PARAMS = { + "scm_class": "hudson.plugins.git.GitSCM", + "git_url": "https://example.com/sairk/pipeline-test.git", +} + +PIPELINE_SCM_JOB = f""" + + + + 2 + + + {PIPELINE_SCM_CONF_TEST_PARAMS['git_url']} + + + + + main + + + + +""" diff --git a/jenkinsapi_tests/systests/test_job_pipeline_scm.py b/jenkinsapi_tests/systests/test_job_pipeline_scm.py new file mode 100644 index 00000000..7c965dcb --- /dev/null +++ b/jenkinsapi_tests/systests/test_job_pipeline_scm.py @@ -0,0 +1,18 @@ +from jenkinsapi_tests.systests.job_configs import ( + PIPELINE_SCM_CONF_TEST_PARAMS, + PIPELINE_SCM_JOB, +) +from jenkinsapi_tests.test_utils.random_strings import random_string + + +def test_pipeline_scm(jenkins): + """ + Can we extract scm info from a pipeline scm job? + """ + job_name = random_string() + job = jenkins.create_job(job_name, PIPELINE_SCM_JOB) + assert ( + job.get_scm_type() + == job._scm_map[PIPELINE_SCM_CONF_TEST_PARAMS["scm_class"]] + ) + assert job.get_scm_url()[0] == PIPELINE_SCM_CONF_TEST_PARAMS["git_url"]