1[
2  {
3    "cmd": [
4      "vpython",
5      "-u",
6      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
7      "--json-output",
8      "/path/to/tmp/json",
9      "ensure-directory",
10      "--mode",
11      "0777",
12      "[START_DIR]/tmp"
13    ],
14    "infra_step": true,
15    "name": "makedirs tmp_dir"
16  },
17  {
18    "cmd": [
19      "python",
20      "-u",
21      "import os\nprint(os.environ.get('SWARMING_BOT_ID', ''))\n"
22    ],
23    "name": "get swarming bot id",
24    "~followup_annotations": [
25      "@@@STEP_LOG_LINE@python.inline@import os@@@",
26      "@@@STEP_LOG_LINE@python.inline@print(os.environ.get('SWARMING_BOT_ID', ''))@@@",
27      "@@@STEP_LOG_END@python.inline@@@"
28    ]
29  },
30  {
31    "cmd": [
32      "/usr/bin/adb.1.0.35",
33      "shell",
34      "mkdir",
35      "-p",
36      "/sdcard/revenge_of_the_skiabot/resources"
37    ],
38    "cwd": "[START_DIR]/skia",
39    "env": {
40      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
41      "CHROME_HEADLESS": "1",
42      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
43    },
44    "infra_step": true,
45    "name": "mkdir /sdcard/revenge_of_the_skiabot/resources"
46  },
47  {
48    "cmd": [
49      "/usr/bin/adb.1.0.35",
50      "shell",
51      "cp",
52      "/vendor/lib64/egl/libGLES_mali.so",
53      "/data/local/tmp/libvulkan.so"
54    ],
55    "cwd": "[START_DIR]/skia",
56    "env": {
57      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
58      "CHROME_HEADLESS": "1",
59      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
60    },
61    "infra_step": true,
62    "name": "cp libGLES_mali.so to /data/local/tmp/"
63  },
64  {
65    "cmd": [
66      "vpython",
67      "-u",
68      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
69      "--json-output",
70      "/path/to/tmp/json",
71      "copy",
72      "[START_DIR]/skia/infra/bots/assets/skp/VERSION",
73      "/path/to/tmp/"
74    ],
75    "infra_step": true,
76    "name": "Get skp VERSION",
77    "~followup_annotations": [
78      "@@@STEP_LOG_LINE@VERSION@42@@@",
79      "@@@STEP_LOG_END@VERSION@@@"
80    ]
81  },
82  {
83    "cmd": [
84      "vpython",
85      "-u",
86      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
87      "--json-output",
88      "/path/to/tmp/json",
89      "copy",
90      "42",
91      "[START_DIR]/tmp/SKP_VERSION"
92    ],
93    "infra_step": true,
94    "name": "write SKP_VERSION",
95    "~followup_annotations": [
96      "@@@STEP_LOG_LINE@SKP_VERSION@42@@@",
97      "@@@STEP_LOG_END@SKP_VERSION@@@"
98    ]
99  },
100  {
101    "cmd": [
102      "/usr/bin/adb.1.0.35",
103      "shell",
104      "cat",
105      "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
106    ],
107    "cwd": "[START_DIR]/skia",
108    "env": {
109      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
110      "CHROME_HEADLESS": "1",
111      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
112    },
113    "infra_step": true,
114    "name": "read /sdcard/revenge_of_the_skiabot/SKP_VERSION"
115  },
116  {
117    "cmd": [
118      "python",
119      "-u",
120      "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)\nexcept subprocess.CalledProcessError as e:\n  output = e.output\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
121      "/usr/bin/adb.1.0.35",
122      "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
123    ],
124    "env": {
125      "CHROME_HEADLESS": "1",
126      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
127    },
128    "infra_step": true,
129    "name": "rm /sdcard/revenge_of_the_skiabot/SKP_VERSION",
130    "~followup_annotations": [
131      "@@@STEP_LOG_LINE@python.inline@@@@",
132      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
133      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
134      "@@@STEP_LOG_LINE@python.inline@@@@",
135      "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
136      "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
137      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
138      "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
139      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
140      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
141      "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
142      "@@@STEP_LOG_LINE@python.inline@@@@",
143      "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
144      "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
145      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
146      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
147      "@@@STEP_LOG_LINE@python.inline@try:@@@",
148      "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)@@@",
149      "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
150      "@@@STEP_LOG_LINE@python.inline@  output = e.output@@@",
151      "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
152      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
153      "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
154      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
155      "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
156      "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
157      "@@@STEP_LOG_END@python.inline@@@"
158    ]
159  },
160  {
161    "cmd": [
162      "python",
163      "-u",
164      "\nimport subprocess\nimport sys\n\n# Remove the path.\nadb = sys.argv[1]\npath = sys.argv[2]\nprint('Removing %s' % path)\ncmd = [adb, 'shell', 'rm', '-rf', path]\nprint(' '.join(cmd))\nsubprocess.check_call(cmd)\n\n# Verify that the path was deleted.\nprint('Checking for existence of %s' % path)\ncmd = [adb, 'shell', 'ls', path]\nprint(' '.join(cmd))\ntry:\n  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)\nexcept subprocess.CalledProcessError as e:\n  output = e.output\nprint('Output was:')\nprint('======')\nprint(output)\nprint('======')\nif 'No such file or directory' not in output:\n  raise Exception('%s exists despite being deleted' % path)\n",
165      "/usr/bin/adb.1.0.35",
166      "/sdcard/revenge_of_the_skiabot/skps"
167    ],
168    "env": {
169      "CHROME_HEADLESS": "1",
170      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
171    },
172    "infra_step": true,
173    "name": "rm /sdcard/revenge_of_the_skiabot/skps",
174    "~followup_annotations": [
175      "@@@STEP_LOG_LINE@python.inline@@@@",
176      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
177      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
178      "@@@STEP_LOG_LINE@python.inline@@@@",
179      "@@@STEP_LOG_LINE@python.inline@# Remove the path.@@@",
180      "@@@STEP_LOG_LINE@python.inline@adb = sys.argv[1]@@@",
181      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[2]@@@",
182      "@@@STEP_LOG_LINE@python.inline@print('Removing %s' % path)@@@",
183      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'rm', '-rf', path]@@@",
184      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
185      "@@@STEP_LOG_LINE@python.inline@subprocess.check_call(cmd)@@@",
186      "@@@STEP_LOG_LINE@python.inline@@@@",
187      "@@@STEP_LOG_LINE@python.inline@# Verify that the path was deleted.@@@",
188      "@@@STEP_LOG_LINE@python.inline@print('Checking for existence of %s' % path)@@@",
189      "@@@STEP_LOG_LINE@python.inline@cmd = [adb, 'shell', 'ls', path]@@@",
190      "@@@STEP_LOG_LINE@python.inline@print(' '.join(cmd))@@@",
191      "@@@STEP_LOG_LINE@python.inline@try:@@@",
192      "@@@STEP_LOG_LINE@python.inline@  output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)@@@",
193      "@@@STEP_LOG_LINE@python.inline@except subprocess.CalledProcessError as e:@@@",
194      "@@@STEP_LOG_LINE@python.inline@  output = e.output@@@",
195      "@@@STEP_LOG_LINE@python.inline@print('Output was:')@@@",
196      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
197      "@@@STEP_LOG_LINE@python.inline@print(output)@@@",
198      "@@@STEP_LOG_LINE@python.inline@print('======')@@@",
199      "@@@STEP_LOG_LINE@python.inline@if 'No such file or directory' not in output:@@@",
200      "@@@STEP_LOG_LINE@python.inline@  raise Exception('%s exists despite being deleted' % path)@@@",
201      "@@@STEP_LOG_END@python.inline@@@"
202    ]
203  },
204  {
205    "cmd": [
206      "/usr/bin/adb.1.0.35",
207      "shell",
208      "mkdir",
209      "-p",
210      "/sdcard/revenge_of_the_skiabot/skps"
211    ],
212    "cwd": "[START_DIR]/skia",
213    "env": {
214      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
215      "CHROME_HEADLESS": "1",
216      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
217    },
218    "infra_step": true,
219    "name": "mkdir /sdcard/revenge_of_the_skiabot/skps"
220  },
221  {
222    "cmd": [
223      "vpython",
224      "-u",
225      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
226      "--json-output",
227      "/path/to/tmp/json",
228      "glob",
229      "[START_DIR]/skp",
230      "*"
231    ],
232    "infra_step": true,
233    "name": "ls [START_DIR]/skp/*",
234    "~followup_annotations": [
235      "@@@STEP_LOG_LINE@glob@[START_DIR]/skp/bar.jpg@@@",
236      "@@@STEP_LOG_LINE@glob@[START_DIR]/skp/foo.png@@@",
237      "@@@STEP_LOG_END@glob@@@"
238    ]
239  },
240  {
241    "cmd": [
242      "/usr/bin/adb.1.0.35",
243      "push",
244      "[START_DIR]/skp/bar.jpg",
245      "[START_DIR]/skp/foo.png",
246      "/sdcard/revenge_of_the_skiabot/skps"
247    ],
248    "cwd": "[START_DIR]/skia",
249    "env": {
250      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
251      "CHROME_HEADLESS": "1",
252      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
253    },
254    "infra_step": true,
255    "name": "push [START_DIR]/skp/* /sdcard/revenge_of_the_skiabot/skps"
256  },
257  {
258    "cmd": [
259      "/usr/bin/adb.1.0.35",
260      "push",
261      "[START_DIR]/tmp/SKP_VERSION",
262      "/sdcard/revenge_of_the_skiabot/SKP_VERSION"
263    ],
264    "cwd": "[START_DIR]/skia",
265    "env": {
266      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
267      "CHROME_HEADLESS": "1",
268      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
269    },
270    "infra_step": true,
271    "name": "push [START_DIR]/tmp/SKP_VERSION /sdcard/revenge_of_the_skiabot/SKP_VERSION"
272  },
273  {
274    "cmd": [
275      "vpython",
276      "-u",
277      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
278      "--json-output",
279      "/path/to/tmp/json",
280      "ensure-directory",
281      "--mode",
282      "0777",
283      "[START_DIR]/[SWARM_OUT_DIR]"
284    ],
285    "infra_step": true,
286    "name": "makedirs perf_dir"
287  },
288  {
289    "cmd": [
290      "adb.1.0.35",
291      "push",
292      "[START_DIR]/build/skpbench",
293      "/data/local/tmp/"
294    ],
295    "cwd": "[START_DIR]/skia",
296    "env": {
297      "CHROME_HEADLESS": "1",
298      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
299    },
300    "infra_step": true,
301    "name": "push skpbench"
302  },
303  {
304    "cmd": [
305      "python",
306      "-u",
307      "[START_DIR]/skia/tools/skpbench/skpbench.py",
308      "/data/local/tmp/skpbench",
309      "--resultsfile",
310      "[START_DIR]/[SWARM_OUT_DIR]/table",
311      "--config",
312      "glesdmsaa,glesmsaa4",
313      "--internalSamples",
314      "4",
315      "-v5",
316      "--adb",
317      "--adb_binary",
318      "adb.1.0.35",
319      "--allPathsVolatile",
320      "--suffix",
321      "_volatile",
322      "/sdcard/revenge_of_the_skiabot/skps/desk_*svg.skp",
323      "/sdcard/revenge_of_the_skiabot/skps/desk_motionmark*.skp",
324      "/sdcard/revenge_of_the_skiabot/skps/desk_chalkboard.skp"
325    ],
326    "env": {
327      "CHROME_HEADLESS": "1",
328      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
329    },
330    "name": "skpbench"
331  },
332  {
333    "cmd": [
334      "python",
335      "-u",
336      "import os\nprint(os.environ.get('SWARMING_TASK_ID', ''))\n"
337    ],
338    "name": "get swarming task id",
339    "~followup_annotations": [
340      "@@@STEP_LOG_LINE@python.inline@import os@@@",
341      "@@@STEP_LOG_LINE@python.inline@print(os.environ.get('SWARMING_TASK_ID', ''))@@@",
342      "@@@STEP_LOG_END@python.inline@@@"
343    ]
344  },
345  {
346    "cmd": [
347      "python",
348      "-u",
349      "[START_DIR]/skia/tools/skpbench/skiaperf.py",
350      "[START_DIR]/[SWARM_OUT_DIR]/table",
351      "--properties",
352      "gitHash",
353      "abc123",
354      "swarming_bot_id",
355      "skia-bot-123",
356      "swarming_task_id",
357      "123456",
358      "--outfile",
359      "[START_DIR]/[SWARM_OUT_DIR]/skpbench_abc123_1337000001.json",
360      "--key",
361      "arch",
362      "arm64",
363      "compiler",
364      "Clang",
365      "cpu_or_gpu",
366      "GPU",
367      "cpu_or_gpu_value",
368      "MaliG77",
369      "extra_config",
370      "Android_AllPathsVolatile_Skpbench",
371      "model",
372      "GalaxyS20",
373      "os",
374      "Android",
375      "test_filter",
376      "All"
377    ],
378    "env": {
379      "CHROME_HEADLESS": "1",
380      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
381    },
382    "name": "Parse skpbench output into Perf json"
383  },
384  {
385    "cmd": [
386      "python",
387      "-u",
388      "\nimport os\nimport subprocess\nimport sys\nout = sys.argv[1]\nlog = subprocess.check_output(['/usr/bin/adb.1.0.35', 'logcat', '-d'])\nfor line in log.split('\\n'):\n  tokens = line.split()\n  if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':\n    addr, path = tokens[-2:]\n    local = os.path.join(out, os.path.basename(path))\n    if os.path.exists(local):\n      try:\n        sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])\n        line = line.replace(addr, addr + ' ' + sym.strip())\n      except subprocess.CalledProcessError:\n        pass\n  print(line)\n",
389      "[START_DIR]/build"
390    ],
391    "env": {
392      "CHROME_HEADLESS": "1",
393      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
394    },
395    "infra_step": true,
396    "name": "dump log",
397    "timeout": 300,
398    "~followup_annotations": [
399      "@@@STEP_LOG_LINE@python.inline@@@@",
400      "@@@STEP_LOG_LINE@python.inline@import os@@@",
401      "@@@STEP_LOG_LINE@python.inline@import subprocess@@@",
402      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
403      "@@@STEP_LOG_LINE@python.inline@out = sys.argv[1]@@@",
404      "@@@STEP_LOG_LINE@python.inline@log = subprocess.check_output(['/usr/bin/adb.1.0.35', 'logcat', '-d'])@@@",
405      "@@@STEP_LOG_LINE@python.inline@for line in log.split('\\n'):@@@",
406      "@@@STEP_LOG_LINE@python.inline@  tokens = line.split()@@@",
407      "@@@STEP_LOG_LINE@python.inline@  if len(tokens) == 11 and tokens[-7] == 'F' and tokens[-3] == 'pc':@@@",
408      "@@@STEP_LOG_LINE@python.inline@    addr, path = tokens[-2:]@@@",
409      "@@@STEP_LOG_LINE@python.inline@    local = os.path.join(out, os.path.basename(path))@@@",
410      "@@@STEP_LOG_LINE@python.inline@    if os.path.exists(local):@@@",
411      "@@@STEP_LOG_LINE@python.inline@      try:@@@",
412      "@@@STEP_LOG_LINE@python.inline@        sym = subprocess.check_output(['addr2line', '-Cfpe', local, addr])@@@",
413      "@@@STEP_LOG_LINE@python.inline@        line = line.replace(addr, addr + ' ' + sym.strip())@@@",
414      "@@@STEP_LOG_LINE@python.inline@      except subprocess.CalledProcessError:@@@",
415      "@@@STEP_LOG_LINE@python.inline@        pass@@@",
416      "@@@STEP_LOG_LINE@python.inline@  print(line)@@@",
417      "@@@STEP_LOG_END@python.inline@@@"
418    ]
419  },
420  {
421    "cmd": [
422      "/usr/bin/adb.1.0.35",
423      "kill-server"
424    ],
425    "cwd": "[START_DIR]/skia",
426    "env": {
427      "ADB_VENDOR_KEYS": "/home/chrome-bot/.android/adbkey",
428      "CHROME_HEADLESS": "1",
429      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
430    },
431    "infra_step": true,
432    "name": "kill adb server"
433  },
434  {
435    "name": "$result"
436  }
437]