run method
Runs stages in order, past any red, and returns the summary line.
Implementation
Future<String> run(List<String> stages) async {
final watch = Stopwatch()..start();
Directory(runDir).createSync(recursive: true);
console.writeln('$toolName ${stages.map((s) => ':$s').join(' ')}');
console.writeln(' logs ${relative(runDir)}');
console.writeln(' lock $lockPath');
console.writeln(
' flutter ${flutter ?? 'NOT FOUND (put it on PATH or set FLUTTER_ROOT)'}',
);
final subscriptions = <StreamSubscription<ProcessSignal>>[];
void onSignal(ProcessSignal signal) {
runner.interrupt();
final line =
'CI RED: interrupted by $signal after '
'${formatCiDuration(watch.elapsed)} — logs so far ${relative(runDir)}';
_appendSummary(line);
stdout.writeln('\n$line');
exit(130);
}
subscriptions.add(ProcessSignal.sigint.watch().listen(onSignal));
if (!Platform.isWindows) {
subscriptions.add(ProcessSignal.sigterm.watch().listen(onSignal));
}
try {
for (final stage in stages) {
console.writeln('== :$stage — ${stageDescriptions[stage] ?? ''}');
await runStage(this, stage);
}
} finally {
// A cancel takes effect when called; nothing waits on its future.
for (final s in subscriptions) {
unawaited(s.cancel());
}
runner.lock.release();
}
final line = ciSummaryLine(
stages: stages,
outcomes: outcomes,
elapsed: watch.elapsed,
runDir: runDir,
relativeTo: repositoryRoot,
);
_appendSummary(line);
return line;
}