nkjnm
Dependencies: MAX44000 nexpaq_mdk
Fork of LED_Demo by
mbd_os/tools/buildbot/master.cfg@7:3a65ef12ba31, 2016-11-04 (annotated)
- Committer:
- nitsshukla
- Date:
- Fri Nov 04 12:06:04 2016 +0000
- Revision:
- 7:3a65ef12ba31
- Parent:
- 1:55a6170b404f
kghj;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nexpaq | 1:55a6170b404f | 1 | # -*- python -*- |
nexpaq | 1:55a6170b404f | 2 | # ex: set syntax=python: |
nexpaq | 1:55a6170b404f | 3 | |
nexpaq | 1:55a6170b404f | 4 | # This is a sample buildmaster config file. It must be installed as |
nexpaq | 1:55a6170b404f | 5 | # 'master.cfg' in your buildmaster's base directory. |
nexpaq | 1:55a6170b404f | 6 | |
nexpaq | 1:55a6170b404f | 7 | # This is the dictionary that the buildmaster pays attention to. We also use |
nexpaq | 1:55a6170b404f | 8 | # a shorter alias to save typing. |
nexpaq | 1:55a6170b404f | 9 | c = BuildmasterConfig = {} |
nexpaq | 1:55a6170b404f | 10 | |
nexpaq | 1:55a6170b404f | 11 | ####### BUILDSLAVES |
nexpaq | 1:55a6170b404f | 12 | |
nexpaq | 1:55a6170b404f | 13 | # The 'slaves' list defines the set of recognized buildslaves. Each element is |
nexpaq | 1:55a6170b404f | 14 | # a BuildSlave object, specifying a unique slave name and password. The same |
nexpaq | 1:55a6170b404f | 15 | # slave name and password must be configured on the slave. |
nexpaq | 1:55a6170b404f | 16 | from buildbot.buildslave import BuildSlave |
nexpaq | 1:55a6170b404f | 17 | c['slaves'] = [BuildSlave("example-slave", "pass"), |
nexpaq | 1:55a6170b404f | 18 | BuildSlave("example-slave-2", "pass"), |
nexpaq | 1:55a6170b404f | 19 | BuildSlave("example-slave-KL25Z", "pass"), |
nexpaq | 1:55a6170b404f | 20 | BuildSlave("example-slave-LPC1768", "pass"), |
nexpaq | 1:55a6170b404f | 21 | BuildSlave("example-slave-LPC11U24", "pass"), |
nexpaq | 1:55a6170b404f | 22 | ] |
nexpaq | 1:55a6170b404f | 23 | |
nexpaq | 1:55a6170b404f | 24 | # 'slavePortnum' defines the TCP port to listen on for connections from slaves. |
nexpaq | 1:55a6170b404f | 25 | # This must match the value configured into the buildslaves (with their |
nexpaq | 1:55a6170b404f | 26 | # --master option) |
nexpaq | 1:55a6170b404f | 27 | c['slavePortnum'] = 9989 |
nexpaq | 1:55a6170b404f | 28 | |
nexpaq | 1:55a6170b404f | 29 | ####### OFFICIAL_MBED_LIBRARY_BUILD |
nexpaq | 1:55a6170b404f | 30 | |
nexpaq | 1:55a6170b404f | 31 | OFFICIAL_MBED_LIBRARY_BUILD = ( |
nexpaq | 1:55a6170b404f | 32 | ('LPC1768', ('ARM', 'GCC_ARM', 'GCC_CR', 'IAR')), |
nexpaq | 1:55a6170b404f | 33 | ('KL05Z', ('ARM', 'uARM', 'GCC_ARM')), |
nexpaq | 1:55a6170b404f | 34 | ('KL25Z', ('ARM', 'GCC_ARM')), |
nexpaq | 1:55a6170b404f | 35 | ('LPC11U24', ('ARM', 'uARM')), |
nexpaq | 1:55a6170b404f | 36 | ('KL46Z', ('ARM', 'GCC_ARM')), |
nexpaq | 1:55a6170b404f | 37 | ('LPC4088', ('ARM', 'GCC_ARM', 'GCC_CR')), |
nexpaq | 1:55a6170b404f | 38 | ('LPC1347', ('ARM',)), |
nexpaq | 1:55a6170b404f | 39 | ('LPC1549', ('uARM',)), |
nexpaq | 1:55a6170b404f | 40 | ('LPC2368', ('ARM',)), |
nexpaq | 1:55a6170b404f | 41 | ('LPC812', ('uARM',)), |
nexpaq | 1:55a6170b404f | 42 | ('LPC11U35_401', ('ARM', 'uARM')), |
nexpaq | 1:55a6170b404f | 43 | ('LPC1114', ('uARM',)), |
nexpaq | 1:55a6170b404f | 44 | ('NUCLEO_F103RB', ('ARM', 'uARM')), |
nexpaq | 1:55a6170b404f | 45 | ('NUCLEO_L152RE', ('ARM', 'uARM')), |
nexpaq | 1:55a6170b404f | 46 | ('NUCLEO_F401RE', ('ARM', 'uARM')), |
nexpaq | 1:55a6170b404f | 47 | ('NUCLEO_F030R8', ('ARM', 'uARM')), |
nexpaq | 1:55a6170b404f | 48 | ('UBLOX_C027', ('ARM', 'GCC_ARM', 'GCC_CR', 'IAR')), |
nexpaq | 1:55a6170b404f | 49 | # ('NRF51822', ('ARM',)), |
nexpaq | 1:55a6170b404f | 50 | ) |
nexpaq | 1:55a6170b404f | 51 | |
nexpaq | 1:55a6170b404f | 52 | # Which hardware platforms are supported for target testing |
nexpaq | 1:55a6170b404f | 53 | OFFICIAL_MBED_TESTBED_SUPPORTED_HARDWARE = ( |
nexpaq | 1:55a6170b404f | 54 | # 'KL25Z', |
nexpaq | 1:55a6170b404f | 55 | # 'LPC1768', |
nexpaq | 1:55a6170b404f | 56 | # 'LPC11U24', |
nexpaq | 1:55a6170b404f | 57 | ) |
nexpaq | 1:55a6170b404f | 58 | |
nexpaq | 1:55a6170b404f | 59 | ####### CHANGESOURCES |
nexpaq | 1:55a6170b404f | 60 | |
nexpaq | 1:55a6170b404f | 61 | # the 'change_source' setting tells the buildmaster how it should find out |
nexpaq | 1:55a6170b404f | 62 | # about source code changes. Here we point to the buildbot clone of pyflakes. |
nexpaq | 1:55a6170b404f | 63 | |
nexpaq | 1:55a6170b404f | 64 | from buildbot.changes.gitpoller import GitPoller |
nexpaq | 1:55a6170b404f | 65 | c['change_source'] = [] |
nexpaq | 1:55a6170b404f | 66 | """ |
nexpaq | 1:55a6170b404f | 67 | c['change_source'].append(GitPoller( |
nexpaq | 1:55a6170b404f | 68 | 'git://github.com/buildbot/pyflakes.git', |
nexpaq | 1:55a6170b404f | 69 | workdir='gitpoller-workdir', branch='master', |
nexpaq | 1:55a6170b404f | 70 | pollinterval=300)) |
nexpaq | 1:55a6170b404f | 71 | """ |
nexpaq | 1:55a6170b404f | 72 | ####### SCHEDULERS |
nexpaq | 1:55a6170b404f | 73 | |
nexpaq | 1:55a6170b404f | 74 | # Configure the Schedulers, which decide how to react to incoming changes. In this |
nexpaq | 1:55a6170b404f | 75 | # case, just kick off a 'runtests' build |
nexpaq | 1:55a6170b404f | 76 | |
nexpaq | 1:55a6170b404f | 77 | from buildbot.schedulers.basic import SingleBranchScheduler |
nexpaq | 1:55a6170b404f | 78 | from buildbot.schedulers.forcesched import ForceScheduler |
nexpaq | 1:55a6170b404f | 79 | from buildbot.changes import filter |
nexpaq | 1:55a6170b404f | 80 | c['schedulers'] = [] |
nexpaq | 1:55a6170b404f | 81 | |
nexpaq | 1:55a6170b404f | 82 | # Create builders to generate one target using all assigned toolchains |
nexpaq | 1:55a6170b404f | 83 | release_builder_name = "BuildRelease" |
nexpaq | 1:55a6170b404f | 84 | builder_names = [release_builder_name] |
nexpaq | 1:55a6170b404f | 85 | for target_name, toolchains in OFFICIAL_MBED_LIBRARY_BUILD: |
nexpaq | 1:55a6170b404f | 86 | builder_name = "All_TC_%s" % target_name |
nexpaq | 1:55a6170b404f | 87 | builder_names.append(builder_name) |
nexpaq | 1:55a6170b404f | 88 | c['schedulers'].append(ForceScheduler(name="force", builderNames=builder_names)) |
nexpaq | 1:55a6170b404f | 89 | |
nexpaq | 1:55a6170b404f | 90 | ####### BUILDERS |
nexpaq | 1:55a6170b404f | 91 | |
nexpaq | 1:55a6170b404f | 92 | # The 'builders' list defines the Builders, which tell Buildbot how to perform a build: |
nexpaq | 1:55a6170b404f | 93 | # what steps, and which slaves can execute them. Note that any particular build will |
nexpaq | 1:55a6170b404f | 94 | # only take place on one slave. |
nexpaq | 1:55a6170b404f | 95 | |
nexpaq | 1:55a6170b404f | 96 | from buildbot.process.factory import BuildFactory |
nexpaq | 1:55a6170b404f | 97 | from buildbot.steps.source.git import Git |
nexpaq | 1:55a6170b404f | 98 | from buildbot.steps.shell import ShellCommand |
nexpaq | 1:55a6170b404f | 99 | from buildbot.process.buildstep import LogLineObserver |
nexpaq | 1:55a6170b404f | 100 | import buildbot.status.results |
nexpaq | 1:55a6170b404f | 101 | import re |
nexpaq | 1:55a6170b404f | 102 | import pprint |
nexpaq | 1:55a6170b404f | 103 | |
nexpaq | 1:55a6170b404f | 104 | class TestCommand(ShellCommand): |
nexpaq | 1:55a6170b404f | 105 | failedTestsCount = 0 # FAIL |
nexpaq | 1:55a6170b404f | 106 | passedTestsCount = 0 # OK |
nexpaq | 1:55a6170b404f | 107 | errorsTestsCount = 0 # ERROR |
nexpaq | 1:55a6170b404f | 108 | undefsTestsCount = 0 # UNDEF |
nexpaq | 1:55a6170b404f | 109 | testsResults = [] |
nexpaq | 1:55a6170b404f | 110 | |
nexpaq | 1:55a6170b404f | 111 | def __init__(self, stage=None,module=None, moduleset=None, **kwargs): |
nexpaq | 1:55a6170b404f | 112 | ShellCommand.__init__(self, **kwargs) |
nexpaq | 1:55a6170b404f | 113 | self.failedTestsCount = 0 |
nexpaq | 1:55a6170b404f | 114 | self.passedTestsCount = 0 |
nexpaq | 1:55a6170b404f | 115 | self.errorsTestsCount = 0 |
nexpaq | 1:55a6170b404f | 116 | self.tracebackPyCount = 0 |
nexpaq | 1:55a6170b404f | 117 | self.testsResults = [] |
nexpaq | 1:55a6170b404f | 118 | testFailuresObserver = UnitTestsObserver () |
nexpaq | 1:55a6170b404f | 119 | self.addLogObserver('stdio', testFailuresObserver) |
nexpaq | 1:55a6170b404f | 120 | |
nexpaq | 1:55a6170b404f | 121 | def createSummary(self, log): |
nexpaq | 1:55a6170b404f | 122 | if self.failedTestsCount >= 0 or self.passedTestsCount >= 0 or self.errorsTestsCount >= 0 or self.undefsTestsCount >= 0: |
nexpaq | 1:55a6170b404f | 123 | self.addHTMLLog ('tests summary', self.createTestsSummary()) |
nexpaq | 1:55a6170b404f | 124 | |
nexpaq | 1:55a6170b404f | 125 | def getText(self, cmd, results): |
nexpaq | 1:55a6170b404f | 126 | text = ShellCommand.getText(self, cmd, results) |
nexpaq | 1:55a6170b404f | 127 | text.append("OK: " + str(self.passedTestsCount)) |
nexpaq | 1:55a6170b404f | 128 | text.append("FAIL: " + str(self.failedTestsCount)) |
nexpaq | 1:55a6170b404f | 129 | text.append("ERROR: " + str(self.errorsTestsCount)) |
nexpaq | 1:55a6170b404f | 130 | text.append("UNDEF: " + str(self.undefsTestsCount)) |
nexpaq | 1:55a6170b404f | 131 | text.append("Traceback: " + str(self.tracebackPyCount)) |
nexpaq | 1:55a6170b404f | 132 | return text |
nexpaq | 1:55a6170b404f | 133 | |
nexpaq | 1:55a6170b404f | 134 | def evaluateCommand(self, cmd): |
nexpaq | 1:55a6170b404f | 135 | if self.failedTestsCount > 0: |
nexpaq | 1:55a6170b404f | 136 | return buildbot.status.results.WARNINGS |
nexpaq | 1:55a6170b404f | 137 | elif self.errorsTestsCount > 0 or self.undefsTestsCount > 0 or self.tracebackPyCount > 0: |
nexpaq | 1:55a6170b404f | 138 | return buildbot.status.results.FAILURE |
nexpaq | 1:55a6170b404f | 139 | return buildbot.status.results.SUCCESS |
nexpaq | 1:55a6170b404f | 140 | |
nexpaq | 1:55a6170b404f | 141 | def find_unique_tc_result_value(self, index): |
nexpaq | 1:55a6170b404f | 142 | """ Get unique values from each row in data parameter """ |
nexpaq | 1:55a6170b404f | 143 | result = [] |
nexpaq | 1:55a6170b404f | 144 | for tc_result_list in self.testsResults: |
nexpaq | 1:55a6170b404f | 145 | if tc_result_list[index] not in result: |
nexpaq | 1:55a6170b404f | 146 | result.append(tc_result_list[index]) |
nexpaq | 1:55a6170b404f | 147 | return result |
nexpaq | 1:55a6170b404f | 148 | |
nexpaq | 1:55a6170b404f | 149 | def html_view_test_result(self, targets, tests, toolchain): |
nexpaq | 1:55a6170b404f | 150 | """ Generates simple result table """ |
nexpaq | 1:55a6170b404f | 151 | COLOR_OK = "LimeGreen" |
nexpaq | 1:55a6170b404f | 152 | COLOR_FAIL = "LightCoral" |
nexpaq | 1:55a6170b404f | 153 | COLOR_UNDEF = "LightSlateGray" |
nexpaq | 1:55a6170b404f | 154 | COLOR_NEUTRAL = "Silver" |
nexpaq | 1:55a6170b404f | 155 | |
nexpaq | 1:55a6170b404f | 156 | STATUS_COLORS = { "OK" : COLOR_OK, |
nexpaq | 1:55a6170b404f | 157 | "FAIL" : COLOR_FAIL, |
nexpaq | 1:55a6170b404f | 158 | "UNDEF" : COLOR_UNDEF} |
nexpaq | 1:55a6170b404f | 159 | |
nexpaq | 1:55a6170b404f | 160 | result = "<table>" |
nexpaq | 1:55a6170b404f | 161 | result += "<tr valign='center'><td align='center'><b>" + toolchain + "</b></td>" |
nexpaq | 1:55a6170b404f | 162 | for test in tests: |
nexpaq | 1:55a6170b404f | 163 | result += "<td align='center'>" + test + "<br></td>" |
nexpaq | 1:55a6170b404f | 164 | result += "</tr>" |
nexpaq | 1:55a6170b404f | 165 | |
nexpaq | 1:55a6170b404f | 166 | for target in targets: |
nexpaq | 1:55a6170b404f | 167 | result += "<tr><td width='110px'><br>" + target + "<br></td>" |
nexpaq | 1:55a6170b404f | 168 | for test in tests: |
nexpaq | 1:55a6170b404f | 169 | for tc_result_list in self.testsResults: |
nexpaq | 1:55a6170b404f | 170 | if tc_result_list[1] == target and tc_result_list[2] == toolchain and tc_result_list[3] == test: |
nexpaq | 1:55a6170b404f | 171 | status = tc_result_list[4] |
nexpaq | 1:55a6170b404f | 172 | bgcolor = STATUS_COLORS[status] |
nexpaq | 1:55a6170b404f | 173 | result += "<td align='center' bgcolor='" + bgcolor + "'>" + status + "</td>" |
nexpaq | 1:55a6170b404f | 174 | break; |
nexpaq | 1:55a6170b404f | 175 | else: |
nexpaq | 1:55a6170b404f | 176 | result += "<td bgcolor='" + COLOR_NEUTRAL + "'></td>" |
nexpaq | 1:55a6170b404f | 177 | result += "</tr>" |
nexpaq | 1:55a6170b404f | 178 | result += "</table>" |
nexpaq | 1:55a6170b404f | 179 | return result |
nexpaq | 1:55a6170b404f | 180 | |
nexpaq | 1:55a6170b404f | 181 | def createTestsSummary (self): |
nexpaq | 1:55a6170b404f | 182 | targets = self.find_unique_tc_result_value(1) |
nexpaq | 1:55a6170b404f | 183 | toolchains = self.find_unique_tc_result_value(2) |
nexpaq | 1:55a6170b404f | 184 | tests = self.find_unique_tc_result_value(3) |
nexpaq | 1:55a6170b404f | 185 | html_result = "" |
nexpaq | 1:55a6170b404f | 186 | for toolchain in toolchains: |
nexpaq | 1:55a6170b404f | 187 | html_result += self.html_view_test_result(targets, tests, toolchain) |
nexpaq | 1:55a6170b404f | 188 | html_result += "<br>" |
nexpaq | 1:55a6170b404f | 189 | return html_result |
nexpaq | 1:55a6170b404f | 190 | |
nexpaq | 1:55a6170b404f | 191 | |
nexpaq | 1:55a6170b404f | 192 | class UnitTestsObserver(LogLineObserver): |
nexpaq | 1:55a6170b404f | 193 | reGroupTestResult = [] |
nexpaq | 1:55a6170b404f | 194 | reGroupPyResult = [] |
nexpaq | 1:55a6170b404f | 195 | |
nexpaq | 1:55a6170b404f | 196 | def __init__(self): |
nexpaq | 1:55a6170b404f | 197 | LogLineObserver.__init__(self) |
nexpaq | 1:55a6170b404f | 198 | if len(self.reGroupTestResult) == 0: |
nexpaq | 1:55a6170b404f | 199 | self.reGroupTestResult.append(re.compile("^(\w+Test)::(\w+)::(\w+)::(\w+)::.* \[(\w+)\] in (\d+\.\d+) of (\d+) sec[\r\n]*$")) |
nexpaq | 1:55a6170b404f | 200 | |
nexpaq | 1:55a6170b404f | 201 | def outLineReceived(self, line): |
nexpaq | 1:55a6170b404f | 202 | matched = False |
nexpaq | 1:55a6170b404f | 203 | for r in self.reGroupTestResult: |
nexpaq | 1:55a6170b404f | 204 | result = r.match(line) |
nexpaq | 1:55a6170b404f | 205 | if result: |
nexpaq | 1:55a6170b404f | 206 | self.step.testsResults.append(result.groups()) |
nexpaq | 1:55a6170b404f | 207 | if result.group(5) == 'OK': |
nexpaq | 1:55a6170b404f | 208 | self.step.passedTestsCount += 1 |
nexpaq | 1:55a6170b404f | 209 | elif result.group(5) == 'FAIL': |
nexpaq | 1:55a6170b404f | 210 | self.step.failedTestsCount += 1 |
nexpaq | 1:55a6170b404f | 211 | elif result.group(5) == 'UNDEF': |
nexpaq | 1:55a6170b404f | 212 | self.step.undefsTestsCount += 1 |
nexpaq | 1:55a6170b404f | 213 | elif result.group(5) == 'ERROR': |
nexpaq | 1:55a6170b404f | 214 | self.step.errorsTestsCount += 1 |
nexpaq | 1:55a6170b404f | 215 | matched = True |
nexpaq | 1:55a6170b404f | 216 | |
nexpaq | 1:55a6170b404f | 217 | |
nexpaq | 1:55a6170b404f | 218 | class BuildCommand(ShellCommand): |
nexpaq | 1:55a6170b404f | 219 | warningsCount = 0 # [Warning] |
nexpaq | 1:55a6170b404f | 220 | errorsCount = 0 # [Error] |
nexpaq | 1:55a6170b404f | 221 | testsResults = [] |
nexpaq | 1:55a6170b404f | 222 | |
nexpaq | 1:55a6170b404f | 223 | def __init__(self, stage=None,module=None, moduleset=None, **kwargs): |
nexpaq | 1:55a6170b404f | 224 | ShellCommand.__init__(self, **kwargs) |
nexpaq | 1:55a6170b404f | 225 | self.warningsCount = 0 |
nexpaq | 1:55a6170b404f | 226 | self.errorsCount = 0 |
nexpaq | 1:55a6170b404f | 227 | self.testsResults = [] |
nexpaq | 1:55a6170b404f | 228 | buildProcessObserver = BuildObserver () |
nexpaq | 1:55a6170b404f | 229 | self.addLogObserver('stdio', buildProcessObserver) |
nexpaq | 1:55a6170b404f | 230 | |
nexpaq | 1:55a6170b404f | 231 | def createSummary(self, log): |
nexpaq | 1:55a6170b404f | 232 | if self.warningsCount >= 0 or self.errorsCount >= 0: |
nexpaq | 1:55a6170b404f | 233 | self.addHTMLLog ('tests summary', self.createTestsSummary()) |
nexpaq | 1:55a6170b404f | 234 | |
nexpaq | 1:55a6170b404f | 235 | def getText(self, cmd, results): |
nexpaq | 1:55a6170b404f | 236 | text = ShellCommand.getText(self, cmd, results) |
nexpaq | 1:55a6170b404f | 237 | if self.warningsCount > 0 or self.errorsCount > 0: |
nexpaq | 1:55a6170b404f | 238 | text.append("warnings: " + str(self.warningsCount)) |
nexpaq | 1:55a6170b404f | 239 | text.append("errors: " + str(self.errorsCount)) |
nexpaq | 1:55a6170b404f | 240 | return text |
nexpaq | 1:55a6170b404f | 241 | |
nexpaq | 1:55a6170b404f | 242 | def evaluateCommand(self, cmd): |
nexpaq | 1:55a6170b404f | 243 | if self.warningsCount > 0: |
nexpaq | 1:55a6170b404f | 244 | return buildbot.status.results.WARNINGS |
nexpaq | 1:55a6170b404f | 245 | elif self.errorsCount > 0: |
nexpaq | 1:55a6170b404f | 246 | return buildbot.status.results.FAILURE |
nexpaq | 1:55a6170b404f | 247 | else: |
nexpaq | 1:55a6170b404f | 248 | return buildbot.status.results.SUCCESS |
nexpaq | 1:55a6170b404f | 249 | |
nexpaq | 1:55a6170b404f | 250 | def createTestsSummary (self): |
nexpaq | 1:55a6170b404f | 251 | # Create a string with your html report and return it |
nexpaq | 1:55a6170b404f | 252 | html = "<h4>Report</h4><table>" |
nexpaq | 1:55a6170b404f | 253 | #for result in self.testsResults: |
nexpaq | 1:55a6170b404f | 254 | html += "</table>" |
nexpaq | 1:55a6170b404f | 255 | return html |
nexpaq | 1:55a6170b404f | 256 | |
nexpaq | 1:55a6170b404f | 257 | class BuildObserver(LogLineObserver): |
nexpaq | 1:55a6170b404f | 258 | regroupresult = [] |
nexpaq | 1:55a6170b404f | 259 | |
nexpaq | 1:55a6170b404f | 260 | def __init__(self): |
nexpaq | 1:55a6170b404f | 261 | LogLineObserver.__init__(self) |
nexpaq | 1:55a6170b404f | 262 | if len(self.regroupresult) == 0: |
nexpaq | 1:55a6170b404f | 263 | self.regroupresult.append(re.compile("^\[([Ww]arning)\] (.*)")) |
nexpaq | 1:55a6170b404f | 264 | self.regroupresult.append(re.compile("^\[([Ee]rror)\] (.*)")) |
nexpaq | 1:55a6170b404f | 265 | |
nexpaq | 1:55a6170b404f | 266 | def outLineReceived(self, line): |
nexpaq | 1:55a6170b404f | 267 | matched = False |
nexpaq | 1:55a6170b404f | 268 | for r in self.regroupresult: |
nexpaq | 1:55a6170b404f | 269 | result = r.match(line) |
nexpaq | 1:55a6170b404f | 270 | if result: |
nexpaq | 1:55a6170b404f | 271 | self.step.testsResults.append(result.groups()) |
nexpaq | 1:55a6170b404f | 272 | if result.group(1) == 'Warning': |
nexpaq | 1:55a6170b404f | 273 | self.step.warningsCount += 1 |
nexpaq | 1:55a6170b404f | 274 | elif result.group(1) == 'Error': |
nexpaq | 1:55a6170b404f | 275 | self.step.errorsCount += 1 |
nexpaq | 1:55a6170b404f | 276 | matched = True |
nexpaq | 1:55a6170b404f | 277 | #if not matched: |
nexpaq | 1:55a6170b404f | 278 | # [Future-Dev] Other check... |
nexpaq | 1:55a6170b404f | 279 | |
nexpaq | 1:55a6170b404f | 280 | |
nexpaq | 1:55a6170b404f | 281 | ####### BUILDERS - mbed project |
nexpaq | 1:55a6170b404f | 282 | git_clone = Git(repourl='https://github.com/mbedmicro/mbed.git', mode='incremental') |
nexpaq | 1:55a6170b404f | 283 | |
nexpaq | 1:55a6170b404f | 284 | # create the build factory for mbed and add the steps to it |
nexpaq | 1:55a6170b404f | 285 | from buildbot.config import BuilderConfig |
nexpaq | 1:55a6170b404f | 286 | |
nexpaq | 1:55a6170b404f | 287 | c['builders'] = [] |
nexpaq | 1:55a6170b404f | 288 | |
nexpaq | 1:55a6170b404f | 289 | copy_mbed_settings = ShellCommand(name = "copy mbed_settings.py", |
nexpaq | 1:55a6170b404f | 290 | command = "cp ../mbed_settings.py mbed_settings.py", |
nexpaq | 1:55a6170b404f | 291 | haltOnFailure = True, |
nexpaq | 1:55a6170b404f | 292 | description = "Copy mbed_settings.py") |
nexpaq | 1:55a6170b404f | 293 | |
nexpaq | 1:55a6170b404f | 294 | mbed_build_release = BuildFactory() |
nexpaq | 1:55a6170b404f | 295 | mbed_build_release.addStep(git_clone) |
nexpaq | 1:55a6170b404f | 296 | mbed_build_release.addStep(copy_mbed_settings) |
nexpaq | 1:55a6170b404f | 297 | |
nexpaq | 1:55a6170b404f | 298 | for target_name, toolchains in OFFICIAL_MBED_LIBRARY_BUILD: |
nexpaq | 1:55a6170b404f | 299 | builder_name = "All_TC_%s" % target_name |
nexpaq | 1:55a6170b404f | 300 | mbed_build = BuildFactory() |
nexpaq | 1:55a6170b404f | 301 | mbed_build.addStep(git_clone) |
nexpaq | 1:55a6170b404f | 302 | mbed_build.addStep(copy_mbed_settings) |
nexpaq | 1:55a6170b404f | 303 | # Adding all chains for target |
nexpaq | 1:55a6170b404f | 304 | for toolchain in toolchains: |
nexpaq | 1:55a6170b404f | 305 | build_py = BuildCommand(name = "Build %s using %s" % (target_name, toolchain), |
nexpaq | 1:55a6170b404f | 306 | command = "python tools/build.py -m %s -t %s" % (target_name, toolchain), |
nexpaq | 1:55a6170b404f | 307 | haltOnFailure = True, |
nexpaq | 1:55a6170b404f | 308 | warnOnWarnings = True, |
nexpaq | 1:55a6170b404f | 309 | description = "Building %s using %s" % (target_name, toolchain), |
nexpaq | 1:55a6170b404f | 310 | descriptionDone = "Built %s using %s" % (target_name, toolchain)) |
nexpaq | 1:55a6170b404f | 311 | |
nexpaq | 1:55a6170b404f | 312 | mbed_build.addStep(build_py) |
nexpaq | 1:55a6170b404f | 313 | mbed_build_release.addStep(build_py) # For build release we need all toolchains |
nexpaq | 1:55a6170b404f | 314 | |
nexpaq | 1:55a6170b404f | 315 | if target_name in OFFICIAL_MBED_TESTBED_SUPPORTED_HARDWARE: |
nexpaq | 1:55a6170b404f | 316 | copy_example_test_spec_json = ShellCommand(name = "Copy example_test_spec.json", |
nexpaq | 1:55a6170b404f | 317 | command = "cp ../example_test_spec.json tools/data/example_test_spec.json", |
nexpaq | 1:55a6170b404f | 318 | haltOnFailure = True, |
nexpaq | 1:55a6170b404f | 319 | description = "Copy example_test_spec.json") |
nexpaq | 1:55a6170b404f | 320 | |
nexpaq | 1:55a6170b404f | 321 | autotest_py = ShellCommand(name = "Running autotest.py for %s" % (target_name), |
nexpaq | 1:55a6170b404f | 322 | command = "python tools/autotest.py tools/data/example_test_spec.json", |
nexpaq | 1:55a6170b404f | 323 | haltOnFailure = True, |
nexpaq | 1:55a6170b404f | 324 | description = "Running autotest.py") |
nexpaq | 1:55a6170b404f | 325 | |
nexpaq | 1:55a6170b404f | 326 | mbed_build.addStep(copy_example_test_spec_json) |
nexpaq | 1:55a6170b404f | 327 | mbed_build.addStep(autotest_py) |
nexpaq | 1:55a6170b404f | 328 | |
nexpaq | 1:55a6170b404f | 329 | # Add builder with steps for each toolchain |
nexpaq | 1:55a6170b404f | 330 | c['builders'].append(BuilderConfig(name=builder_name, |
nexpaq | 1:55a6170b404f | 331 | slavenames=["example-slave-%s" % (target_name)], |
nexpaq | 1:55a6170b404f | 332 | factory=mbed_build)) |
nexpaq | 1:55a6170b404f | 333 | else: |
nexpaq | 1:55a6170b404f | 334 | # Add builder with steps for each toolchain |
nexpaq | 1:55a6170b404f | 335 | c['builders'].append(BuilderConfig(name=builder_name, |
nexpaq | 1:55a6170b404f | 336 | slavenames=["example-slave"], |
nexpaq | 1:55a6170b404f | 337 | factory=mbed_build)) |
nexpaq | 1:55a6170b404f | 338 | |
nexpaq | 1:55a6170b404f | 339 | # copy_example_test_spec_json = ShellCommand(name = "Copy example_test_spec.json", |
nexpaq | 1:55a6170b404f | 340 | # command = "cp ../example_test_spec.json tools/data/example_test_spec.json", |
nexpaq | 1:55a6170b404f | 341 | # haltOnFailure = True, |
nexpaq | 1:55a6170b404f | 342 | # description = "Copy example_test_spec.json") |
nexpaq | 1:55a6170b404f | 343 | |
nexpaq | 1:55a6170b404f | 344 | singletest_py = TestCommand(name = "Running Target Tests", |
nexpaq | 1:55a6170b404f | 345 | command = "python tools/singletest.py -i tools/test_spec.json -M tools/muts_all.json", |
nexpaq | 1:55a6170b404f | 346 | haltOnFailure = True, |
nexpaq | 1:55a6170b404f | 347 | warnOnWarnings = True, |
nexpaq | 1:55a6170b404f | 348 | description = "Running Target Tests", |
nexpaq | 1:55a6170b404f | 349 | descriptionDone = "Target Testing Finished") |
nexpaq | 1:55a6170b404f | 350 | |
nexpaq | 1:55a6170b404f | 351 | mbed_build_release.addStep(singletest_py) |
nexpaq | 1:55a6170b404f | 352 | # Release build collects all building toolchains |
nexpaq | 1:55a6170b404f | 353 | c['builders'].append(BuilderConfig(name=release_builder_name, |
nexpaq | 1:55a6170b404f | 354 | slavenames=["example-slave"], |
nexpaq | 1:55a6170b404f | 355 | factory=mbed_build_release)) |
nexpaq | 1:55a6170b404f | 356 | |
nexpaq | 1:55a6170b404f | 357 | ####### STATUS TARGETS |
nexpaq | 1:55a6170b404f | 358 | |
nexpaq | 1:55a6170b404f | 359 | # 'status' is a list of Status Targets. The results of each build will be |
nexpaq | 1:55a6170b404f | 360 | # pushed to these targets. buildbot/status/*.py has a variety to choose from, |
nexpaq | 1:55a6170b404f | 361 | # including web pages, email senders, and IRC bots. |
nexpaq | 1:55a6170b404f | 362 | |
nexpaq | 1:55a6170b404f | 363 | c['status'] = [] |
nexpaq | 1:55a6170b404f | 364 | |
nexpaq | 1:55a6170b404f | 365 | from buildbot.status import html |
nexpaq | 1:55a6170b404f | 366 | from buildbot.status.web import authz, auth |
nexpaq | 1:55a6170b404f | 367 | |
nexpaq | 1:55a6170b404f | 368 | authz_cfg=authz.Authz( |
nexpaq | 1:55a6170b404f | 369 | # change any of these to True to enable; see the manual for more |
nexpaq | 1:55a6170b404f | 370 | # options |
nexpaq | 1:55a6170b404f | 371 | auth=auth.BasicAuth([("pyflakes","pyflakes")]), |
nexpaq | 1:55a6170b404f | 372 | gracefulShutdown = False, |
nexpaq | 1:55a6170b404f | 373 | forceBuild = 'auth', # use this to test your slave once it is set up |
nexpaq | 1:55a6170b404f | 374 | forceAllBuilds = True, |
nexpaq | 1:55a6170b404f | 375 | pingBuilder = True, |
nexpaq | 1:55a6170b404f | 376 | stopBuild = True, |
nexpaq | 1:55a6170b404f | 377 | stopAllBuilds = True, |
nexpaq | 1:55a6170b404f | 378 | cancelPendingBuild = True, |
nexpaq | 1:55a6170b404f | 379 | ) |
nexpaq | 1:55a6170b404f | 380 | c['status'].append(html.WebStatus(http_port=8010, authz=authz_cfg, order_console_by_time=True)) |
nexpaq | 1:55a6170b404f | 381 | |
nexpaq | 1:55a6170b404f | 382 | ####### PROJECT IDENTITY |
nexpaq | 1:55a6170b404f | 383 | |
nexpaq | 1:55a6170b404f | 384 | # the 'title' string will appear at the top of this buildbot |
nexpaq | 1:55a6170b404f | 385 | # installation's html.WebStatus home page (linked to the |
nexpaq | 1:55a6170b404f | 386 | # 'titleURL') and is embedded in the title of the waterfall HTML page. |
nexpaq | 1:55a6170b404f | 387 | |
nexpaq | 1:55a6170b404f | 388 | c['title'] = "Green Tea" |
nexpaq | 1:55a6170b404f | 389 | c['titleURL'] = "" |
nexpaq | 1:55a6170b404f | 390 | |
nexpaq | 1:55a6170b404f | 391 | # the 'buildbotURL' string should point to the location where the buildbot's |
nexpaq | 1:55a6170b404f | 392 | # internal web server (usually the html.WebStatus page) is visible. This |
nexpaq | 1:55a6170b404f | 393 | # typically uses the port number set in the Waterfall 'status' entry, but |
nexpaq | 1:55a6170b404f | 394 | # with an externally-visible host name which the buildbot cannot figure out |
nexpaq | 1:55a6170b404f | 395 | # without some help. |
nexpaq | 1:55a6170b404f | 396 | |
nexpaq | 1:55a6170b404f | 397 | c['buildbotURL'] = "http://localhost:8010/" |
nexpaq | 1:55a6170b404f | 398 | |
nexpaq | 1:55a6170b404f | 399 | ####### DB URL |
nexpaq | 1:55a6170b404f | 400 | |
nexpaq | 1:55a6170b404f | 401 | c['db'] = { |
nexpaq | 1:55a6170b404f | 402 | # This specifies what database buildbot uses to store its state. You can leave |
nexpaq | 1:55a6170b404f | 403 | # this at its default for all but the largest installations. |
nexpaq | 1:55a6170b404f | 404 | 'db_url' : "sqlite:///state.sqlite", |
nexpaq | 1:55a6170b404f | 405 | # 'db_url' : "mysql://buildbot:123456@localhost/buildbot_mbed?max_idle=300", |
nexpaq | 1:55a6170b404f | 406 | } |