Bug 1842164 - don't optimize away tasks whose configuration changes
[gecko.git] / mobile / android / taskcluster / android_taskgraph / transforms / gradle_optimization.py
blob6b4f34d7245be1ec6367bd6f9889e5b122a05ee7
1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 from taskgraph.transforms.base import TransformSequence
7 from ..build_config import get_path, get_upstream_deps_for_all_gradle_projects
8 from ..gradle import get_gradle_project
10 transforms = TransformSequence()
13 @transforms.add
14 def add_components_optimization(config, tasks):
15 for task in tasks:
16 attributes = task.get("attributes", {})
17 # TODO bug 1806454 - Use a single attribute instead of 2. This is a historical
18 # discrepancy where A-C are labeled by build-types but APKs by release ones.
20 # The monorepo migration made this discrepancy more obvious compared to when
21 # A-C and APKs lived in different repos
22 build_type = attributes.get("build-type", "")
23 release_type = attributes.get("release-type", "")
25 # We want to optimize away tasks on all android-components and APKs as long as
26 # these tasks are not labeled nightly, beta, or release.
28 # Any change that impacts all a-c (e.g. a change in the a-c gradle config)
29 # should also trigger APK builds and tests.
30 if all(
31 type_ not in ("nightly", "beta", "release")
32 for type_ in (build_type, release_type)
34 optimization = task.setdefault("optimization", {})
35 skip_unless_changed = optimization.setdefault("skip-unless-changed", [])
36 skip_unless_changed.extend(
38 "android-components/build.gradle",
39 "android-components/settings.gradle",
40 "android-components/buildSrc.*",
41 "android-components/gradle.properties",
42 "android-components/gradle/wrapper/gradle-wrapper.properties",
43 "android-components/plugins/dependencies/**",
47 yield task
50 @transforms.add
51 def extend_optimization_if_one_already_exists(config, tasks):
52 deps_per_component = get_upstream_deps_for_all_gradle_projects()
54 for task in tasks:
55 optimization = task.get("optimization")
56 if optimization:
57 skip_unless_changed = optimization["skip-unless-changed"]
58 skip_unless_changed.append(f"{config.path}/**")
60 gradle_project = get_gradle_project(task)
61 # TODO Remove this special case when ui-test.sh is able to accept "browser-engine-gecko"
62 if gradle_project == "browser":
63 gradle_project = "browser-engine-gecko"
65 if gradle_project:
66 dependencies = deps_per_component[gradle_project]
67 gradle_project_and_deps = [gradle_project] + dependencies
69 skip_unless_changed.extend(
70 sorted(
72 _get_path(gradle_project)
73 for gradle_project in gradle_project_and_deps
78 yield task
81 def _get_path(gradle_project):
82 if gradle_project == "focus":
83 return "focus-android/**"
84 elif gradle_project == "service-telemetry":
85 return "focus-android/service-telemetry/**"
86 elif gradle_project == "fenix":
87 return "fenix/**"
88 else:
89 return f"android-components/{get_path(gradle_project)}/**"