Create device_doctor recipe to build package to CIPD.
Success runs
linux: https://chromium-swarm.appspot.com/task?id=506813a13e8b9710
mac: https://chromium-swarm.appspot.com/task?id=5068189617253a10
windows: https://chromium-swarm.appspot.com/task?id=506c11fe5a84fc10
Bug: https://github.com/flutter/flutter/issues/66193
Change-Id: Icfb9721e4d2a721649c5879a444876f776fc0123
Reviewed-on: https://flutter-review.googlesource.com/c/recipes/+/9181
Commit-Queue: Keyong Han <keyonghan@google.com>
Reviewed-by: Casey Hillers <chillers@google.com>
diff --git a/recipes/cocoon/device_doctor.expected/linux.json b/recipes/cocoon/device_doctor.expected/linux.json
new file mode 100644
index 0000000..6db4f88
--- /dev/null
+++ b/recipes/cocoon/device_doctor.expected/linux.json
@@ -0,0 +1,178 @@
+[
+ {
+ "cmd": [],
+ "name": "Checkout flutter/cocoon"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
+ "--path",
+ "[START_DIR]/cocoon",
+ "--url",
+ "https://abc.com/repo"
+ ],
+ "name": "Checkout flutter/cocoon.git setup",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "fetch",
+ "origin",
+ "refs/pull/123/head",
+ "--recurse-submodules",
+ "--progress",
+ "--tags"
+ ],
+ "cwd": "[START_DIR]/cocoon",
+ "env": {
+ "PATH": "RECIPE_REPO[depot_tools]:<PATH>"
+ },
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.git fetch",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "checkout",
+ "-f",
+ "FETCH_HEAD"
+ ],
+ "cwd": "[START_DIR]/cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.git checkout",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "rev-parse",
+ "HEAD"
+ ],
+ "cwd": "[START_DIR]/cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.read revision",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@",
+ "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"deadbeef\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "clean",
+ "-f",
+ "-d",
+ "-x"
+ ],
+ "cwd": "[START_DIR]/cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.git clean",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "submodule",
+ "sync"
+ ],
+ "cwd": "[START_DIR]/cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.submodule sync",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "submodule",
+ "update",
+ "--init",
+ "--recursive"
+ ],
+ "cwd": "[START_DIR]/cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.submodule update",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [],
+ "name": "validate luci builder json schemas"
+ },
+ {
+ "cmd": [
+ "bash",
+ "[START_DIR]/cocoon/device_doctor/tool/build.sh"
+ ],
+ "cwd": "[START_DIR]/cocoon/device_doctor",
+ "name": "build package"
+ },
+ {
+ "cmd": [
+ "cipd",
+ "pkg-build",
+ "-in",
+ "[START_DIR]/cocoon/device_doctor/build",
+ "-name",
+ "flutter/device_doctor/${platform}",
+ "-out",
+ "device_doctor.zip",
+ "-hash-algo",
+ "sha256",
+ "-json-output",
+ "/path/to/tmp/json"
+ ],
+ "name": "build ${platform}",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"result\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"instance_id\": \"40-chars-fake-of-the-package-instance_id\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"package\": \"flutter/device_doctor/resolved-platform\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "cipd",
+ "pkg-register",
+ "device_doctor.zip",
+ "-ref",
+ "staging",
+ "-tag",
+ "sha_timestamp:deadbeef_1337000001",
+ "-json-output",
+ "/path/to/tmp/json"
+ ],
+ "name": "register flutter/device_doctor/${platform}",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"result\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"instance_id\": \"40-chars-fake-of-the-package-instance_id\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"package\": \"flutter/device_doctor/resolved-platform\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@STEP_LINK@flutter/device_doctor/resolved-platform@https://chrome-infra-packages.appspot.com/p/flutter/device_doctor/resolved-platform/+/40-chars-fake-of-the-package-instance_id@@@"
+ ]
+ },
+ {
+ "name": "$result"
+ }
+]
\ No newline at end of file
diff --git a/recipes/cocoon/device_doctor.expected/mac.json b/recipes/cocoon/device_doctor.expected/mac.json
new file mode 100644
index 0000000..6db4f88
--- /dev/null
+++ b/recipes/cocoon/device_doctor.expected/mac.json
@@ -0,0 +1,178 @@
+[
+ {
+ "cmd": [],
+ "name": "Checkout flutter/cocoon"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
+ "--path",
+ "[START_DIR]/cocoon",
+ "--url",
+ "https://abc.com/repo"
+ ],
+ "name": "Checkout flutter/cocoon.git setup",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "fetch",
+ "origin",
+ "refs/pull/123/head",
+ "--recurse-submodules",
+ "--progress",
+ "--tags"
+ ],
+ "cwd": "[START_DIR]/cocoon",
+ "env": {
+ "PATH": "RECIPE_REPO[depot_tools]:<PATH>"
+ },
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.git fetch",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "checkout",
+ "-f",
+ "FETCH_HEAD"
+ ],
+ "cwd": "[START_DIR]/cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.git checkout",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "rev-parse",
+ "HEAD"
+ ],
+ "cwd": "[START_DIR]/cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.read revision",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@",
+ "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"deadbeef\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "clean",
+ "-f",
+ "-d",
+ "-x"
+ ],
+ "cwd": "[START_DIR]/cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.git clean",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "submodule",
+ "sync"
+ ],
+ "cwd": "[START_DIR]/cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.submodule sync",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "submodule",
+ "update",
+ "--init",
+ "--recursive"
+ ],
+ "cwd": "[START_DIR]/cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.submodule update",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [],
+ "name": "validate luci builder json schemas"
+ },
+ {
+ "cmd": [
+ "bash",
+ "[START_DIR]/cocoon/device_doctor/tool/build.sh"
+ ],
+ "cwd": "[START_DIR]/cocoon/device_doctor",
+ "name": "build package"
+ },
+ {
+ "cmd": [
+ "cipd",
+ "pkg-build",
+ "-in",
+ "[START_DIR]/cocoon/device_doctor/build",
+ "-name",
+ "flutter/device_doctor/${platform}",
+ "-out",
+ "device_doctor.zip",
+ "-hash-algo",
+ "sha256",
+ "-json-output",
+ "/path/to/tmp/json"
+ ],
+ "name": "build ${platform}",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"result\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"instance_id\": \"40-chars-fake-of-the-package-instance_id\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"package\": \"flutter/device_doctor/resolved-platform\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "cipd",
+ "pkg-register",
+ "device_doctor.zip",
+ "-ref",
+ "staging",
+ "-tag",
+ "sha_timestamp:deadbeef_1337000001",
+ "-json-output",
+ "/path/to/tmp/json"
+ ],
+ "name": "register flutter/device_doctor/${platform}",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"result\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"instance_id\": \"40-chars-fake-of-the-package-instance_id\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"package\": \"flutter/device_doctor/resolved-platform\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@STEP_LINK@flutter/device_doctor/resolved-platform@https://chrome-infra-packages.appspot.com/p/flutter/device_doctor/resolved-platform/+/40-chars-fake-of-the-package-instance_id@@@"
+ ]
+ },
+ {
+ "name": "$result"
+ }
+]
\ No newline at end of file
diff --git a/recipes/cocoon/device_doctor.expected/win.json b/recipes/cocoon/device_doctor.expected/win.json
new file mode 100644
index 0000000..0406561
--- /dev/null
+++ b/recipes/cocoon/device_doctor.expected/win.json
@@ -0,0 +1,177 @@
+[
+ {
+ "cmd": [],
+ "name": "Checkout flutter/cocoon"
+ },
+ {
+ "cmd": [
+ "python",
+ "-u",
+ "RECIPE_MODULE[depot_tools::git]\\resources\\git_setup.py",
+ "--path",
+ "[START_DIR]\\cocoon",
+ "--url",
+ "https://abc.com/repo"
+ ],
+ "name": "Checkout flutter/cocoon.git setup",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "fetch",
+ "origin",
+ "refs/pull/123/head",
+ "--recurse-submodules",
+ "--progress",
+ "--tags"
+ ],
+ "cwd": "[START_DIR]\\cocoon",
+ "env": {
+ "PATH": "RECIPE_REPO[depot_tools];<PATH>"
+ },
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.git fetch",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "checkout",
+ "-f",
+ "FETCH_HEAD"
+ ],
+ "cwd": "[START_DIR]\\cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.git checkout",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "rev-parse",
+ "HEAD"
+ ],
+ "cwd": "[START_DIR]\\cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.read revision",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@",
+ "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"deadbeef\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "clean",
+ "-f",
+ "-d",
+ "-x"
+ ],
+ "cwd": "[START_DIR]\\cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.git clean",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "submodule",
+ "sync"
+ ],
+ "cwd": "[START_DIR]\\cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.submodule sync",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "git",
+ "submodule",
+ "update",
+ "--init",
+ "--recursive"
+ ],
+ "cwd": "[START_DIR]\\cocoon",
+ "infra_step": true,
+ "name": "Checkout flutter/cocoon.submodule update",
+ "~followup_annotations": [
+ "@@@STEP_NEST_LEVEL@1@@@"
+ ]
+ },
+ {
+ "cmd": [],
+ "name": "validate luci builder json schemas"
+ },
+ {
+ "cmd": [
+ "[START_DIR]\\cocoon\\device_doctor\\tool\\build.bat"
+ ],
+ "cwd": "[START_DIR]\\cocoon\\device_doctor",
+ "name": "build package"
+ },
+ {
+ "cmd": [
+ "cipd.bat",
+ "pkg-build",
+ "-in",
+ "[START_DIR]\\cocoon\\device_doctor\\build",
+ "-name",
+ "flutter/device_doctor/${platform}",
+ "-out",
+ "device_doctor.zip",
+ "-hash-algo",
+ "sha256",
+ "-json-output",
+ "/path/to/tmp/json"
+ ],
+ "name": "build ${platform}",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"result\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"instance_id\": \"40-chars-fake-of-the-package-instance_id\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"package\": \"flutter/device_doctor/resolved-platform\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "cipd.bat",
+ "pkg-register",
+ "device_doctor.zip",
+ "-ref",
+ "staging",
+ "-tag",
+ "sha_timestamp:deadbeef_1337000001",
+ "-json-output",
+ "/path/to/tmp/json"
+ ],
+ "name": "register flutter/device_doctor/${platform}",
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"result\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"instance_id\": \"40-chars-fake-of-the-package-instance_id\", @@@",
+ "@@@STEP_LOG_LINE@json.output@ \"package\": \"flutter/device_doctor/resolved-platform\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@STEP_LINK@flutter/device_doctor/resolved-platform@https://chrome-infra-packages.appspot.com/p/flutter/device_doctor/resolved-platform/+/40-chars-fake-of-the-package-instance_id@@@"
+ ]
+ },
+ {
+ "name": "$result"
+ }
+]
\ No newline at end of file
diff --git a/recipes/cocoon/device_doctor.py b/recipes/cocoon/device_doctor.py
new file mode 100644
index 0000000..0685d1e
--- /dev/null
+++ b/recipes/cocoon/device_doctor.py
@@ -0,0 +1,59 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from recipe_engine.recipe_api import Property
+
+DEPS = [
+ 'recipe_engine/cipd',
+ 'recipe_engine/context',
+ 'recipe_engine/json',
+ 'recipe_engine/path',
+ 'recipe_engine/platform',
+ 'recipe_engine/properties',
+ 'recipe_engine/step',
+ 'recipe_engine/time',
+ 'flutter/json_util',
+ 'repo_util',
+]
+
+# This recipe builds the device_doctor CIPD package.
+def RunSteps(api):
+ cocoon_dir = api.path['start_dir'].join('cocoon')
+ cocoon_git_rev = api.repo_util.checkout(
+ 'cocoon',
+ cocoon_dir,
+ api.properties.get('git_url'),
+ api.properties.get('git_ref'),
+ )
+ # Validates cocoon builders json format.
+ api.json_util.validate_json(cocoon_dir)
+
+ # Builds and uploads a new version of the device_doctor CIPD package.
+ device_doctor_path = cocoon_dir.join('device_doctor')
+ with api.context(cwd=device_doctor_path):
+ if api.platform.is_linux or api.platform.is_mac:
+ build_file = device_doctor_path.join('tool', 'build.sh')
+ api.step('build package', cmd=['bash', build_file])
+ else:
+ build_file = device_doctor_path.join('tool', 'build.bat')
+ api.step('build package', cmd=[build_file])
+
+ cipd_package_name = 'flutter/device_doctor/${platform}'
+ cipd_zip_path = 'device_doctor.zip'
+
+ api.cipd.build(
+ device_doctor_path.join('build'), cipd_zip_path, cipd_package_name)
+ time = str(int(api.time.time()))
+ api.cipd.register(cipd_package_name, cipd_zip_path, refs=['staging'],
+ tags={'sha_timestamp': cocoon_git_rev+'_'+time})
+
+
+def GenTests(api):
+ for platform in ('mac', 'linux', 'win'):
+ yield api.test(
+ platform,
+ api.properties(
+ git_ref='refs/pull/123/head', git_url='https://abc.com/repo'),
+ api.platform(platform, 64)
+ )