Commit 9589b3a4 authored by Yiwei Zhang's avatar Yiwei Zhang Committed by LUCI CQ

recipe: deprecate cipd module in favor of the engine supplied one

Bug: 875523
Change-Id: I99056b760cd2bd2633773ebbb8ba062219c7d6cb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/3140892
Commit-Queue: Yiwei Zhang <yiwzhang@google.com>
Reviewed-by: 's avatarGavin Mak <gavinmak@google.com>
parent e7695c5e
......@@ -4,7 +4,6 @@
**[Recipe Modules](#Recipe-Modules)**
* [bot_update](#recipe_modules-bot_update) (Python3 ✅) &mdash; Recipe module to ensure a checkout is consistent on a bot.
* [cipd](#recipe_modules-cipd) (Python3 ✅) &mdash; API for interacting with CIPD.
* [depot_tools](#recipe_modules-depot_tools) (Python3 ✅) &mdash; The `depot_tools` module provides safe functions to access paths within the depot_tools repo.
* [gclient](#recipe_modules-gclient) (Python3 ✅)
* [gerrit](#recipe_modules-gerrit) (Python3 ✅)
......@@ -21,8 +20,6 @@
* [bot_update:examples/full](#recipes-bot_update_examples_full) (Python3 ✅)
* [bot_update:tests/do_not_retry_patch_failures_in_cq](#recipes-bot_update_tests_do_not_retry_patch_failures_in_cq) (Python3 ✅)
* [bot_update:tests/ensure_checkout](#recipes-bot_update_tests_ensure_checkout) (Python3 ✅)
* [cipd:examples/full](#recipes-cipd_examples_full)
* [cipd:examples/platform_suffix](#recipes-cipd_examples_platform_suffix) (Python3 ✅)
* [depot_tools:examples/full](#recipes-depot_tools_examples_full) (Python3 ✅)
* [fetch_end_to_end_test](#recipes-fetch_end_to_end_test)
* [gclient:examples/full](#recipes-gclient_examples_full) (Python3 ✅)
......@@ -117,125 +114,6 @@ Returns (list of str): All properties that'll hold the checked-out revision
Sets a fixed revision for a single dependency using project revision
properties.
### *recipe_modules* / [cipd](/recipes/recipe_modules/cipd)
[DEPS](/recipes/recipe_modules/cipd/__init__.py#3): [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step]
PYTHON_VERSION_COMPATIBILITY: PY2+3
API for interacting with CIPD.
Depends on 'cipd' binary available in PATH:
https://godoc.org/go.chromium.org/luci/cipd/client/cmd/cipd
WARNING: There is an alternative cipd recipe_module in recipes-py.git:
https://codesearch.chromium.org/chromium/infra/recipes-py/recipe_modules/cipd/
Consider using that one instead.
TODO(crbug.com/875523): Delete this module.
#### **class [CIPDApi](/recipes/recipe_modules/cipd/api.py#163)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
CIPDApi provides basic support for CIPD.
This assumes that `cipd` (or `cipd.exe` or `cipd.bat` on windows) has been
installed somewhere in $PATH. This will be true if you use depot_tools, or if
your recipe is running inside of chrome-infrastructure's systems (buildbot,
swarming).
&mdash; **def [build](/recipes/recipe_modules/cipd/api.py#236)(self, input_dir, output_package, package_name, install_mode=None):**
Builds, but does not upload, a cipd package from a directory.
Args:
input_dir (Path) - the directory to build the package from.
output_package (Path) - the file to write the package to.
package_name (str) - the name of the cipd package as it would appear when
uploaded to the cipd package server.
install_mode (None|'copy'|'symlink') - the mechanism that the cipd client
should use when installing this package. If None, defaults to the
platform default ('copy' on windows, 'symlink' on everything else).
&mdash; **def [create\_from\_pkg](/recipes/recipe_modules/cipd/api.py#340)(self, pkg_def, refs=None, tags=None):**
Builds and uploads a package based on a PackageDefinition object.
This builds and uploads the package in one step.
Args:
pkg_def (PackageDefinition) - The description of the package we want to
create.
refs (list(str)) - A list of ref names to set for the package instance.
tags (dict(str, str)) - A map of tag name -> value to set for the package
instance.
Returns the JSON 'result' section, e.g.: {
"package": "infra/tools/cipd/android-amd64",
"instance_id": "433bfdf86c0bb82d1eee2d1a0473d3709c25d2c4"
}
&mdash; **def [create\_from\_yaml](/recipes/recipe_modules/cipd/api.py#314)(self, pkg_def, refs=None, tags=None, verification_timeout=None):**
Builds and uploads a package based on on-disk YAML package definition
file.
This builds and uploads the package in one step.
Args:
pkg_def (Path) - The path to the yaml file.
refs (list(str)) - A list of ref names to set for the package instance.
tags (dict(str, str)) - A map of tag name -> value to set for the package
instance.
verification_timeout (str) - Duration string that controls the time to
wait for backend-side package hash
verification. Valid time units are "ns",
"us", "ms", "s", "m", "h".
Returns the JSON 'result' section, e.g.: {
"package": "infra/tools/cipd/android-amd64",
"instance_id": "433bfdf86c0bb82d1eee2d1a0473d3709c25d2c4"
}
&emsp; **@property**<br>&mdash; **def [default\_bot\_service\_account\_credentials](/recipes/recipe_modules/cipd/api.py#200)(self):**
&mdash; **def [describe](/recipes/recipe_modules/cipd/api.py#447)(self, package_name, version, test_data_refs=None, test_data_tags=None):**
&mdash; **def [ensure](/recipes/recipe_modules/cipd/api.py#362)(self, root, packages):**
Ensures that packages are installed in a given root dir.
packages must be a mapping from package name to its version, where
* name must be for right platform (see also ``platform_suffix``),
* version could be either instance_id, or ref, or unique tag.
If installing a package requires credentials, call
``set_service_account_credentials`` before calling this function.
&emsp; **@property**<br>&mdash; **def [executable](/recipes/recipe_modules/cipd/api.py#196)(self):**
&mdash; **def [initialize](/recipes/recipe_modules/cipd/api.py#190)(self):**
&mdash; **def [platform\_suffix](/recipes/recipe_modules/cipd/api.py#209)(self, name=None, arch=None, bits=None):**
Use to get full package name that is platform indepdent.
Example:
>>> 'my/package/%s' % api.cipd.platform_suffix()
'my/package/linux-amd64'
Optional platform bits and architecture may be supplied to generate CIPD
suffixes for other platforms. If any are omitted, the current platform
parameters will be used.
&mdash; **def [register](/recipes/recipe_modules/cipd/api.py#264)(self, package_name, package_path, refs=None, tags=None):**
&mdash; **def [search](/recipes/recipe_modules/cipd/api.py#429)(self, package_name, tag):**
&mdash; **def [set\_ref](/recipes/recipe_modules/cipd/api.py#409)(self, package_name, version, refs):**
&mdash; **def [set\_service\_account\_credentials](/recipes/recipe_modules/cipd/api.py#193)(self, path):**
&mdash; **def [set\_tag](/recipes/recipe_modules/cipd/api.py#389)(self, package_name, version, tags):**
### *recipe_modules* / [depot\_tools](/recipes/recipe_modules/depot_tools)
[DEPS](/recipes/recipe_modules/depot_tools/__init__.py#7): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime]
......@@ -1076,20 +954,6 @@ PYTHON_VERSION_COMPATIBILITY: PY2+3
PYTHON_VERSION_COMPATIBILITY: PY2+3
&mdash; **def [RunSteps](/recipes/recipe_modules/bot_update/tests/ensure_checkout.py#16)(api):**
### *recipes* / [cipd:examples/full](/recipes/recipe_modules/cipd/examples/full.py)
[DEPS](/recipes/recipe_modules/cipd/examples/full.py#8): [cipd](#recipe_modules-cipd), [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step]
PYTHON_VERSION_COMPATIBILITY: PY2
&mdash; **def [RunSteps](/recipes/recipe_modules/cipd/examples/full.py#27)(api, use_pkg, pkg_files, pkg_dirs, ver_files, install_mode):**
### *recipes* / [cipd:examples/platform\_suffix](/recipes/recipe_modules/cipd/examples/platform_suffix.py)
[DEPS](/recipes/recipe_modules/cipd/examples/platform_suffix.py#10): [cipd](#recipe_modules-cipd), [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step]
PYTHON_VERSION_COMPATIBILITY: PY2+3
&mdash; **def [RunSteps](/recipes/recipe_modules/cipd/examples/platform_suffix.py#24)(api, arch_override, bits_override, expect_error):**
### *recipes* / [depot\_tools:examples/full](/recipes/recipe_modules/depot_tools/examples/full.py)
[DEPS](/recipes/recipe_modules/depot_tools/examples/full.py#7): [depot\_tools](#recipe_modules-depot_tools), [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step]
......
PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
DEPS = [
'recipe_engine/json',
'recipe_engine/path',
'recipe_engine/platform',
'recipe_engine/properties',
'recipe_engine/python',
'recipe_engine/raw_io',
'recipe_engine/step',
]
This diff is collapsed.
[
{
"cmd": [
"cipd",
"ensure",
"-root",
"[START_DIR]/packages",
"-ensure-file",
"public/package/linux-amd64 7f751b2237df2fdf3c1405be00590fefffbaea2d",
"-json-output",
"/path/to/tmp/json",
"-service-account-json",
"/creds/service_accounts/service-account-cipd-builder.json"
],
"name": "ensure_installed",
"~followup_annotations": [
"@@@STEP_LOG_LINE@json.output@{@@@",
"@@@STEP_LOG_LINE@json.output@ \"result\": [@@@",
"@@@STEP_LOG_LINE@json.output@ {@@@",
"@@@STEP_LOG_LINE@json.output@ \"instance_id\": \"7f751b2237df2fdf3c1405be00590fefffbaea2d\", @@@",
"@@@STEP_LOG_LINE@json.output@ \"package\": \"public/package/linux-amd64\"@@@",
"@@@STEP_LOG_LINE@json.output@ }@@@",
"@@@STEP_LOG_LINE@json.output@ ]@@@",
"@@@STEP_LOG_LINE@json.output@}@@@",
"@@@STEP_LOG_END@json.output@@@"
]
},
{
"cmd": [
"cipd",
"search",
"public/package/linux-amd64",
"-tag",
"git_revision:40-chars-long-hash",
"-json-output",
"/path/to/tmp/json",
"-service-account-json",
"/creds/service_accounts/service-account-cipd-builder.json"
],
"name": "cipd search public/package/linux-amd64 git_revision:40-chars-long-hash",
"~followup_annotations": [
"@@@STEP_LOG_LINE@json.output@{@@@",
"@@@STEP_LOG_LINE@json.output@ \"result\": [@@@",
"@@@STEP_LOG_LINE@json.output@ {@@@",
"@@@STEP_LOG_LINE@json.output@ \"instance_id\": \"40-chars-fake-of-the-package-instance_id\", @@@",
"@@@STEP_LOG_LINE@json.output@ \"package\": \"public/package/linux-amd64\"@@@",
"@@@STEP_LOG_LINE@json.output@ }@@@",
"@@@STEP_LOG_LINE@json.output@ ]@@@",
"@@@STEP_LOG_LINE@json.output@}@@@",
"@@@STEP_LOG_END@json.output@@@"
]
},
{
"cmd": [
"cipd",
"describe",
"public/package/linux-amd64",
"-version",
"40-chars-fake-of-the-package-instance_id",
"-json-output",
"/path/to/tmp/json",
"-service-account-json",
"/creds/service_accounts/service-account-cipd-builder.json"
],
"name": "cipd describe public/package/linux-amd64",
"~followup_annotations": [
"@@@STEP_LOG_LINE@json.output@{@@@",
"@@@STEP_LOG_LINE@json.output@ \"error\": \"package \\\"public/package/linux-amd64-ubuntu14_04\\\" not registered\", @@@",
"@@@STEP_LOG_LINE@json.output@ \"result\": null@@@",
"@@@STEP_LOG_LINE@json.output@}@@@",
"@@@STEP_LOG_END@json.output@@@",
"@@@STEP_FAILURE@@@"
]
},
{
"failure": {
"failure": {},
"humanReason": "Step('cipd describe public/package/linux-amd64') (retcode: 1)"
},
"name": "$result"
}
]
\ No newline at end of file
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from recipe_engine.config import List, Single, ConfigList, ConfigGroup
from recipe_engine.recipe_api import Property
DEPS = [
'recipe_engine/path',
'recipe_engine/platform',
'recipe_engine/properties',
'recipe_engine/step',
'cipd',
]
PROPERTIES = {
'use_pkg': Property(default=False, kind=bool),
'pkg_files': Property(default=(), kind=List(str)),
'pkg_dirs': Property(default=(), kind=ConfigList(lambda: ConfigGroup(
path=Single(str),
exclusions=List(str),
))),
'ver_files': Property(default=(), kind=List(str)),
'install_mode': Property(default=None),
}
def RunSteps(api, use_pkg, pkg_files, pkg_dirs, ver_files, install_mode):
# Need to set service account credentials.
api.cipd.set_service_account_credentials(
api.cipd.default_bot_service_account_credentials)
package_name = 'public/package/%s' % api.cipd.platform_suffix()
package_instance_id = '7f751b2237df2fdf3c1405be00590fefffbaea2d'
packages = {package_name: package_instance_id}
cipd_root = api.path['start_dir'].join('packages')
# Some packages don't require credentials to be installed or queried.
api.cipd.ensure(cipd_root, packages)
step = api.cipd.search(package_name, tag='git_revision:40-chars-long-hash')
api.cipd.describe(package_name,
version=step.json.output['result'][0]['instance_id'])
# Others do, so provide creds first.
api.cipd.set_service_account_credentials('fake-credentials.json')
private_package_name = 'private/package/%s' % api.cipd.platform_suffix()
packages[private_package_name] = 'latest'
api.cipd.ensure(cipd_root, packages)
step = api.cipd.search(private_package_name, tag='key:value')
api.cipd.describe(private_package_name,
version=step.json.output['result'][0]['instance_id'],
test_data_tags=['custom:tagged', 'key:value'],
test_data_refs=['latest'])
# The rest of commands expect credentials to be set.
# Build & register new package version.
api.cipd.build('fake-input-dir', 'fake-package-path', 'infra/fake-package')
api.cipd.build('fake-input-dir', 'fake-package-path', 'infra/fake-package',
install_mode='copy')
api.cipd.register('infra/fake-package', 'fake-package-path',
refs=['fake-ref-1', 'fake-ref-2'],
tags={'fake_tag_1': 'fake_value_1',
'fake_tag_2': 'fake_value_2'})
# Create (build & register).
if use_pkg:
root = api.path['start_dir'].join('some_subdir')
pkg = api.cipd.PackageDefinition('infra/fake-package', root, install_mode)
for fullpath in pkg_files:
pkg.add_file(api.path.abs_to_path(fullpath))
pkg.add_dir(root)
for obj in pkg_dirs:
pkg.add_dir(api.path.abs_to_path(obj.get('path', '')),
obj.get('exclusions'))
for pth in ver_files:
pkg.add_version_file(pth)
api.cipd.create_from_pkg(pkg,
refs=['fake-ref-1', 'fake-ref-2'],
tags={'fake_tag_1': 'fake_value_1',
'fake_tag_2': 'fake_value_2'})
else:
api.cipd.create_from_yaml(api.path['start_dir'].join('fake-package.yaml'),
refs=['fake-ref-1', 'fake-ref-2'],
tags={'fake_tag_1': 'fake_value_1',
'fake_tag_2': 'fake_value_2'},
verification_timeout='10m')
# Set tag or ref of an already existing package.
api.cipd.set_tag('fake-package',
version='long/weird/ref/which/doesn/not/fit/into/40chars',
tags={'dead': 'beaf', 'more': 'value'})
api.cipd.set_ref('fake-package', version='latest', refs=['any', 'some'])
# Search by the new tag.
api.cipd.search('fake-package/%s' % api.cipd.platform_suffix(),
tag='dead:beaf')
def GenTests(api):
yield (
# This is very common dev workstation, but not all devs are on it.
api.test('basic')
+ api.platform('linux', 64)
)
yield (
api.test('mac64')
+ api.platform('mac', 64)
)
yield (
api.test('win64')
+ api.platform('win', 64)
)
yield (
api.test('describe-failed')
+ api.platform('linux', 64)
+ api.override_step_data(
'cipd describe public/package/linux-amd64',
api.cipd.example_error(
'package "public/package/linux-amd64-ubuntu14_04" not registered',
))
)
yield (
api.test('describe-many-instances')
+ api.platform('linux', 64)
+ api.override_step_data(
'cipd search fake-package/linux-amd64 dead:beaf',
api.cipd.example_search(
'public/package/linux-amd64-ubuntu14_04',
instances=3
))
)
yield (
api.test('basic_pkg')
+ api.properties(
use_pkg=True,
pkg_files=[
'[START_DIR]/some_subdir/a/path/to/file.py',
'[START_DIR]/some_subdir/some_config.cfg',
],
pkg_dirs=[
{
'path': '[START_DIR]/some_subdir/directory',
},
{
'path': '[START_DIR]/some_subdir/other_dir',
'exclusions': [
r'.*\.pyc',
]
},
],
ver_file=['.versions/file.cipd_version'],
)
)
yield (
api.test('pkg_bad_verfile')
+ api.properties(
use_pkg=True,
ver_files=['a', 'b'],
)
+ api.expect_exception('ValueError')
)
yield (
api.test('pkg_bad_mode')
+ api.properties(
use_pkg=True,
install_mode='',
)
+ api.expect_exception('ValueError')
)
yield (
api.test('pkg_bad_file')
+ api.properties(
use_pkg=True,
pkg_files=[
'[START_DIR]/a/path/to/file.py',
],
)
+ api.expect_exception('ValueError')
)
[
{
"cmd": [
"echo",
"linux-armv6"
],
"name": "platform_suffix"
},
{
"name": "$result"
}
]
\ No newline at end of file
[
{
"cmd": [
"echo",
"linux-arm64"
],
"name": "platform_suffix"
},
{
"name": "$result"
}
]
\ No newline at end of file
[
{
"cmd": [
"echo",
"linux-386"
],
"name": "platform_suffix"
},
{
"name": "$result"
}
]
\ No newline at end of file
[
{
"cmd": [
"echo",
"linux-amd64"
],
"name": "platform_suffix"
},
{
"name": "$result"
}
]
\ No newline at end of file
[
{
"cmd": [
"echo",
"linux-mips64"
],
"name": "platform_suffix"
},
{
"name": "$result"
}
]
\ No newline at end of file
[
{
"cmd": [
"echo",
"mac-amd64"
],
"name": "platform_suffix"
},
{
"name": "$result"
}
]
\ No newline at end of file
[
{
"cmd": [
"echo",
"windows-386"
],
"name": "platform_suffix"
},
{
"name": "$result"
}
]
\ No newline at end of file
[
{
"cmd": [
"echo",
"windows-amd64"
],
"name": "platform_suffix"
},
{
"name": "$result"
}
]
\ No newline at end of file
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from recipe_engine.config import List, Single, ConfigList, ConfigGroup
from recipe_engine.recipe_api import Property
PYTHON_VERSION_COMPATIBILITY = 'PY2+3'
DEPS = [
'recipe_engine/path',
'recipe_engine/platform',
'recipe_engine/properties',
'recipe_engine/step',
'cipd',
]
PROPERTIES = {
'arch_override': Property(kind=str, default=None),
'bits_override': Property(kind=int, default=None),
'expect_error': Property(kind=bool, default=False),
}
def RunSteps(api, arch_override, bits_override, expect_error):
was_error = False
try:
api.step('platform_suffix', ['echo', api.cipd.platform_suffix(
arch=arch_override,
bits=bits_override,
)])
except KeyError:
was_error = True
assert was_error == expect_error
def GenTests(api):
for name, arch, bits in (
('linux', 'intel', 32),
('linux', 'intel', 64),
('linux', 'mips', 64),
('linux', 'arm', 32),
('linux', 'arm', 64),
('mac', 'intel', 64),
('win', 'intel', 32),
('win', 'intel', 64)):
test = (
api.test('%s_%s_%d' % (name, arch, bits)) +
api.platform(name, bits)
)
if arch != 'intel':
test += api.properties(arch_override=arch)
yield test
yield (
api.test('junk arch') +
api.properties(arch_override='pants', expect_error=True))
yield (
api.test('junk bits') +
api.properties(bits_override=42, expect_error=True))
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from recipe_engine import recipe_test_api
class CIPDTestApi(recipe_test_api.RecipeTestApi):
def make_resolved_version(self, v):
if not v:
return '40-chars-fake-of-the-package-instance_id'
if len(v) == 40:
return v
# Truncate or pad to 40 chars.
prefix = 'resolved-instance_id-of-'
if len(v) + len(prefix) >= 40:
return '%s%s' % (prefix, v[:40-len(prefix)])
return '%s%s%s' % (prefix, v, '-' * (40 - len(prefix) - len(v)))
def make_pin(self, package_name, version=None):
return {
'package': package_name.replace('${platform}', 'resolved-platform'),
'instance_id': self.make_resolved_version(version),
}
def _resultify(self, result, error=None, retcode=None):
dic = {'result': result}
if error:
dic['error'] = error
return self.m.json.output(dic, retcode=retcode)
def example_error(self, error, retcode=None):
return self._resultify(
result=None,
error=error,
retcode=1 if retcode is None else retcode)
def example_build(self, package_name, version=None):
return self._resultify(self.make_pin(package_name, version))
example_register = example_build
def example_ensure(self, packages):
return self._resultify([self.make_pin(name, version)
for name, version in sorted(packages.items())])
def example_set_tag(self, package_name, version):
return self._resultify({
'package': package_name,
'pin': self.make_pin(package_name, version)
})
example_set_ref = example_set_tag
def example_search(self, package_name, instances=None):
if instances is None:
# Return one instance by default.
return self._resultify([self.make_pin(package_name)])
if isinstance(instances, int):
instances = ['instance_id_%i' % (i+1) for i in range(instances)]
return self._resultify([self.make_pin(package_name, instance)
for instance in instances])
def example_describe(self, package_name, version=None,
test_data_refs=None, test_data_tags=None,
user='user:44-blablbla@developer.gserviceaccount.com',
tstamp=1446574210):
assert not test_data_tags or all(':' in tag for tag in test_data_tags)
return self._resultify({
'pin': self.make_pin(package_name, version),
'registered_by': user,
'registered_ts': tstamp,
'refs': [
{
'ref': ref,
'modified_by': user,
'modified_ts': tstamp,
}
for ref in (['latest'] if test_data_refs is None else test_data_refs)
],
'tags': [
{
'tag': tag,
'registered_by': user,
'registered_ts': tstamp,
}
for tag in ([
'buildbot_build:some.waterfall/builder/1234',
'git_repository:https://chromium.googlesource.com/some/repo',
'git_revision:397a2597cdc237f3026e6143b683be4b9ab60540',
] if test_data_tags is None else test_data_tags)
],
})
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment