blob: 74d0ceca2d0da750230d95684481765c51e10343 [file] [log] [blame]
Oleh Prypin1a0593f2019-03-11 09:43:28 +01001#!/usr/bin/env lucicfg
2
3# Copyright (c) 2019 The WebRTC project authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7# https://chromium.googlesource.com/infra/luci/luci-go/+/master/lucicfg/doc/
8
9WEBRTC_GIT = "https://webrtc.googlesource.com/src"
10WEBRTC_GERRIT = "https://webrtc-review.googlesource.com/src"
11
12# Top-level configs:
13
14lucicfg.config(
15 config_dir = ".",
16 tracked_files = [
17 "commit-queue.cfg",
18 "cr-buildbucket.cfg",
19 "luci-logdog.cfg",
20 "luci-milo.cfg",
Oleh Prypin71d17422019-03-28 08:43:16 +010021 "luci-notify.cfg",
Oleh Prypin705b6a62019-04-03 23:10:51 +020022 "luci-notify/**/*",
Oleh Prypin1a0593f2019-03-11 09:43:28 +010023 "luci-scheduler.cfg",
24 "project.cfg",
25 ],
26)
27
28luci.project(
29 name = "webrtc",
30 buildbucket = "cr-buildbucket.appspot.com",
31 logdog = "luci-logdog.appspot.com",
32 milo = "luci-milo.appspot.com",
Oleh Prypin71d17422019-03-28 08:43:16 +010033 notify = "luci-notify.appspot.com",
Oleh Prypin1a0593f2019-03-11 09:43:28 +010034 scheduler = "luci-scheduler.appspot.com",
35 swarming = "chromium-swarm.appspot.com",
36 acls = [
37 acl.entry(
38 [acl.BUILDBUCKET_READER, acl.LOGDOG_READER, acl.PROJECT_CONFIGS_READER, acl.SCHEDULER_READER],
39 groups = ["all"],
40 ),
41 acl.entry(acl.LOGDOG_WRITER, groups = ["luci-logdog-chromium-writers"]),
42 acl.entry(acl.SCHEDULER_OWNER, groups = ["project-webrtc-admins"]),
43 ],
44)
45
46luci.logdog(
47 gs_bucket = "chromium-luci-logdog",
48)
49
50luci.milo(
51 logo = "https://storage.googleapis.com/chrome-infra/webrtc-logo-vert-retro-255x305.png",
52)
53
54luci.cq(
55 status_host = "chromium-cq-status.appspot.com",
56 submit_max_burst = 1,
57 submit_burst_delay = 1 * time.minute,
58)
59
60luci.gitiles_poller(
61 name = "webrtc-gitiles-trigger-master",
62 bucket = "ci",
63 repo = WEBRTC_GIT,
64)
65
66# Bucket definitions:
67
68luci.bucket(
69 name = "try",
70 acls = [
71 acl.entry(acl.BUILDBUCKET_TRIGGERER, groups = [
72 "service-account-cq",
73 "project-webrtc-tryjob-access",
74 ]),
75 ],
76)
77
78luci.bucket(
79 name = "ci",
80 acls = [
81 acl.entry(acl.BUILDBUCKET_TRIGGERER, users = [
82 "luci-scheduler@appspot.gserviceaccount.com",
83 ]),
84 ],
85)
86
87luci.bucket(
88 name = "perf",
89 acls = [
90 acl.entry(acl.BUILDBUCKET_TRIGGERER, users = [
91 "luci-scheduler@appspot.gserviceaccount.com",
92 "webrtc-ci-builder@chops-service-accounts.iam.gserviceaccount.com",
93 ]),
94 ],
95)
96
97luci.bucket(
98 name = "cron",
99 acls = [
100 acl.entry(acl.BUILDBUCKET_TRIGGERER, users = [
101 "luci-scheduler@appspot.gserviceaccount.com",
102 ]),
103 ],
104)
105
106# Commit queue definitions:
107
108luci.cq_group(
109 name = "cq",
110 tree_status_host = "webrtc-status.appspot.com",
111 watch = [cq.refset(
112 repo = WEBRTC_GERRIT,
113 refs = ["refs/heads/master", "refs/branch-heads/.+"],
114 )],
115 acls = [
116 acl.entry(acl.CQ_COMMITTER, groups = ["project-webrtc-committers"]),
117 acl.entry(acl.CQ_DRY_RUNNER, groups = ["project-webrtc-tryjob-access"]),
118 ],
119 retry_config = cq.RETRY_ALL_FAILURES,
120)
121
122luci.cq_group(
123 name = "infra_cq",
124 watch = [cq.refset(
125 repo = WEBRTC_GERRIT,
126 refs = ["refs/heads/infra/config"],
127 )],
128 acls = [
129 acl.entry(acl.CQ_COMMITTER, groups = ["project-webrtc-admins"]),
130 acl.entry(acl.CQ_DRY_RUNNER, groups = ["project-webrtc-tryjob-access"]),
131 ],
132 retry_config = cq.RETRY_ALL_FAILURES,
133)
134
135luci.cq_tryjob_verifier(
136 builder = "presubmit",
137 cq_group = "infra_cq",
138)
139
Oleh Prypin71d17422019-03-28 08:43:16 +0100140# Notifier definitions:
141
142luci.notifier(
143 name = "ci_notifier",
144 on_failure = True,
145 notify_emails = ["webrtc-sheriffs-robots@google.com"],
Oleh Prypin705b6a62019-04-03 23:10:51 +0200146 template = luci.notifier_template(
147 name = "ci",
148 body = io.read_file("luci-notify/email-templates/ci.template"),
149 ),
Oleh Prypin71d17422019-03-28 08:43:16 +0100150)
151
152luci.notifier(
153 name = "cron_notifier",
154 on_failure = True,
155 notify_emails = ["webrtc-troopers-robots@google.com"],
Oleh Prypin705b6a62019-04-03 23:10:51 +0200156 template = luci.notifier_template(
157 name = "cron",
158 body = io.read_file("luci-notify/email-templates/cron.template"),
159 ),
Oleh Prypin71d17422019-03-28 08:43:16 +0100160)
161
Oleh Prypin1a0593f2019-03-11 09:43:28 +0100162# Recipe definitions:
163
164def recipe(recipe, pkg = "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"):
165 return luci.recipe(
166 name = recipe.split("/")[-1],
167 cipd_package = pkg,
168 cipd_version = "refs/heads/master",
169 recipe = recipe,
170 )
171
172recipe("chromium_trybot")
173recipe("run_presubmit")
174recipe("webrtc/auto_roll_webrtc_deps")
175recipe("webrtc/ios")
176recipe("webrtc/ios_api_framework")
177recipe("webrtc/libfuzzer")
178recipe("webrtc/more_configs")
179recipe("webrtc/noop")
180recipe("webrtc/standalone")
181recipe("lkgr_finder", pkg = "infra/recipe_bundles/chromium.googlesource.com/infra/infra")
182
183# Console definitions:
184
185luci.console_view(name = "ci", title = "Main", repo = WEBRTC_GIT, header = "console-header.textpb")
186luci.console_view(name = "perf", title = "Perf", repo = WEBRTC_GIT, header = "console-header.textpb")
187luci.list_view(name = "cron", title = "Cron")
188luci.console_view(name = "fyi", title = "FYI", repo = WEBRTC_GIT, header = "console-header.textpb")
189luci.list_view(name = "try", title = "Tryserver")
190
191def add_milo(builder, views):
192 """Add Milo console entries for the builder.
193
194 Args:
195 builder: builder name (str).
196 views: dict where keys are names of consoles and values are either a
197 category for the console (str, pipe-separated) or True, which means
198 adding to a list view rather than a console.
199 """
200 for view_name, category in views.items():
201 if category == None:
202 continue
203 elif type(category) == "string":
204 category, _, short_name = category.rpartition("|")
205 luci.console_view_entry(
206 console_view = view_name,
207 builder = builder,
208 category = category or None,
209 short_name = short_name or None,
210 )
211 elif category == True:
212 luci.list_view_entry(
213 list_view = view_name,
214 builder = builder,
215 )
216 else:
217 fail("Unexpected value for category: %r" % category)
218
219# Builder-defining functions:
220
221def webrtc_builder(name, recipe = "standalone", dimensions = {}, priority = 30, **kwargs):
222 dimensions = merge_dicts({"cpu": "x86-64"}, dimensions)
223
224 return luci.builder(
225 name = name,
Oleh Prypin705b6a62019-04-03 23:10:51 +0200226 executable = recipe,
Oleh Prypin1a0593f2019-03-11 09:43:28 +0100227 dimensions = {k: v for k, v in dimensions.items() if v != None},
228 execution_timeout = 2 * time.hour,
229 priority = priority,
230 build_numbers = True,
231 swarming_tags = ["vpython:native-python-wrapper"],
232 **kwargs
233 )
234
235def ci_builder(
236 name,
237 ci_cat,
238 perf_cat = None,
239 fyi_cat = None,
240 properties = {},
241 dimensions = {},
242 prioritized = False,
Oleh Prypinf5432c52019-03-19 15:10:37 +0100243 enabled = True,
Oleh Prypin1a0593f2019-03-11 09:43:28 +0100244 **kwargs):
245 if prioritized:
246 kwargs["triggering_policy"] = scheduler.greedy_batching(
247 max_batch_size = 1,
248 max_concurrent_invocations = 3,
249 )
250 kwargs["priority"] = 29
251
Oleh Prypinf5432c52019-03-19 15:10:37 +0100252 if enabled:
253 add_milo(name, {"ci": ci_cat, "perf": perf_cat, "fyi": fyi_cat})
Oleh Prypin1a0593f2019-03-11 09:43:28 +0100254 return webrtc_builder(
255 name = name,
256 properties = merge_dicts({"mastername": "client.webrtc"}, properties),
257 dimensions = merge_dicts({"pool": "luci.webrtc.ci"}, dimensions),
258 bucket = "ci",
259 service_account = "webrtc-ci-builder@chops-service-accounts.iam.gserviceaccount.com",
Oleh Prypinf5432c52019-03-19 15:10:37 +0100260 triggered_by = ["webrtc-gitiles-trigger-master"] if enabled else None,
Oleh Prypin71d17422019-03-28 08:43:16 +0100261 repo = WEBRTC_GIT,
262 notifies = ["ci_notifier"] if enabled else None,
Oleh Prypin1a0593f2019-03-11 09:43:28 +0100263 **kwargs
264 )
265
266def try_builder(
267 name,
268 try_cat = True,
269 fyi_cat = None,
270 properties = {},
271 dimensions = {},
272 cq = {},
273 **kwargs):
274 add_milo(name, {"try": try_cat, "fyi": fyi_cat})
275 if cq != None:
276 luci.cq_tryjob_verifier(
277 builder = name,
278 cq_group = "cq",
279 **cq
280 )
281
282 return webrtc_builder(
283 name = name,
284 properties = merge_dicts({"mastername": "tryserver.webrtc"}, properties),
285 dimensions = merge_dicts({"pool": "luci.webrtc.try"}, dimensions),
286 bucket = "try",
287 service_account = "webrtc-try-builder@chops-service-accounts.iam.gserviceaccount.com",
288 **kwargs
289 )
290
291def perf_builder(
292 name,
293 perf_cat,
294 recipe = "standalone",
295 properties = {},
296 dimensions = {},
297 **kwargs):
298 add_milo(name, {"perf": perf_cat})
299 return webrtc_builder(
300 name = name,
301 recipe = recipe,
302 properties = merge_dicts({"mastername": "client.webrtc.perf"}, properties),
303 dimensions = merge_dicts({"pool": "luci.webrtc.perf", "os": "Linux", "cpu": None}, dimensions),
304 bucket = "perf",
305 service_account = "webrtc-ci-builder@chops-service-accounts.iam.gserviceaccount.com",
306 # log_base of 1.7 means:
307 # when there are P pending builds, LUCI will batch the first B builds.
308 # P: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
309 # B: 1 1 2 2 3 3 3 3 4 4 4 4 4 4 5 ...
310 triggering_policy = scheduler.logarithmic_batching(log_base = 17 / 10),
311 **kwargs
312 )
313
314def cron_builder(name, dimensions = {}, **kwargs):
315 add_milo(name, {"cron": True})
316 return webrtc_builder(
317 name = name,
318 dimensions = merge_dicts({"pool": "luci.webrtc.cron", "os": "Linux"}, dimensions),
319 bucket = "cron",
320 service_account = "chromium-webrtc-autoroll@webrtc-ci.iam.gserviceaccount.com",
Oleh Prypin71d17422019-03-28 08:43:16 +0100321 repo = WEBRTC_GIT,
322 notifies = ["cron_notifier"],
Oleh Prypin1a0593f2019-03-11 09:43:28 +0100323 **kwargs
324 )
325
326# Helpers:
327
328def merge_dicts(a, b):
329 """Return the result of merging two dicts.
330
331 If matching values are both dicts or both lists, they will be merged (non-recursively).
332
333 Args:
334 a: first dict.
335 b: second dict (takes priority).
336 Returns:
337 Merged dict.
338 """
339 a = dict(a)
340 for k, bv in b.items():
341 av = a.get(k)
342 if type(av) == "dict" and type(bv) == "dict":
343 a[k] = dict(av)
344 a[k].update(bv)
345 elif type(av) == "list" and type(bv) == "list":
346 a[k] = av + bv
347 else:
348 a[k] = bv
349 return a
350
351def normal_builder_factory(**common_kwargs):
352 def builder(*args, **kwargs):
353 return ci_builder(*args, **merge_dicts(common_kwargs, kwargs))
354
355 def try_job(*args, **kwargs):
356 return try_builder(*args, **merge_dicts(common_kwargs, kwargs))
357
358 return builder, try_job
359
360# Mixins:
361
362linux_builder, linux_try_job = normal_builder_factory(
363 dimensions = {"os": "Linux", "inside_docker": "0"},
364)
365
366android_builder, android_try_job = normal_builder_factory(
367 dimensions = {"os": "Linux"},
368)
369
370win_builder, win_try_job = normal_builder_factory(
371 dimensions = {"os": "Windows"},
372)
373
374mac_builder, mac_try_job = normal_builder_factory(
375 dimensions = {"os": "Mac"},
376)
377
378ios_builder, ios_try_job = normal_builder_factory(
379 dimensions = {"os": "Mac-10.13"},
380 recipe = "ios",
381 properties = {"$depot_tools/osx_sdk": {"sdk_version": "10l232m"}},
382 caches = [swarming.cache("osx_sdk")],
383)
384
385# Actual builder configuration:
386
387android_builder("Android32 (M Nexus5X)(dbg)", "Android|arm|dbg")
388android_try_job("android_compile_arm_dbg", cq = None)
389android_try_job("android_arm_dbg")
390android_builder("Android32 (M Nexus5X)", "Android|arm|rel")
391android_try_job("android_arm_rel")
392android_builder("Android32 Builder arm", "Android|arm|size", perf_cat = "Android|arm|Builder|", prioritized = True)
393android_try_job("android_compile_arm_rel")
394perf_builder("Perf Android32 (L Nexus4)", "Android|arm|Tester|L Nexus4", triggered_by = ["Android32 Builder arm"])
395perf_builder("Perf Android32 (K Nexus5)", "Android|arm|Tester|K Nexus5", triggered_by = ["Android32 Builder arm"])
396perf_builder("Perf Android32 (L Nexus5)", "Android|arm|Tester|L Nexus5", triggered_by = ["Android32 Builder arm"])
397perf_builder("Perf Android32 (L Nexus6)", "Android|arm|Tester|L Nexus6", triggered_by = ["Android32 Builder arm"])
398perf_builder("Perf Android32 (L Nexus7.2)", "Android|arm|Tester|L Nexus7.2", triggered_by = ["Android32 Builder arm"])
399perf_builder("Perf Android32 (N Nexus6)", "Android|arm|Tester|N Nexus6", triggered_by = ["Android32 Builder arm"])
400android_builder("Android64 (M Nexus5X)(dbg)", "Android|arm64|dbg")
401android_try_job("android_compile_arm64_dbg", cq = None)
402android_try_job("android_arm64_dbg", cq = None)
403android_builder("Android64 (M Nexus5X)", "Android|arm64|rel")
404android_try_job("android_arm64_rel")
405android_builder("Android64 Builder arm64", "Android|arm64|size", perf_cat = "Android|arm64|Builder|", prioritized = True)
406android_try_job("android_compile_arm64_rel")
407perf_builder("Perf Android64 (L Nexus9)", "Android|arm64|Tester|L Nexus9", triggered_by = ["Android64 Builder arm64"])
408perf_builder("Perf Android64 (N Pixel)", "Android|arm64|Tester|N Pixel", triggered_by = ["Android64 Builder arm64"])
409android_builder("Android64 Builder x64 (dbg)", "Android|x64|dbg")
410android_try_job("android_compile_x64_dbg")
411android_try_job("android_compile_x64_rel", cq = None)
412android_builder("Android32 Builder x86 (dbg)", "Android|x86|dbg")
413android_try_job("android_compile_x86_dbg")
414android_builder("Android32 Builder x86", "Android|x86|rel")
415android_try_job("android_compile_x86_rel")
416android_builder("Android32 (more configs)", "Android|arm|more", recipe = "more_configs")
417android_try_job("android_arm_more_configs", recipe = "more_configs")
418android_try_job("android_chromium_compile", recipe = "chromium_trybot")
419
420ios_builder("iOS32 Debug", "iOS|arm|dbg")
421ios_try_job("ios_compile_arm_dbg")
422ios_builder("iOS32 Release", "iOS|arm|rel")
423ios_try_job("ios_compile_arm_rel")
424ios_builder("iOS64 Debug", "iOS|arm64|dbg")
425ios_try_job("ios_compile_arm64_dbg")
426ios_builder("iOS64 Release", "iOS|arm64|rel")
427ios_try_job("ios_compile_arm64_rel")
428ios_builder("iOS64 Sim Debug (iOS 10.0)", "iOS|x64|10")
429ios_try_job("ios_sim_x64_dbg_ios10")
430ios_builder("iOS64 Sim Debug (iOS 11)", "iOS|x64|11")
431ios_try_job("ios_sim_x64_dbg_ios11")
432ios_builder("iOS64 Sim Debug (iOS 12)", "iOS|x64|12")
433ios_try_job("ios_sim_x64_dbg_ios12")
434ios_builder("iOS API Framework Builder", "iOS|fat|size", recipe = "ios_api_framework", prioritized = True)
435ios_try_job("ios_api_framework", recipe = "ios_api_framework")
436
437linux_builder("Linux32 Debug", "Linux|x86|dbg")
438linux_try_job("linux_x86_dbg")
439linux_builder("Linux32 Release", "Linux|x86|rel")
440linux_try_job("linux_x86_rel")
441linux_builder("Linux64 Debug", "Linux|x64|dbg")
442linux_try_job("linux_dbg", cq = None)
443linux_try_job("linux_compile_dbg")
444linux_builder("Linux64 Release", "Linux|x64|rel")
445linux_try_job("linux_rel")
446linux_builder("Linux64 Builder", "Linux|x64|size", perf_cat = "Linux|x64|Builder|", prioritized = True)
447linux_try_job("linux_compile_rel")
448perf_builder("Perf Linux Trusty", "Linux|x64|Tester|Trusty", triggered_by = ["Linux64 Builder"])
449linux_builder("Linux32 Debug (ARM)", "Linux|arm|dbg")
450linux_try_job("linux_compile_arm_dbg")
451linux_builder("Linux32 Release (ARM)", "Linux|arm|rel")
452linux_try_job("linux_compile_arm_rel")
453linux_builder("Linux64 Debug (ARM)", "Linux|arm64|dbg")
454linux_try_job("linux_compile_arm64_dbg")
455linux_builder("Linux64 Release (ARM)", "Linux|arm64|rel")
456linux_try_job("linux_compile_arm64_rel")
457linux_builder("Linux64 Release (GCC)", "Linux|x64|gcc")
458linux_try_job("linux_compile_gcc_rel")
459linux_builder("Linux Asan", "Linux|x64|asan")
460linux_try_job("linux_asan")
461linux_builder("Linux MSan", "Linux|x64|msan")
462linux_try_job("linux_msan")
463linux_builder("Linux Tsan v2", "Linux|x64|tsan")
464linux_try_job("linux_tsan2")
465linux_builder("Linux UBSan", "Linux|x64|ubsan")
466linux_try_job("linux_ubsan")
467linux_builder("Linux UBSan vptr", "Linux|x64|ubsan")
468linux_try_job("linux_ubsan_vptr")
469linux_builder("Linux64 Release (Libfuzzer)", "Linux|x64|fuzz", recipe = "libfuzzer")
470linux_try_job("linux_libfuzzer_rel", recipe = "libfuzzer")
471linux_builder("Linux (more configs)", "Linux|x64|more", recipe = "more_configs")
472linux_try_job("linux_more_configs", recipe = "more_configs")
473linux_try_job("linux_chromium_compile", recipe = "chromium_trybot")
474
475mac_builder("Mac64 Debug", "Mac|x64|dbg")
476mac_try_job("mac_dbg", cq = None)
477mac_try_job("mac_compile_dbg")
478mac_builder("Mac64 Release", "Mac|x64|rel")
479mac_try_job("mac_rel")
480mac_try_job("mac_compile_rel", cq = None)
481mac_builder("Mac64 Builder", ci_cat = None, perf_cat = "Mac|x64|Builder|")
482perf_builder("Perf Mac 10.11", "Mac|x64|Tester|10.11", triggered_by = ["Mac64 Builder"])
483mac_builder("Mac Asan", "Mac|x64|asan")
484mac_try_job("mac_asan")
485mac_try_job("mac_chromium_compile", recipe = "chromium_trybot", dimensions = {"cores": "8"})
486
487win_builder("Win32 Debug", "Win MSVC|x86|dbg")
488win_try_job("win_x86_msvc_dbg")
489win_try_job("win_compile_x86_msvc_dbg", cq = None)
Oleh Prypin63041b82019-03-19 22:56:01 +0000490win_builder("Win32 Release", "Win MSVC|x86|rel")
491win_try_job("win_x86_msvc_rel")
Oleh Prypin1a0593f2019-03-11 09:43:28 +0100492win_try_job("win_compile_x86_msvc_rel", cq = None)
493win_builder("Win64 Debug", "Win MSVC|x64|dbg")
494win_try_job("win_x64_msvc_dbg")
495win_try_job("win_compile_x64_msvc_dbg", cq = None)
496win_builder("Win64 Release", "Win MSVC|x64|rel")
497win_try_job("win_x64_msvc_rel")
498win_try_job("win_compile_x64_msvc_rel", cq = None)
499win_builder("Win32 Debug (Clang)", "Win Clang|x86|dbg")
500win_try_job("win_x86_clang_dbg", cq = None)
501win_try_job("win_compile_x86_clang_dbg")
502win_builder("Win32 Release (Clang)", "Win Clang|x86|rel")
503win_try_job("win_x86_clang_rel")
504win_try_job("win_compile_x86_clang_rel", cq = None)
505win_builder("Win32 Builder (Clang)", ci_cat = None, perf_cat = "Win|x86|Builder|")
506perf_builder("Perf Win7", "Win|x86|Tester|7", triggered_by = ["Win32 Builder (Clang)"])
507win_builder("Win64 Debug (Clang)", "Win Clang|x64|dbg")
508win_try_job("win_x64_clang_dbg", cq = None)
509win_try_job("win_x64_clang_dbg_win8", cq = None)
510win_try_job("win_x64_clang_dbg_win10", cq = None)
511win_try_job("win_compile_x64_clang_dbg")
512win_builder("Win64 Release (Clang)", "Win Clang|x64|rel")
513win_try_job("win_x64_clang_rel", cq = None)
514win_try_job("win_compile_x64_clang_rel")
515win_builder("Win32 ASan", "Win Clang|x86|asan")
516win_try_job("win_asan")
517win_builder("Win64 UWP", ci_cat = None, fyi_cat = "")
518win_try_job("win_x64_uwp", cq = None, try_cat = None, fyi_cat = "")
519win_builder("Win (more configs)", "Win Clang|x86|more", recipe = "more_configs")
520win_try_job("win_x86_more_configs", recipe = "more_configs")
521win_try_job("win_chromium_compile", recipe = "chromium_trybot")
522
523linux_try_job(
524 "presubmit",
525 recipe = "run_presubmit",
526 properties = {"repo_name": "webrtc", "runhooks": True},
527 priority = 28,
528 cq = {"disable_reuse": True},
529)
530linux_try_job("noop", recipe = "noop", cq = {
531 "equivalent_builder": "external/*/g3.webrtc-internal.try/internal_compile_lite",
532 "equivalent_builder_percentage": 100,
533 "equivalent_builder_whitelist": "project-webrtc-internal-tryjob-access",
534})
535
536cron_builder(
537 "Auto-roll - WebRTC DEPS",
538 recipe = "auto_roll_webrtc_deps",
539 schedule = "0 */1 * * *", # Hourly.
540)
541cron_builder(
542 "WebRTC lkgr finder",
543 recipe = "lkgr_finder",
544 properties = {"lkgr_project": "webrtc", "allowed_lag": 4},
545 schedule = "*/10 * * * *", # Every 10 minutes.
546)