generateWorkflow function

Future<void> generateWorkflow({
  1. required String branch,
  2. required bool analyze,
  3. required bool test,
  4. required bool buildAndroid,
  5. required bool buildIOS,
  6. required bool androidSign,
  7. required bool iosSign,
  8. String? keystorePath,
  9. String? keyAlias,
  10. String? keystorePassword,
  11. String? keyPassword,
  12. String? p12Path,
  13. String? profilePath,
  14. String? p12Password,
})

Implementation

Future<void> generateWorkflow({
  required String branch,
  required bool analyze,
  required bool test,
  required bool buildAndroid,
  required bool buildIOS,
  required bool androidSign,
  required bool iosSign,
  String? keystorePath,
  String? keyAlias,
  String? keystorePassword,
  String? keyPassword,
  String? p12Path,
  String? profilePath,
  String? p12Password,
}) async {
  final workflowDir = Directory('.github/workflows');
  if (!workflowDir.existsSync()) workflowDir.createSync(recursive: true);

  final workflowFile = File(p.join(workflowDir.path, 'flutter-ci.yml'));
  if (workflowFile.existsSync()) {
    stdout.write('Workflow file exists. Overwrite? (Y/n): ');
    final overwrite = stdin.readLineSync()?.toLowerCase() ?? 'n';
    if (overwrite != 'y') {
      print('Aborted. Workflow not overwritten.');
      return;
    }
  }

  final buffer = StringBuffer();
  buffer.writeln('name: Flutter CI');
  buffer.writeln('on:');
  buffer.writeln('  push:');
  buffer.writeln('    branches:');
  buffer.writeln('      - $branch');
  buffer.writeln('  pull_request:');
  buffer.writeln('    branches:');
  buffer.writeln('      - $branch');
  buffer.writeln('jobs:');
  buffer.writeln('  build:');
  buffer.writeln('    runs-on: ubuntu-latest');
  buffer.writeln('    steps:');
  buffer.writeln('      - uses: actions/checkout@v3');
  buffer.writeln('      - name: Setup Flutter');
  buffer.writeln('        uses: subosito/flutter-action@v2');
  buffer.writeln('        with:');
  buffer.writeln('          flutter-version: stable');
  buffer.writeln('      - name: Install dependencies');
  buffer.writeln('        run: flutter pub get');

  if (analyze) {
    buffer.writeln('      - name: Analyze\n        run: flutter analyze');
  }
  if (test) {
    buffer.writeln('      - name: Run tests\n        run: flutter test');
  }

  if (buildAndroid) {
    buffer.writeln('      - name: Build APK');
    if (androidSign && keystorePath != null) {
      buffer.writeln(
        '        run: flutter build apk --release --flavor prod --dart-define=KEYSTORE=$keystorePath',
      );
    } else {
      buffer.writeln('        run: flutter build apk --release');
    }
  }

  if (buildIOS) {
    buffer.writeln('      - name: Build iOS');
    buffer.writeln('        if: runner.os == "macOS"'); // Only macOS runner
    buffer.writeln('        run: flutter build ios --release');
  }

  workflowFile.writeAsStringSync(buffer.toString());
  print('✅ Workflow file created at ${workflowFile.path}');
}