summaryrefslogtreecommitdiff
path: root/chromium/infra/config/project.star
blob: 31f34ba5b072a091dc1ba534aea4130cb9786ed7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# Copyright 2020 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.

# The value for each attribute should be the corresponding value that can be
# passed to the --type flag of scripts/branch.py
branch_type = struct(
    STANDARD = "standard",
    DESKTOP_EXTENDED_STABLE = "desktop-extended-stable",
    CROS_LTS = "cros-lts",
    FUCHSIA_LTS = "fuchsia-lts",
)

BRANCH_TYPES = tuple([getattr(branch_type, a) for a in dir(branch_type)])

def _project_settings(
        *,
        project,
        project_title,
        ref,
        chrome_project,
        branch_types = []):
    """Declare settings for the project.

    This provides the central location for what must be modified when
    setting up the project for a new branch or when a branch changes category
    (e.g. moves from a standard release channel to the long-term support
    channel).

    Args:
      * project - The name of the LUCI project.
      * project_title - A string identifying the project in title contexts (e.g.
        titles of consoles).
      * ref - The git ref containing the code for this branch.
      * chrome_project - The name of the corresponding chrome project.
      * branch_types - Values indicating what type(s) apply to the branch. If no
        branch types are specified, that indicates main. It is an error for
        branch_type.STANDARD to appear along with any other values.

    Returns:
      A struct with attributes set to the input parameters. Additionally, the
      is_main attribute is set to True if branch_types is empty or False if
      branch_types is not empty.
    """
    invalid_branch_types = [t for t in branch_types if t not in BRANCH_TYPES]
    if invalid_branch_types:
        fail("The following branch types are invalid: {}".format(invalid_branch_types))
    if branch_type.STANDARD in branch_types and len(branch_types) != 1:
        fail("STANDARD branch type cannot be specified along with other branch types")
    return struct(
        project = project,
        project_title = project_title,
        ref = ref,
        chrome_project = chrome_project,
        is_main = not branch_types,
        branch_types = branch_types,
    )

settings = _project_settings(**json.decode(io.read_file("./settings.json")))

def _generate_project_pyl(ctx):
    ctx.output["project.pyl"] = "\n".join([
        "# This is a non-LUCI generated file",
        "# This is consumed by presubmit checks that need to validate the config",
        repr(dict(
            # On main, we want to ensure that we don't have source side specs
            # defined for non-existent builders
            # On branches, we don't want to re-generate the source side specs as
            # that would increase branch day toil and complicate cherry-picks
            validate_source_side_specs_have_builder = settings.is_main,
        )),
        "",
    ])

lucicfg.generator(_generate_project_pyl)

def _milestone_details(*, project, ref):
    """Define the details for an active milestone.

    Args:
      * project - The name of the LUCI project that is configured for the
        milestone.
      * ref - The ref in the git repository that contains the code for the
        milestone.
    """
    return struct(
        project = project,
        ref = ref,
    )

# The milestone names and branch numbers of branches that we have builders
# running for (including milestone-specific projects)
# Branch numbers and milestones can be viewed in the chromium column at
# https://chromiumdash.appspot.com/releases
# The 3rd portion of the version number is the branch number for the associated
# milestone
ACTIVE_MILESTONES = {
    m["name"]: _milestone_details(project = m["project"], ref = m["ref"])
    for m in json.decode(io.read_file("./milestones.json")).values()
}