Source code

Revision control

Copy as Markdown

Other Tools

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from taskgraph.transforms.base import TransformSequence
from taskgraph.util.schema import Schema
from voluptuous import Any, Optional, Required
transforms = TransformSequence()
bootstrap_schema = Schema(
{
# Name of the bootstrap task.
Required("name"): str,
# Name of the docker image. Ideally, we'd also have tasks for mac and windows,
# but we unfortunately don't have workers barebones enough for such testing
# to be satisfactory.
Required("image"): Any(str, {"in-tree": str}),
# Initialization commands.
Required("pre-commands"): [str],
# relative path (from config.path) to the file task was defined in
Optional("job-from"): str,
}
)
transforms.add_validate(bootstrap_schema)
@transforms.add
def bootstrap_tasks(config, tasks):
for task in tasks:
name = task.pop("name")
image = task.pop("image")
pre_commands = task.pop("pre-commands")
head_repo = config.params["head_repository"]
head_rev = config.params["head_rev"]
# Get all the non macos/windows local toolchains (the only ones bootstrap can use),
# and use them as dependencies for the tasks we create, so that they don't start
# before any potential toolchain task that would be triggered on the same push
# (which would lead to bootstrap failing).
dependencies = {
name: name
for name, task in config.kind_dependencies_tasks.items()
if task.attributes.get("local-toolchain")
and not name.startswith(("toolchain-macos", "toolchain-win"))
}
# We don't test the artifacts variants, or js, because they are essentially subsets.
# Mobile and browser are different enough to warrant testing them separately.
for app in ("browser", "mobile_android"):
commands = pre_commands + [
# MOZ_AUTOMATION changes the behavior, and we want something closer to user
# machines.
"unset MOZ_AUTOMATION",
f"curl -O {head_repo}/raw-file/{head_rev}/python/mozboot/bin/bootstrap.py",
f"python3 bootstrap.py --no-interactive --application-choice {app}",
"cd mozilla-unified",
# After bootstrap, configure should go through without its own auto-bootstrap.
"./mach configure --enable-bootstrap=no-update",
# Then a build should go through too.
"./mach build",
]
os_specific = []
if app == "mobile_android":
os_specific += ["android*"]
for os, filename in (
("debian", "debian.py"),
("ubuntu", "debian.py"),
("fedora", "centosfedora.py"),
("rockylinux", "centosfedora.py"),
("opensuse", "opensuse.py"),
("gentoo", "gentoo.py"),
("archlinux", "archlinux.py"),
("voidlinux", "void.py"),
):
if name.startswith(os):
os_specific.append(filename)
break
else:
raise Exception(f"Missing OS specific bootstrap file for {name}")
taskdesc = {
"label": f"{config.kind}-{name}-{app}",
"description": f"Bootstrap {app} build on {name}",
"always-target": True,
"scopes": [],
"treeherder": {
"symbol": f"Boot({name})",
"platform": {
"browser": "linux64/opt",
"mobile_android": "android-5-0-armv7/opt",
}[app],
"kind": "other",
"tier": 2,
},
"run-on-projects": ["trunk"],
"worker-type": "b-linux-gcp",
"worker": {
"implementation": "docker-worker",
"docker-image": image,
"os": "linux",
"env": {
"GECKO_HEAD_REPOSITORY": head_repo,
"GECKO_HEAD_REV": head_rev,
"MACH_NO_TERMINAL_FOOTER": "1",
"MOZ_SCM_LEVEL": config.params["level"],
},
"command": ["sh", "-c", "-x", "-e", " && ".join(commands)],
"max-run-time": 7200,
},
"dependencies": dependencies,
"optimization": {
"skip-unless-changed": [
"python/mozboot/bin/bootstrap.py",
"python/mozboot/mozboot/base.py",
"python/mozboot/mozboot/bootstrap.py",
"python/mozboot/mozboot/linux_common.py",
"python/mozboot/mozboot/mach_commands.py",
"python/mozboot/mozboot/mozconfig.py",
"python/mozboot/mozboot/rust.py",
"python/mozboot/mozboot/sccache.py",
"python/mozboot/mozboot/util.py",
]
+ [f"python/mozboot/mozboot/{f}" for f in os_specific]
},
}
yield taskdesc