Add support for replacing more params using job templates
Change-Id: Ib5ef66a2a5504dee190f65912c910bd5131f71ab
diff --git a/README.rst b/README.rst
old mode 100755
new mode 100644
index fe3421d..b24514d
--- a/README.rst
+++ b/README.rst
@@ -352,6 +352,8 @@
Interpolating parameters for job templates.
+.. code-block:: yaml
+
_param:
salt_formulas:
- aodh
@@ -368,6 +370,22 @@
param:
formula: ${_param:salt_formulas}
+Or simply define multiple jobs and it's parameters to replace from template:
+
+.. code-block:: yaml
+
+ jenkins:
+ client:
+ job_template:
+ test_workflow_template:
+ name: test-{{name}}-{{myparam}}
+ template:
+ ...
+ jobs:
+ - name: firstjob
+ myparam: dummy
+ - name: secondjob
+ myparam: dummyaswell
Purging undefined jobs from Jenkins
diff --git a/jenkins/client/_job.sls b/jenkins/client/_job.sls
new file mode 100644
index 0000000..003a11a
--- /dev/null
+++ b/jenkins/client/_job.sls
@@ -0,0 +1,39 @@
+{%- if job.enabled|default(True) %}
+
+jenkins_job_{{ job_name }}_definition:
+ file.managed:
+ - name: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
+ - source: salt://jenkins/files/jobs/{{ job.type }}.xml
+ - mode: 400
+ - template: jinja
+ - defaults:
+ job_name: {{ job_name }}
+ {%- if job is defined %}
+ job: {{ job|yaml }}
+ {%- endif %}
+ - require:
+ - file: jenkins_client_dirs
+
+jenkins_job_{{ job_name }}_present:
+ jenkins_job.present:
+ - name: {{ job_name }}
+ - config: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
+ - watch:
+ - file: jenkins_job_{{ job_name }}_definition
+ - file: /etc/salt/minion.d/_jenkins.conf
+
+{%- else %}
+
+jenkins_job_{{ job_name }}_definition:
+ file.absent:
+ - name: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
+ - require:
+ - file: jenkins_client_dirs
+
+jenkins_job_{{ job_name }}_absent:
+ jenkins_job.absent:
+ - name: {{ job_name }}
+ - watch:
+ - file: /etc/salt/minion.d/_jenkins.conf
+
+{%- endif %}
diff --git a/jenkins/client/job.sls b/jenkins/client/job.sls
index 217278d..821fff8 100644
--- a/jenkins/client/job.sls
+++ b/jenkins/client/job.sls
@@ -4,44 +4,7 @@
- jenkins.client
{%- for job_name, job in client.get('job', {}).iteritems() %}
-
-{%- if job.enabled|default(True) %}
-
-jenkins_job_{{ job_name }}_definition:
- file.managed:
- - name: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
- - source: salt://jenkins/files/jobs/{{ job.type }}.xml
- - mode: 400
- - template: jinja
- - defaults:
- job_name: {{ job_name }}
- - require:
- - file: jenkins_client_dirs
-
-jenkins_job_{{ job_name }}_present:
- jenkins_job.present:
- - name: {{ job_name }}
- - config: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
- - watch:
- - file: jenkins_job_{{ job_name }}_definition
- - file: /etc/salt/minion.d/_jenkins.conf
-
-{%- else %}
-
-jenkins_job_{{ job_name }}_definition:
- file.absent:
- - name: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
- - require:
- - file: jenkins_client_dirs
-
-jenkins_job_{{ job_name }}_absent:
- jenkins_job.absent:
- - name: {{ job_name }}
- - watch:
- - file: /etc/salt/minion.d/_jenkins.conf
-
-{%- endif %}
-
+ {%- include "jenkins/client/_job.sls" %}
{%- endfor %}
{%- if client.get('purge_jobs', False) %}
@@ -57,6 +20,15 @@
{%- do jobs.append(job_name) %}
{%- endfor %}
{%- endfor %}
+
+ {%- for job_params in job_template.get('jobs', []) %}
+ {%- set job_name = job.template.name %}
+ {%- for key, value in job_params.iteritems() %}
+ {%- set replacer = "{{" + key + "}}" %}
+ {%- set job_name = job_name|replace(replacer, value) %}
+ {%- do jobs.append(job_name) %}
+ {%- endfor %}
+ {%- endfor %}
{%- endif %}
{%- endfor %}
diff --git a/jenkins/client/job_template.sls b/jenkins/client/job_template.sls
index e974656..8d519cd 100644
--- a/jenkins/client/job_template.sls
+++ b/jenkins/client/job_template.sls
@@ -5,36 +5,34 @@
{%- for job_template_name, job_template in client.get('job_template', {}).iteritems() %}
{%- if job_template.get('enabled', true) %}
- {# now just 1 defined param is supported #}
- {%- if job_template.param|length == 1 %}
- {%- for param_name, params in job_template.param.iteritems() %}
- {%- set replacer = "{{" + param_name + "}}" %}
- {%- for param in params %}
- {%- set job_name = job_template.name|replace(replacer, param) %}
- {%- set job = job_template.template|yaml|replace(replacer, param)|load_yaml %}
-
-jenkins_job_{{ job_name }}_definition:
- file.managed:
- - name: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
- - source: salt://jenkins/files/jobs/{{ job.type }}.xml
- - mode: 400
- - template: jinja
- - defaults:
- job_name: {{ job_name }}
- job: {{ job|yaml }}
- - require:
- - file: jenkins_client_dirs
-
-jenkins_job_{{ job_name }}_present:
- jenkins_job.present:
- - name: {{ job_name }}
- - config: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
- - watch:
- - file: jenkins_job_{{ job_name }}_definition
- - file: /etc/salt/minion.d/_jenkins.conf
-
- {%- endfor %}
+ {#- Matrix way, simulating behavior of Jenkins job builder, not fully
+ supported at the moment #}
+ {%- for param_name, params in job_template.get('param', {}).iteritems() %}
+ {%- set replacer = "{{" + param_name + "}}" %}
+ {%- for param in params %}
+ {%- set job_name = job_template.name|replace(replacer, param) %}
+ {%- set job = job_template.template|yaml|replace(replacer, param)|load_yaml %}
+ {%- include "jenkins/client/_job.sls" %}
{%- endfor %}
- {%- endif %}
+ {%- endfor %}
+
+ {#- Simple list of jobs togenerate with multiple parameters to replace #}
+ {%- for job_params in job_template.get('jobs', []) %}
+ {%- set _job_name = [job_template.name] %}
+ {%- set _job = [job_template.template] %}
+
+ {%- for key, value in job_params.iteritems() %}
+ {#- You may think WTF hack is this but we can't update variables in
+ inner scope to replace all parameters. But we can abuse lists for
+ this purpose }:-) #}
+ {%- set replacer = "{{" + key + "}}" %}
+ {%- do _job_name.append(_job_name|last|replace(replacer, value)) %}
+ {%- do _job.append(_job|last|yaml|replace(replacer, value)|load_yaml) %}
+ {%- endfor %}
+
+ {%- set job_name = _job_name|last %}
+ {%- set job = _job|last %}
+ {%- include "jenkins/client/_job.sls" %}
+ {%- endfor %}
{%- endif %}
{%- endfor %}