summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/source/definition.rst3
-rw-r--r--jenkins_jobs/formatter.py11
-rw-r--r--jenkins_jobs/parser.py4
-rw-r--r--tests/yamlparser/fixtures/complete001.xml3
-rw-r--r--tests/yamlparser/fixtures/complete001.yaml8
5 files changed, 24 insertions, 5 deletions
diff --git a/doc/source/definition.rst b/doc/source/definition.rst
index 13c44fda..18485905 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 008d66e7..7eaab598 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 b4704663..b3b9bcff 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 c34f622f..40fee172 100644
--- a/tests/yamlparser/fixtures/complete001.xml
+++ b/tests/yamlparser/fixtures/complete001.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<project>
<actions/>
- <description>&lt;!-- Managed by Jenkins Job Builder --&gt;</description>
+ <description>JJB template: complete001_{version}
+&lt;!-- Managed by Jenkins Job Builder --&gt;</description>
<keepDependencies>false</keepDependencies>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
diff --git a/tests/yamlparser/fixtures/complete001.yaml b/tests/yamlparser/fixtures/complete001.yaml
index 2a9ce7ec..f64b8084 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