Add Build.get_matrix_runs()
authorKieron Briggs <kbriggs@gmail.com>
Fri, 30 Aug 2013 03:51:36 +0000 (13:51 +1000)
committerKieron Briggs <kbriggs@gmail.com>
Fri, 30 Aug 2013 03:51:36 +0000 (13:51 +1000)
Add a method to get the individual sub-builds for a matrix build.

jenkinsapi/build.py
jenkinsapi_tests/systests/job_configs.py
jenkinsapi_tests/systests/test_jenkins_matrix.py [new file with mode: 0644]

index fa5c3ae..f7670ac 100644 (file)
@@ -211,6 +211,16 @@ class Build(JenkinsBase):
         except (IndexError, KeyError):
             return None
 
+    def get_matrix_runs(self):
+        """
+        For a matrix job, get the individual builds for each
+        matrix configuration
+        :return: Generator of Build
+        """
+        if "runs" in self._data:
+            for rinfo in self._data["runs"]:
+                yield Build(rinfo["url"], rinfo["number"], self.job)
+
     def is_running( self ):
         """
         Return a bool if running.
index 53de906..55daf99 100644 (file)
@@ -156,3 +156,36 @@ gzip &lt; out.txt &gt; out.gz</command>
   </publishers>
   <buildWrappers/>
 </project>""".strip()
+
+MATRIX_JOB = """
+<?xml version='1.0' encoding='UTF-8'?>
+<matrix-project>
+  <actions/>
+  <description></description>
+  <keepDependencies>false</keepDependencies>
+  <properties/>
+  <scm class="hudson.scm.NullSCM"/>
+  <canRoam>true</canRoam>
+  <disabled>false</disabled>
+  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
+  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
+  <triggers class="vector"/>
+  <concurrentBuild>false</concurrentBuild>
+  <axes>
+    <hudson.matrix.TextAxis>
+      <name>foo</name>
+      <values>
+        <string>one</string>
+        <string>two</string>
+        <string>three</string>
+      </values>
+    </hudson.matrix.TextAxis>
+  </axes>
+  <builders>
+    <hudson.tasks.Shell>
+      <command>ping -c 10 localhost</command>
+    </hudson.tasks.Shell>
+  </builders>
+  <publishers/>
+  <buildWrappers/>
+</matrix-project>""".strip()
diff --git a/jenkinsapi_tests/systests/test_jenkins_matrix.py b/jenkinsapi_tests/systests/test_jenkins_matrix.py
new file mode 100644 (file)
index 0000000..3219909
--- /dev/null
@@ -0,0 +1,39 @@
+'''
+System tests for `jenkinsapi.jenkins` module.
+'''
+import os
+import re
+import time
+import gzip
+import shutil
+import tempfile
+import unittest
+
+from jenkinsapi_tests.systests.base import BaseSystemTest
+from jenkinsapi_tests.systests.job_configs import MATRIX_JOB
+from jenkinsapi_tests.test_utils.random_strings import random_string
+
+
+class TestPingerJob(BaseSystemTest):
+
+    def test_invoke_job(self):
+        job_name = 'create_%s' % random_string()
+        job = self.jenkins.create_job(job_name, MATRIX_JOB)
+        job.invoke(block=True)
+
+        b = job.get_last_build()
+
+        while b.is_running():
+            time.sleep(1)
+
+        s = set()
+        for r in b.get_matrix_runs():
+            self.assertEquals(r.get_number(), b.get_number())
+            self.assertEquals(r.get_upstream_build(), b)
+            m = re.search(u'\xbb (.*) #\\d+$', r.name)
+            self.assertIsNotNone(m)
+            s.add(m.group(1))
+        self.assertEqual(s, {'one','two','three'})
+
+if __name__ == '__main__':
+    unittest.main()