run method

  1. @override
Future<void> run()
override

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.',
  );
}