Add a method to get the individual sub-builds for a matrix build.
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.
</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()
--- /dev/null
+'''
+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()