oto/lib/oto/application.dart
leedongmyung c487d6fc8d test
2023-11-12 21:24:19 +09:00

166 lines
5.1 KiB
Dart

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:dart_framework/charset/euc_kr.dart';
import 'package:dart_framework/utils/system_util.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;
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 {
// await test();
// return;
Map<String, dynamic>? buildMap;
Map<String, dynamic>? jenkinsMap;
// var envArgs = envArguments(arguments);
// bool isTest = envArgs.containsKey('isTest'); //for Unit Test
switch (buildType) {
case BuildType.test:
//Test map
_jenkinsData = DataJenkins.fromJson(TestData.jenkinsMap!);
buildMap = TestData.buildMap;
print('Start test build...');
break;
case BuildType.jenkins:
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) {
String? stdout;
String? stderr;
await Process.run('cmd', [
'/C',
'${Directory.current.path}/assets/script/batch/jenkins_env_params.bat'
]).then((ProcessResult result) {
stdout = result.stdout;
stderr = result.stderr;
});
List<int> bytes = utf8.encode(stdout!);
jsonStr = eucKr.decode(bytes).replaceAll('\\', '/');
jenkinsMap = getMapFromJson(jsonStr);
} else {
enable = false;
print(
'is not Mac/Windows/Linux. build must be execute in Mac/Windows os system');
}
if (enable) {
printBuildStep('Jenkins Variables');
print(jsonStr);
}
_jenkinsData = DataJenkins.fromJson(jenkinsMap!);
buildMap = getMapFromYaml(await getBuildData());
break;
case BuildType.file:
_jenkinsData = DataJenkins.fromJson(FileData.jenkinsMap!);
buildMap = getMapFromYaml(yamlContent!);
break;
}
await execute(buildMap!);
}
Future<void> execute(Map<String, dynamic> buildMap) async {
var c = Completer();
DataBuild? build;
build = DataBuild.fromJson(buildMap);
_property = build.common;
for (var command in build.commands) {
String commandStr =
command.command.toString().replaceAll('CommandType.', '');
printBuildStep('Phase Start: $commandStr');
if (!await Command(command.command).execute(command)) {
exit(10);
}
}
c.complete();
printBuildStep('Build Successfully Complete');
exit(0);
}
void printBuildStep(String name) {
print(
'************************************************************************************');
print('* $name');
print(
'************************************************************************************');
}
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: Platform.isWindows ? eucKr : SystemEncoding())
.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();
}
print(content);
c.complete(content);
return c.future;
}
}