run method
Runs this command.
The return value is wrapped in a Future if necessary and returned by
CommandRunner.runCommand.
Implementation
@override
Future<void> run() async {
config = ConfigService(projectDir);
whiteLabel = WhiteLabelService(projectDir: projectDir, config: config);
cleanup = CleanupService(projectDir: projectDir, config: config);
final isTest = argResults!['test'] as bool;
final failFast = argResults!['fail-fast'] as bool;
_progressFile = argResults!['progress-file'] as String?;
final plan = BuildPlan(
clients: BuildPlan.resolveClients(
argResults!['client'] as List<String>,
allClients: argResults!['all-clients'] as bool,
knownClients: await listClientNames(),
),
targets: BuildPlan.resolveTargets(
argResults!['platform'] as List<String>,
argResults!['type'] as List<String>,
),
);
final versions = BuildVersion.resolvePerClient(
argResults!['build-version'] as List<String>, plan.clients);
final parallel = _resolveParallel(argResults!['parallel'] as String);
if (argResults!['slack'] as bool) {
slackService =
await initializeSlackService(argResults!['slack-channel'] as String);
}
final jobs = plan.jobs;
final estimator = DurationEstimator(await config.loadBuildHistory());
final runStart = DateTime.now();
final List<TargetResult> results;
if (jobs.length == 1) {
results = await _runSingleJob(jobs.single, estimator,
isTest: isTest,
failFast: failFast,
version: versions[jobs.single.client]);
} else {
results = await _runBatch(plan, jobs, estimator,
isTest: isTest,
failFast: failFast,
versions: versions,
parallel: parallel);
}
final resultFile = argResults!['result-file'] as String?;
if (resultFile != null) TargetResult.writeAll(File(resultFile), results);
final failed = results.where((r) => r.failed).toList();
if (results.length > 1) {
_printBatchSummary(results, DateTime.now().difference(runStart));
} else {
_printSingleSummary(results.single);
}
if (_cancelled) {
Logger.warning(
'Build cancelled. Finished artifacts are in build/udara/.');
exit(130);
}
if (failed.isEmpty) return;
if (results.length == 1) {
// Keep the original error (and its fix) for single builds.
final cause = failed.single.cause;
throw cause is BuildException
? cause
: BuildException(failed.single.error ?? 'Build failed.');
}
throw BuildException(
'${failed.length} of ${results.length} builds failed.',
fix: 'See the summary above, or run "udara_cli history" for the errors.',
);
}