release static method

Future<List<String>> release({
  1. required String buildName,
  2. required int buildNumber,
  3. required String platform,
  4. required String buildOptions,
  5. required String flutterVersion,
})

Implementation

static Future<List<String>> release({
  required final String buildName,
  required final int buildNumber,
  required final String platform,
  required final String buildOptions,
  required final String flutterVersion,
}) async {
  stdout.writeln(
    'Starting shorebird build for $buildName+${buildNumber + 1}...',
  );

  final shorebirdReleaseProcess = await Process.start(
    'shorebird',
    [
      'release',
      '--platforms=$platform',
      '--build-name=$buildName',
      '--build-number=${buildNumber + 1}',
      '--flutter-version=$flutterVersion',
      '--',
      if (platform.contains('ios'))
        '--export-options-plist=ios/exportOptions.plist',
      ...buildOptions.split(' '),
    ],
  );

  shorebirdReleaseProcess.stdout
      .transform(const SystemEncoding().decoder)
      .listen((final data) {
    stdout.write(data);
  });
  shorebirdReleaseProcess.stderr
      .transform(const SystemEncoding().decoder)
      .listen((final data) => stderr.write(data));

  final shorebirdReleaseProcessExitCode =
      await shorebirdReleaseProcess.exitCode;
  if (shorebirdReleaseProcessExitCode != 0) {
    exit(1);
  }

  final buildFiles = Directory('build').listSync(recursive: true).where(
        (final file) =>
            (platform.contains('ios') && file.path.contains('.ipa')) ||
            (platform.contains('android') &&
                file.path.contains('.aab') &&
                !file.path.contains('intermediary')),
      );
  if (buildFiles.isEmpty) {
    stderr.writeln('No build files found in build folder.');
    exit(1);
  }
  stdout.writeln(
    'Found build files ${buildFiles.map((final file) => file.path)}',
  );

  return [for (final file in buildFiles) file.path];
}