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