Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merging from default

changeset:   2952:cfd8764019cc
parent:      2950:64bc2a52059b
user:        Ben Hearsum <bhearsum@mozilla.com>
date:        Thu Jan 24 13:38:52 2013 -0500
summary:     bug 833985: all android builds now available email doesn't go to r-d. r=rail

changeset:   2953:9af91e0e1674
user:        Ben Hearsum <bhearsum@mozilla.com>
date:        Thu Jan 24 16:53:15 2013 -0500
summary:     bugs 823841 and 812322: Add support for promptWaitTime and relbranch to release kickoff form. r=nthomas

changeset:   2956:ce2310555604
parent:      2953:9af91e0e1674
user:        Armen Zambrano Gasparnian <armenzg@mozilla.com>
date:        Fri Jan 25 12:48:08 2013 -0500
summary:     Bug 829145. Reveal revision of script runnning a job. r=catlee

changeset:   2957:752085bfe40c
user:        Chris AtLee <catlee@mozilla.com>
date:        Fri Jan 25 15:21:39 2013 -0500
summary:     Bug 825936: Remove reserved slaves support r=rail

changeset:   2958:e0b138d60056
user:        Chris AtLee <catlee@mozilla.com>
date:        Fri Jan 25 16:25:26 2013 -0500
summary:     Bug 825936: Fix only_fast behaviour r=rail

changeset:   2959:d6a91d86930e
user:        Rail Aliiev <rail@mozilla.com>
date:        Fri Jan 25 16:25:53 2013 -0500
summary:     Bug 831771 - deploy node.js to Ubuntu. r=Callek

changeset:   2960:4479afaa0dc1
user:        Aki Sasaki <asasaki@mozilla.com>
date:        Fri Jan 25 15:01:42 2013 -0800
summary:     bug 821445 - mozharness production branch. r=rail

changeset:   2961:4852ccd2e2a4
user:        Chris AtLee <catlee@mozilla.com>
date:        Mon Jan 28 11:07:53 2013 -0500
summary:     nobug: code cleanup. r=bhearsum

changeset:   2962:5c588088dfdf
tag:         tip
user:        Rail Aliiev <rail@mozilla.com>
date:        Mon Jan 28 12:59:50 2013 -0500
summary:     Bug 835391 - Configs for new Linux32 testing reference platform. r=armenzg

--HG--
branch : production-0.8
  • Loading branch information...
