From e53a05ac39288ee0cf434f051eff68fa6ac5a902 Mon Sep 17 00:00:00 2001
From: Andrew Hutchings <andrew@linuxjedi.co.uk>
Date: Mon, 19 Mar 2012 20:05:03 +0000
Subject: [PATCH] Add Jenkins job filler to puppet

Adds default Openstack jobs for a given project name into Jenkins

To envoke add a section as follows to your site manifest:

  class { "jenkins_jobs":
    site => "openstack",
    projects => ["project1", "project2"]
  }

Now using xml building blocks!

Change-Id: If4cacba91d3dc22207e53413543e5bcfcfb0b541
---
 modules/jenkins_jobs/manifests/add_jobs.pp    |  85 +++++++++
 modules/jenkins_jobs/manifests/init.pp        |  10 +
 modules/jenkins_jobs/manifests/job.pp         |  44 +++++
 modules/jenkins_jobs/templates/body.xml.erb   |  59 ++++++
 .../templates/builder_copy_bundle.xml.erb     |  23 +++
 .../templates/builder_coverage.xml.erb        |   9 +
 .../templates/builder_docs.xml.erb            |  10 +
 .../templates/builder_gerrit_git_prep.xml.erb |  31 +++
 .../templates/builder_pep8.xml.erb            |   9 +
 .../templates/builder_ppa.xml.erb             |  22 +++
 .../templates/builder_python26.xml.erb        |   8 +
 .../templates/builder_python27.xml.erb        |   8 +
 .../templates/builder_tarball.xml.erb         |   4 +
 .../templates/builder_venv.xml.erb            |   3 +
 .../jenkins_jobs/templates/logrotate.xml.erb  |   7 +
 .../templates/publisher_coverage.xml.erb      |  53 ++++++
 .../templates/publisher_docs.xml.erb          |  20 ++
 .../templates/publisher_pep8.xml.erb          | 179 ++++++++++++++++++
 .../templates/publisher_ppa.xml.erb           |   4 +
 .../templates/publisher_tarball.xml.erb       |  30 +++
 .../templates/publisher_venv.xml.erb          |   4 +
 .../jenkins_jobs/templates/scm_git.xml.erb    |  34 ++++
 .../templates/trigger_gerrit_comment.xml.erb  |  28 +++
 .../trigger_gerrit_ref_updated.xml.erb        |  25 +++
 .../templates/trigger_timed_15mins.xml.erb    |   3 +
 .../templates/trigger_timed_midnight.xml.erb  |   3 +
 26 files changed, 715 insertions(+)
 create mode 100644 modules/jenkins_jobs/manifests/add_jobs.pp
 create mode 100644 modules/jenkins_jobs/manifests/init.pp
 create mode 100644 modules/jenkins_jobs/manifests/job.pp
 create mode 100644 modules/jenkins_jobs/templates/body.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/builder_copy_bundle.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/builder_coverage.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/builder_docs.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/builder_gerrit_git_prep.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/builder_pep8.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/builder_ppa.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/builder_python26.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/builder_python27.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/builder_tarball.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/builder_venv.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/logrotate.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/publisher_coverage.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/publisher_docs.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/publisher_pep8.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/publisher_ppa.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/publisher_tarball.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/publisher_venv.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/scm_git.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/trigger_gerrit_comment.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/trigger_gerrit_ref_updated.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/trigger_timed_15mins.xml.erb
 create mode 100644 modules/jenkins_jobs/templates/trigger_timed_midnight.xml.erb

