Skip to content

Commit d718fab

Browse files
authored
bot: Build suite, chunk and platform from full task (#114)
1 parent 1e19cc5 commit d718fab

File tree

20 files changed

+1934
-83
lines changed

20 files changed

+1934
-83
lines changed

bot/code_coverage_bot/artifacts.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ def get(self, platform=None, suite=None, chunk=None):
6060
return filtered_files
6161

6262
def download(self, test_task):
63-
chunk_name = taskcluster.get_chunk(test_task["task"]["metadata"]["name"])
64-
platform_name = taskcluster.get_platform(test_task["task"]["metadata"]["name"])
63+
chunk_name = taskcluster.get_chunk(test_task["task"])
64+
platform_name = taskcluster.get_platform(test_task["task"])
6565
test_task_id = test_task["status"]["taskId"]
6666

6767
for artifact in taskcluster.get_task_artifacts(test_task_id):
@@ -104,7 +104,8 @@ def download_all(self):
104104
task
105105
for group in groups
106106
for task in taskcluster.get_tasks_in_group(group)
107-
if taskcluster.is_coverage_task(task) and not self.is_filtered_task(task)
107+
if taskcluster.is_coverage_task(task["task"])
108+
and not self.is_filtered_task(task)
108109
]
109110
logger.info("Downloading artifacts from {} tasks".format(len(test_tasks)))
110111

@@ -130,10 +131,8 @@ def download_all(self):
130131
status
131132
)
132133

133-
chunk_name = taskcluster.get_chunk(test_task["task"]["metadata"]["name"])
134-
platform_name = taskcluster.get_platform(
135-
test_task["task"]["metadata"]["name"]
136-
)
134+
chunk_name = taskcluster.get_chunk(test_task["task"])
135+
platform_name = taskcluster.get_platform(test_task["task"])
137136

138137
if any(to_ignore in chunk_name for to_ignore in SUITES_TO_IGNORE):
139138
continue

bot/code_coverage_bot/chunk_mapping.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ def get_tests_chunks(revision, platform, suite):
6262
run_key_prefix = "test-linux64-ccov"
6363
elif platform == "windows":
6464
run_key_prefix = "test-windows10-64-ccov"
65+
else:
66+
raise Exception("Unsupported platform {}".format(platform))
6567

