From a2e5427862d822fe86acacc8339556e167a6240a Mon Sep 17 00:00:00 2001 From: Vsevolod Fedorov Date: Mon, 23 Jan 2023 11:04:16 +0300 Subject: [PATCH] STORY: 2010534 Fix bug: j2-yaml is not allowed inside macro body Change-Id: I24916df5f0592a5ea8197e7f372bd37fdba3a461 --- jenkins_jobs/registry.py | 13 +++++++++---- .../job_fixtures/jinja-yaml-macro-body.xml | 19 +++++++++++++++++++ .../job_fixtures/jinja-yaml-macro-body.yaml | 17 +++++++++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 tests/yamlparser/job_fixtures/jinja-yaml-macro-body.xml create mode 100644 tests/yamlparser/job_fixtures/jinja-yaml-macro-body.yaml diff --git a/jenkins_jobs/registry.py b/jenkins_jobs/registry.py index e470cf81a..c1babc426 100644 --- a/jenkins_jobs/registry.py +++ b/jenkins_jobs/registry.py @@ -26,6 +26,7 @@ from six import PY2 from jenkins_jobs.errors import JenkinsJobsException from jenkins_jobs.expander import Expander, ParamsExpander +from jenkins_jobs.yaml_objects import BaseYamlObject __all__ = ["ModuleRegistry"] @@ -319,12 +320,16 @@ class ModuleRegistry(object): expander = self._params_expander else: expander = self._expander + expander_params = {**component_data, **(job_data or {})} - for b in macro.elements: + elements = macro.elements + if isinstance(elements, BaseYamlObject): + # Expand !j2-yaml element right below macro body. + elements = elements.expand(expander, expander_params) + + for b in elements: try: - element = expander.expand( - b, params={**component_data, **(job_data or {})} - ) + element = expander.expand(b, expander_params) except JenkinsJobsException as x: raise JenkinsJobsException(f"While expanding macro {name!r}: {x}") # Pass component_data in as template data to this function diff --git a/tests/yamlparser/job_fixtures/jinja-yaml-macro-body.xml b/tests/yamlparser/job_fixtures/jinja-yaml-macro-body.xml new file mode 100644 index 000000000..0ec5d8b6d --- /dev/null +++ b/tests/yamlparser/job_fixtures/jinja-yaml-macro-body.xml @@ -0,0 +1,19 @@ + + + + <!-- Managed by Jenkins Job Builder --> + false + false + false + false + true + + + + + echo ${var} + + + + + diff --git a/tests/yamlparser/job_fixtures/jinja-yaml-macro-body.yaml b/tests/yamlparser/job_fixtures/jinja-yaml-macro-body.yaml new file mode 100644 index 000000000..a2e843e5b --- /dev/null +++ b/tests/yamlparser/job_fixtures/jinja-yaml-macro-body.yaml @@ -0,0 +1,17 @@ +- builder: + name: sample-macro + builders: + !j2-yaml: | + # Check that inner elements are expanded, but only once. + - shell: !j2: | + echo ${var} + +- job-template: + name: sample-job + builders: + - sample-macro + +- project: + name: sample-project + jobs: + - sample-job