diff --git a/modules/jenkins_jobs/manifests/add_jobs.pp b/modules/jenkins_jobs/manifests/add_jobs.pp
new file mode 100644
index 0000000000..4e0c22dda3
--- /dev/null
+++ b/modules/jenkins_jobs/manifests/add_jobs.pp
@@ -0,0 +1,85 @@
+define jenkins_jobs::add_jobs($site) {
+  $project = $name
+
+  jenkins_jobs::job { "${name}-coverage":
+    site => "${site}",
+    project => "${name}",
+    job => "coverage",
+    logrotate => template("jenkins_jobs/logrotate.xml.erb"),
+    builders => [template("jenkins_jobs/builder_copy_bundle.xml.erb"), template("jenkins_jobs/builder_coverage.xml.erb")],
+    publishers => template("jenkins_jobs/publisher_coverage.xml.erb"),
+    triggers => template("jenkins_jobs/trigger_timed_15mins.xml.erb"),
+    scm => template("jenkins_jobs/scm_git.xml.erb")
+  }
+
+  jenkins_jobs::job { "${name}-docs":
+    site => "${site}",
+    project => "${name}",
+    job => "docs",
+    triggers => template("jenkins_jobs/trigger_timed_15mins.xml.erb"),
+    builders => [template("jenkins_jobs/builder_copy_bundle.xml.erb"), template("jenkins_jobs/builder_docs.xml.erb")],
+    publishers => template("jenkins_jobs/publisher_docs.xml.erb"),
+    scm => template("jenkins_jobs/scm_git.xml.erb")
+  }
+
+  jenkins_jobs::job { "${name}-merge":
+    site => "${site}",
+    project => "${name}",
+    job => "merge",
+    triggers => template("jenkins_jobs/trigger_gerrit_comment.xml.erb"),
+    builders => template("jenkins_jobs/builder_gerrit_git_prep.xml.erb")
+  }
+
+  jenkins_jobs::job { "${name}-pep8":
+    site => "${site}",
+    project => "${name}",
+    job => "pep8",
+    triggers => template("jenkins_jobs/trigger_gerrit_comment.xml.erb"),
+    builders => [template("jenkins_jobs/builder_gerrit_git_prep.xml.erb"), template("jenkins_jobs/builder_copy_bundle.xml.erb"), template("jenkins_jobs/builder_pep8.xml.erb")],
+    publishers => template("jenkins_jobs/publisher_pep8.xml.erb")
+  }
+
+  jenkins_jobs::job { "${name}-ppa":
+    site => "${site}",
+    project => "${name}",
+    job => "ppa",
+    builders => template("jenkins_jobs/builder_ppa.xml.erb"),
+    publishers => template("jenkins_jobs/publisher_ppa.xml.erb")
+  }
+
+  jenkins_jobs::job { "${name}-python26":
+    site => "${site}",
+    project => "${name}",
+    job => "python26",
+    triggers => template("jenkins_jobs/trigger_gerrit_comment.xml.erb"),
+    builders => [template("jenkins_jobs/builder_gerrit_git_prep.xml.erb"), template("jenkins_jobs/builder_copy_bundle.xml.erb"), template("jenkins_jobs/builder_python26.xml.erb")],
+  }
+
+  jenkins_jobs::job { "${name}-python27":
+    site => "${site}",
+    project => "${name}",
+    job => "python27",
+    triggers => template("jenkins_jobs/trigger_gerrit_comment.xml.erb"),
+    builders => [template("jenkins_jobs/builder_gerrit_git_prep.xml.erb"), template("jenkins_jobs/builder_copy_bundle.xml.erb"), template("jenkins_jobs/builder_python27.xml.erb")],
+  }
+
+  jenkins_jobs::job { "${name}-tarball":
+    site => "${site}",
+    project => "${name}",
+    job => "tarball",
+    triggers => template("jenkins_jobs/trigger_gerrit_ref_updated.xml.erb"),
+    builders => [template("jenkins_jobs/builder_gerrit_git_prep.xml.erb"), template("jenkins_jobs/builder_copy_bundle.xml.erb"), template("jenkins_jobs/builder_tarball.xml.erb")],
+    publishers => template("jenkins_jobs/publisher_tarball.xml.erb")
+  }
+
+  jenkins_jobs::job { "${name}-venv":
+    site => "${site}",
+    project => "${job}",
+    job => "venv",
+    triggers => template("jenkins_jobs/trigger_timed_midnight.xml.erb"),
+    builders => template("jenkins_jobs/builder_venv.xml.erb"),
+    publishers => template("jenkins_jobs/publisher_venv.xml.erb"),
+    scm => template("jenkins_jobs/scm_git.xml.erb")
+  }
+
+}
diff --git a/modules/jenkins_jobs/manifests/init.pp b/modules/jenkins_jobs/manifests/init.pp
new file mode 100644
index 0000000000..8a5cc419a0
--- /dev/null
+++ b/modules/jenkins_jobs/manifests/init.pp
@@ -0,0 +1,10 @@
+class jenkins_jobs($site, $projects) {
+
+  service { "jenkins":
+    ensure => running
+  }
+
+  jenkins_jobs::add_jobs { $projects:
+    site => "${site}"
+  }
+}
diff --git a/modules/jenkins_jobs/manifests/job.pp b/modules/jenkins_jobs/manifests/job.pp
new file mode 100644
index 0000000000..53029130e8
--- /dev/null
+++ b/modules/jenkins_jobs/manifests/job.pp
@@ -0,0 +1,44 @@
+define jenkins_jobs::job($site, $project, $job, $triggers="", $builders, $publishers="", $logrotate="", $scm="") {
+
+  file { "/var/lib/jenkins/jobs/${project}-${job}":
+    ensure => directory,
+    owner => 'jenkins',
+    group => 'nogroup'
+  }
+
+  file { "/var/lib/jenkins/jobs/${project}-${job}/builds":
+    ensure => directory,
+    owner => 'jenkins',
+    group => 'nogroup',
+    require => File["/var/lib/jenkins/jobs/${project}-${job}"],
+    notify => Service["jenkins"]
+  }
+
+  file { "/var/lib/jenkins/jobs/${project}-${job}/config-history":
+    ensure => directory,
+    owner => 'jenkins',
+    group => 'nogroup',
+    require => File["/var/lib/jenkins/jobs/${project}-${job}"],
+    notify => Service["jenkins"]
+  }
+
+  file { "/var/lib/jenkins/jobs/${project}-${job}/config.xml":
+    ensure => present,
+    content => template("jenkins_jobs/body.xml.erb"),
+    owner => 'jenkins',
+    group => 'nogroup',
+    require => File["/var/lib/jenkins/jobs/${project}-${job}"],
+    notify => Service["jenkins"]
+  }
+
+  file { "/var/lib/jenkins/jobs/${project}-${job}/nextBuildNumer":
+    ensure => present,
+    content => "1",
+    owner => 'jenkins',
+    group => 'nogroup',
+    replace => false,
+    require => File["/var/lib/jenkins/jobs/${project}-${job}"],
+    notify => Service["jenkins"]
+  }
+
+}
diff --git a/modules/jenkins_jobs/templates/body.xml.erb b/modules/jenkins_jobs/templates/body.xml.erb
new file mode 100644
index 0000000000..14a6719195
--- /dev/null
+++ b/modules/jenkins_jobs/templates/body.xml.erb
@@ -0,0 +1,59 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<project>
+  <actions/>
+  <description></description>
+  <%= logrotate %>
+  <keepDependencies>false</keepDependencies>
+  <properties>
+    <com.coravy.hudson.plugins.github.GithubProjectProperty>
+      <projectUrl>https://github.com/<%= site %>/<%= project %>/</projectUrl>
+    </com.coravy.hudson.plugins.github.GithubProjectProperty>
+    <hudson.plugins.throttleconcurrents.ThrottleJobProperty>
+      <maxConcurrentPerNode>0</maxConcurrentPerNode>
+      <maxConcurrentTotal>0</maxConcurrentTotal>
+      <categories/>
+      <throttleEnabled>false</throttleEnabled>
+      <throttleOption>project</throttleOption>
+      <configVersion>1</configVersion>
+    </hudson.plugins.throttleconcurrents.ThrottleJobProperty>
+    <EnvInjectJobProperty>
+      <info>
+        <propertiesContent>PROJECT=<%= project %></propertiesContent>
+        <loadFilesFromMaster>false</loadFilesFromMaster>
+      </info>
+      <on>true</on>
+      <keepJenkinsSystemVariables>true</keepJenkinsSystemVariables>
+      <keepBuildVariables>true</keepBuildVariables>
+      <contributors/>
+    </EnvInjectJobProperty>
+    <hudson.security.AuthorizationMatrixProperty>
+      <permission>hudson.model.Item.Build:authenticated</permission>
+    </hudson.security.AuthorizationMatrixProperty>
+  </properties>
+  <% if scm == "" %>
+  <scm class="hudson.scm.NullSCM"/>
+  <% else %>
+  <%= scm %>
+  <% end %>
+  <canRoam>false</canRoam>
+  <disabled>false</disabled>
+  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
+  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
+  <% if triggers != "" %>
+  <triggers class="vector">
+  <%= triggers %>
+  </triggers>
+  <% end %>
+  <concurrentBuild>false</concurrentBuild>
+  <% if builders != "" %>
+  <builders>
+  <%= builders %>
+  </builders>
+  <% end %>
+  <% if publishers != "" %>
+  <publishers>
+  <%= publishers %>
+  </publishers>
+  <% end %>
+  <buildWrappers/>
+</project>
diff --git a/modules/jenkins_jobs/templates/builder_copy_bundle.xml.erb b/modules/jenkins_jobs/templates/builder_copy_bundle.xml.erb
new file mode 100644
index 0000000000..be713c36c1
--- /dev/null
+++ b/modules/jenkins_jobs/templates/builder_copy_bundle.xml.erb
@@ -0,0 +1,23 @@
+  <builders>
+    <hudson.plugins.copyartifact.CopyArtifact>
+      <projectName>$PROJECT-venv</projectName>
+      <filter></filter>
+      <target></target>
+      <selector class="hudson.plugins.copyartifact.StatusBuildSelector"/>
+    </hudson.plugins.copyartifact.CopyArtifact>
+    <hudson.tasks.Shell>
+      <command># Support jobs, such as nova-docs, which are not yet triggered by gerrit
+if [ &quot;x$GERRIT_BRANCH&quot; = &quot;x&quot; ] ; then
+  GERRIT_BRANCH=master
+fi
+mv jenkins_venvs/$GERRIT_BRANCH/.cache.bundle .
+rm -fr jenkins_venvs
+
+if [ -f tools/test-requires -a \
+    `git diff HEAD^1 tools/test-requires 2&gt;/dev/null | wc -l` -gt 0 -o \
+      `git diff HEAD^1 tools/pip-requires 2&gt;/dev/null | wc -l` -gt 0 ]
+then
+  rm .cache.bundle
+fi</command>
+    </hudson.tasks.Shell>
+  </builders>
diff --git a/modules/jenkins_jobs/templates/builder_coverage.xml.erb b/modules/jenkins_jobs/templates/builder_coverage.xml.erb
new file mode 100644
index 0000000000..df75227b87
--- /dev/null
+++ b/modules/jenkins_jobs/templates/builder_coverage.xml.erb
@@ -0,0 +1,9 @@
+    <hudson.tasks.Shell>
+      <command>if [ -f .cache.bundle ] ; then
+  tox -ejenkinscover
+else
+  tox -evenv -- nosetests test/unit --with-xcoverage --cover-erase --cover-package=<%= project %>
+
+fi</command>
+    </hudson.tasks.Shell>
+
diff --git a/modules/jenkins_jobs/templates/builder_docs.xml.erb b/modules/jenkins_jobs/templates/builder_docs.xml.erb
new file mode 100644
index 0000000000..b0820ddddc
--- /dev/null
+++ b/modules/jenkins_jobs/templates/builder_docs.xml.erb
@@ -0,0 +1,10 @@
+    <hudson.tasks.Shell>
+      <command>mkdir -p doc/build
+export HUDSON_PUBLISH_DOCS=1
+if [ -f .cache.bundle ] ; then
+  tox -ejenkinsvenv python setup.py build_sphinx
+else
+  tox -evenv python setup.py build_sphinx
+fi</command>
+    </hudson.tasks.Shell>
+
diff --git a/modules/jenkins_jobs/templates/builder_gerrit_git_prep.xml.erb b/modules/jenkins_jobs/templates/builder_gerrit_git_prep.xml.erb
new file mode 100644
index 0000000000..dfbbb5af50
--- /dev/null
+++ b/modules/jenkins_jobs/templates/builder_gerrit_git_prep.xml.erb
@@ -0,0 +1,31 @@
+    <hudson.tasks.Shell>
+      <command>#!/bin/bash -xe
+
+if [ -z &quot;$GERRIT_NEWREV&quot; ] &amp;&amp; [ -z &quot;$GERRIT_REFSPEC&quot; ]
+then
+    echo &quot;This job may only be triggered by Gerrit.&quot;
+    exit 1
+fi
+
+if [[ ! -e .git ]]
+then
+    git clone https://review.<%= site %>.org/p/$GERRIT_PROJECT .
+fi
+git remote update || git remote update # attempt to work around bug #925790
+git reset --hard
+git clean -x -f -d -q
+
+if [ ! -z &quot;$GERRIT_REFSPEC&quot; ]
+then
+    git checkout $GERRIT_BRANCH
+    git reset --hard remotes/origin/$GERRIT_BRANCH
+    git clean -x -f -d -q
+    git fetch https://review.<%= site %>.org/p/$GERRIT_PROJECT $GERRIT_REFSPEC
+    git merge FETCH_HEAD
+else
+    git checkout $GERRIT_NEWREV
+    git reset --hard $GERRIT_NEWREV
+    git clean -x -f -d -q
+fi
+</command>
+    </hudson.tasks.Shell>
diff --git a/modules/jenkins_jobs/templates/builder_pep8.xml.erb b/modules/jenkins_jobs/templates/builder_pep8.xml.erb
new file mode 100644
index 0000000000..35a0227dd0
--- /dev/null
+++ b/modules/jenkins_jobs/templates/builder_pep8.xml.erb
@@ -0,0 +1,9 @@
+    <hudson.tasks.Shell>
+      <command>#!/bin/sh
+
+if [ -f .cache.bundle ] ; then
+  tox -v -ejenkinspep8 | tee pep8.txt
+else
+  tox -v -epep8 | tee pep8.txt
+fi</command>
+    </hudson.tasks.Shell>
diff --git a/modules/jenkins_jobs/templates/builder_ppa.xml.erb b/modules/jenkins_jobs/templates/builder_ppa.xml.erb
new file mode 100644
index 0000000000..e67079041a
--- /dev/null
+++ b/modules/jenkins_jobs/templates/builder_ppa.xml.erb
@@ -0,0 +1,22 @@
+    <hudson.tasks.Shell>
+      <command>rm -rf build dist.zip
+mkdir build
+</command>
+    </hudson.tasks.Shell>
+    <hudson.plugins.copyartifact.CopyArtifact>
+      <projectName><%= project %>-tarball</projectName>
+      <filter>dist/*.tar.gz</filter>
+      <target>build</target>
+      <selector class="hudson.plugins.copyartifact.ParameterizedBuildSelector">
+        <parameterName>BUILD_SELECTOR</parameterName>
+      </selector>
+    </hudson.plugins.copyartifact.CopyArtifact>
+    <hudson.tasks.Shell>
+      <command>#!/bin/bash
+
+#export DO_UPLOAD=&quot;no&quot;
+export PROJECT=&quot;<%= project %>&quot;
+export GERRIT_REFNAME=$BRANCH
+/bin/bash -xe ~/openstack-ci/slave_scripts/create-ppa-package.sh
+</command>
+    </hudson.tasks.Shell>
diff --git a/modules/jenkins_jobs/templates/builder_python26.xml.erb b/modules/jenkins_jobs/templates/builder_python26.xml.erb
new file mode 100644
index 0000000000..0bf35607c5
--- /dev/null
+++ b/modules/jenkins_jobs/templates/builder_python26.xml.erb
@@ -0,0 +1,8 @@
+    <hudson.tasks.Shell>
+      <command>if [ -f .cache.bundle ]
+then
+  tox -v -ejenkinspy26
+else
+  tox -v -epy26
+fi</command>
+    </hudson.tasks.Shell>
diff --git a/modules/jenkins_jobs/templates/builder_python27.xml.erb b/modules/jenkins_jobs/templates/builder_python27.xml.erb
new file mode 100644
index 0000000000..462e5f1ed4
--- /dev/null
+++ b/modules/jenkins_jobs/templates/builder_python27.xml.erb
@@ -0,0 +1,8 @@
+    <hudson.tasks.Shell>
+      <command>if [ -f .cache.bundle ]
+then
+  tox -v -ejenkinspy27
+else
+  tox -v -epy27
+fi</command>
+    </hudson.tasks.Shell>
diff --git a/modules/jenkins_jobs/templates/builder_tarball.xml.erb b/modules/jenkins_jobs/templates/builder_tarball.xml.erb
new file mode 100644
index 0000000000..4c51f32b42
--- /dev/null
+++ b/modules/jenkins_jobs/templates/builder_tarball.xml.erb
@@ -0,0 +1,4 @@
+    <hudson.tasks.Shell>
+      <command>~/openstack-ci/slave_scripts/create-tarball.sh
+</command>
+    </hudson.tasks.Shell>
diff --git a/modules/jenkins_jobs/templates/builder_venv.xml.erb b/modules/jenkins_jobs/templates/builder_venv.xml.erb
new file mode 100644
index 0000000000..459cc5bb6d
--- /dev/null
+++ b/modules/jenkins_jobs/templates/builder_venv.xml.erb
@@ -0,0 +1,3 @@
+    <hudson.tasks.Shell>
+      <command>bash -x ~/openstack-ci/slave_scripts/build-bundle.sh</command>
+    </hudson.tasks.Shell>
diff --git a/modules/jenkins_jobs/templates/logrotate.xml.erb b/modules/jenkins_jobs/templates/logrotate.xml.erb
new file mode 100644
index 0000000000..b617b7e689
--- /dev/null
+++ b/modules/jenkins_jobs/templates/logrotate.xml.erb
@@ -0,0 +1,7 @@
+  <logRotator>
+    <daysToKeep>3</daysToKeep>
+    <numToKeep>20</numToKeep>
+    <artifactDaysToKeep>-1</artifactDaysToKeep>
+    <artifactNumToKeep>-1</artifactNumToKeep>
+  </logRotator>
+
diff --git a/modules/jenkins_jobs/templates/publisher_coverage.xml.erb b/modules/jenkins_jobs/templates/publisher_coverage.xml.erb
new file mode 100644
index 0000000000..aa534f3185
--- /dev/null
+++ b/modules/jenkins_jobs/templates/publisher_coverage.xml.erb
@@ -0,0 +1,53 @@
+    <hudson.plugins.cobertura.CoberturaPublisher>
+      <coberturaReportFile>**/coverage.xml</coberturaReportFile>
+      <onlyStable>false</onlyStable>
+      <healthyTarget>
+        <targets class="enum-map" enum-type="hudson.plugins.cobertura.targets.CoverageMetric">
+          <entry>
+            <hudson.plugins.cobertura.targets.CoverageMetric>CONDITIONAL</hudson.plugins.cobertura.targets.CoverageMetric>
+            <int>70</int>
+          </entry>
+          <entry>
+            <hudson.plugins.cobertura.targets.CoverageMetric>LINE</hudson.plugins.cobertura.targets.CoverageMetric>
+            <int>80</int>
+          </entry>
+          <entry>
+            <hudson.plugins.cobertura.targets.CoverageMetric>METHOD</hudson.plugins.cobertura.targets.CoverageMetric>
+            <int>80</int>
+          </entry>
+        </targets>
+      </healthyTarget>
+      <unhealthyTarget>
+        <targets class="enum-map" enum-type="hudson.plugins.cobertura.targets.CoverageMetric">
+          <entry>
+            <hudson.plugins.cobertura.targets.CoverageMetric>CONDITIONAL</hudson.plugins.cobertura.targets.CoverageMetric>
+            <int>0</int>
+          </entry>
+          <entry>
+            <hudson.plugins.cobertura.targets.CoverageMetric>LINE</hudson.plugins.cobertura.targets.CoverageMetric>
+            <int>0</int>
+          </entry>
+          <entry>
+            <hudson.plugins.cobertura.targets.CoverageMetric>METHOD</hudson.plugins.cobertura.targets.CoverageMetric>
+            <int>0</int>
+          </entry>
+        </targets>
+      </unhealthyTarget>
+      <failingTarget>
+        <targets class="enum-map" enum-type="hudson.plugins.cobertura.targets.CoverageMetric">
+          <entry>
+            <hudson.plugins.cobertura.targets.CoverageMetric>CONDITIONAL</hudson.plugins.cobertura.targets.CoverageMetric>
+            <int>0</int>
+          </entry>
+          <entry>
+            <hudson.plugins.cobertura.targets.CoverageMetric>LINE</hudson.plugins.cobertura.targets.CoverageMetric>
+            <int>0</int>
+          </entry>
+          <entry>
+            <hudson.plugins.cobertura.targets.CoverageMetric>METHOD</hudson.plugins.cobertura.targets.CoverageMetric>
+            <int>0</int>
+          </entry>
+        </targets>
+      </failingTarget>
+      <sourceEncoding>ASCII</sourceEncoding>
+    </hudson.plugins.cobertura.CoberturaPublisher>
diff --git a/modules/jenkins_jobs/templates/publisher_docs.xml.erb b/modules/jenkins_jobs/templates/publisher_docs.xml.erb
new file mode 100644
index 0000000000..e8b1bf78bc
--- /dev/null
+++ b/modules/jenkins_jobs/templates/publisher_docs.xml.erb
@@ -0,0 +1,20 @@
+    <be.certipost.hudson.plugin.SCPRepositoryPublisher>
+      <siteName><%= project %>.<%= site %>.org</siteName>
+      <entries>
+        <be.certipost.hudson.plugin.Entry>
+          <filePath>docs/<%= project %></filePath>
+          <sourceFile>doc/build/html/**</sourceFile>
+          <keepHierarchy>false</keepHierarchy>
+        </be.certipost.hudson.plugin.Entry>
+        <be.certipost.hudson.plugin.Entry>
+          <filePath>docs/<%= project %>/_static</filePath>
+          <sourceFile>doc/build/html/_static/**</sourceFile>
+          <keepHierarchy>false</keepHierarchy>
+        </be.certipost.hudson.plugin.Entry>
+        <be.certipost.hudson.plugin.Entry>
+          <filePath>docs/<%= project %>/_sources</filePath>
+          <sourceFile>doc/build/html/_sources/**</sourceFile>
+          <keepHierarchy>false</keepHierarchy>
+        </be.certipost.hudson.plugin.Entry>
+      </entries>
+    </be.certipost.hudson.plugin.SCPRepositoryPublisher>
diff --git a/modules/jenkins_jobs/templates/publisher_pep8.xml.erb b/modules/jenkins_jobs/templates/publisher_pep8.xml.erb
new file mode 100644
index 0000000000..0fe94351b7
--- /dev/null
+++ b/modules/jenkins_jobs/templates/publisher_pep8.xml.erb
@@ -0,0 +1,179 @@
+    <hudson.plugins.violations.ViolationsPublisher>
+      <config>
+        <suppressions class="tree-set">
+          <no-comparator/>
+        </suppressions>
+        <typeConfigs>
+          <no-comparator/>
+          <entry>
+            <string>checkstyle</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>checkstyle</type>
+              <min>10</min>
+              <max>999</max>
+              <unstable>999</unstable>
+              <usePattern>false</usePattern>
+              <pattern></pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+          <entry>
+            <string>codenarc</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>codenarc</type>
+              <min>10</min>
+              <max>999</max>
+              <unstable>999</unstable>
+              <usePattern>false</usePattern>
+              <pattern></pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+          <entry>
+            <string>cpd</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>cpd</type>
+              <min>10</min>
+              <max>999</max>
+              <unstable>999</unstable>
+              <usePattern>false</usePattern>
+              <pattern></pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+          <entry>
+            <string>cpplint</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>cpplint</type>
+              <min>10</min>
+              <max>999</max>
+              <unstable>999</unstable>
+              <usePattern>false</usePattern>
+              <pattern></pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+          <entry>
+            <string>csslint</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>csslint</type>
+              <min>10</min>
+              <max>999</max>
+              <unstable>999</unstable>
+              <usePattern>false</usePattern>
+              <pattern></pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+          <entry>
+            <string>findbugs</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>findbugs</type>
+              <min>10</min>
+              <max>999</max>
+              <unstable>999</unstable>
+              <usePattern>false</usePattern>
+              <pattern></pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+          <entry>
+            <string>fxcop</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>fxcop</type>
+              <min>10</min>
+              <max>999</max>
+              <unstable>999</unstable>
+              <usePattern>false</usePattern>
+              <pattern></pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+          <entry>
+            <string>gendarme</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>gendarme</type>
+              <min>10</min>
+              <max>999</max>
+              <unstable>999</unstable>
+              <usePattern>false</usePattern>
+              <pattern></pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+          <entry>
+            <string>jcreport</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>jcreport</type>
+              <min>10</min>
+              <max>999</max>
+              <unstable>999</unstable>
+              <usePattern>false</usePattern>
+              <pattern></pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+          <entry>
+            <string>jslint</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>jslint</type>
+              <min>10</min>
+              <max>999</max>
+              <unstable>999</unstable>
+              <usePattern>false</usePattern>
+              <pattern></pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+          <entry>
+            <string>pep8</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>pep8</type>
+              <min>0</min>
+              <max>1</max>
+              <unstable>1</unstable>
+              <usePattern>false</usePattern>
+              <pattern>**/pep8.txt</pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+          <entry>
+            <string>pmd</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>pmd</type>
+              <min>10</min>
+              <max>999</max>
+              <unstable>999</unstable>
+              <usePattern>false</usePattern>
+              <pattern></pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+          <entry>
+            <string>pylint</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>pylint</type>
+              <min>10</min>
+              <max>999</max>
+              <unstable>999</unstable>
+              <usePattern>false</usePattern>
+              <pattern></pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+          <entry>
+            <string>simian</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>simian</type>
+              <min>10</min>
+              <max>999</max>
+              <unstable>999</unstable>
+              <usePattern>false</usePattern>
+              <pattern></pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+          <entry>
+            <string>stylecop</string>
+            <hudson.plugins.violations.TypeConfig>
+              <type>stylecop</type>
+              <min>10</min>
+              <max>999</max>
+              <unstable>999</unstable>
+              <usePattern>false</usePattern>
+              <pattern></pattern>
+            </hudson.plugins.violations.TypeConfig>
+          </entry>
+        </typeConfigs>
+        <limit>100</limit>
+        <sourcePathPattern></sourcePathPattern>
+        <fauxProjectPath></fauxProjectPath>
+        <encoding>default</encoding>
+      </config>
+    </hudson.plugins.violations.ViolationsPublisher>
diff --git a/modules/jenkins_jobs/templates/publisher_ppa.xml.erb b/modules/jenkins_jobs/templates/publisher_ppa.xml.erb
new file mode 100644
index 0000000000..bab1265788
--- /dev/null
+++ b/modules/jenkins_jobs/templates/publisher_ppa.xml.erb
@@ -0,0 +1,4 @@
+    <hudson.tasks.ArtifactArchiver>
+      <artifacts>build/*.dsc,build/*.tar.gz,build/*.changes</artifacts>
+      <latestOnly>false</latestOnly>
+    </hudson.tasks.ArtifactArchiver>
diff --git a/modules/jenkins_jobs/templates/publisher_tarball.xml.erb b/modules/jenkins_jobs/templates/publisher_tarball.xml.erb
new file mode 100644
index 0000000000..7811ecfe0e
--- /dev/null
+++ b/modules/jenkins_jobs/templates/publisher_tarball.xml.erb
@@ -0,0 +1,30 @@
+    <hudson.tasks.ArtifactArchiver>
+      <artifacts>dist/*.tar.gz</artifacts>
+      <latestOnly>false</latestOnly>
+    </hudson.tasks.ArtifactArchiver>
+    <be.certipost.hudson.plugin.SCPRepositoryPublisher>
+      <siteName><%= project %>.<%= site %>.org</siteName>
+      <entries>
+        <be.certipost.hudson.plugin.Entry>
+          <filePath>tarballs/<%= project %>/</filePath>
+          <sourceFile>dist/*.tar.gz</sourceFile>
+          <keepHierarchy>false</keepHierarchy>
+        </be.certipost.hudson.plugin.Entry>
+      </entries>
+    </be.certipost.hudson.plugin.SCPRepositoryPublisher>
+    <hudson.plugins.parameterizedtrigger.BuildTrigger>
+      <configs>
+        <hudson.plugins.parameterizedtrigger.BuildTriggerConfig>
+          <configs>
+            <hudson.plugins.parameterizedtrigger.PredefinedBuildParameters>
+              <properties>BUILD_SELECTOR=&lt;SpecificBuildSelector&gt;&lt;buildNumber&gt;$BUILD_NUMBER&lt;/buildNumber&gt;&lt;/SpecificBuildSelector&gt;
+BRANCH=$GERRIT_REFNAME
+</properties>
+            </hudson.plugins.parameterizedtrigger.PredefinedBuildParameters>
+          </configs>
+          <projects><%= project %>-ppa</projects>
+          <condition>SUCCESS</condition>
+          <triggerWithNoParameters>false</triggerWithNoParameters>
+        </hudson.plugins.parameterizedtrigger.BuildTriggerConfig>
+      </configs>
+    </hudson.plugins.parameterizedtrigger.BuildTrigger>
diff --git a/modules/jenkins_jobs/templates/publisher_venv.xml.erb b/modules/jenkins_jobs/templates/publisher_venv.xml.erb
new file mode 100644
index 0000000000..3a114edecc
--- /dev/null
+++ b/modules/jenkins_jobs/templates/publisher_venv.xml.erb
@@ -0,0 +1,4 @@
+    <hudson.tasks.ArtifactArchiver>
+      <artifacts>jenkins_venvs/**/.cache.bundle</artifacts>
+      <latestOnly>false</latestOnly>
+    </hudson.tasks.ArtifactArchiver>
diff --git a/modules/jenkins_jobs/templates/scm_git.xml.erb b/modules/jenkins_jobs/templates/scm_git.xml.erb
new file mode 100644
index 0000000000..ee026a7e26
--- /dev/null
+++ b/modules/jenkins_jobs/templates/scm_git.xml.erb
@@ -0,0 +1,34 @@
+  <scm class="hudson.plugins.git.GitSCM">
+    <configVersion>2</configVersion>
+    <userRemoteConfigs>
+      <hudson.plugins.git.UserRemoteConfig>
+        <name>origin</name>
+        <refspec>+refs/heads/*:refs/remotes/origin/*</refspec>
+        <url>git://github.com/<%= site %>/<%= project %>.git</url>
+      </hudson.plugins.git.UserRemoteConfig>
+    </userRemoteConfigs>
+    <branches>
+      <hudson.plugins.git.BranchSpec>
+        <name>**</name>
+      </hudson.plugins.git.BranchSpec>
+    </branches>
+    <disableSubmodules>false</disableSubmodules>
+    <recursiveSubmodules>false</recursiveSubmodules>
+    <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
+    <authorOrCommitter>false</authorOrCommitter>
+    <clean>false</clean>
+    <wipeOutWorkspace>true</wipeOutWorkspace>
+    <pruneBranches>false</pruneBranches>
+    <remotePoll>false</remotePoll>
+    <buildChooser class="hudson.plugins.git.util.DefaultBuildChooser"/>
+    <gitTool>Default</gitTool>
+    <submoduleCfg class="list"/>
+    <relativeTargetDir></relativeTargetDir>
+    <reference></reference>
+    <excludedRegions></excludedRegions>
+    <excludedUsers></excludedUsers>
+    <gitConfigName></gitConfigName>
+    <gitConfigEmail></gitConfigEmail>
+    <skipTag>false</skipTag>
+    <scmName></scmName>
+  </scm>
diff --git a/modules/jenkins_jobs/templates/trigger_gerrit_comment.xml.erb b/modules/jenkins_jobs/templates/trigger_gerrit_comment.xml.erb
new file mode 100644
index 0000000000..0f922951e9
--- /dev/null
+++ b/modules/jenkins_jobs/templates/trigger_gerrit_comment.xml.erb
@@ -0,0 +1,28 @@
+    <com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger>
+      <spec></spec>
+      <gerritProjects>
+        <com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.GerritProject>
+          <compareType>PLAIN</compareType>
+          <pattern><%= site %>/<%= project %></pattern>
+          <branches>
+            <com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch>
+              <compareType>ANT</compareType>
+              <pattern>**</pattern>
+            </com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch>
+          </branches>
+        </com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.GerritProject>
+      </gerritProjects>
+      <silentMode>false</silentMode>
+      <escapeQuotes>true</escapeQuotes>
+      <triggerOnPatchsetUploadedEvent>true</triggerOnPatchsetUploadedEvent>
+      <triggerOnChangeMergedEvent>false</triggerOnChangeMergedEvent>
+      <triggerOnCommentAddedEvent>true</triggerOnCommentAddedEvent>
+      <triggerOnRefUpdatedEvent>false</triggerOnRefUpdatedEvent>
+      <commentAddedTriggerApprovalCategory>APRV</commentAddedTriggerApprovalCategory>
+      <commentAddedTriggerApprovalValue>1</commentAddedTriggerApprovalValue>
+      <buildStartMessage></buildStartMessage>
+      <buildFailureMessage>This change was unable to be automatically merged with the current state of the repository. Please rebase your change and upload a new patchset.</buildFailureMessage>
+      <buildSuccessfulMessage></buildSuccessfulMessage>
+      <buildUnstableMessage></buildUnstableMessage>
+      <customUrl></customUrl>
+    </com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger>
diff --git a/modules/jenkins_jobs/templates/trigger_gerrit_ref_updated.xml.erb b/modules/jenkins_jobs/templates/trigger_gerrit_ref_updated.xml.erb
new file mode 100644
index 0000000000..782d217587
--- /dev/null
+++ b/modules/jenkins_jobs/templates/trigger_gerrit_ref_updated.xml.erb
@@ -0,0 +1,25 @@
+        <com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.GerritProject>
+          <compareType>PLAIN</compareType>
+          <pattern><%= site %>/<%= project %></pattern>
+          <branches>
+            <com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch>
+              <compareType>REG_EXP</compareType>
+              <pattern>^(?!refs/).*$</pattern>
+            </com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch>
+          </branches>
+        </com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.GerritProject>
+      </gerritProjects>
+      <silentMode>false</silentMode>
+      <escapeQuotes>true</escapeQuotes>
+      <triggerOnPatchsetUploadedEvent>false</triggerOnPatchsetUploadedEvent>
+      <triggerOnChangeMergedEvent>false</triggerOnChangeMergedEvent>
+      <triggerOnCommentAddedEvent>false</triggerOnCommentAddedEvent>
+      <triggerOnRefUpdatedEvent>true</triggerOnRefUpdatedEvent>
+      <commentAddedTriggerApprovalCategory></commentAddedTriggerApprovalCategory>
+      <commentAddedTriggerApprovalValue></commentAddedTriggerApprovalValue>
+      <buildStartMessage></buildStartMessage>
+      <buildFailureMessage></buildFailureMessage>
+      <buildSuccessfulMessage></buildSuccessfulMessage>
+      <buildUnstableMessage></buildUnstableMessage>
+      <customUrl></customUrl>
+    </com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger>
diff --git a/modules/jenkins_jobs/templates/trigger_timed_15mins.xml.erb b/modules/jenkins_jobs/templates/trigger_timed_15mins.xml.erb
new file mode 100644
index 0000000000..183d4b2d40
--- /dev/null
+++ b/modules/jenkins_jobs/templates/trigger_timed_15mins.xml.erb
@@ -0,0 +1,3 @@
+    <hudson.triggers.SCMTrigger>
+      <spec>*/15 * * * *</spec>
+    </hudson.triggers.SCMTrigger>
diff --git a/modules/jenkins_jobs/templates/trigger_timed_midnight.xml.erb b/modules/jenkins_jobs/templates/trigger_timed_midnight.xml.erb
new file mode 100644
index 0000000000..0bfde74060
--- /dev/null
+++ b/modules/jenkins_jobs/templates/trigger_timed_midnight.xml.erb
@@ -0,0 +1,3 @@
+    <hudson.triggers.TimerTrigger>
+      <spec>@midnight</spec>
+    </hudson.triggers.TimerTrigger>