6668
r = requests.post(
6769
ACTIVEDATA_QUERY_URL,
@@ -239,7 +241,7 @@ def _inner_generate(
239241
def chunk_test_iter():
240242
test_iter = enumerate(tests_data["result.test"])
241243
return (
242-
(platform, taskcluster.get_chunk(task_names[i]), test)
244+
(platform, taskcluster.name_to_chunk(task_names[i]), test)
243245
for i, test in test_iter
244246
)
245247

@@ -257,7 +259,7 @@ def chunk_test_iter():
257259
(platform, chunk) = futures[future]
258260
files = future.result()
259261

260-
suite = taskcluster.get_suite(chunk)
262+
suite = taskcluster.chunk_to_suite(chunk)
261263
if is_chunk_only_suite(suite):
262264
per_test_cursor.executemany(
263265
"INSERT INTO file_to_chunk VALUES (?,?,?)",

bot/code_coverage_bot/taskcluster.py

Lines changed: 62 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ def perform_download():
115115
"build-android-test-ccov/opt",
116116
]
117117

118-
119118
TEST_PLATFORMS = [
120119
"test-linux64-ccov/debug",
121120
"test-windows10-64-ccov/debug",
@@ -124,10 +123,16 @@ def perform_download():
124123

125124

126125
def is_coverage_task(task):
127-
return any(task["task"]["metadata"]["name"].startswith(t) for t in TEST_PLATFORMS)
126+
return any(task["metadata"]["name"].startswith(t) for t in TEST_PLATFORMS)
127+
128128

129+
def name_to_chunk(name):
130+
"""
131+
Helper to convert a task name to a chunk
132+
Used by chunk mapping
133+
"""
134+
assert isinstance(name, str)
129135

130-
def get_chunk(name):
131136
# Some tests are run on build machines, we define a placeholder chunk for those.
132137
if name in BUILD_PLATFORMS:
133138
return "build"
@@ -139,18 +144,60 @@ def get_chunk(name):
139144
return "-".join([p for p in name.split("-") if p != "e10s"])
140145

141146

142-
def get_suite(chunk_name):
143-
return "-".join([p for p in chunk_name.split("-") if not p.isdigit()])
147+
def chunk_to_suite(chunk):
148+
"""
149+
Helper to convert a chunk to a suite (no numbers)
150+
Used by chunk mapping
151+
"""
152+
assert isinstance(chunk, str)
153+
return "-".join([p for p in chunk.split("-") if not p.isdigit()])
154+
155+
156+
def get_chunk(task):
157+
"""
158+
Build clean chunk name from a Taskcluster task
159+
"""
160+
suite = get_suite(task)
161+
chunks = task["extra"].get("chunks", {})
162+
if "current" in chunks:
163+
return f'{suite}-{chunks["current"]}'
164+
return suite
165+
166+
167+
def get_suite(task):
168+
"""
169+
Build clean suite name from a Taskcluster task
170+
"""
171+
assert isinstance(task, dict)
172+
tags = task["tags"]
173+
extra = task["extra"]
174+
treeherder = extra.get("treeherder", {})
175+
176+
if treeherder.get("jobKind") == "build":
177+
return "build"
178+
elif "suite" in extra:
179+
if isinstance(extra["suite"], dict):
180+
return extra["suite"]["name"]
181+
return extra["suite"]
182+
else:
183+
return tags.get("test-type")
184+
185+
raise Exception("Unknown chunk")
144186

145187

146-
def get_platform(name):
147-
if "linux" in name:
148-
return "linux"
149-
elif "win" in name:
150-
return "windows"
151-
elif "android-test" in name:
152-
return "android-test"
153-
elif "android-em" in name:
154-
return "android-emulator"
155-
else:
188+
def get_platform(task):
189+
"""
190+
Build clean platform from a Taskcluster task
191+
"""
192+
assert isinstance(task, dict)
193+
assert isinstance(task, dict)
194+
tags = task.get("tags", {})
195+
platform = tags.get("os")
196+
if not platform:
156197
raise Exception("Unknown platform")
198+
199+
# Weird case for android build on Linux docker
200+
if platform == "linux" and tags.get("android-stuff"):
201+
return "android"
202+
203+
return platform
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
{
2+
"provisionerId": "aws-provisioner-v1",
3+
"workerType": "gecko-3-b-android",
4+
"schedulerId": "gecko-level-3",
5+
"taskGroupId": "Mu6w3n-dS9GOfrv6wGOtvg",
6+
"dependencies": [
7+
"CGQi0Z1nQhizLPmm9d3wYQ",
8+
"L0gYcGJ1QgeMRebLMme27Q",
9+
"RZMFIeVKTqekWYEP91wu8w",
10+
"SDBWKWVPTC6SI4o4cNXn0w",
11+
"fn4N8jQtRZWbuUAjlqXFLA",
12+
"Mu6w3n-dS9GOfrv6wGOtvg"
13+
],
14+
"requires": "all-completed",
15+
"routes": [
16+
"index.gecko.v2.mozilla-central.latest.mobile.android-test-ccov",
17+
"index.gecko.v2.mozilla-central.pushdate.2019.03.28.20190328173141.mobile.android-test-ccov",
18+
"index.gecko.v2.mozilla-central.pushlog-id.35772.mobile.android-test-ccov",
19+
"index.gecko.v2.mozilla-central.revision.e31357c7759379d2279b6883cb09c91997bfaa5d.mobile.android-test-ccov",
20+
"index.gecko.v2.trunk.revision.e31357c7759379d2279b6883cb09c91997bfaa5d.mobile.android-test-ccov",
21+
"tc-treeherder.v2.mozilla-central.e31357c7759379d2279b6883cb09c91997bfaa5d.35772"
22+
],
23+
"priority": "medium",
24+
"retries": 5,
25+
"created": "2019-03-28T17:38:38.640Z",
26+
"deadline": "2019-03-29T17:38:38.640Z",
27+
"expires": "2020-03-27T17:38:38.640Z",
28+
"scopes": [
29+
"queue:get-artifact:project/gecko/android-sdk/*",
30+
"secrets:get:project/taskcluster/gecko/hgfingerprint",
31+
"docker-worker:relengapi-proxy:tooltool.download.public",
32+
"docker-worker:relengapi-proxy:tooltool.download.internal",
33+
"secrets:get:project/releng/gecko/build/level-3/*",
34+
"docker-worker:cache:gecko-level-3-mozilla-central-build-android-test-ccov-opt-workspace-v3-33ea6ead87f10b63cd64",
35+
"docker-worker:cache:gecko-level-3-checkouts-v3-33ea6ead87f10b63cd64",
36+
"docker-worker:cache:gecko-level-3-tooltool-cache-v3-33ea6ead87f10b63cd64"
37+
],
38+
"payload": {
39+
"onExitStatus": {
40+
"retry": [
41+
4,
42+
72
43+
],
44+
"purgeCaches": [
45+
72
46+
]
47+
},
48+
"maxRunTime": 7200,
49+
"image": {
50+
"path": "public/image.tar.zst",
51+
"type": "task-image",
52+
"taskId": "fn4N8jQtRZWbuUAjlqXFLA"
53+
},
54+
"cache": {
55+
"gecko-level-3-tooltool-cache-v3-33ea6ead87f10b63cd64": "/builds/worker/tooltool-cache",
56+
"gecko-level-3-checkouts-v3-33ea6ead87f10b63cd64": "/builds/worker/checkouts",
57+
"gecko-level-3-mozilla-central-build-android-test-ccov-opt-workspace-v3-33ea6ead87f10b63cd64": "/builds/worker/workspace"
58+
},
59+
"artifacts": {
60+
"public/logs": {
61+
"path": "/builds/worker/logs/",
62+
"expires": "2020-03-27T17:38:38.640Z",
63+
"type": "directory"
64+
},
65+
"public/build": {
66+
"path": "/builds/worker/artifacts/",
67+
"expires": "2020-03-27T17:38:38.640Z",
68+
"type": "directory"
69+
},
70+
"public/code-coverage-grcov.zip": {
71+
"path": "/builds/worker/workspace/build/src/obj-firefox/code-coverage-grcov.zip",
72+
"expires": "2020-03-27T17:38:38.640Z",
73+
"type": "file"
74+
}
75+
},
76+
"command": [
77+
"/builds/worker/bin/run-task",
78+
"--gecko-checkout",
79+
"/builds/worker/workspace/build/src",
80+
"--",
81+
"/builds/worker/workspace/build/src/taskcluster/scripts/builder/build-linux.sh"
82+
],
83+
"env": {
84+
"MOZ_AUTOMATION": "1",
85+
"MOZ_SOURCE_CHANGESET": "e31357c7759379d2279b6883cb09c91997bfaa5d",
86+
"MOZ_FETCHES": "[{\"artifact\": \"public/build/grcov.tar.xz\", \"extract\": true, \"task\": \"CGQi0Z1nQhizLPmm9d3wYQ\"}]",
87+
"PERFHERDER_EXTRA_OPTIONS": "android-test-ccov",
88+
"TOOLTOOL_CACHE": "/builds/worker/tooltool-cache",
89+
"PYTHONUNBUFFERED": "1",
90+
"MOZ_FETCHES_DIR": "/builds/worker/fetches",
91+
"MOZHARNESS_SCRIPT": "mozharness/scripts/fx_desktop_build.py",
92+
"MOZ_BUILD_DATE": "20190328173141",
93+
"MH_BUILD_POOL": "taskcluster",
94+
"HG_STORE_PATH": "/builds/worker/checkouts/hg-store",
95+
"MH_CUSTOM_BUILD_VARIANT_CFG": "android-test-ccov",
96+
"MOZHARNESS_ACTIONS": "get-secrets build",
97+
"GECKO_PATH": "/builds/worker/workspace/build/src",
98+
"GECKO_HEAD_REPOSITORY": "https://hg.mozilla.org/mozilla-central",
99+
"EXTRA_MOZHARNESS_CONFIG": "{\"update_channel\": \"nightly\"}",
100+
"SCCACHE_DISABLE": "1",
101+
"MOZ_TOOLCHAINS": "public/build/android-gradle-dependencies.tar.xz@RZMFIeVKTqekWYEP91wu8w project/gecko/android-sdk/android-sdk-linux.tar.xz@L0gYcGJ1QgeMRebLMme27Q public/build/node.tar.xz@SDBWKWVPTC6SI4o4cNXn0w",
102+
"MOZ_SOURCE_REPO": "https://hg.mozilla.org/mozilla-central",
103+
"GECKO_HEAD_REV": "e31357c7759379d2279b6883cb09c91997bfaa5d",
104+
"MH_BRANCH": "mozilla-central",
105+
"MOZ_SCM_LEVEL": "3",
106+
"GECKO_BASE_REPOSITORY": "https://hg.mozilla.org/mozilla-unified",
107+
"NEED_XVFB": "false",
108+
"MOZ_DISABLE_FULL_SYMBOLS": "1",
109+
"TASKCLUSTER_CACHES": "/builds/worker/checkouts;/builds/worker/tooltool-cache;/builds/worker/workspace",
110+
"GRADLE_USER_HOME": "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline",
111+
"TASKCLUSTER_VOLUMES": "/builds/worker/checkouts;/builds/worker/tooltool-cache;/builds/worker/workspace",
112+
"MOZHARNESS_CONFIG": "builds/releng_base_android_64_builds.py"
113+
},
114+
"features": {
115+
"taskclusterProxy": true,
116+
"relengAPIProxy": true,
117+
"chainOfTrust": true
118+
}
119+
},
120+
"metadata": {
121+
"owner": "[email protected]",
122+
"source": "https://hg.mozilla.org/mozilla-central/file/e31357c7759379d2279b6883cb09c91997bfaa5d/taskcluster/ci/build",
123+
"description": "Android armv7 unit test coverage report ([Treeherder push](https://treeherder.mozilla.org/#/jobs?repo=mozilla-central&revision=e31357c7759379d2279b6883cb09c91997bfaa5d))",
124+
"name": "build-android-test-ccov/opt"
125+
},
126+
"tags": {
127+
"kind": "build",
128+
"worker-implementation": "docker-worker",
129+
"createdForUser": "[email protected]",
130+
"label": "build-android-test-ccov/opt",
131+
"os": "linux",
132+
"android-stuff": "true"
133+
},
134+
"extra": {
135+
"index": {
136+
"rank": 1553794301
137+
},
138+
"chainOfTrust": {
139+
"inputs": {
140+
"docker-image": "fn4N8jQtRZWbuUAjlqXFLA"
141+
}
142+
},
143+
"treeherder": {
144+
"jobKind": "build",
145+
"groupSymbol": "A",
146+
"collection": {
147+
"opt": true
148+
},
149+
"machine": {
150+
"platform": "android-4-0-armv7-api16"
151+
},
152+
"groupName": "Android Gradle tests",
153+
"tier": 1,
154+
"symbol": "test-ccov"
155+
},
156+
"treeherder-platform": "android-4-0-armv7-api16/opt",
157+
"parent": "Mu6w3n-dS9GOfrv6wGOtvg"
158+
}
159+
}

0 commit comments

Comments
 (0)