Exemple #1
0
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
Exemple #2
0
    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)
Exemple #3
0
  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']))
Exemple #4
0
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
Exemple #5
0
    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')