commit 50e6559faffbd6e6a1bfc60a6af25876fff04335 2 parents fd7da3c + af7fc29
@ccooper ccooper authored
View
1  common.py
@@ -93,6 +93,7 @@ def reallyShort(name, product=None):
'fedora': 'fed',
'fedora64': 'fed64',
'ubuntu64': 'ub64',
+ 'ubuntu32': 'ub32',
'repack': 'rpk',
'alder': 'a',
'holly': 'h',
View
2  env.py
@@ -77,7 +77,7 @@
"CCACHE_DIR": '/builds/ccache',
"CCACHE_UMASK": '002',
"MOZ_HIDE_RESULTS_TABLE": '1',
- "MOZ_NODE_PATH": "/home/cltbld/bin/node.exe"
+ "MOZ_NODE_PATH": "/usr/bin/node"
}
MozillaEnvironments['linux64-unittest'] = MozillaEnvironments[
View
351 misc.py
@@ -9,7 +9,6 @@
import re
import sys
import os
-import time
from copy import deepcopy
from twisted.python import log
@@ -225,7 +224,6 @@ def generateTestBuilderNames(name_prefix, suites_name, suites):
return test_builders
fastRegexes = []
-nReservedSlaves = 0
def _partitionSlaves(slaves):
@@ -245,46 +243,6 @@ def _partitionSlaves(slaves):
return fast, slow
-def _partitionUnreservedSlaves(slaves):
- fast, slow = _partitionSlaves(slaves)
- fast = fast[nReservedSlaves:]
- reserved_fast = len(fast)
- # If we don't have enough fast slaves to satisfy us, set aside some slow slaves too
- # If nReservedSlaves > len(fast), then we need to reserve some slow slaves,
- # and reserved_slow will be > 0
- # If nReservedSlaves <= len(fast), then we have enough fast slaves, and
- # reserved_slow will be 0
- reserved_slow = max(0, nReservedSlaves - reserved_fast)
- slow = slow[reserved_slow:]
- return fast, slow
-
-
-def _readReservedFile(filename):
- if not filename or not os.path.exists(filename):
- n = 0
- else:
- try:
- data = open(filename).read().strip()
- if data == '':
- n = 0
- else:
- n = int(data)
- except IOError:
- log.msg("Unable to open '%s' for reading" % filename)
- log.err()
- return
- except ValueError:
- log.msg("Unable to read '%s' as an integer" % filename)
- log.err()
- return
-
- global nReservedSlaves
- if n != nReservedSlaves:
- log.msg("Setting nReservedFastSlaves to %i (was %i)" % (n,
- nReservedSlaves))
- nReservedSlaves = n
-
-
def _getLastTimeOnBuilder(builder, slavename):
# New builds are at the end of the buildCache, so
# examine it backwards
@@ -312,7 +270,7 @@ def sortfunc(s1, s2):
def _nextSlowSlave(builder, available_slaves):
try:
- fast, slow = _partitionUnreservedSlaves(available_slaves)
+ fast, slow = _partitionSlaves(available_slaves)
# Choose the slow slave that was most recently on this builder
# If there aren't any slow slaves, choose the slow slave that was most
# recently on this builder
@@ -328,32 +286,19 @@ def _nextSlowSlave(builder, available_slaves):
return random.choice(available_slaves)
-def _nextFastSlave(builder, available_slaves, only_fast=False, reserved=False):
- # Check if our reserved slaves count needs updating
- global _checkedReservedSlaveFile, _reservedFileName
- if int(time.time() - _checkedReservedSlaveFile) > 60:
- _readReservedFile(_reservedFileName)
- _checkedReservedSlaveFile = int(time.time())
-
+def _nextFastSlave(builder, available_slaves, only_fast=False):
try:
if only_fast:
# Check that the builder has some fast slaves configured. We do
# this because some machines classes don't have a fast/slow
# distinction, and so they default to 'slow'
- # We should look at the full set of slaves here regardless of if
- # we're only supposed to be returning unreserved slaves so we get
- # the full set of slaves on the builder.
fast, slow = _partitionSlaves(builder.slaves)
if not fast:
- log.msg("Builder '%s' has no fast slaves configured, but only_fast is enabled; disabling only_fast" % builder.name)
+ log.msg("Builder '%s' has no fast slaves configured, but only_fast"
+ " is enabled; disabling only_fast" % builder.name)
only_fast = False
- if reserved:
- # We have access to the full set of slaves!
- fast, slow = _partitionSlaves(available_slaves)
- else:
- # We only have access to unreserved slaves
- fast, slow = _partitionUnreservedSlaves(available_slaves)
+ fast, slow = _partitionSlaves(available_slaves)
# Choose the fast slave that was most recently on this builder
# If there aren't any fast slaves, choose the slow slave that was most
@@ -371,18 +316,6 @@ def _nextFastSlave(builder, available_slaves, only_fast=False, reserved=False):
log.err()
return random.choice(available_slaves)
-_checkedReservedSlaveFile = 0
-_reservedFileName = None
-
-
-def setReservedFileName(filename):
- global _reservedFileName
- _reservedFileName = filename
-
-
-def _nextFastReservedSlave(builder, available_slaves, only_fast=True):
- return _nextFastSlave(builder, available_slaves, only_fast, reserved=True)
-
def _nextL10nSlave(n=4):
"""Return a nextSlave function that restricts itself to choosing amongst
@@ -395,7 +328,7 @@ def _nextslave(builder, available_slaves):
connected_slaves = [s for s in builder.slaves if s.slave.slave_status.isConnected()]
# Sort the list so we're stable across reconfigs
connected_slaves.sort(key=lambda s: s.slave.slavename)
- fast, slow = _partitionUnreservedSlaves(connected_slaves)
+ fast, slow = _partitionSlaves(connected_slaves)
slow = slow[:n]
# Choose enough fast slaves so that we're considering a total of n
# slaves
@@ -424,7 +357,7 @@ def _nextSlowIdleSlave(nReserved):
"""Return a nextSlave function that will only return a slave to run a build
if there are at least nReserved slaves available."""
def _nextslave(builder, available_slaves):
- fast, slow = _partitionUnreservedSlaves(available_slaves)
+ fast, slow = _partitionSlaves(available_slaves)
if len(slow) <= nReserved:
return None
return sorted(slow, _recentSort(builder))[-1]
@@ -502,6 +435,44 @@ def makeMHFactory(config, pf, **kwargs):
return factory
+def makeBundleBuilder(config, name):
+ stageBasePath = '%s/%s' % (config['stage_base_path'],
+ config['platforms']['linux']['stage_product'])
+ bundle_factory = ScriptFactory(
+ config['hgurl'] + config['build_tools_repo_path'],
+ 'scripts/bundle/hg-bundle.sh',
+ interpreter='bash',
+ script_timeout=3600,
+ script_maxtime=3600,
+ extra_args=[
+ name,
+ config['repo_path'],
+ config['stage_server'],
+ config['stage_username'],
+ stageBasePath,
+ config['stage_ssh_key'],
+ ],
+ )
+ slaves = set()
+ for p in sorted(config['platforms'].keys()):
+ slaves.update(set(config['platforms'][p]['slaves']))
+ bundle_builder = {
+ 'name': '%s hg bundle' % name,
+ 'slavenames': list(slaves),
+ 'builddir': '%s-bundle' % (name,),
+ 'slavebuilddir': reallyShort('%s-bundle' % (name,)),
+ 'factory': bundle_factory,
+ 'category': name,
+ 'nextSlave': _nextSlowSlave,
+ 'properties': {'slavebuilddir': reallyShort('%s-bundle' % (name,)),
+ 'branch': name,
+ 'platform': None,
+ 'product': 'firefox',
+ }
+ }
+ return bundle_builder
+
+
def generateTestBuilder(config, branch_name, platform, name_prefix,
build_dir_prefix, suites_name, suites,
mochitestLeakThreshold, crashtestLeakThreshold,
@@ -509,10 +480,10 @@ def generateTestBuilder(config, branch_name, platform, name_prefix,
stagePlatform=None, stageProduct=None,
mozharness=False, mozharness_python=None,
mozharness_suite_config=None,
- mozharness_repo=None):
+ mozharness_repo=None, mozharness_tag='production'):
builders = []
pf = config['platforms'].get(platform, {})
- if slaves == None:
+ if slaves is None:
slavenames = config['platforms'][platform]['slaves']
else:
slavenames = slaves
@@ -565,6 +536,7 @@ def generateTestBuilder(config, branch_name, platform, name_prefix,
'reboot_command', suites.get('reboot_command', None))
hg_bin = mozharness_suite_config.get(
'hg_bin', suites.get('hg_bin', 'hg'))
+ properties['script_repo_revision'] = mozharness_tag
factory = ScriptFactory(
interpreter=mozharness_python,
scriptRepo=mozharness_repo,
@@ -712,19 +684,15 @@ def generateBranchObjects(config, name, secrets=None):
secrets = {}
builders = []
buildersByProduct = {}
- triggeredUnittestBuilders = []
nightlyBuilders = []
xulrunnerNightlyBuilders = []
periodicPgoBuilders = []
# Only used for the 'periodic' strategy. rename to perodicPgoBuilders?
weeklyBuilders = []
- coverageBuilders = []
# prettyNames is a mapping to pass to the try_parser for validation
PRETTY_NAME = '%(basename)s %(trystatus)sbuild'
NAME = '%(basename)s build'
prettyNames = {}
- unittestPrettyNames = {}
- unittestSuites = []
# These dicts provides mapping between en-US dep and nightly scheduler names
# to l10n dep and l10n nightly scheduler names. It's filled out just below
# here.
@@ -773,29 +741,7 @@ def generateBranchObjects(config, name, secrets=None):
pretty_name = PRETTY_NAME % values
builder_id = NAME % values
- if platform.endswith("-debug"):
- builders.append(builder_id)
- buildersByProduct.setdefault(
- pf['stage_product'], []).append(builder_id)
- prettyNames[platform] = pretty_name
- # Debug unittests
- if pf.get('enable_unittests'):
- test_builders = []
- if 'opt_base_name' in config['platforms'][platform]:
- base_name = config['platforms'][platform]['opt_base_name']
- else:
- base_name = config['platforms'][
- platform.replace("-debug", "")]['base_name']
- for suites_name, suites in config['unittest_suites']:
- unittestPrettyNames[platform] = '%s debug test' % base_name
- test_builders.extend(generateTestBuilderNames(
- '%s debug test' % base_name, suites_name, suites))
- triggeredUnittestBuilders.append(('%s-%s-unittest' % (name, platform), test_builders, config.get('enable_merging', True)))
- # Skip l10n, unit tests
- # Skip nightlies for debug builds unless requested
- if 'enable_nightly' not in pf:
- continue
- elif pf.get('enable_dep', True):
+ if pf.get('enable_dep', True):
builders.append(builder_id)
buildersByProduct.setdefault(
pf['stage_product'], []).append(builder_id)
@@ -841,20 +787,15 @@ def generateBranchObjects(config, name, secrets=None):
if config['enable_valgrind'] and \
platform in config['valgrind_platforms']:
nightlyBuilders.append('%s valgrind' % base_name)
- # Optimized unittest builds
- if pf.get('enable_opt_unittests'):
- test_builders = []
- for suites_name, suites in config['unittest_suites']:
- unittestPrettyNames[platform] = '%s opt test' % base_name
- test_builders.extend(generateTestBuilderNames(
- '%s opt test' % base_name, suites_name, suites))
- triggeredUnittestBuilders.append(('%s-%s-opt-unittest' % (name, platform), test_builders, config.get('enable_merging', True)))
if config.get('enable_blocklist_update', False) and platform in ('linux',):
weeklyBuilders.append('%s blocklist update' % base_name)
if pf.get('enable_xulrunner', config['enable_xulrunner']):
xulrunnerNightlyBuilders.append('%s xulrunner' % base_name)
+
if config['enable_weekly_bundle']:
- weeklyBuilders.append('%s hg bundle' % name)
+ bundle_builder = makeBundleBuilder(config, name)
+ branchObjects['builders'].append(bundle_builder)
+ weeklyBuilders.append(bundle_builder['name'])
# Try Server notifier
if config.get('enable_mail_notifier'):
@@ -948,6 +889,7 @@ def generateBranchObjects(config, name, secrets=None):
# for Try we have a custom scheduler that can accept a function to read commit comments
# in order to know what to schedule
extra_args = {}
+ extra_args['treeStableTimer'] = None
if config.get('enable_try'):
scheduler_class = makePropertiesScheduler(
BuilderChooserScheduler, [buildUIDSchedFunc])
@@ -961,9 +903,8 @@ def generateBranchObjects(config, name, secrets=None):
if not config.get('enable_merging', True):
nomergeBuilders.extend(builders)
- nomergeBuilders.extend(
- periodicPgoBuilders) # these should never, ever merge
- extra_args['treeStableTimer'] = None
+ # these should never, ever merge
+ nomergeBuilders.extend(periodicPgoBuilders)
if 'product_prefix' in config:
scheduler_name_prefix = "%s_%s" % (config['product_prefix'], name)
@@ -1008,42 +949,6 @@ def generateBranchObjects(config, name, secrets=None):
}
))
- for scheduler_branch, test_builders, merge in triggeredUnittestBuilders:
- scheduler_name = scheduler_branch
- for test in test_builders:
- unittestSuites.append(test.split(' ')[-1])
- if not merge:
- nomergeBuilders.extend(test_builders)
- extra_args = {}
- if config.get('enable_try'):
- scheduler_class = BuilderChooserScheduler
- extra_args['chooserFunc'] = tryChooser
- extra_args['numberOfBuildsToTrigger'] = 1
- extra_args['prettyNames'] = prettyNames
- extra_args['unittestSuites'] = unittestSuites
- extra_args['unittestPrettyNames'] = unittestPrettyNames
- extra_args['buildbotBranch'] = name
- else:
- scheduler_class = Scheduler
- branchObjects['schedulers'].append(scheduler_class(
- name=scheduler_name,
- branch=scheduler_branch,
- builderNames=test_builders,
- treeStableTimer=None,
- **extra_args
- ))
-
- if not config.get('disable_tinderbox_mail'):
- branchObjects['status'].append(TinderboxMailNotifier(
- fromaddr="mozilla2.buildbot@build.mozilla.org",
- tree=config['packaged_unittest_tinderbox_tree'],
- extraRecipients=["tinderbox-daemon@tinderbox.mozilla.org"],
- relayhost="mail.build.mozilla.org",
- builders=test_builders,
- logCompression="gzip",
- errorparser="unittest"
- ))
-
# Now, setup the nightly en-US schedulers and maybe,
# their downstream l10n ones
if nightlyBuilders or xulrunnerNightlyBuilders:
@@ -1099,13 +1004,13 @@ def generateBranchObjects(config, name, secrets=None):
'localesURL', None)
))
- if coverageBuilders or weeklyBuilders:
+ if weeklyBuilders:
weekly_scheduler = Nightly(
name='weekly-%s' % scheduler_name_prefix,
branch=config['repo_path'],
dayOfWeek=5, # Saturday
hour=[3], minute=[02],
- builderNames=coverageBuilders + weeklyBuilders,
+ builderNames=weeklyBuilders,
)
branchObjects['schedulers'].append(weekly_scheduler)
@@ -1136,6 +1041,7 @@ def generateBranchObjects(config, name, secrets=None):
'platform': platform,
'product': pf['stage_product'],
'repo_path': config['repo_path'],
+ 'script_repo_revision': config['mozharness_tag'],
}
}
if pf.get('enable_dep', True):
@@ -1160,6 +1066,7 @@ def generateBranchObjects(config, name, secrets=None):
'product': pf['stage_product'],
'repo_path': config['repo_path'],
'nightly_build': True,
+ 'script_repo_revision': config['mozharness_tag'],
}
}
branchObjects['builders'].append(builder)
@@ -1177,26 +1084,14 @@ def generateBranchObjects(config, name, secrets=None):
disableSymbols = pf.get('disable_symbols', False)
packageTests = False
talosMasters = pf.get('talos_masters', [])
- unittestBranch = "%s-%s-opt-unittest" % (name, platform)
+ unittestBranch = "%s-%s-unittest" % (name, pf.get('unittest_platform', platform))
# Generate the PGO branch even if it isn't on for dep builds
# because we will still use it for nightlies... maybe
pgoUnittestBranch = "%s-%s-pgo-unittest" % (name, platform)
tinderboxBuildsDir = None
- if platform.find('-debug') > -1:
- # Some platforms can't run on the build host
- leakTest = pf.get('enable_leaktests', True)
- if not pf.get('enable_unittests'):
- uploadPackages = pf.get('packageTests', False)
- else:
- packageTests = True
- talosMasters = None
- # Platform already has the -debug suffix
- unittestBranch = "%s-%s-unittest" % (name, platform)
- tinderboxBuildsDir = "%s-%s" % (name, platform)
- else:
- if pf.get('enable_opt_unittests'):
- packageTests = True
- leakTest = False
+
+ packageTests = pf.get('packageTests', False)
+ leakTest = pf.get('enable_leaktests', False)
# Allow for test packages on platforms that can't be tested
# on the same master.
@@ -1207,8 +1102,6 @@ def generateBranchObjects(config, name, secrets=None):
buildSpace = pf.get('build_space', config['default_build_space'])
l10nSpace = config['default_l10n_space']
clobberTime = pf.get('clobber_time', config['default_clobber_time'])
- mochitestLeakThreshold = pf.get('mochitest_leak_threshold', None)
- crashtestLeakThreshold = pf.get('crashtest_leak_threshold', None)
checkTest = pf.get('enable_checktests', False)
valgrindCheck = pf.get('enable_valgrind_checktests', False)
@@ -1233,7 +1126,7 @@ def generateBranchObjects(config, name, secrets=None):
# For the 'per-checkin' pgo strategy, we want PGO
# enabled on what would be 'opt' builds.
if platform in config['pgo_platforms']:
- if config['pgo_strategy'] in ('periodic', 'try') or config['pgo_strategy'] == None:
+ if config['pgo_strategy'] in ('periodic', 'try') or config['pgo_strategy'] is None:
per_checkin_build_uses_pgo = False
elif config['pgo_strategy'] == 'per-checkin':
per_checkin_build_uses_pgo = True
@@ -1396,27 +1289,7 @@ def generateBranchObjects(config, name, secrets=None):
branchObjects['builders'].append(pgo_builder)
# skip nightlies for debug builds unless requested at platform level
- if platform.find('debug') > -1:
- if pf.get('enable_unittests'):
- for suites_name, suites in config['unittest_suites']:
- if "macosx" in platform and 'mochitest-a11y' in suites:
- suites = suites[:]
- suites.remove('mochitest-a11y')
-
- if 'opt_base_name' in config['platforms'][platform]:
- base_name = config[
- 'platforms'][platform]['opt_base_name']
- else:
- base_name = config['platforms'][
- platform.replace("-debug", "")]['base_name']
-
- branchObjects['builders'].extend(generateTestBuilder(
- config, name, platform, "%s debug test" % base_name,
- "%s-%s-unittest" % (name, platform),
- suites_name, suites, mochitestLeakThreshold,
- crashtestLeakThreshold, stagePlatform=stage_platform,
- stageProduct=pf['stage_product']))
- if 'enable_nightly' not in pf:
+ if platform.endswith("-debug") and not pf.get('enable_nightly'):
continue
if config['enable_nightly']:
@@ -1471,7 +1344,9 @@ def generateBranchObjects(config, name, secrets=None):
'stage_platform': stage_platform,
'product': pf['stage_product'],
'platform': platform,
- 'slavebuilddir': slavebuilddir},
+ 'slavebuilddir': slavebuilddir,
+ 'script_repo_revision': config['mozharness_tag'],
+ },
'env': builder_env
})
@@ -1812,32 +1687,6 @@ def generateBranchObjects(config, name, secrets=None):
}
branchObjects['builders'].append(mozilla2_l10n_dep_builder)
- for suites_name, suites in config['unittest_suites']:
- runA11y = True
- if platform.startswith('macosx'):
- runA11y = config['enable_mac_a11y']
-
- # For the regular unittest build, run the a11y suite if
- # enable_mac_a11y is set on mac
- if not runA11y and 'mochitest-a11y' in suites:
- suites = suites[:]
- suites.remove('mochitest-a11y')
-
- # Remove mochitest-a11y from other types of builds, since they're not
- # built with a11y enabled
- if platform.startswith("macosx") and 'mochitest-a11y' in suites:
- # Create a new factory that doesn't have mochitest-a11y
- suites = suites[:]
- suites.remove('mochitest-a11y')
-
- if pf.get('enable_opt_unittests'):
- branchObjects['builders'].extend(generateTestBuilder(
- config, name, platform, "%s opt test" % pf['base_name'],
- "%s-%s-opt-unittest" % (name, platform),
- suites_name, suites, mochitestLeakThreshold,
- crashtestLeakThreshold, stagePlatform=stage_platform,
- stageProduct=pf['stage_product']))
-
if config.get('enable_blocklist_update', False):
if platform == 'linux':
blocklistBuilder = generateBlocklistBuilder(
@@ -1905,43 +1754,6 @@ def generateBranchObjects(config, name, secrets=None):
# -- end of per-platform loop --
- if config['enable_weekly_bundle']:
- stageBasePath = '%s/%s' % (config['stage_base_path'],
- pf['stage_product'])
- bundle_factory = ScriptFactory(
- config['hgurl'] + config['build_tools_repo_path'],
- 'scripts/bundle/hg-bundle.sh',
- interpreter='bash',
- script_timeout=3600,
- script_maxtime=3600,
- extra_args=[
- name,
- config['repo_path'],
- config['stage_server'],
- config['stage_username'],
- stageBasePath,
- config['stage_ssh_key'],
- ],
- )
- slaves = set()
- for p in sorted(config['platforms'].keys()):
- slaves.update(set(config['platforms'][p]['slaves']))
- bundle_builder = {
- 'name': '%s hg bundle' % name,
- 'slavenames': list(slaves),
- 'builddir': '%s-bundle' % (name,),
- 'slavebuilddir': reallyShort('%s-bundle' % (name,)),
- 'factory': bundle_factory,
- 'category': name,
- 'nextSlave': _nextSlowSlave,
- 'properties': {'slavebuilddir': reallyShort('%s-bundle' % (name,)),
- 'branch': name,
- 'platform': None,
- 'product': 'firefox',
- }
- }
- branchObjects['builders'].append(bundle_builder)
-
return branchObjects
@@ -2059,6 +1871,14 @@ def generateTalosBranchObjects(branch, branch_config, PLATFORMS, SUITES,
builddir = "%s_%s_test-%s" % (
branch, slave_platform, suite)
slavebuilddir = 'test'
+ properties = {
+ 'branch': branchProperty,
+ 'platform': slave_platform,
+ 'stage_platform': stage_platform,
+ 'product': stage_product,
+ 'builddir': builddir,
+ 'slavebuilddir': slavebuilddir,
+ }
if branch_config.get('mozharness_talos') and not platform_config.get('is_mobile'):
extra_args = ['--suite', suite,
'--add-option',
@@ -2083,7 +1903,7 @@ def generateTalosBranchObjects(branch, branch_config, PLATFORMS, SUITES,
extra_args.append('--use-talos-json')
factory = generateMozharnessTalosBuilder(
platform=platform,
- mozharness_repo=branch_config.get('mozharness_repo', platform_config['mozharness_config']['mozharness_repo']),
+ mozharness_repo=branch_config['mozharness_repo'],
script_path="scripts/talos_script.py",
hg_bin=platform_config[
'mozharness_config']['hg_bin'],
@@ -2097,6 +1917,7 @@ def generateTalosBranchObjects(branch, branch_config, PLATFORMS, SUITES,
reboot_command=platform_config[
'mozharness_config'].get('reboot_command'),
)
+ properties['script_repo_revision'] = branch_config['mozharness_tag']
else:
factory = factory_class(**factory_kwargs)
@@ -2107,14 +1928,7 @@ def generateTalosBranchObjects(branch, branch_config, PLATFORMS, SUITES,
'slavebuilddir': slavebuilddir,
'factory': factory,
'category': branch,
- 'properties': {
- 'branch': branchProperty,
- 'platform': slave_platform,
- 'stage_platform': stage_platform,
- 'product': stage_product,
- 'builddir': builddir,
- 'slavebuilddir': slavebuilddir,
- },
+ 'properties': properties,
}
if not merge:
@@ -2232,8 +2046,9 @@ def generateTalosBranchObjects(branch, branch_config, PLATFORMS, SUITES,
"stagePlatform": stage_platform,
"stageProduct": stage_product
}
- if isinstance(suites, dict) and "mozharness_repo" in suites:
- test_builder_kwargs['mozharness_repo'] = branch_config.get('mozharness_repo', suites['mozharness_repo'])
+ if isinstance(suites, dict) and "use_mozharness" in suites:
+ test_builder_kwargs['mozharness_repo'] = branch_config['mozharness_repo']
+ test_builder_kwargs['mozharness_tag'] = branch_config['mozharness_tag']
test_builder_kwargs['mozharness'] = True
test_builder_kwargs['mozharness_python'] = platform_config['mozharness_config']['mozharness_python']
if suites_name in branch_config['platforms'][platform][slave_platform].get('suite_config', {}):
View
32 process/factory.py
@@ -4193,7 +4193,8 @@ def __init__(self, patcherConfig, verifyConfigs,
releaseNotesUrl=None, python='python',
testOlderPartials=False,
longVersion=None, schema=None,
- useBetaChannelForRelease=False, useChecksums=False, **kwargs):
+ useBetaChannelForRelease=False, useChecksums=False,
+ promptWaitTime=None, **kwargs):
"""patcherConfig: The filename of the patcher config file to bump,
and pass to patcher.
mozRepoPath: The path for the Mozilla repo to hand patcher as the
@@ -4236,6 +4237,7 @@ def __init__(self, patcherConfig, verifyConfigs,
self.useChecksums = useChecksums
self.python = python
self.configRepoPath = configRepoPath
+ self.promptWaitTime = promptWaitTime
# The patcher config bumper needs to know the exact previous version
self.previousVersion = str(
@@ -4325,6 +4327,8 @@ def bumpConfigs(self):
bumpCommand.extend(['--platform', platform])
if self.useBetaChannelForRelease:
bumpCommand.append('-u')
+ if self.promptWaitTime:
+ bumpCommand.extend(['--prompt-wait-time', self.promptWaitTime])
if self.releaseNotesUrl:
rnurl = self.releaseNotesUrl
if self.use_mock:
@@ -5539,8 +5543,8 @@ def pythonWithJson(self, platform):
Return path to a python version that eithers has "simplejson" or
it is 2.6 or higher (which includes the json module)
'''
- if (platform in ("fedora", "fedora64", "ubuntu64", "leopard",
- "snowleopard", "lion", "mountainlion")):
+ if (platform in ("fedora", "fedora64", "ubuntu32", "ubuntu64",
+ "leopard", "snowleopard", "lion", "mountainlion")):
return "/tools/buildbot/bin/python"
elif (platform in ('w764', 'win7', 'xp')):
return "C:\\mozilla-build\\python25\\python.exe"
@@ -5989,10 +5993,10 @@ def addSetupSteps(self):
def addPluginInstallSteps(self):
if self.plugins:
# 32 bit (includes mac browsers)
- if self.OS in ('xp', 'vista', 'win7', 'fedora', 'tegra_android',
- 'tegra_android-armv6', 'tegra_android-noion', 'panda_android',
- 'leopard', 'snowleopard', 'leopard-o', 'lion',
- 'mountainlion'):
+ if self.OS in ('xp', 'vista', 'win7', 'fedora', 'ubuntu32',
+ 'tegra_android', 'tegra_android-armv6',
+ 'tegra_android-noion', 'panda_android', 'leopard',
+ 'snowleopard', 'leopard-o', 'lion', 'mountainlion'):
self.addStep(DownloadFile(
url=WithProperties(
"%s/%s" % (self.supportUrlBase, self.plugins['32'])),
@@ -6552,6 +6556,20 @@ def __init__(self, scriptRepo, scriptName, cwd=None, interpreter=None,
haltOnFailure=True,
workdir='scripts'
))
+ self.addStep(SetProperty(
+ name='get_script_repo_revision',
+ property='script_repo_revision',
+ command=['hg', 'id', '-i'],
+ workdir='scripts',
+ haltOnFailure=False,
+ ))
+ self.addStep(ShellCommand(
+ name='print_url_to_script_revision_used',
+ command=['echo', 'TinderboxPrint:',
+ "%s_revlink" % scriptRepo.split('/')[-1],
+ WithProperties("%s/rev/%%(script_repo_revision)s" % scriptRepo)],
+ haltOnFailure=False,
+ ))
self.runScript()
self.reboot()
View
108 process/release.py
@@ -26,7 +26,7 @@
from buildbotcustom.status.mail import ChangeNotifier
from buildbotcustom.misc import get_l10n_repositories, \
- generateTestBuilderNames, generateTestBuilder, _nextFastReservedSlave, \
+ generateTestBuilderNames, generateTestBuilder, _nextFastSlave, \
changeContainsProduct, nomergeBuilders, changeContainsProperties
from buildbotcustom.common import reallyShort
from buildbotcustom.process.factory import StagingRepositorySetupFactory, \
@@ -91,10 +91,6 @@ def generateReleaseBranchObjects(releaseConfig, branchConfig,
mock_slaves = [x for x in set(mock_slaves)]
all_slaves = [x for x in set(all_slaves)]
- manuallySignedPlatforms = ()
- if not releaseConfig.get('enableSigningAtBuildTime', True):
- manuallySignedPlatforms = releaseConfig.get('manuallySignedPlatforms',
- ('win32',))
if secrets is None:
secrets = {}
@@ -183,9 +179,6 @@ def createReleaseMessage(mode, name, build, results, master_status):
platformDir = buildbot2ftp(bare_platform)
if 'xulrunner' in platform:
platformDir = ''
- if bare_platform in manuallySignedPlatforms:
- platformDir = 'unsigned/%s' % platformDir
- isPlatformUnsigned = True
ftpURL = '/'.join([
ftpURL.strip('/'),
platformDir])
@@ -469,7 +462,7 @@ def getMessageId():
'slavebuilddir': reallyShort(
builderPrefix('%s_tag' % releaseConfig['productName'])),
'factory': tag_factory,
- 'nextSlave': _nextFastReservedSlave,
+ 'nextSlave': _nextFastSlave,
'env': tag_env,
'properties': {
'builddir': builderPrefix(
@@ -544,7 +537,7 @@ def getMessageId():
'%s_source' % releaseConfig['productName']), releaseConfig['productName']),
'factory': source_factory,
'env': builder_env,
- 'nextSlave': _nextFastReservedSlave,
+ 'nextSlave': _nextFastSlave,
'properties': {
'slavebuilddir': reallyShort(
builderPrefix(
@@ -738,7 +731,7 @@ def getMessageId():
'builddir': builderPrefix('%s_build' % platform),
'slavebuilddir': reallyShort(builderPrefix('%s_build' % platform), releaseConfig['productName']),
'factory': build_factory,
- 'nextSlave': _nextFastReservedSlave,
+ 'nextSlave': _nextFastSlave,
'env': builder_env,
'properties': {
'slavebuilddir': reallyShort(builderPrefix('%s_build' % platform), releaseConfig['productName']),
@@ -798,7 +791,7 @@ def getMessageId():
'category': builderPrefix(''),
'builddir': builderPrefix("standalone_repack", platform),
'factory': standalone_factory,
- 'nextSlave': _nextFastReservedSlave,
+ 'nextSlave': _nextFastSlave,
'env': env,
'properties': {
'builddir': builderPrefix("standalone_repack", platform),
@@ -810,6 +803,15 @@ def getMessageId():
})
for n, builderName in l10nBuilders(platform).iteritems():
+ builddir = builderPrefix('%s_repack' % platform) + \
+ '_' + str(n)
+ properties = {
+ 'builddir': builddir,
+ 'slavebuilddir': reallyShort(builddir, releaseConfig['productName']),
+ 'release_config': releaseConfigFile,
+ 'platform': platform,
+ 'branch': 'release-%s' % sourceRepoInfo['name'],
+ }
if hasPlatformSubstring(platform, 'android'):
extra_args = releaseConfig['single_locale_options'][platform] + ['--total-chunks', str(l10nChunks), '--this-chunk', str(n)]
repack_factory = SigningScriptFactory(
@@ -819,6 +821,7 @@ def getMessageId():
extra_args=extra_args,
env=env,
)
+ properties['script_repo_revision'] = releaseTag
else:
extra_args = [platform, branchConfigFile]
extra_args.extend([
@@ -848,9 +851,6 @@ def getMessageId():
mock_copyin_files=pf.get('mock_copyin_files'),
)
- builddir = builderPrefix('%s_repack' % platform) + \
- '_' + str(n)
-
builders.append({
'name': builderName,
'slavenames': pf.get('l10n_slaves', pf['slaves']),
@@ -858,15 +858,9 @@ def getMessageId():
'builddir': builddir,
'slavebuilddir': reallyShort(builddir, releaseConfig['productName']),
'factory': repack_factory,
- 'nextSlave': _nextFastReservedSlave,
+ 'nextSlave': _nextFastSlave,
'env': env,
- 'properties': {
- 'builddir': builddir,
- 'slavebuilddir': reallyShort(builddir, releaseConfig['productName']),
- 'release_config': releaseConfigFile,
- 'platform': platform,
- 'branch': 'release-%s' % sourceRepoInfo['name'],
- }
+ 'properties': properties,
})
builders.append(makeDummyBuilder(
@@ -1032,7 +1026,7 @@ def getMessageId():
'slavebuilddir': reallyShort(builderPrefix(
'partner_repack', platform), releaseConfig['productName']),
'factory': partner_repack_factory,
- 'nextSlave': _nextFastReservedSlave,
+ 'nextSlave': _nextFastSlave,
'env': builder_env,
'properties': {
'slavebuilddir': reallyShort(builderPrefix('partner_repack', platform), releaseConfig['productName']),
@@ -1043,17 +1037,6 @@ def getMessageId():
deliverables_builders.append(
builderPrefix('partner_repack', platform))
- if 'win32' in manuallySignedPlatforms:
- builders.append(makeDummyBuilder(
- name=builderPrefix('signing_done'),
- slaves=all_slaves,
- category=builderPrefix(''),
- properties={
- 'platform': 'win32',
- 'branch': 'release-%s' % sourceRepoInfo['name'],
- },
- ))
-
if releaseConfig.get('enableSigningAtBuildTime', True) and \
releaseConfig.get('autoGenerateChecksums', True):
pf = branchConfig['platforms']['linux']
@@ -1180,6 +1163,8 @@ def getMessageId():
mock_target=pf.get('mock_target'),
mock_packages=pf.get('mock_packages'),
mock_copyin_files=pf.get('mock_copyin_files'),
+ promptWaitTime=releaseConfig.get(
+ 'promptWaitTime', None),
)
builders.append({
@@ -1189,7 +1174,7 @@ def getMessageId():
'builddir': builderPrefix('updates'),
'slavebuilddir': reallyShort(builderPrefix('updates'), releaseConfig['productName']),
'factory': updates_factory,
- 'nextSlave': _nextFastReservedSlave,
+ 'nextSlave': _nextFastSlave,
'env': builder_env,
'properties': {
'slavebuilddir': reallyShort(builderPrefix('updates'), releaseConfig['productName']),
@@ -1245,7 +1230,7 @@ def getMessageId():
'builddir': builddir,
'slavebuilddir': reallyShort(builddir, releaseConfig['productName']),
'factory': uv_factory,
- 'nextSlave': _nextFastReservedSlave,
+ 'nextSlave': _nextFastSlave,
'env': env,
'properties': {'builddir': builddir,
'slavebuilddir': reallyShort(builddir, releaseConfig['productName']),
@@ -1455,7 +1440,7 @@ def getMessageId():
'builddir': builderPrefix('final_verification', platform),
'slavebuilddir': reallyShort(builderPrefix('fnl_verf', platform), releaseConfig['productName']),
'factory': final_verification_factory,
- 'nextSlave': _nextFastReservedSlave,
+ 'nextSlave': _nextFastSlave,
'env': builder_env,
'properties': {
'slavebuilddir': reallyShort(builderPrefix('fnl_verf', platform), releaseConfig['productName']),
@@ -1572,49 +1557,6 @@ def getMessageId():
##### Change sources and Schedulers
- if 'win32' in manuallySignedPlatforms:
- change_source.append(UrlPoller(
- branch=builderPrefix('post_signing'),
- url='%s/win32_signing_build%s.log' % (
- makeCandidatesDir(
- releaseConfig['productName'],
- releaseConfig['version'],
- releaseConfig['buildNumber'],
- protocol='http',
- server=releaseConfig['ftpServer']),
- releaseConfig['buildNumber']),
- pollInterval=60 * 10,
- ))
- signing_done_scheduler = Scheduler(
- name=builderPrefix('signing_done'),
- treeStableTimer=0,
- branch=builderPrefix('post_signing'),
- builderNames=[builderPrefix('signing_done')]
- )
- schedulers.append(signing_done_scheduler)
- important_builders.append(builderPrefix('signing_done'))
-
- if hasPlatformSubstring(manuallySignedPlatforms, 'android'):
- # Watch only armv7 en-US APK
- platform = 'android'
- locale = 'en-US'
- candidatesDir = makeCandidatesDir(
- releaseConfig['productName'],
- releaseConfig['version'],
- releaseConfig['buildNumber'],
- protocol='http',
- server=releaseConfig['ftpServer'])
- enUS_signed_apk_url = '%s%s/%s/%s-%s.%s.android-arm.apk' % \
- (candidatesDir,
- buildbot2ftp(platform),
- locale, releaseConfig['productName'], releaseConfig['version'],
- locale)
- change_source.append(UrlPoller(
- branch=builderPrefix('android_post_signing'),
- url=enUS_signed_apk_url,
- pollInterval=60 * 10
- ))
-
reset_schedulers_scheduler = Scheduler(
name=builderPrefix(
'%s_reset_schedulers' % releaseConfig['productName']),
@@ -1679,6 +1621,8 @@ def getMessageId():
if platform in releaseConfig['notifyPlatforms']:
important_builders.append(builderPrefix('%s_build' % platform))
if platform in releaseConfig['l10nPlatforms']:
+ if platform in releaseConfig.get('l10nNotifyPlatforms', []):
+ important_builders.append(builderPrefix('%s_repack_complete' % platform))
l10nBuilderNames = l10nBuilders(platform).values()
repack_scheduler = Triggerable(
name=builderPrefix('%s_repack' % platform),
@@ -1784,8 +1728,6 @@ def getMessageId():
post_antivirus_builders.append(builderPrefix('push_to_mirrors'))
if not hasPlatformSubstring(releaseConfig['enUSPlatforms'], 'android'):
- if 'win32' in manuallySignedPlatforms:
- updates_upstream_builders = [builderPrefix('signing_done')]
schedulers.append(AggregatingScheduler(
name=builderPrefix(
'%s_signing_done' % releaseConfig['productName']),
View
161 test/test_misc_nextslaves.py
@@ -1,6 +1,4 @@
from __future__ import with_statement
-import time
-import tempfile
import mock
@@ -8,18 +6,13 @@
import buildbotcustom.misc
from buildbotcustom.misc import _nextSlowIdleSlave, _nextL10nSlave,\
- _nextFastSlave, _nextFastReservedSlave, _nextSlowSlave,\
- setReservedFileName, _partitionUnreservedSlaves
+ _nextFastSlave, _nextSlowSlave
class TestNextSlaveFuncs(unittest.TestCase):
def setUp(self):
# Reset these each time
buildbotcustom.misc.fastRegexes = ['fast']
- buildbotcustom.misc.nReservedSlaves = 0
-
- # Prevent looking for reserved slaves file
- buildbotcustom.misc._checkedReservedSlaveFile = time.time()
self.slaves = slaves = []
for name in ('fast1', 'fast2', 'fast3', 'slow1', 'slow2', 'slow3'):
@@ -36,88 +29,32 @@ def setUp(self):
builder.slaves = self.slaves
def test_nextFastSlave_AllAvail(self):
- """Test that _nextFastSlave and _nextFastReservedSlave return a fast
+ """Test that _nextFastSlave returns a fast
slave when all slaves are available."""
- for func in _nextFastReservedSlave, _nextFastSlave:
- slave = func(self.builder, self.slaves, only_fast=True)
- self.assert_(slave.slave.slavename.startswith("fast"))
+ slave = _nextFastSlave(self.builder, self.slaves, only_fast=True)
+ self.assert_(slave.slave.slavename.startswith("fast"))
def test_nextFastSlave_OnlySlowAvail(self):
- """Test that _nextFastSlave and _nextFastReservedSlave return None
- slave when only slow slaves are available, and only_fast is True."""
- for func in _nextFastReservedSlave, _nextFastSlave:
- slave = func(self.builder, self.slow_slaves, only_fast=True)
- self.assert_(slave is None)
+ """Test that _nextFastSlave returns None slave when only slow slaves
+ are available, and only_fast is True."""
+ slave = _nextFastSlave(self.builder, self.slow_slaves, only_fast=True)
+ self.assert_(slave is None)
def test_nextFastSlave_OnlySlowAvail_notOnlyFast(self):
- """Test that _nextFastSlave and _nextFastReservedSlave return a slow
- slave when only slow slaves are available and only_fast is False."""
- for func in _nextFastReservedSlave, _nextFastSlave:
- slave = func(self.builder, self.slow_slaves, only_fast=False)
- self.assert_(slave.slave.slavename.startswith("slow"))
-
- def test_nextFastReservedSlave_reserved(self):
- """Test that _nextFastReservedSlave returns a fast slave if there's one
- reserved."""
- buildbotcustom.misc.nReservedSlaves = 1
-
- # Only one fast slave available
- available_slaves = [
- s for s in self.slaves if s.slave.slavename == 'fast2']
- slave = _nextFastReservedSlave(self.builder, available_slaves)
- self.assert_(slave.slave.slavename == "fast2")
-
- def test_nextFastSlave_reserved(self):
- """Test that _nextFastSlave returns None if there's one slave
- reserved."""
- buildbotcustom.misc.nReservedSlaves = 1
-
- # Only one fast slave available
- available_slaves = [
- s for s in self.slaves if s.slave.slavename == 'fast2']
- slave = _nextFastSlave(self.builder, available_slaves)
- self.assert_(slave is None)
+ """Test that _nextFastSlave and returns a slow slave when only slow
+ slaves are available and only_fast is False."""
+ slave = _nextFastSlave(self.builder, self.slow_slaves, only_fast=False)
+ self.assert_(slave.slave.slavename.startswith("slow"))
def test_nextFastSlave_allslow(self):
"""Test that _nextFastSlave works if the builder is configured with
just slow slaves. This handles the case for platforms that don't have a
fast/slow distinction."""
- buildbotcustom.misc.nReservedSlaves = 1
self.builder.slaves = self.slow_slaves
slave = _nextFastSlave(self.builder, self.slow_slaves, only_fast=True)
self.assert_(slave.slavename.startswith('slow'))
- def test_partitionUnreservedSlaves_allslow_reserved(self):
- """Test that _partitionUnreservedSlaves works if the builder is
- configured with just slow slaves and has slave reservations. Some of
- the slow slaves should be reserved in this case."""
- buildbotcustom.misc.nReservedSlaves = 2
- slaves = self.slow_slaves
- fast, slow = _partitionUnreservedSlaves(slaves)
-
- self.assert_(len(fast) == 0, [s.slave.slavename for s in fast])
- self.assert_(len(slow) == 1, [s.slave.slavename for s in slow])
-
- def test_nextSlowSlave_allslow_allreserved(self):
- """Test that _nextSlowSlave returns None when all slaves are reserved,
- and there are only slow slaves."""
- buildbotcustom.misc.nReservedSlaves = 3
- self.builder.slaves = self.slow_slaves
-
- slave = _nextSlowSlave(self.builder, self.slow_slaves)
- self.assert_(slave is None)
-
- def test_nextSlave_allslow_allreserved(self):
- """Test that _nextFastReservedSlave returns None when all slaves are
- reserved, and there are only slow slaves."""
- buildbotcustom.misc.nReservedSlaves = 3
- self.builder.slaves = self.slow_slaves
-
- slave = _nextFastReservedSlave(
- self.builder, self.slow_slaves, only_fast=True)
- self.assert_(slave is not None)
-
def test_nextSlowSlave(self):
"""Test that _nextSlowSlave returns a slow slave if one is available."""
slave = _nextSlowSlave(self.builder, self.slaves)
@@ -158,77 +95,3 @@ def test_nextL10nSlave_unavail(self):
s for s in self.slaves if s.slave.slavename != 'slow1']
slave = func(self.builder, available_slaves)
self.assert_(slave is None)
-
- def test_update_reserved(self):
- """Test that updates to the reserved file are obeyed, and that calls to
- the _nextFast functions pick it up."""
- reservedFile = tempfile.NamedTemporaryFile()
- buildbotcustom.misc._checkedReservedSlaveFile = 0
- # Need to fake out time.time
- with mock.patch.object(time, 'time') as time_method:
- setReservedFileName(reservedFile.name)
- time_method.return_value = 0
- self.assertEquals(buildbotcustom.misc.nReservedSlaves, 0)
-
- # Only one fast slave available, but none are reserved yet
- available_slaves = [
- s for s in self.slaves if s.slave.slavename == 'fast2']
- slave = _nextFastSlave(self.builder, available_slaves)
- self.assert_(slave.slave.slavename == 'fast2')
-
- # Reserve 1 slave
- reservedFile.write('1')
- reservedFile.flush()
- time_method.return_value = 61
-
- # Only one fast slave available, but 1 is reserved
- available_slaves = [
- s for s in self.slaves if s.slave.slavename == 'fast2']
-
- # Check that the regular function doesn't get it
- slave = _nextFastSlave(
- self.builder, available_slaves, only_fast=True)
- self.assertEquals(buildbotcustom.misc.nReservedSlaves, 1)
- self.assert_(slave is None)
-
- # But our reserved function now does
- slave = _nextFastReservedSlave(
- self.builder, available_slaves, only_fast=True)
- self.assert_(slave.slave.slavename == 'fast2')
-
- def test_update_reserved_blank(self):
- """Test that updates to the reserved file are obeyed, and that calls to
- the _nextFast functions pick it up."""
- reservedFile = tempfile.NamedTemporaryFile()
- reservedFile.write('5')
- reservedFile.flush()
- buildbotcustom.misc._checkedReservedSlaveFile = 0
- # Need to fake out time.time
- with mock.patch.object(time, 'time') as time_method:
- setReservedFileName(reservedFile.name)
- time_method.return_value = 61
- self.assertEquals(buildbotcustom.misc.nReservedSlaves, 0)
-
- # Only one fast slave available, but all are reserved yet
- available_slaves = [
- s for s in self.slaves if s.slave.slavename == 'fast2']
- slave = _nextFastSlave(self.builder, available_slaves)
- self.assert_(slave is None)
- self.assertEquals(buildbotcustom.misc.nReservedSlaves, 5)
-
- # Empty out reserved slaves file
- reservedFile.seek(0)
- reservedFile.write('')
- reservedFile.truncate()
- reservedFile.flush()
- time_method.return_value = buildbotcustom.misc._checkedReservedSlaveFile + 61
-
- # Only one fast slave available, but none are reserved
- available_slaves = [
- s for s in self.slaves if s.slave.slavename == 'fast2']
-
- # Check that the regular function gets it
- slave = _nextFastSlave(
- self.builder, available_slaves, only_fast=True)
- self.assertEquals(buildbotcustom.misc.nReservedSlaves, 0)
- self.assert_(slave.slave.slavename == 'fast2')
Please sign in to comment.
Something went wrong with that request. Please try again.