[devtools] Add full (clean) build capability

Bug: chromium:1143363
Change-Id: Ia562434c1191adbc62dbe8d19053f157f46e8e6d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/build/+/2506750
Commit-Queue: Liviu Rau <liviurau@chromium.org>
Reviewed-by: Michael Achenbach <machenbach@chromium.org>
diff --git a/recipes/recipes/devtools/devtools-frontend.expected/basic debug.json b/recipes/recipes/devtools/devtools-frontend.expected/basic debug.json
index 79729d6..7fbbc5d 100644
--- a/recipes/recipes/devtools/devtools-frontend.expected/basic debug.json
+++ b/recipes/recipes/devtools/devtools-frontend.expected/basic debug.json
@@ -175,16 +175,22 @@
   },
   {
     "cmd": [
-      "rm",
-      "-rf",
+      "python",
+      "-u",
+      "RECIPE_REPO[depot_tools]/gn.py",
+      "clean",
       "[CACHE]/builder/devtools-frontend/out/Debug"
     ],
+    "cwd": "[CACHE]/builder/devtools-frontend/out/Debug",
     "env_prefixes": {
       "PATH": [
         "[CACHE]/builder/devtools-frontend/third_party"
       ]
     },
-    "name": "clean debug"
+    "name": "clean outdir",
+    "~followup_annotations": [
+      "@@@STEP_LOG_END@raw_io.output_text[gn output]@@@"
+    ]
   },
   {
     "cmd": [
diff --git a/recipes/recipes/devtools/devtools-frontend.py b/recipes/recipes/devtools/devtools-frontend.py
index 46658fa..0858045 100644
--- a/recipes/recipes/devtools/devtools-frontend.py
+++ b/recipes/recipes/devtools/devtools-frontend.py
@@ -4,7 +4,7 @@
 
 from contextlib import contextmanager
 from PB.go.chromium.org.luci.buildbucket.proto import common as common_pb
-from recipe_engine.post_process import (DropExpectation, StatusFailure)
+from recipe_engine import post_process
 import json
 
 DEPS = [
@@ -15,6 +15,7 @@
     'depot_tools/git',
     'depot_tools/gclient',
     'depot_tools/tryserver',
+    'gn',
     'perf_dashboard',
     'recipe_engine/buildbucket',
     'recipe_engine/context',
@@ -39,12 +40,12 @@
 
   with _depot_on_path(api):
     api.chromium.ensure_goma()
-    _clean_debug(api)
+    clean_out_dir(api)
     api.chromium.run_gn(use_goma=True)
     compilation_result = api.chromium.compile(use_goma_module=True)
     if compilation_result.status != common_pb.SUCCESS:
       return compilation_result
-    if is_debug(api):
+    if is_debug_builder(api):
       return
     run_unit_tests(api)
     run_type_check(api)
@@ -64,9 +65,11 @@
   return api.properties.get('builder_config', 'Release')
 
 
-def is_debug(api):
+def is_debug_builder(api):
   return builder_config(api) == 'Debug'
 
+def is_clobber(api):
+  return api.properties.get('clobber', False)
 
 def _configure(api):
   _configure_source(api)
@@ -138,12 +141,15 @@
   with api.context(cwd=api.path['checkout']):
     api.git('clean', '-xf', '--', 'front_end')
 
-def _clean_debug(api):
-  if is_debug(api):
-    api.step(
-      'clean debug',
-      ['rm', '-rf', api.path['checkout'].join('out', 'Debug')]
-    )
+def clean_out_dir(api):
+  if is_clobber(api):
+    dir_to_clean = 'Release'
+  elif is_debug_builder(api):
+    dir_to_clean = 'Debug'
+  else:
+    return
+  api.gn.clean(
+      api.path['checkout'].join('out', dir_to_clean))
 
 
 @contextmanager
@@ -268,7 +274,7 @@
       api.builder_group.for_current('devtools-frontend'),
       ci_build(builder='linux'),
       api.step_data('compile', retcode=1),
-      api.post_process(StatusFailure),
+      api.post_process(post_process.StatusFailure),
   )
 
   yield api.test(
@@ -284,3 +290,13 @@
       ci_build(builder='linux'),
       api.properties(builder_config='Debug'),
   )
+
+  yield api.test(
+      'full build',
+      api.builder_group.for_current('tryserver.devtools-frontend'),
+      ci_build(builder='linux'),
+      api.properties(clobber=True),
+      api.post_process(post_process.MustRun, 'clean outdir'),
+      api.post_process(post_process.StatusSuccess),
+      api.post_process(post_process.DropExpectation),
+  )