diff --git a/ci/dev/README.md b/ci/dev/README.md new file mode 100644 index 0000000000000..8c0f473f376e3 --- /dev/null +++ b/ci/dev/README.md @@ -0,0 +1,28 @@ +This directory contains resources that the Flutter team uses during +the development of engine. + +## Luci builder file +`engine_try_builders.json` and `engine_prod_builders.json` contains the +supported luci try/prod builders for engine. It follows format: +```json +{ + "builders":[ + { + "name":"xxx", + "repo":"engine" + }, + { + "name":"yyy", + "repo":"engine" + } + ] +} +``` +This file will be mainly used in [`flutter/cocoon`](https://github.com/flutter/cocoon) +to trigger/update engine luci tasks. + +If any new changes, please validate json contents by running +``` +dart validate_json.dart engine_try_builders.json +dart validate_json.dart engine_prod_builders.json +``` diff --git a/ci/dev/dev_test.sh b/ci/dev/dev_test.sh new file mode 100644 index 0000000000000..43d4880bce736 --- /dev/null +++ b/ci/dev/dev_test.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Copyright 2020 The Flutter Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Runner for dart tests. It expects a single parameter with the full +# path to the start folder where tests will be run. + +set -e + +dir=$(dirname $0) + +pushd $dir > /dev/null +dart validate_json.dart engine_try_builders.json +dart validate_json.dart engine_prod_builders.json + +popd > /dev/null + + diff --git a/ci/dev/engine_prod_builders.json b/ci/dev/engine_prod_builders.json new file mode 100644 index 0000000000000..58fc27caad09d --- /dev/null +++ b/ci/dev/engine_prod_builders.json @@ -0,0 +1,52 @@ +{ + "builders":[ + { + "name":"Linux Host Engine", + "repo":"engine" + }, + { + "name":"Linux Fuchsia", + "repo":"engine" + }, + { + "name":"Linux Android AOT Engine", + "repo":"engine" + }, + { + "name":"Linux Android Debug Engine", + "repo":"engine" + }, + { + "name":"Mac Host Engine", + "repo":"engine" + }, + { + "name":"Mac Android AOT Engine", + "repo":"engine" + }, + { + "name":"Mac Android Debug Engine", + "repo":"engine" + }, + { + "name":"Mac iOS Engine", + "repo":"engine" + }, + { + "name":"Mac iOS Engine Profile", + "repo":"engine" + }, + { + "name":"Mac iOS Engine Release", + "repo":"engine" + }, + { + "name":"Windows Host Engine", + "repo":"engine" + }, + { + "name":"Windows Android AOT Engine", + "repo":"engine" + } + ] +} diff --git a/ci/dev/engine_try_builders.json b/ci/dev/engine_try_builders.json new file mode 100644 index 0000000000000..f93d214ed5546 --- /dev/null +++ b/ci/dev/engine_try_builders.json @@ -0,0 +1,60 @@ +{ + "builders":[ + { + "name":"Linux Host Engine", + "repo":"engine" + }, + { + "name":"Linux Fuchsia", + "repo":"engine" + }, + { + "name":"Linux Android AOT Engine", + "repo":"engine" + }, + { + "name":"Linux Android Debug Engine", + "repo":"engine" + }, + { + "name":"Linux Web Engine", + "repo":"engine" + }, + { + "name":"Mac Host Engine", + "repo":"engine" + }, + { + "name":"Mac Android AOT Engine", + "repo":"engine" + }, + { + "name":"Mac Android Debug Engine", + "repo":"engine" + }, + { + "name":"Mac Host Engine", + "repo":"engine" + }, + { + "name":"Mac iOS Engine", + "repo":"engine" + }, + { + "name":"Windows Host Engine", + "repo":"engine" + }, + { + "name":"Windows Android AOT Engine", + "repo":"engine" + }, + { + "name":"Windows Web Engine", + "repo":"engine" + }, + { + "name":"Mac Web Engine", + "repo":"engine" + } + ] +} diff --git a/ci/dev/validate_json.dart b/ci/dev/validate_json.dart new file mode 100644 index 0000000000000..957813cf4d3eb --- /dev/null +++ b/ci/dev/validate_json.dart @@ -0,0 +1,76 @@ +// Copyright 2020 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; +import 'dart:io'; +import 'dart:io' show File; +import 'dart:io' as io_internals show exit; + +final bool hasColor = stdout.supportsAnsiEscapes; +final String bold = hasColor ? '\x1B[1m' : ''; // used for shard titles +final String red = hasColor ? '\x1B[31m' : ''; // used for errors +final String reset = hasColor ? '\x1B[0m' : ''; +final String reverse = hasColor ? '\x1B[7m' : ''; // used for clocks + +/// Validates if the input builders JSON file has valid contents. +/// +/// Examples: +/// dart validate_json.dart /path/to/json/file +Future main(List args) async { + final String jsonString = await File(args[0]).readAsString(); + Map decodedJson; + final List messages = []; + try { + decodedJson = json.decode(jsonString) as Map; + final List builders = decodedJson['builders'] as List; + if (builders == null) { + messages.add('${bold}Json format is violated: no "builders" exists. Please follow: $reset'); + messages.add(''' + { + "builders":[ + { + "name":"xxx", + "repo":"engine" + }, { + "name":"xxx", + "repo":"engine" + } + ] + }'''); + exitWithError(messages); + } + } on ExitException catch (error) { + error.apply(); + } + print('$clock ${bold}Analysis successful for ${args[0]}.$reset'); +} + +class ExitException implements Exception { + ExitException(this.exitCode); + + final int exitCode; + + void apply() { + io_internals.exit(exitCode); + } +} + +void exitWithError(List messages) { + final String redLine = '$red━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━$reset'; + print(redLine); + messages.forEach(print); + print(redLine); + exit(1); +} + +String get clock { + final DateTime now = DateTime.now(); + return '$reverse▌' + '${now.hour.toString().padLeft(2, "0")}:' + '${now.minute.toString().padLeft(2, "0")}:' + '${now.second.toString().padLeft(2, "0")}' + '▐$reset'; +} + +