198 lines
6.3 KiB
Dart
198 lines
6.3 KiB
Dart
import 'dart:async';
|
|
import 'dart:convert';
|
|
import 'dart:io';
|
|
import 'package:dart_framework/platform/process.dart';
|
|
import 'package:dart_framework/utils/system_util.dart';
|
|
import 'package:oto_cli/cli/cli.dart';
|
|
import 'package:oto_cli/oto/command.dart';
|
|
import 'package:oto_cli/oto/data/data.dart';
|
|
import 'package:oto_cli/oto/data/jenkins_data.dart';
|
|
import 'package:oto_cli/oto/defined_data.dart';
|
|
|
|
enum BuildType { jenkins, test, file }
|
|
|
|
class Application {
|
|
Application._privateConstructor();
|
|
static final Application _instance = Application._privateConstructor();
|
|
static Application get instance => _instance;
|
|
|
|
final Map<BuildType, DataComposer> _mapComposer = {
|
|
BuildType.test: DataComposerTest(),
|
|
BuildType.jenkins: DataComposerJenkins(),
|
|
BuildType.file: DataComposerFile()
|
|
};
|
|
|
|
Map<String, dynamic>? _property;
|
|
Map<String, dynamic>? get property {
|
|
return _property;
|
|
}
|
|
|
|
DataJenkins? _jenkinsData;
|
|
DataJenkins? get jenkinsData {
|
|
return _jenkinsData;
|
|
}
|
|
|
|
Future<void> build(BuildType buildType, {String? yamlContent}) async {
|
|
setUTF8();
|
|
|
|
DataBuild? build;
|
|
|
|
// var envArgs = envArguments(arguments);
|
|
// bool isTest = envArgs.containsKey('isTest'); //for Unit Test
|
|
try {
|
|
var composer = _mapComposer[buildType]!;
|
|
await composer.compose(yamlContent, printBuildStep);
|
|
_jenkinsData = composer.jenkinsData;
|
|
build = DataBuild.fromJson(getMapFromYaml(composer.buildYaml)!);
|
|
await CLI.println(
|
|
'********************************* Build Data *************************************',
|
|
color: Color.magenta);
|
|
print(composer.buildYaml);
|
|
|
|
_property = build.common;
|
|
for (var command in build.commands) {
|
|
await printBuildStep('Phase Start: ${command.name}', Color.green);
|
|
await Command.byType(command.command).execute(command);
|
|
}
|
|
} on Exception catch (e, stacktace) {
|
|
await CLI.printString(e.toString(), color: Color.redStrong);
|
|
await CLI.printString(stacktace.toString(), color: Color.yellowStrong);
|
|
await printBuildStep('Build Failed', Color.redStrong);
|
|
return;
|
|
}
|
|
|
|
await printBuildStep('Build Successfully Complete', Color.cyan);
|
|
exit(0);
|
|
}
|
|
|
|
Future setUTF8() async {
|
|
if (Platform.isWindows) {
|
|
var data = await ProcessExecutor.start(StringBuffer('chcp 65001'));
|
|
var exitCode = await data.process.exitCode;
|
|
print('======> Set Korean: ${exitCode == 0}');
|
|
}
|
|
return simpleFuture;
|
|
}
|
|
|
|
Future printBuildStep(String name, Color? color) async {
|
|
var message =
|
|
'''************************************************************************************
|
|
* $name
|
|
************************************************************************************''';
|
|
await CLI.printString(message, color: color ?? Color.green);
|
|
return simpleFuture;
|
|
}
|
|
}
|
|
|
|
//############################ DataComposer ##########################//
|
|
abstract class DataComposer {
|
|
DataJenkins? jenkinsData;
|
|
String buildYaml = '';
|
|
|
|
Future compose(String? yaml, Future Function(String, Color?) printer) async {
|
|
return simpleFuture;
|
|
}
|
|
}
|
|
|
|
class DataComposerTest extends DataComposer {
|
|
@override
|
|
Future compose(String? yaml, Future Function(String, Color?) printer) async {
|
|
jenkinsData = DataJenkins.fromJson(TestData.jenkinsMap!);
|
|
buildYaml = TestData.buildYaml;
|
|
return simpleFuture;
|
|
}
|
|
}
|
|
|
|
class DataComposerFile extends DataComposer {
|
|
@override
|
|
Future compose(String? yaml, Future Function(String, Color?) printer) async {
|
|
jenkinsData = DataJenkins.fromJson(FileData.jenkinsMap!);
|
|
buildYaml = yaml ?? '---';
|
|
return simpleFuture;
|
|
}
|
|
}
|
|
|
|
class DataComposerJenkins extends DataComposer {
|
|
@override
|
|
Future compose(String? yaml, Future Function(String, Color?) printer) async {
|
|
Map<String, dynamic>? jenkinsMap;
|
|
String os = Platform.operatingSystem;
|
|
var enable = true;
|
|
print('Current OS: $os');
|
|
print('Start build...');
|
|
String jsonStr = '';
|
|
if (Platform.isMacOS || Platform.isLinux) {
|
|
await Process.run('zsh', [
|
|
'${Directory.current.path}/assets/script/shell/jenkins_env_params.sh'
|
|
]).then((ProcessResult result) => jsonStr = result.stdout);
|
|
jenkinsMap = getMapFromJson(jsonStr)!;
|
|
} else if (Platform.isWindows) {
|
|
await Process.run('cmd', [
|
|
'/C',
|
|
'${Directory.current.path}/assets/script/batch/jenkins_env_params.bat'
|
|
]).then((ProcessResult result) => jsonStr = result.stdout);
|
|
jsonStr = jsonStr.substring(jsonStr.indexOf('{'));
|
|
jsonStr = jsonStr.replaceAll('\\', '/');
|
|
jenkinsMap = getMapFromJson(jsonStr);
|
|
} else {
|
|
enable = false;
|
|
printer(
|
|
'is not Mac/Windows/Linux. build must be execute in Mac/Windows os system',
|
|
Color.redStrong);
|
|
}
|
|
if (enable) {
|
|
await printer('Jenkins Variables', Color.green);
|
|
print(jsonStr);
|
|
}
|
|
jenkinsData = DataJenkins.fromJson(jenkinsMap!);
|
|
buildYaml = await getBuildData();
|
|
|
|
return simpleFuture;
|
|
}
|
|
|
|
Future<String> getBuildData() async {
|
|
var c = Completer<String>();
|
|
var file = File('${jenkinsData!.workspace}/build_data.conf');
|
|
var content = '';
|
|
if (Platform.isWindows) {
|
|
content = file
|
|
.readAsStringSync(encoding: utf8)
|
|
.replaceAll('BuildData=', '')
|
|
.replaceAll('\\', '/');
|
|
var regEx = RegExp(r'(%)([a-zA-Z0-9]+)(%)');
|
|
var list = regEx.allMatches(content);
|
|
var params = <String>[];
|
|
for (var match in list) {
|
|
var param = match.group(2);
|
|
if (!params.contains(param)) {
|
|
params.add(param!);
|
|
}
|
|
}
|
|
|
|
var temp = File('${jenkinsData!.workspace}/param_temp.bat');
|
|
var bat = '';
|
|
for (var param in params) {
|
|
bat += '@echo %$param%\n';
|
|
}
|
|
temp.writeAsStringSync(bat);
|
|
|
|
var resultParam = '';
|
|
await Process.run('cmd', ['/C', temp.path])
|
|
.then((ProcessResult result) => resultParam = result.stdout);
|
|
var values = resultParam.split('\n');
|
|
var length = params.length;
|
|
for (var i = 0; i < length; ++i) {
|
|
var value = values[i]
|
|
.toString()
|
|
.replaceAll('\\', '/')
|
|
.replaceAll(RegExp('\r|\n'), '');
|
|
content = content.replaceAll('%${params[i]}%', value);
|
|
}
|
|
temp.deleteSync();
|
|
} else {
|
|
content = await file.readAsString();
|
|
}
|
|
c.complete(content);
|
|
return c.future;
|
|
}
|
|
}
|