def _setup_recipes(build): """Initializes a build request using recipes. Returns: extra_swarming_tags, extra_task_template_params """ exe = build.proto.exe props = copy.copy(build.proto.input.properties) # TODO(nodir): Remove recipe dependencies from buildbucket. assert 'recipe' in props.fields, props recipe = props['recipe'] # In order to allow some builders to behave like other builders, we allow # builders to explicitly set buildername. # TODO(nodir): delete this "feature". if 'buildername' not in props: # pragma: no branch props['buildername'] = build.proto.builder.builder props.get_or_create_struct('$recipe_engine/runtime').update({ 'is_luci': True, 'is_experimental': build.experimental, }) if build.proto.number: # pragma: no branch props['buildnumber'] = build.proto.number # Add repository property, for backward compatibility. # TODO(crbug.com/877161): remove it. if len(build.proto.input.gerrit_changes) == 1: # pragma: no branch cl = build.proto.input.gerrit_changes[0] suffix = '-review.googlesource.com' if cl.host.endswith(suffix) and cl.project: # pragma: no branch props['repository'] = 'https://%s.googlesource.com/%s' % ( cl.host[:-len(suffix)], cl.project) props['$recipe_engine/buildbucket'] = _buildbucket_property(build) # TODO(nodir): remove legacy "buildbucket" property. props['buildbucket'] = _buildbucket_property_legacy(build) extra_task_template_params = { 'recipe': recipe, 'properties_json': api_common.properties_to_json(props), 'checkout_dir': _KITCHEN_CHECKOUT, } extra_swarming_tags = [ 'recipe_name:%s' % recipe, 'recipe_package:%s' % exe.cipd_package, ] return extra_swarming_tags, extra_task_template_params
def test_basic(self): expected = json.dumps( { 'a': 'b', 'buildnumber': 1, 'another number': 1.0, }, sort_keys=True, ) actual = api_common.properties_to_json({ 'a': 'b', 'buildnumber': 1, 'another number': 1, }) self.assertEqual(expected, actual)
def test_legacy_kitchen(self): build = self._test_build( builder=build_pb2.BuilderID( project='chromium', bucket='try', builder='linux_kitchen' ), ) actual = self.compute_task_def(build) self.assertEqual([ "kitchen${EXECUTABLE_SUFFIX}", 'cook', '-buildbucket-hostname', 'cr-buildbucket.appspot.com', '-buildbucket-build-id', '9027773186396127232', '-call-update-build', '-build-url', 'https://milo.example.com/b/9027773186396127232', '-luci-system-account', 'system', '-recipe', 'presubmit', '-cache-dir', 'cache', '-checkout-dir', 'kitchen-checkout', '-temp-dir', 'tmp', '-properties', api_common.properties_to_json( swarming._compute_legacy_properties(build) ), '-logdog-annotation-url', 'logdog://logdog.example.com/chromium/bb/+/annotations', '-known-gerrit-host', 'chromium-review.googlesource.com' ], test_util.ununicode(actual['task_slices'][0]['properties']['command']))
def _compute_command(build, settings): if _builder_matches(build.proto.builder, settings.swarming.bbagent_package.builders): return _compute_bbagent(build, settings) logdog = build.proto.infra.logdog annotation_url = ('logdog://%s/%s/%s/+/annotations' % (logdog.hostname, logdog.project, logdog.prefix)) ret = [ 'kitchen${EXECUTABLE_SUFFIX}', 'cook', '-buildbucket-hostname', app_identity.get_default_version_hostname(), '-buildbucket-build-id', build.proto.id, '-call-update-build', '-build-url', _generate_build_url(settings.swarming.milo_hostname, build), '-luci-system-account', 'system', '-recipe', build.proto.input.properties['recipe'], '-cache-dir', _CACHE_DIR, '-checkout-dir', _KITCHEN_CHECKOUT, '-temp-dir', 'tmp', '-properties', api_common.properties_to_json(_compute_legacy_properties(build)), '-logdog-annotation-url', annotation_url, ] for h in settings.known_public_gerrit_hosts: ret += ['-known-gerrit-host', h] ret = map(unicode, ret) # Ensure strings. return ret
def test_get_task_def(self): self.patch( 'tokens.generate_build_token', autospec=True, return_value='beeff00d', ) req = { 'build_request': { 'bucket': 'luci.chromium.try', 'parameters_json': json.dumps({model.BUILDER_PARAMETER: 'linux'}), }, } resp = self.call_api('get_task_def', req).json_body actual_task_def = json.loads(resp['task_definition']) props_def = { 'env': [{ 'key': 'BUILDBUCKET_EXPERIMENTAL', 'value': 'FALSE' }], 'extra_args': [ 'cook', '-recipe', 'presubmit', '-properties', api_common.properties_to_json({ 'recipe': 'presubmit', 'buildbucket': { 'hostname': 'cr-buildbucket.appspot.com', 'build': { 'project': 'chromium', 'bucket': 'luci.chromium.try', 'created_by': 'anonymous:anonymous', 'created_ts': 1448841600000000, 'id': '1', 'tags': ['builder:linux'], }, }, '$recipe_engine/buildbucket': { 'hostname': 'cr-buildbucket.appspot.com', 'build': { 'id': '1', 'builder': { 'project': 'chromium', 'bucket': 'try', 'builder': 'linux', }, 'number': 1, 'createdBy': 'anonymous:anonymous', 'createTime': '2015-11-30T00:00:00Z', 'schedulingTimeout': '21600s', 'executionTimeout': '10800s', 'exe': { 'cipdPackage': 'infra/recipe_bundle', 'cipdVersion': 'refs/heads/master', }, 'input': {}, 'infra': { 'buildbucket': {}, 'swarming': { 'hostname': 'swarming.example.com', 'priority': 30, 'taskDimensions': [ { 'key': 'baz', 'value': 'baz', 'expiration': '0s', }, { 'key': 'builder', 'value': 'linux', 'expiration': '0s', }, { 'key': 'foo', 'value': 'bar', 'expiration': '0s', }, ], 'caches': [{ 'path': 'builder', 'name': 'builder_cache_name', 'waitForWarmCache': '0s', }], }, 'logdog': { 'hostname': 'logdog.example.com', 'project': 'chromium', 'prefix': ('buildbucket/cr-buildbucket.appspot.com/1' ), }, }, }, }, '$recipe_engine/runtime': { 'is_experimental': False, 'is_luci': True, }, 'foo': 'bar', 'baz': 1, 'buildername': 'linux', 'buildnumber': 1, }), '-logdog-project', 'chromium', ], 'execution_timeout_secs': '10800', 'cipd_input': { 'packages': [ { 'package_name': 'infra/tools/luci_runner', 'path': '.', 'version': 'luci-runner-version', }, { 'package_name': 'infra/tools/kitchen', 'path': '.', 'version': 'kitchen-version', }, { 'package_name': 'infra/recipe_bundle', 'path': 'kitchen-checkout', 'version': 'refs/heads/master', }, { 'package_name': 'infra/tools/git', 'path': swarming.USER_PACKAGE_DIR, 'version': 'git-version', }, ], }, 'dimensions': [ { 'key': 'baz', 'value': 'baz' }, { 'key': 'builder', 'value': 'linux' }, { 'key': 'foo', 'value': 'bar' }, ], 'caches': [{ 'path': 'cache/builder', 'name': 'builder_cache_name', }], } expected_task_def = { 'name': 'bb-1-chromium-linux', 'tags': [ 'buildbucket_bucket:chromium/try', 'buildbucket_build_id:1', 'buildbucket_hostname:cr-buildbucket.appspot.com', 'buildbucket_template_canary:0', 'buildbucket_template_revision:rev', 'builder:linux', 'recipe_name:presubmit', 'recipe_package:infra/recipe_bundle', ], 'priority': '30', 'pool_task_template': 'CANARY_NEVER', 'task_slices': [{ 'expiration_secs': '21600', 'properties': props_def, 'wait_for_capacity': False, }], } self.assertEqual(actual_task_def, expected_task_def) self.assertEqual(resp['swarming_host'], 'swarming.example.com')