publish method

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

Implementation

@override
Future<void> publish() async {
  print('Install dependencies...');
  await runProcess(
    'sudo',
    [
      'apt-get',
      'install',
      '-y',
      'ruby',
      'ruby-dev',
    ],
    runInShell: true,
  );

  await runProcess(
    'sudo',
    [
      'gem',
      'install',
      'fastlane',
    ],
    runInShell: true,
  );

  final buildGradleFile = File('$_androidDirectory/app/build.gradle');
  final buildGradleFileContents = await buildGradleFile.readAsString();

  // Save Google play store credentials file
  final fastlaneSecretsJsonFile =
      File('$_androidDirectory/$_fastlaneSecretsJsonFile');
  await fastlaneSecretsJsonFile
      .writeAsBytes(base64.decode(fastlaneSecretsJsonBase64));

  final regex = RegExp(r'(?<=applicationId)(.*)(?=\n)');
  final match = regex.firstMatch(buildGradleFileContents);
  if (match == null) throw Exception('Application Id not found');
  var packageName = match.group(0);
  if (packageName == null) throw Exception('Application Id not found');
  packageName = packageName.trim();
  packageName = packageName.replaceAll('"', '');
  packageName = packageName.replaceAll("'", '');
  final fastlaneAppfile = '''
json_key_file("${fastlaneSecretsJsonFile.absolute.path}")
package_name("$packageName")
  ''';
  await Directory(_fastlaneDirectory).create(recursive: true);
  await File('$_fastlaneDirectory/Appfile').writeAsString(fastlaneAppfile);

  // Check if play store credentials are valid
  await runProcess(
    'fastlane',
    [
      'run',
      'validate_play_store_json_key',
      // 'json_key:${fastlaneSecretsJsonFile.absolute.path}',
    ],
    workingDirectory: _androidDirectory,
    runInShell: true,
  );

  final track = switch (flutterPublish.stage) {
    PublishStage.production => 'production',
    PublishStage.beta => 'beta',
    PublishStage.alpha => 'alpha',
    _ => 'internal',
  };

  Future<int?> getLastVersionCode() async {
    final result = await runProcess(
      'fastlane',
      [
        'run',
        'google_play_track_version_codes',
        // 'package_name: app_identifier',
        'track:$track',
      ],
      environment: {'FASTLANE_DISABLE_COLORS': '1'},
      workingDirectory: _androidDirectory,
    );

    // Get latest version code
    const splitter = LineSplitter();
    final lines = splitter.convert(result.stdout);
    final resultSearchStr = 'Result:';
    final versionCodesStr = lines.last
        .substring(
          lines.last.indexOf(resultSearchStr) + resultSearchStr.length,
        )
        .trim();
    final json = jsonDecode(versionCodesStr);
    return json[0] as int?;
  }

  var versionCode = await getLastVersionCode();
  // Increase versionCode by 1, if available:
  versionCode = versionCode == null ? null : (versionCode + 1);
  print(
    'Use $versionCode as next version code unless build number is overridden.',
  );

  print('Build application...');
  if (versionCode != null) {
    platformBuild.flutterBuild.buildNumber = versionCode;
  }
  final outputPath = await platformBuild.build();
  final outputFile = File(outputPath);

  if (flutterPublish.isDryRun) {
    print('Did NOT publish: Remove `--dry-run` flag for publishing.');
  } else {
    print('Publish...');
    await runProcess(
      'fastlane',
      [
        'supply',
        '--aab',
        outputFile.absolute.path,
        '--track',
        track,
        '--release_status',
        switch (flutterPublish.stage) {
          PublishStage.production => 'completed',
          PublishStage.beta => 'completed',
          PublishStage.alpha => 'completed',
          _ => 'draft',
        },
      ],
      workingDirectory: _androidDirectory,
      printCall: true,
      runInShell: true,
    );
  }
}