blob: f326f03bcf6553e4e02f96280aa92d8b34117ce1 [file] [log] [blame]
lucicfg.config(config_dir = ".output")
lucicfg.config(tracked_files = ["*.cfg"])
lucicfg.config(fail_on_warnings = True)
luci.project(
name = "infra",
buildbucket = "cr-buildbucket.appspot.com",
logdog = "luci-logdog.appspot.com",
milo = "luci-milo.appspot.com",
notify = "luci-notify.appspot.com",
scheduler = "luci-scheduler.appspot.com",
swarming = "chromium-swarm.appspot.com",
tricium = "tricium-prod.appspot.com",
acls = [
acl.entry(
roles = [
acl.PROJECT_CONFIGS_READER,
acl.LOGDOG_READER,
acl.BUILDBUCKET_READER,
acl.SCHEDULER_READER,
],
groups = ["all"],
),
acl.entry(
roles = [
acl.BUILDBUCKET_OWNER,
acl.SCHEDULER_OWNER,
acl.CQ_COMMITTER,
],
groups = ["admins"],
),
],
)
luci.logdog(
gs_bucket = "chromium-luci-logdog",
cloud_logging_project = "chromium-build-logs",
)
luci.milo(
logo = "https://storage.googleapis.com/chrome-infra-public/logo/chrome-infra-logo-200x200.png",
favicon = "https://storage.googleapis.com/chrome-infra-public/logo/favicon.ico",
bug_url_template = "https://bugs.chromium.org/p/tutu%%2C%%20all%%20aboard/issues/entry?summary=Bug%%20summary&description=Everything%%20is%%20broken&components=Stuff%%3EHard",
)
# Recipes.
luci.recipe(
name = "main/recipe",
cipd_package = "recipe/bundles/main",
use_python3 = True,
wrapper = ["path/to/wrapper"],
)
# Executables.
luci.executable(
name = "main/executable",
cipd_package = "executable/bundles/main",
cmd = ["cmd"],
)
# CI bucket.
luci.bucket(
name = "ci",
# Allow developers to force-launch CI builds through Scheduler, but not
# directly through Buildbucket. The direct access to Buildbucket allows to
# override almost all aspects of the builds (e.g. what recipe is used),
# and Buildbucket totally ignores any concurrency limitations set in the
# LUCI Scheduler configs. This makes direct Buildbucket access to CI buckets
# dangerous. They usually have very small pool of machines, and these
# machines are assumed to be running only "approved" code (being post-submit
# builders).
acls = [
acl.entry(
acl.SCHEDULER_TRIGGERER,
groups = ["devs"],
projects = ["some-project"],
),
],
)
luci.gitiles_poller(
name = "main-poller",
bucket = "ci",
repo = "https://noop.com",
refs = [
"refs/heads/main",
"refs/tags/blah",
r"refs/branch-heads/\d+\.\d+",
],
path_regexps = [".*"],
path_regexps_exclude = ["excluded"],
schedule = "with 10s interval",
)
luci.builder(
name = "linux ci builder",
bucket = "ci",
description_html = "this is a linux ci builder",
executable = "main/recipe",
triggered_by = ["main-poller"],
triggers = [
"ci/generically named builder",
"ci/generically named executable builder",
],
properties = {
"prop2": ["val2", 123],
"prop1": "val1",
},
allowed_property_overrides = ["prop1"],
service_account = "builder@example.com",
caches = [
swarming.cache("path1"),
swarming.cache("path2", name = "name2"),
swarming.cache("path3", name = "name3", wait_for_warm_cache = 10 * time.minute),
],
execution_timeout = 3 * time.hour,
grace_period = 2 * time.minute,
dimensions = {
"os": "Linux",
"builder": "linux ci builder", # no auto_builder_dimension
"prefer_if_available": [
swarming.dimension("first-choice", expiration = 5 * time.minute),
swarming.dimension("fallback"),
],
},
priority = 80,
swarming_tags = ["tag1:val1", "tag2:val2"],
expiration_timeout = time.hour,
build_numbers = True,
triggering_policy = scheduler.greedy_batching(
max_concurrent_invocations = 5,
max_batch_size = 10,
),
resultdb_settings = resultdb.settings(
enable = True,
bq_exports = [
resultdb.export_test_results(
bq_table = "luci-resultdb.my-awesome-project.all_test_results",
predicate = resultdb.test_result_predicate(
test_id_regexp = "ninja:.*",
unexpected_only = True,
variant_contains = True,
variant = {"test_suite": "super_interesting_suite"},
),
),
resultdb.export_text_artifacts(
bq_table = "luci-resultdb.my-awesome-project.all_text_artifacts",
predicate = resultdb.artifact_predicate(
test_result_predicate = resultdb.test_result_predicate(
test_id_regexp = "ninja:.*",
unexpected_only = True,
variant_contains = True,
variant = {"test_suite": "super_interesting_suite"},
),
included_invocations = False,
test_results = True,
content_type_regexp = "text.*",
),
),
],
history_options = resultdb.history_options(
by_timestamp = True,
),
),
test_presentation = resultdb.test_presentation(
column_keys = ["v.gpu"],
grouping_keys = ["status", "v.test_suite"],
),
)
luci.builder(
name = "generically named builder",
bucket = "ci",
executable = "main/recipe",
triggered_by = ["main-poller"],
)
luci.builder(
name = "generically named executable builder",
bucket = "ci",
executable = "main/executable",
properties = {
"prop2": ["val2", 123],
"prop1": "val1",
},
allowed_property_overrides = ["*"],
triggered_by = ["main-poller"],
)
luci.builder(
name = "cron builder",
bucket = "ci",
executable = "main/recipe",
schedule = "0 6 * * *",
repo = "https://cron.repo.example.com",
)
luci.builder(
name = "builder with custom swarming host",
bucket = "ci",
executable = "main/recipe",
swarming_host = "another-swarming.appspot.com",
)
luci.builder(
name = "builder with the default test presentation config",
bucket = "ci",
executable = "main/recipe",
test_presentation = resultdb.test_presentation(
column_keys = [],
grouping_keys = ["status"],
),
)
# Try bucket.
luci.bucket(
name = "try",
# Allow developers to launch try jobs directly with whatever parameters
# they want. Try bucket is basically a free build farm for all developers.
acls = [
acl.entry(acl.BUILDBUCKET_TRIGGERER, groups = "devs"),
],
)
luci.builder(
name = "linux try builder",
bucket = "try",
executable = "main/recipe",
)
luci.builder(
name = "linux try builder 2",
bucket = "try",
executable = "main/recipe",
)
luci.builder(
name = "generically named builder",
bucket = "try",
executable = "main/recipe",
)
luci.builder(
name = "builder with executable",
bucket = "try",
executable = "main/executable",
)
luci.builder(
name = "builder with experiment map",
bucket = "try",
executable = "main/executable",
experiments = {
"luci.enable_new_beta_feature": 32,
},
)
luci.builder(
name = "spell-checker",
bucket = "try",
executable = "main/recipe",
)
# Inline definitions.
def inline_poller():
return luci.gitiles_poller(
name = "inline poller",
bucket = "inline",
repo = "https://noop.com",
refs = [
"refs/heads/main",
"refs/tags/blah",
r"refs/branch-heads/\d+\.\d+",
],
schedule = "with 10s interval",
)
luci.builder(
name = "triggerer builder",
bucket = luci.bucket(name = "inline"),
executable = luci.recipe(
name = "inline/recipe",
cipd_package = "recipe/bundles/inline",
use_bbagent = True,
),
service_account = "builder@example.com",
triggers = [
luci.builder(
name = "triggered builder",
bucket = "inline",
executable = "inline/recipe",
),
],
triggered_by = [inline_poller()],
)
luci.builder(
name = "another builder",
bucket = "inline",
executable = luci.recipe(
name = "inline/recipe",
cipd_package = "recipe/bundles/inline",
use_bbagent = True,
),
service_account = "builder@example.com",
triggered_by = [inline_poller()],
)
luci.builder(
name = "another executable builder",
bucket = "inline",
executable = luci.executable(
name = "inline/executable",
cipd_package = "executable/bundles/inline",
),
service_account = "builder@example.com",
triggered_by = [inline_poller()],
)
luci.builder(
name = "executable builder wrapper",
bucket = "inline",
executable = luci.executable(
name = "wrapped executable",
cipd_package = "executable/bundles/inline",
wrapper = ["/path/to/wrapper"],
),
service_account = "builder@example.com",
)
# List views.
luci.list_view(
name = "List view",
entries = [
"cron builder",
"ci/generically named builder",
luci.list_view_entry(
builder = "linux ci builder",
),
],
)
luci.list_view_entry(
list_view = "List view",
builder = "inline/triggered builder",
)
# Console views.
luci.console_view(
name = "Console view",
title = "CI Builders",
header = {
"links": [
{"name": "a", "links": [{"text": "a"}]},
{"name": "b", "links": [{"text": "b"}]},
],
},
repo = "https://noop.com",
refs = ["refs/tags/blah", r"refs/branch-heads/\d+\.\d+"],
exclude_ref = "refs/heads/main",
include_experimental_builds = True,
entries = [
luci.console_view_entry(
builder = "linux ci builder",
category = "a|b",
short_name = "lnx",
),
# An alias for luci.console_view_entry(**{...}).
{"builder": "cron builder", "category": "cron"},
],
default_commit_limit = 3,
default_expand = True,
)
luci.console_view_entry(
console_view = "Console view",
builder = "inline/triggered builder",
)
luci.external_console_view(
name = "external-console",
title = "External console",
source = "chromium:main",
)
# Notifier.
luci.notifier(
name = "main notifier",
on_new_status = ["FAILURE"],
notify_emails = ["someone@example,com"],
notify_blamelist = True,
template = "notifier_template",
notified_by = [
"linux ci builder",
"cron builder",
],
)
luci.notifier_template(
name = "notifier_template",
body = "Hello\n\nHi\n",
)
luci.notifier_template(
name = "another_template",
body = "Boo!\n",
)
luci.builder(
name = "watched builder",
bucket = "ci",
executable = "main/recipe",
repo = "https://custom.example.com/repo",
notifies = ["main notifier"],
)
# CQ.
luci.cq(
submit_max_burst = 10,
submit_burst_delay = 10 * time.minute,
draining_start_time = "2017-12-23T15:47:58Z",
status_host = "chromium-cq-status.appspot.com",
)
luci.cq_group(
name = "main-cq",
watch = [
cq.refset("https://example.googlesource.com/repo"),
cq.refset(
"https://example.googlesource.com/another/repo",
refs_exclude = ["refs/heads/infra/config"],
),
],
acls = [
acl.entry(acl.CQ_COMMITTER, groups = ["committers"]),
acl.entry(acl.CQ_DRY_RUNNER, groups = ["dry-runners"]),
],
allow_submit_with_open_deps = True,
allow_owner_if_submittable = cq.ACTION_COMMIT,
tree_status_host = "tree-status.example.com",
verifiers = [
luci.cq_tryjob_verifier(
builder = "linux try builder",
cancel_stale = False,
result_visibility = cq.COMMENT_LEVEL_RESTRICTED,
location_regexp_exclude = ["https://example.com/repo/[+]/all/one.txt"],
mode_allowlist = [cq.MODE_DRY_RUN, cq.MODE_QUICK_DRY_RUN],
),
# An experimental verifier with location_regexp_exclude.
luci.cq_tryjob_verifier(
builder = "linux try builder 2",
location_regexp_exclude = ["https://example.com/repo/[+]/all/two.txt"],
experiment_percentage = 50,
),
# An alias for luci.cq_tryjob_verifier(**{...}).
{"builder": "try/generically named builder", "disable_reuse": True},
# An alias for luci.cq_tryjob_verifier(<builder>).
"another-project:try/yyy",
luci.cq_tryjob_verifier(
builder = "another-project:try/zzz",
includable_only = True,
owner_whitelist = ["another-project-committers"],
),
luci.cq_tryjob_verifier(
builder = "spell-checker",
owner_whitelist = ["project-contributor"],
mode_allowlist = [cq.MODE_ANALYZER_RUN],
),
],
additional_modes = cq.run_mode(
name = "TEST_RUN",
cq_label_value = 1,
triggering_label = "TEST_RUN_LABEL",
triggering_value = 1,
),
)
luci.cq_tryjob_verifier(
builder = "triggerer builder",
cq_group = "main-cq",
experiment_percentage = 50.0,
)
luci.cq_tryjob_verifier(
builder = "triggered builder",
cq_group = "main-cq",
)
luci.cq_tryjob_verifier(
builder = luci.builder(
name = "main cq builder",
bucket = "try",
executable = "main/recipe",
),
equivalent_builder = luci.builder(
name = "equivalent cq builder",
bucket = "try",
executable = "main/recipe",
),
equivalent_builder_percentage = 60,
equivalent_builder_whitelist = "owners",
cq_group = "main-cq",
)
luci.cq_tryjob_verifier(
builder = "another-project:analyzer/format checker",
cq_group = "main-cq",
location_regexp = [r".+\.py", r".+\.go"],
owner_whitelist = ["project-contributor"],
mode_allowlist = [cq.MODE_ANALYZER_RUN, cq.MODE_FULL_RUN],
)
# Emitting arbitrary configs,
lucicfg.emit(
dest = "dir/custom.cfg",
data = "hello!\n",
)
# Expect configs:
#
# === commit-queue.cfg
# draining_start_time: "2017-12-23T15:47:58Z"
# cq_status_host: "chromium-cq-status.appspot.com"
# submit_options {
# max_burst: 10
# burst_delay {
# seconds: 600
# }
# }
# config_groups {
# name: "main-cq"
# gerrit {
# url: "https://example-review.googlesource.com"
# projects {
# name: "repo"
# ref_regexp: "refs/heads/main"
# }
# projects {
# name: "another/repo"
# ref_regexp: "refs/heads/main"
# ref_regexp_exclude: "refs/heads/infra/config"
# }
# }
# verifiers {
# gerrit_cq_ability {
# committer_list: "admins"
# committer_list: "committers"
# dry_run_access_list: "dry-runners"
# allow_submit_with_open_deps: true
# allow_owner_if_submittable: COMMIT
# }
# tree_status {
# url: "https://tree-status.example.com"
# }
# tryjob {
# builders {
# name: "another-project/analyzer/format checker"
# location_regexp: ".+\\.py"
# location_regexp: ".+\\.go"
# owner_whitelist_group: "project-contributor"
# mode_allowlist: "ANALYZER_RUN"
# mode_allowlist: "FULL_RUN"
# }
# builders {
# name: "another-project/try/yyy"
# }
# builders {
# name: "another-project/try/zzz"
# includable_only: true
# owner_whitelist_group: "another-project-committers"
# }
# builders {
# name: "infra/inline/triggered builder"
# triggered_by: "infra/inline/triggerer builder"
# }
# builders {
# name: "infra/inline/triggerer builder"
# experiment_percentage: 50
# }
# builders {
# name: "infra/try/generically named builder"
# disable_reuse: true
# }
# builders {
# name: "infra/try/linux try builder"
# result_visibility: COMMENT_LEVEL_RESTRICTED
# cancel_stale: NO
# location_regexp: ".*"
# location_regexp_exclude: "https://example.com/repo/[+]/all/one.txt"
# mode_allowlist: "DRY_RUN"
# mode_allowlist: "QUICK_DRY_RUN"
# }
# builders {
# name: "infra/try/linux try builder 2"
# experiment_percentage: 50
# location_regexp: ".*"
# location_regexp_exclude: "https://example.com/repo/[+]/all/two.txt"
# }
# builders {
# name: "infra/try/main cq builder"
# equivalent_to {
# name: "infra/try/equivalent cq builder"
# percentage: 60
# owner_whitelist_group: "owners"
# }
# }
# builders {
# name: "infra/try/spell-checker"
# owner_whitelist_group: "project-contributor"
# mode_allowlist: "ANALYZER_RUN"
# }
# retry_config {
# single_quota: 1
# global_quota: 2
# failure_weight: 100
# transient_failure_weight: 1
# timeout_weight: 100
# }
# }
# }
# additional_modes {
# name: "TEST_RUN"
# cq_label_value: 1
# triggering_label: "TEST_RUN_LABEL"
# triggering_value: 1
# }
# }
# ===
#
# === cr-buildbucket.cfg
# buckets {
# name: "ci"
# acls {
# role: WRITER
# group: "admins"
# }
# acls {
# group: "all"
# }
# swarming {
# builders {
# name: "builder with custom swarming host"
# swarming_host: "another-swarming.appspot.com"
# exe {
# cipd_package: "recipe/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# wrapper: "path/to/wrapper"
# }
# properties:
# '{'
# ' "recipe": "main/recipe"'
# '}'
# experiments {
# key: "luci.recipes.use_python3"
# value: 100
# }
# }
# builders {
# name: "builder with the default test presentation config"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "recipe/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# wrapper: "path/to/wrapper"
# }
# properties:
# '{'
# ' "recipe": "main/recipe"'
# '}'
# experiments {
# key: "luci.recipes.use_python3"
# value: 100
# }
# }
# builders {
# name: "cron builder"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "recipe/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# wrapper: "path/to/wrapper"
# }
# properties:
# '{'
# ' "recipe": "main/recipe"'
# '}'
# experiments {
# key: "luci.recipes.use_python3"
# value: 100
# }
# }
# builders {
# name: "generically named builder"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "recipe/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# wrapper: "path/to/wrapper"
# }
# properties:
# '{'
# ' "recipe": "main/recipe"'
# '}'
# experiments {
# key: "luci.recipes.use_python3"
# value: 100
# }
# }
# builders {
# name: "generically named executable builder"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "executable/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "cmd"
# }
# properties:
# '{'
# ' "prop1": "val1",'
# ' "prop2": ['
# ' "val2",'
# ' 123'
# ' ]'
# '}'
# allowed_property_overrides: "*"
# }
# builders {
# name: "linux ci builder"
# swarming_host: "chromium-swarm.appspot.com"
# swarming_tags: "tag1:val1"
# swarming_tags: "tag2:val2"
# dimensions: "builder:linux ci builder"
# dimensions: "os:Linux"
# dimensions: "300:prefer_if_available:first-choice"
# dimensions: "prefer_if_available:fallback"
# exe {
# cipd_package: "recipe/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# wrapper: "path/to/wrapper"
# }
# properties:
# '{'
# ' "$recipe_engine/resultdb/test_presentation": {'
# ' "column_keys": ['
# ' "v.gpu"'
# ' ],'
# ' "grouping_keys": ['
# ' "status",'
# ' "v.test_suite"'
# ' ]'
# ' },'
# ' "prop1": "val1",'
# ' "prop2": ['
# ' "val2",'
# ' 123'
# ' ],'
# ' "recipe": "main/recipe"'
# '}'
# allowed_property_overrides: "prop1"
# priority: 80
# execution_timeout_secs: 10800
# expiration_secs: 3600
# grace_period {
# seconds: 120
# }
# caches {
# name: "name2"
# path: "path2"
# }
# caches {
# name: "name3"
# path: "path3"
# wait_for_warm_cache_secs: 600
# }
# caches {
# name: "path1"
# path: "path1"
# }
# build_numbers: YES
# service_account: "builder@example.com"
# experiments {
# key: "luci.recipes.use_python3"
# value: 100
# }
# resultdb {
# enable: true
# bq_exports {
# project: "luci-resultdb"
# dataset: "my-awesome-project"
# table: "all_test_results"
# test_results {
# predicate {
# test_id_regexp: "ninja:.*"
# variant {
# contains {
# def {
# key: "test_suite"
# value: "super_interesting_suite"
# }
# }
# }
# expectancy: VARIANTS_WITH_UNEXPECTED_RESULTS
# }
# }
# }
# bq_exports {
# project: "luci-resultdb"
# dataset: "my-awesome-project"
# table: "all_text_artifacts"
# text_artifacts {
# predicate {
# follow_edges {
# test_results: true
# }
# test_result_predicate {
# test_id_regexp: "ninja:.*"
# variant {
# contains {
# def {
# key: "test_suite"
# value: "super_interesting_suite"
# }
# }
# }
# expectancy: VARIANTS_WITH_UNEXPECTED_RESULTS
# }
# content_type_regexp: "text.*"
# }
# }
# }
# history_options {
# use_invocation_timestamp: true
# }
# }
# description_html: "this is a linux ci builder"
# }
# builders {
# name: "watched builder"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "recipe/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# wrapper: "path/to/wrapper"
# }
# properties:
# '{'
# ' "recipe": "main/recipe"'
# '}'
# experiments {
# key: "luci.recipes.use_python3"
# value: 100
# }
# }
# }
# }
# buckets {
# name: "inline"
# acls {
# role: WRITER
# group: "admins"
# }
# acls {
# group: "all"
# }
# swarming {
# builders {
# name: "another builder"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "recipe/bundles/inline"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# }
# properties:
# '{'
# ' "recipe": "inline/recipe"'
# '}'
# service_account: "builder@example.com"
# }
# builders {
# name: "another executable builder"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "executable/bundles/inline"
# cipd_version: "refs/heads/main"
# }
# properties: '{}'
# service_account: "builder@example.com"
# }
# builders {
# name: "executable builder wrapper"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "executable/bundles/inline"
# cipd_version: "refs/heads/main"
# wrapper: "/path/to/wrapper"
# }
# properties: '{}'
# service_account: "builder@example.com"
# }
# builders {
# name: "triggered builder"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "recipe/bundles/inline"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# }
# properties:
# '{'
# ' "recipe": "inline/recipe"'
# '}'
# }
# builders {
# name: "triggerer builder"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "recipe/bundles/inline"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# }
# properties:
# '{'
# ' "recipe": "inline/recipe"'
# '}'
# service_account: "builder@example.com"
# }
# }
# }
# buckets {
# name: "try"
# acls {
# role: WRITER
# group: "admins"
# }
# acls {
# group: "all"
# }
# acls {
# role: SCHEDULER
# group: "devs"
# }
# swarming {
# builders {
# name: "builder with executable"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "executable/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "cmd"
# }
# properties: '{}'
# }
# builders {
# name: "builder with experiment map"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "executable/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "cmd"
# }
# properties: '{}'
# experiments {
# key: "luci.enable_new_beta_feature"
# value: 32
# }
# }
# builders {
# name: "equivalent cq builder"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "recipe/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# wrapper: "path/to/wrapper"
# }
# properties:
# '{'
# ' "recipe": "main/recipe"'
# '}'
# experiments {
# key: "luci.recipes.use_python3"
# value: 100
# }
# }
# builders {
# name: "generically named builder"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "recipe/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# wrapper: "path/to/wrapper"
# }
# properties:
# '{'
# ' "recipe": "main/recipe"'
# '}'
# experiments {
# key: "luci.recipes.use_python3"
# value: 100
# }
# }
# builders {
# name: "linux try builder"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "recipe/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# wrapper: "path/to/wrapper"
# }
# properties:
# '{'
# ' "recipe": "main/recipe"'
# '}'
# experiments {
# key: "luci.recipes.use_python3"
# value: 100
# }
# }
# builders {
# name: "linux try builder 2"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "recipe/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# wrapper: "path/to/wrapper"
# }
# properties:
# '{'
# ' "recipe": "main/recipe"'
# '}'
# experiments {
# key: "luci.recipes.use_python3"
# value: 100
# }
# }
# builders {
# name: "main cq builder"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "recipe/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# wrapper: "path/to/wrapper"
# }
# properties:
# '{'
# ' "recipe": "main/recipe"'
# '}'
# experiments {
# key: "luci.recipes.use_python3"
# value: 100
# }
# }
# builders {
# name: "spell-checker"
# swarming_host: "chromium-swarm.appspot.com"
# exe {
# cipd_package: "recipe/bundles/main"
# cipd_version: "refs/heads/main"
# cmd: "luciexe"
# wrapper: "path/to/wrapper"
# }
# properties:
# '{'
# ' "recipe": "main/recipe"'
# '}'
# experiments {
# key: "luci.recipes.use_python3"
# value: 100
# }
# }
# }
# }
# ===
#
# === dir/custom.cfg
# hello!
# ===
#
# === luci-logdog.cfg
# reader_auth_groups: "all"
# archive_gs_bucket: "chromium-luci-logdog"
# cloud_logging_config {
# destination: "chromium-build-logs"
# }
# ===
#
# === luci-milo.cfg
# consoles {
# id: "List view"
# name: "List view"
# builders {
# name: "buildbucket/luci.infra.ci/cron builder"
# }
# builders {
# name: "buildbucket/luci.infra.ci/generically named builder"
# }
# builders {
# name: "buildbucket/luci.infra.ci/linux ci builder"
# }
# builders {
# name: "buildbucket/luci.infra.inline/triggered builder"
# }
# favicon_url: "https://storage.googleapis.com/chrome-infra-public/logo/favicon.ico"
# builder_view_only: true
# }
# consoles {
# id: "Console view"
# name: "CI Builders"
# repo_url: "https://noop.com"
# refs: "regexp:refs/tags/blah"
# refs: "regexp:refs/branch-heads/\\d+\\.\\d+"
# exclude_ref: "refs/heads/main"
# manifest_name: "REVISION"
# builders {
# name: "buildbucket/luci.infra.ci/linux ci builder"
# category: "a|b"
# short_name: "lnx"
# }
# builders {
# name: "buildbucket/luci.infra.ci/cron builder"
# category: "cron"
# }
# builders {
# name: "buildbucket/luci.infra.inline/triggered builder"
# }
# favicon_url: "https://storage.googleapis.com/chrome-infra-public/logo/favicon.ico"
# header {
# links {
# name: "a"
# links {
# text: "a"
# }
# }
# links {
# name: "b"
# links {
# text: "b"
# }
# }
# }
# include_experimental_builds: true
# default_commit_limit: 3
# default_expand: true
# }
# consoles {
# id: "external-console"
# name: "External console"
# external_project: "chromium"
# external_id: "main"
# }
# logo_url: "https://storage.googleapis.com/chrome-infra-public/logo/chrome-infra-logo-200x200.png"
# bug_url_template: "https://bugs.chromium.org/p/tutu%2C%20all%20aboard/issues/entry?summary=Bug%20summary&description=Everything%20is%20broken&components=Stuff%3EHard"
# ===
#
# === luci-notify.cfg
# notifiers {
# notifications {
# on_new_status: FAILURE
# email {
# recipients: "someone@example,com"
# }
# template: "notifier_template"
# notify_blamelist {}
# }
# builders {
# bucket: "ci"
# name: "cron builder"
# repository: "https://cron.repo.example.com"
# }
# }
# notifiers {
# notifications {
# on_new_status: FAILURE
# email {
# recipients: "someone@example,com"
# }
# template: "notifier_template"
# notify_blamelist {}
# }
# builders {
# bucket: "ci"
# name: "linux ci builder"
# repository: "https://noop.com"
# }
# }
# notifiers {
# notifications {
# on_new_status: FAILURE
# email {
# recipients: "someone@example,com"
# }
# template: "notifier_template"
# notify_blamelist {}
# }
# builders {
# bucket: "ci"
# name: "watched builder"
# repository: "https://custom.example.com/repo"
# }
# }
# ===
#
# === luci-notify/email-templates/another_template.template
# Boo!
# ===
#
# === luci-notify/email-templates/notifier_template.template
# Hello
#
# Hi
# ===
#
# === luci-scheduler.cfg
# job {
# id: "another builder"
# realm: "inline"
# acl_sets: "inline"
# buildbucket {
# server: "cr-buildbucket.appspot.com"
# bucket: "luci.infra.inline"
# builder: "another builder"
# }
# }
# job {
# id: "another executable builder"
# realm: "inline"
# acl_sets: "inline"
# buildbucket {
# server: "cr-buildbucket.appspot.com"
# bucket: "luci.infra.inline"
# builder: "another executable builder"
# }
# }
# job {
# id: "cron builder"
# realm: "ci"
# schedule: "0 6 * * *"
# acl_sets: "ci"
# buildbucket {
# server: "cr-buildbucket.appspot.com"
# bucket: "luci.infra.ci"
# builder: "cron builder"
# }
# }
# job {
# id: "generically named builder"
# realm: "ci"
# acls {
# role: TRIGGERER
# granted_to: "builder@example.com"
# }
# acl_sets: "ci"
# buildbucket {
# server: "cr-buildbucket.appspot.com"
# bucket: "luci.infra.ci"
# builder: "generically named builder"
# }
# }
# job {
# id: "generically named executable builder"
# realm: "ci"
# acls {
# role: TRIGGERER
# granted_to: "builder@example.com"
# }
# acl_sets: "ci"
# buildbucket {
# server: "cr-buildbucket.appspot.com"
# bucket: "luci.infra.ci"
# builder: "generically named executable builder"
# }
# }
# job {
# id: "linux ci builder"
# realm: "ci"
# acl_sets: "ci"
# triggering_policy {
# kind: GREEDY_BATCHING
# max_concurrent_invocations: 5
# max_batch_size: 10
# }
# buildbucket {
# server: "cr-buildbucket.appspot.com"
# bucket: "luci.infra.ci"
# builder: "linux ci builder"
# }
# }
# job {
# id: "triggered builder"
# realm: "inline"
# acls {
# role: TRIGGERER
# granted_to: "builder@example.com"
# }
# acl_sets: "inline"
# buildbucket {
# server: "cr-buildbucket.appspot.com"
# bucket: "luci.infra.inline"
# builder: "triggered builder"
# }
# }
# job {
# id: "triggerer builder"
# realm: "inline"
# acl_sets: "inline"
# buildbucket {
# server: "cr-buildbucket.appspot.com"
# bucket: "luci.infra.inline"
# builder: "triggerer builder"
# }
# }
# trigger {
# id: "inline poller"
# realm: "inline"
# schedule: "with 10s interval"
# acl_sets: "inline"
# triggers: "another builder"
# triggers: "another executable builder"
# triggers: "triggerer builder"
# gitiles {
# repo: "https://noop.com"
# refs: "regexp:refs/heads/main"
# refs: "regexp:refs/tags/blah"
# refs: "regexp:refs/branch-heads/\\d+\\.\\d+"
# }
# }
# trigger {
# id: "main-poller"
# realm: "ci"
# schedule: "with 10s interval"
# acl_sets: "ci"
# triggers: "generically named builder"
# triggers: "generically named executable builder"
# triggers: "linux ci builder"
# gitiles {
# repo: "https://noop.com"
# refs: "regexp:refs/heads/main"
# refs: "regexp:refs/tags/blah"
# refs: "regexp:refs/branch-heads/\\d+\\.\\d+"
# path_regexps: ".*"
# path_regexps_exclude: "excluded"
# }
# }
# acl_sets {
# name: "ci"
# acls {
# role: OWNER
# granted_to: "group:admins"
# }
# acls {
# granted_to: "group:all"
# }
# acls {
# role: TRIGGERER
# granted_to: "group:devs"
# }
# acls {
# role: TRIGGERER
# granted_to: "project:some-project"
# }
# }
# acl_sets {
# name: "inline"
# acls {
# role: OWNER
# granted_to: "group:admins"
# }
# acls {
# granted_to: "group:all"
# }
# }
# ===
#
# === project.cfg
# name: "infra"
# access: "group:all"
# ===
#
# === realms.cfg
# realms {
# name: "@root"
# bindings {
# role: "role/buildbucket.owner"
# principals: "group:admins"
# }
# bindings {
# role: "role/buildbucket.reader"
# principals: "group:all"
# }
# bindings {
# role: "role/configs.reader"
# principals: "group:all"
# }
# bindings {
# role: "role/cq.committer"
# principals: "group:admins"
# }
# bindings {
# role: "role/logdog.reader"
# principals: "group:all"
# }
# bindings {
# role: "role/scheduler.owner"
# principals: "group:admins"
# }
# bindings {
# role: "role/scheduler.reader"
# principals: "group:all"
# }
# }
# realms {
# name: "ci"
# bindings {
# role: "role/buildbucket.builderServiceAccount"
# principals: "user:builder@example.com"
# }
# bindings {
# role: "role/scheduler.triggerer"
# principals: "group:devs"
# principals: "project:some-project"
# }
# }
# realms {
# name: "inline"
# bindings {
# role: "role/buildbucket.builderServiceAccount"
# principals: "user:builder@example.com"
# }
# }
# realms {
# name: "try"
# bindings {
# role: "role/buildbucket.triggerer"
# principals: "group:devs"
# }
# }
# ===
#
# === tricium-prod.cfg
# functions {
# type: ANALYZER
# name: "AnotherProjectAnalyzerFormatChecker"
# needs: GIT_FILE_DETAILS
# provides: RESULTS
# path_filters: "*.go"
# path_filters: "*.py"
# impls {
# provides_for_platform: LINUX
# runtime_platform: LINUX
# recipe {
# project: "another-project"
# bucket: "analyzer"
# builder: "format checker"
# }
# }
# }
# functions {
# type: ANALYZER
# name: "InfraTrySpellChecker"
# needs: GIT_FILE_DETAILS
# provides: RESULTS
# impls {
# provides_for_platform: LINUX
# runtime_platform: LINUX
# recipe {
# project: "infra"
# bucket: "try"
# builder: "spell-checker"
# }
# }
# }
# selections {
# function: "AnotherProjectAnalyzerFormatChecker"
# platform: LINUX
# }
# selections {
# function: "InfraTrySpellChecker"
# platform: LINUX
# }
# repos {
# gerrit_project {
# host: "example-review.googlesource.com"
# project: "another/repo"
# git_url: "https://example.googlesource.com/another/repo"
# }
# whitelisted_group: "project-contributor"
# }
# repos {
# gerrit_project {
# host: "example-review.googlesource.com"
# project: "repo"
# git_url: "https://example.googlesource.com/repo"
# }
# whitelisted_group: "project-contributor"
# }
# service_account: "tricium-prod@appspot.gserviceaccount.com"
# ===