in app_dart/lib/src/request_handlers/refresh_chromebot_status.dart [90:143]
Future<void> _updateStatus(
LuciBuilder builder,
String? branch,
DatastoreService datastore,
Map<String, List<LuciTask>>? luciTasksMap,
RepositorySlug slug,
) async {
final List<FullTask> datastoreTasks = await datastore
.queryRecentTasks(
taskName: builder.taskName,
branch: branch,
slug: slug,
)
.toList();
/// Update [devicelabTask] when first [luciTask] run finishes. There may be
/// reruns for the same commit and same builder. Update [devicelabTask]
/// [builderNumberList] when luci rerun happens, and update [devicelabTask]
/// status when the status of latest luci run changes.
for (FullTask datastoreTask in datastoreTasks) {
final String commitSha = datastoreTask.commit.sha!;
if (!luciTasksMap!.containsKey(commitSha)) {
continue;
}
final List<LuciTask> luciTasks = luciTasksMap[commitSha]!;
final String buildNumberList =
luciTasks.reversed.map((LuciTask luciTask) => luciTask.buildNumber.toString()).toList().join(',');
final LuciTask latestLuciTask = luciTasks.first;
if (buildNumberList != datastoreTask.task.buildNumberList || latestLuciTask.status != datastoreTask.task.status) {
final Task update = datastoreTask.task;
update.status = latestLuciTask.status;
/// Use `update.attempts - 1` as the `retries` to skip the initial run.
if (await luciBuildService.checkRerunBuilder(
commit: datastoreTask.commit,
luciTask: latestLuciTask,
retries: update.attempts! - 1,
datastore: datastore,
isFlaky: datastoreTask.task.isFlaky)) {
update.status = Task.statusNew;
update.attempts = (update.attempts ?? 0) + 1;
}
update.buildNumberList = buildNumberList;
update.builderName = builder.name;
update.luciBucket = builder.flaky ?? false ? 'luci.flutter.staging' : 'luci.flutter.prod';
await datastore.insert(<Task>[update]);
// Save luci task record to BigQuery only when task finishes.
if (update.status == Task.statusFailed || update.status == Task.statusSucceeded) {
await _insertBigquery(update);
}
}
}
}