From 50bc586ec5cc2e9c9ad194bcf198e513e42c0d7d Mon Sep 17 00:00:00 2001 From: Christoffer Skeppstedt Date: Tue, 30 Sep 2014 09:18:04 +0200 Subject: [PATCH] Serialize combine-queued-commits for git-revision When configuring the trigger_builds Builder in the Jenkins web interface, you can add the parameter "Pass-through Git Commit that was built". You could not configure this in a jobs.yml. This commit adds that functionality (both to the builder "trigger_builds " and the publisher "trigger_parameterized_builds"). I still want to be backwards compatible with the old version (true/false) and maintain the similarity with the svn-revision param. Which means that you can either configure it as git-revision: true/false or git-revision: combine-queued-commits: true/false There were no prior case of shared code between builders and publishers, so (by recommendation) I put the common logic in builders.py, and then imported it in publishers.py. I added thorough tests for the feature in the builders fixtures, and only a basic test in the publishers fixtures, as suggested. Change-Id: I72cdcae3fac1094ffcc9367369556b8bcbe2d5d7 --- jenkins_jobs/modules/builders.py | 16 +++++----- jenkins_jobs/modules/helpers.py | 15 ++++++++++ jenkins_jobs/modules/publishers.py | 30 +++++++++++++++---- tests/builders/fixtures/trigger-builds005.xml | 3 ++ .../builders/fixtures/trigger-builds005.yaml | 2 ++ tests/builders/fixtures/trigger-builds007.xml | 16 ++++++++++ .../builders/fixtures/trigger-builds007.yaml | 4 +++ .../trigger-parameterized-builds001.xml | 15 ++++++++++ .../trigger-parameterized-builds001.yaml | 4 +++ .../trigger-parameterized-builds002.xml | 19 ++++++++++++ .../trigger-parameterized-builds002.yaml | 6 ++++ .../trigger_parameterized_builds001.xml | 5 +++- .../trigger_parameterized_builds001.yaml | 4 ++- .../trigger_parameterized_builds003.xml | 2 +- 14 files changed, 125 insertions(+), 16 deletions(-) create mode 100644 tests/builders/fixtures/trigger-builds007.xml create mode 100644 tests/builders/fixtures/trigger-builds007.yaml create mode 100644 tests/publishers/fixtures/trigger-parameterized-builds001.xml create mode 100644 tests/publishers/fixtures/trigger-parameterized-builds001.yaml create mode 100644 tests/publishers/fixtures/trigger-parameterized-builds002.xml create mode 100644 tests/publishers/fixtures/trigger-parameterized-builds002.yaml diff --git a/jenkins_jobs/modules/builders.py b/jenkins_jobs/modules/builders.py index 6f9ed7bd7..aa0b7c255 100644 --- a/jenkins_jobs/modules/builders.py +++ b/jenkins_jobs/modules/builders.py @@ -43,6 +43,7 @@ from jenkins_jobs.errors import InvalidAttributeError from jenkins_jobs.errors import JenkinsJobsException from jenkins_jobs.errors import MissingAttributeError import jenkins_jobs.modules.base +from jenkins_jobs.modules.helpers import append_git_revision_config from jenkins_jobs.modules.helpers import cloudformation_init from jenkins_jobs.modules.helpers import cloudformation_region_dict from jenkins_jobs.modules.helpers import cloudformation_stack @@ -382,8 +383,11 @@ def trigger_builds(parser, xml_parent, data): Plugin (optional) :arg bool svn-revision: Whether to pass the svn revision to the triggered job (optional) - :arg bool git-revision: Whether to pass the git revision to the triggered - job (optional) + :arg dict git-revision: Passes git revision to the triggered job + (optional). + + * **combine-queued-commits** (bool): Whether to combine queued git + hashes or not (default false) :arg bool block: whether to wait for the triggered jobs to finish or not (default false) :arg dict block-thresholds: Fail builds and/or mark as failed or unstable @@ -485,12 +489,10 @@ def trigger_builds(parser, xml_parent, data): XML.SubElement(tconfigs, 'hudson.plugins.parameterizedtrigger.' 'SubversionRevisionBuildParameters') + if(project_def.get('git-revision')): - params = XML.SubElement(tconfigs, - 'hudson.plugins.git.' - 'GitRevisionBuildParameters') - combine = XML.SubElement(params, 'combineQueuedCommits') - combine.text = 'false' + append_git_revision_config(tconfigs, project_def['git-revision']) + if(project_def.get('same-node')): XML.SubElement(tconfigs, 'hudson.plugins.parameterizedtrigger.' diff --git a/jenkins_jobs/modules/helpers.py b/jenkins_jobs/modules/helpers.py index aa3aeac26..2e04886a4 100644 --- a/jenkins_jobs/modules/helpers.py +++ b/jenkins_jobs/modules/helpers.py @@ -426,6 +426,21 @@ def artifactory_repository(xml_parent, data, target): data.get('deploy-dynamic-mode', False)).lower() +def append_git_revision_config(parent, config_def): + params = XML.SubElement( + parent, 'hudson.plugins.git.GitRevisionBuildParameters') + + try: + # If git-revision is a boolean, the get() will + # throw an AttributeError + combine_commits = str( + config_def.get('combine-queued-commits', False)).lower() + except AttributeError: + combine_commits = 'false' + + XML.SubElement(params, 'combineQueuedCommits').text = combine_commits + + def convert_mapping_to_xml(parent, data, mapping, fail_required=False): """Convert mapping to XML diff --git a/jenkins_jobs/modules/publishers.py b/jenkins_jobs/modules/publishers.py index e6738766e..ec710ec37 100644 --- a/jenkins_jobs/modules/publishers.py +++ b/jenkins_jobs/modules/publishers.py @@ -38,6 +38,7 @@ from jenkins_jobs.errors import JenkinsJobsException from jenkins_jobs.errors import MissingAttributeError import jenkins_jobs.modules.base from jenkins_jobs.modules import hudson_model +from jenkins_jobs.modules.helpers import append_git_revision_config from jenkins_jobs.modules.helpers import artifactory_common_details from jenkins_jobs.modules.helpers import artifactory_deployment_patterns from jenkins_jobs.modules.helpers import artifactory_env_vars_patterns @@ -350,9 +351,18 @@ def trigger_parameterized_builds(parser, xml_parent, data): :arg bool svn-revision: Pass svn revision to the triggered job (optional) :arg bool include-upstream: Include/pass through Upstream SVN Revisons. Only valid when 'svn-revision' is true. (default false) - :arg bool git-revision: Pass git revision to the other job (optional) + :arg dict git-revision: Passes git revision to the triggered job + (optional). + + * **combine-queued-commits** (bool): Whether to combine queued git + hashes or not (default false) + :arg bool combine-queued-commits: Combine Queued git hashes. Only valid when 'git-revision' is true. (default false) + + .. deprecated:: 1.4.0. Please use `combine-queued-commits` under the + `git-revision` argument instead. + :arg dict boolean-parameters: Pass boolean parameters to the downstream jobs. Specify the name and boolean value mapping of the parameters. (optional) @@ -446,11 +456,19 @@ def trigger_parameterized_builds(parser, xml_parent, data): properties = XML.SubElement(params, 'properties') properties.text = param_value elif param_type == 'git-revision' and param_value: - params = XML.SubElement(tconfigs, - 'hudson.plugins.git.' - 'GitRevisionBuildParameters') - XML.SubElement(params, 'combineQueuedCommits').text = str( - project_def.get('combine-queued-commits', False)).lower() + if 'combine-queued-commits' in project_def: + logger.warn( + "'combine-queued-commit' has moved to reside under " + "'git-revision' configuration, please update your " + "configs as support for this will be removed." + ) + git_revision = { + 'combine-queued-commits': + project_def['combine-queued-commits'] + } + else: + git_revision = project_def['git-revision'] + append_git_revision_config(tconfigs, git_revision) elif param_type == 'property-file': params = XML.SubElement(tconfigs, pt_prefix + 'FileBuildParameters') diff --git a/tests/builders/fixtures/trigger-builds005.xml b/tests/builders/fixtures/trigger-builds005.xml index f950214b4..323ff8780 100644 --- a/tests/builders/fixtures/trigger-builds005.xml +++ b/tests/builders/fixtures/trigger-builds005.xml @@ -5,6 +5,9 @@ + + true + propfile.txt true diff --git a/tests/builders/fixtures/trigger-builds005.yaml b/tests/builders/fixtures/trigger-builds005.yaml index aa792fc59..16f76094e 100644 --- a/tests/builders/fixtures/trigger-builds005.yaml +++ b/tests/builders/fixtures/trigger-builds005.yaml @@ -1,6 +1,8 @@ builders: - trigger-builds: - project: "build_started" + git-revision: + combine-queued-commits: true property-file: propfile.txt block: true block-thresholds: diff --git a/tests/builders/fixtures/trigger-builds007.xml b/tests/builders/fixtures/trigger-builds007.xml new file mode 100644 index 000000000..2a1a13c35 --- /dev/null +++ b/tests/builders/fixtures/trigger-builds007.xml @@ -0,0 +1,16 @@ + + + + + + + + build_started + ALWAYS + false + false + + + + + diff --git a/tests/builders/fixtures/trigger-builds007.yaml b/tests/builders/fixtures/trigger-builds007.yaml new file mode 100644 index 000000000..1b68e02e1 --- /dev/null +++ b/tests/builders/fixtures/trigger-builds007.yaml @@ -0,0 +1,4 @@ +builders: + - trigger-builds: + - project: "build_started" + git-revision: false \ No newline at end of file diff --git a/tests/publishers/fixtures/trigger-parameterized-builds001.xml b/tests/publishers/fixtures/trigger-parameterized-builds001.xml new file mode 100644 index 000000000..ec3bc08f0 --- /dev/null +++ b/tests/publishers/fixtures/trigger-parameterized-builds001.xml @@ -0,0 +1,15 @@ + + + + + + + + fixture + SUCCESS + false + + + + + diff --git a/tests/publishers/fixtures/trigger-parameterized-builds001.yaml b/tests/publishers/fixtures/trigger-parameterized-builds001.yaml new file mode 100644 index 000000000..8da3ce0f2 --- /dev/null +++ b/tests/publishers/fixtures/trigger-parameterized-builds001.yaml @@ -0,0 +1,4 @@ +publishers: + - trigger-parameterized-builds: + - project: 'fixture' + condition: SUCCESS \ No newline at end of file diff --git a/tests/publishers/fixtures/trigger-parameterized-builds002.xml b/tests/publishers/fixtures/trigger-parameterized-builds002.xml new file mode 100644 index 000000000..6e664f3c6 --- /dev/null +++ b/tests/publishers/fixtures/trigger-parameterized-builds002.xml @@ -0,0 +1,19 @@ + + + + + + + + + true + + + fixture + SUCCESS + false + + + + + diff --git a/tests/publishers/fixtures/trigger-parameterized-builds002.yaml b/tests/publishers/fixtures/trigger-parameterized-builds002.yaml new file mode 100644 index 000000000..c3e3e116e --- /dev/null +++ b/tests/publishers/fixtures/trigger-parameterized-builds002.yaml @@ -0,0 +1,6 @@ +publishers: + - trigger-parameterized-builds: + - project: 'fixture' + condition: SUCCESS + git-revision: + combine-queued-commits: true diff --git a/tests/publishers/fixtures/trigger_parameterized_builds001.xml b/tests/publishers/fixtures/trigger_parameterized_builds001.xml index f4bb7908b..9802dbab3 100644 --- a/tests/publishers/fixtures/trigger_parameterized_builds001.xml +++ b/tests/publishers/fixtures/trigger_parameterized_builds001.xml @@ -20,6 +20,9 @@ bar=foo BUILD_NUM=${BUILD_NUMBER} + + false + version.prop true @@ -35,7 +38,7 @@ bar=foo foo=bar - false + true label=="x86" diff --git a/tests/publishers/fixtures/trigger_parameterized_builds001.yaml b/tests/publishers/fixtures/trigger_parameterized_builds001.yaml index bf07fb7b3..16ca4de52 100644 --- a/tests/publishers/fixtures/trigger_parameterized_builds001.yaml +++ b/tests/publishers/fixtures/trigger_parameterized_builds001.yaml @@ -9,11 +9,13 @@ publishers: bar=foo - project: other_job1, other_job2 predefined-parameters: BUILD_NUM=${BUILD_NUMBER} + git-revision: true property-file: version.prop fail-on-missing: true - project: yet_another_job predefined-parameters: foo=bar - git-revision: true + git-revision: + combine-queued-commits: true restrict-matrix-project: label=="x86" - project: yet_another_job_2 node-label-name: foo diff --git a/tests/publishers/fixtures/trigger_parameterized_builds003.xml b/tests/publishers/fixtures/trigger_parameterized_builds003.xml index d662d59bd..e4dc9205d 100644 --- a/tests/publishers/fixtures/trigger_parameterized_builds003.xml +++ b/tests/publishers/fixtures/trigger_parameterized_builds003.xml @@ -36,4 +36,4 @@ - \ No newline at end of file +