Allow template-name in the global defaults

Inject the template-name into parameters earlier, so it's possible to
use it in the global defaults. Mark the template name as 'verbatim' so
the interpolation is skipped by the formatter.

Change-Id: I5d98e32ed2bedaa6b536e61fbdec589f358f861f
This commit is contained in:
Jan Hruban 2016-12-09 16:51:03 +01:00
parent cc200dade0
commit 28cab53d5d
5 changed files with 24 additions and 5 deletions

View File

@ -401,6 +401,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

View File

@ -32,7 +32,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:
@ -124,3 +126,10 @@ class CustomFormatter(Formatter):
)
return ''
raise
class VerbatimString(str):
"""
String which is not expanded by `deep_format`.
"""
verbatim = True

View File

@ -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
@ -337,6 +337,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:
@ -378,7 +379,6 @@ class YamlParser(object):
if key not in params:
params[key] = template[key]
params['template-name'] = template_name
try:
expanded = deep_format(
template, params,

View File

@ -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>

View File

@ -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