[ci] Upload screenshots, logs, and Xcode test results for drive and integration_test runs (#7430)

1. Native Xcode tests will output a helpful "xcresult" package on failure containing logs, screenshots, and screen recordings.  Zip and upload these results when tests fail.

2. Pass `flutter test --debug-logs-dir` flag to upload logs  like https://github.com/flutter/flutter/pull/142643.

3. Pass `flutter drive --screenshot` flag to upload screenshots on timeout like https://github.com/flutter/flutter/pull/96973.

Example of [failing Xcode analyzer build](https://ci.chromium.org/ui/p/flutter/builders/try/Mac_arm64%20ios_platform_tests_shard_5%20master/17374/overview) has the [zipped xcresult](https://storage.googleapis.com/flutter_logs/flutter/ff98c32e-18ca-4ad4-a910-9db1d7f7e4b0/xcode%20analyze/ff98c32e-18ca-4ad4-a910-9db1d7f7e4b0/xcodebuild-2024-10-25T09:56:46.440913.zip) attached as a log.
![Screenshot 2024-10-25 at 10 10 36 AM](https://github.com/user-attachments/assets/dd7ae9bc-6161-4381-8a4f-f10b8c981801)

The unzipped xcresult looks like this in Xcode:

![Screenshot 2024-10-25 at 10 11 55 AM](https://github.com/user-attachments/assets/d4dd8420-f272-459c-9785-ab0c03887a74)

A [failing "native test" step build](https://ci.chromium.org/ui/p/flutter/builders/try/Mac_arm64%20macos_platform_tests%20master%20-%20packages/17315/overview):

![Screenshot 2024-10-25 at 10 19 55 AM](https://github.com/user-attachments/assets/76a86a15-2150-482a-8b15-e3e7ac90485e)

Fixes https://github.com/flutter/flutter/issues/144795
This commit is contained in:
Jenn Magder
2024-11-05 22:58:26 -08:00
committed by GitHub
parent d3d563de5a
commit bb5a25815c
8 changed files with 242 additions and 40 deletions

View File

@ -228,8 +228,12 @@ class DriveExamplesCommand extends PackageLoopingCommand {
}
for (final File driver in drivers) {
final List<File> failingTargets = await _driveTests(
example, driver, testTargets,
deviceFlags: deviceFlags);
example,
driver,
testTargets,
deviceFlags: deviceFlags,
exampleName: exampleName,
);
for (final File failingTarget in failingTargets) {
errors.add(
getRelativePosixPath(failingTarget, from: package.directory));
@ -376,10 +380,16 @@ class DriveExamplesCommand extends PackageLoopingCommand {
File driver,
List<File> targets, {
required List<String> deviceFlags,
required String exampleName,
}) async {
final List<File> failures = <File>[];
final String enableExperiment = getStringArg(kEnableExperiment);
final String screenshotBasename =
'${exampleName.replaceAll(platform.pathSeparator, '_')}-drive';
final Directory? screenshotDirectory =
ciLogsDirectory(platform, driver.fileSystem)
?.childDirectory(screenshotBasename);
for (final File target in targets) {
final int exitCode = await processRunner.runAndStream(
@ -389,6 +399,8 @@ class DriveExamplesCommand extends PackageLoopingCommand {
...deviceFlags,
if (enableExperiment.isNotEmpty)
'--enable-experiment=$enableExperiment',
if (screenshotDirectory != null)
'--screenshot=${screenshotDirectory.path}',
'--driver',
getRelativePosixPath(driver, from: example.directory),
'--target',
@ -416,6 +428,8 @@ class DriveExamplesCommand extends PackageLoopingCommand {
required List<File> testFiles,
}) async {
final String enableExperiment = getStringArg(kEnableExperiment);
final Directory? logsDirectory =
ciLogsDirectory(platform, testFiles.first.fileSystem);
// Workaround for https://github.com/flutter/flutter/issues/135673
// Once that is fixed on stable, this logic can be removed and the command
@ -438,6 +452,7 @@ class DriveExamplesCommand extends PackageLoopingCommand {
...deviceFlags,
if (enableExperiment.isNotEmpty)
'--enable-experiment=$enableExperiment',
if (logsDirectory != null) '--debug-logs-dir=${logsDirectory.path}',
target,
],
workingDir: example.directory);