diff --git a/doc/source/definition.rst b/doc/source/definition.rst index 13c44fda8..18485905e 100644 --- a/doc/source/definition.rst +++ b/doc/source/definition.rst @@ -437,6 +437,9 @@ You can define variables that will be realized in a `Job Template`. Would create jobs ``build-i386`` and ``build-amd64``. +You can also reference a variable ``{template-name}`` in any value and it will +be subtitued by the name of the current job template being processed. + .. _variable_references: Variable References diff --git a/jenkins_jobs/formatter.py b/jenkins_jobs/formatter.py index 008d66e74..7eaab5980 100644 --- a/jenkins_jobs/formatter.py +++ b/jenkins_jobs/formatter.py @@ -33,7 +33,9 @@ def deep_format(obj, paramdict, allow_empty=False): # limitations on the values in paramdict - the post-format result must # still be valid YAML (so substituting-in a string containing quotes, for # example, is problematic). - if hasattr(obj, 'format'): + if getattr(obj, 'verbatim', False) is True: + ret = obj + elif hasattr(obj, 'format'): try: ret = CustomFormatter(allow_empty).format(obj, **paramdict) except KeyError as exc: @@ -129,3 +131,10 @@ class CustomFormatter(Formatter): ) return '' raise + + +class VerbatimString(str): + """ + String which is not expanded by `deep_format`. + """ + verbatim = True diff --git a/jenkins_jobs/parser.py b/jenkins_jobs/parser.py index b4704663c..b3b9bcffc 100644 --- a/jenkins_jobs/parser.py +++ b/jenkins_jobs/parser.py @@ -24,7 +24,7 @@ import os from jenkins_jobs.constants import MAGIC_MANAGE_STRING from jenkins_jobs.errors import JenkinsJobsException -from jenkins_jobs.formatter import deep_format +from jenkins_jobs.formatter import deep_format, VerbatimString import jenkins_jobs.local_yaml as local_yaml from jenkins_jobs import utils @@ -346,6 +346,7 @@ class YamlParser(object): for values in itertools.product(*dimensions): params = copy.deepcopy(project) + params['template-name'] = VerbatimString(template_name) params = self._applyDefaults(params, template) try: @@ -387,7 +388,6 @@ class YamlParser(object): if key not in params: params[key] = template[key] - params['template-name'] = template_name try: expanded = deep_format( template, params, diff --git a/tests/yamlparser/fixtures/complete001.xml b/tests/yamlparser/fixtures/complete001.xml index c34f622f4..40fee172e 100644 --- a/tests/yamlparser/fixtures/complete001.xml +++ b/tests/yamlparser/fixtures/complete001.xml @@ -1,7 +1,8 @@ - <!-- Managed by Jenkins Job Builder --> + JJB template: complete001_{version} +<!-- Managed by Jenkins Job Builder --> false false false diff --git a/tests/yamlparser/fixtures/complete001.yaml b/tests/yamlparser/fixtures/complete001.yaml index 2a9ce7ec6..f64b8084c 100644 --- a/tests/yamlparser/fixtures/complete001.yaml +++ b/tests/yamlparser/fixtures/complete001.yaml @@ -1,3 +1,8 @@ +- defaults: + name: global + description: | + JJB template: {template-name} + - wrapper: name: timeout-wrapper wrappers: @@ -85,10 +90,11 @@ version: - 1.2 jobs: - - 'complete001_{version}' + - 'complete001' - job-template: name: 'complete001_{version}' + id: 'complete001' scm: - gerrit-scm: project_pattern: openstack-infra/jenkins-job-builder