Code refactoring

This commit is contained in:
leedongmyung[desktop] 2023-11-25 12:12:55 +09:00
parent e06770c359
commit a9c051bd04
27 changed files with 487 additions and 459 deletions

View file

@ -19,31 +19,31 @@ pipeline:
- exe: zip
commands:
### 콜백이 필요없는 단순 깃 명령 호출
- command: Git
id: git
param:
commands:
- restore .
- clean -f
- switch pipeline
# ### 콜백이 필요없는 단순 깃 명령 호출
# - command: Git
# id: git
# param:
# commands:
# - restore .
# - clean -f
# - switch pipeline
### 깃 리비전 정보 저장
- command: GitRev
id: git-rev
param:
result-value: <!property.git_rev>
# ### 깃 리비전 정보 저장
# - command: GitRev
# id: git-rev
# param:
# result-value: <!property.git_rev>
### Json value read
- command: JsonValue
id: json-value
param:
- set:
from: gitHash
to: <!property:old-git-rev>
- set:
from: version
to: <!property:old-version>
# ### Json value read
# - command: JsonValue
# id: json-value
# param:
# - set:
# from: gitHash
# to: <!property:old-git-rev>
# - set:
# from: version
# to: <!property:old-version>
### Version 쓰기
- command: CreateAppData

View file

@ -13,13 +13,4 @@ void main(List<String> arguments) async {
CommandStart(),
CommandStop()
]);
// String test = '''
// Error on line 5, column 1: Expected ':'.
//
// 5 < commands:
// ^
//
// ''';
// await CLI.printString(test, color: Color.red);
}

View file

@ -4,11 +4,11 @@ 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/commands/command.dart';
import 'package:oto_cli/oto/pipeline/pipeline.dart';
import 'package:oto_cli/oto/data/command_data.dart';
import 'package:oto_cli/oto/data/jenkins_data.dart';
import 'package:oto_cli/oto/data/pipeline_data.dart';
import 'package:oto_cli/oto/defined_data.dart';
import 'package:oto_cli/oto/core/data_composer.dart';
import 'package:yaml/yaml.dart';
enum BuildType { jenkins, test, file }
@ -34,10 +34,11 @@ class Application {
};
DataJenkins? jenkinsData;
Map<String, dynamic>? property;
Map<String, dynamic> property = {};
Map<String, DataCommand> dataCommandMap = {};
late Pipeline pipeline;
//pipeline validate & initialize
PipelineValidateResult pipelineInitialize(List<dynamic> list) {
var result = PipelineValidateResult();
for (Map<String, dynamic> item in list) {
@ -104,6 +105,8 @@ class Application {
throw Exception(ex);
}
pipeline = validateResult.pipeline!;
//start build
await pipeline.execute();
}
} on Exception catch (e, stacktace) {
@ -144,241 +147,3 @@ class Application {
return simpleFuture;
}
}
//####################### Pipeline #######################//
class Pipeline {
List<PipelineExecutor> _exeList;
Pipeline(this._exeList);
Future execute() async {
for (var exe in _exeList) {
await exe.execute();
}
return simpleFuture;
}
}
class PipelineValidateResult {
late String? message;
late bool enable = true;
late List<PipelineExecutor> exeList = [];
Pipeline? get pipeline {
if (exeList.isNotEmpty) {
return Pipeline(exeList);
} else {
return null;
}
}
}
abstract class PipelineExecutor {
//set & validate data
PipelineValidateResult initialize(Map<String, dynamic> set);
Future execute();
PipelineValidateResult validateTasks(List<dynamic>? list) {
var result = PipelineValidateResult();
if (list != null) {
return Application.instance.pipelineInitialize(list);
}
return result;
}
}
class PipelineExe extends PipelineExecutor {
late String targetCommandID;
@override
PipelineValidateResult initialize(Map<String, dynamic> set) {
var result = PipelineValidateResult();
targetCommandID = set.values.first as String;
if (!Application.instance.dataCommandMap.containsKey(targetCommandID)) {
result.enable = false;
result.message =
'The "$targetCommandID" command does not exist in the command list.';
}
return result;
}
Future<DataCommand> get commandData async {
var commandData = Application.instance.dataCommandMap[targetCommandID]!;
await Application.instance
.printBuildStep('Phase Start: ${commandData.name}', Color.green);
return dataFutrue(commandData);
}
@override
Future execute() async {
var now = DateTime.now();
var time =
'${now.minute.toString().padLeft(2)}:${now.second.toString().padLeft(2)}:${now.millisecond.toString().padLeft(2)}';
print('==================> [$time] Execute: $targetCommandID');
var data = await commandData;
await Command.byType(data.command).execute(data);
return simpleFuture;
}
}
class PipelineAsync extends PipelineExe {
@override
Future execute() async {
executeAsync(await commandData);
return simpleFuture;
}
void executeAsync(DataCommand data) async {
await Command.byType(data.command).execute(data);
}
}
class PipelineIf extends PipelineExecutor {
late DataIf _data;
late Pipeline? _pipelineTrue;
late Pipeline? _pipelineFalse;
@override
PipelineValidateResult initialize(Map<String, dynamic> set) {
var result = PipelineValidateResult();
_data = DataIf.fromJson(set.values.first);
var dataValidateResult = _data.validate();
if (!dataValidateResult.enable) {
return dataValidateResult;
}
//set true task
var validateResult = validateTasks(_data.on_true);
if (!validateResult.enable) {
return validateResult;
}
_pipelineTrue = validateResult.pipeline;
//set false task
validateResult = validateTasks(_data.on_false);
if (!validateResult.enable) {
return validateResult;
}
_pipelineFalse = validateResult.pipeline;
return result;
}
@override
Future execute() async {
//To-do: check true or false
await _pipelineTrue?.execute();
await _pipelineFalse?.execute();
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;
}
}

View file

@ -1,8 +1,7 @@
import 'dart:async';
import 'package:dart_framework/core/app_data_manager.dart';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
class CreateAppData extends Command {
@ -11,10 +10,9 @@ class CreateAppData extends Command {
@override
Future execute(DataCommand command) async {
Completer<bool> c = Completer<bool>();
var jenkins = Application.instance.jenkinsData!;
var data = DataAppDataCreator.fromJson(command.param);
var workspace = data.workspace ?? jenkins.workspace;
workspace = workspace.replaceAll('\\', '/');
var workspace = getWorkspace(data.workspace);
var appData = await AppDataManager.to
.create(data.scm, workspace, data.relativeAssetPath, data.name);
Command.setReturnValue(data.returnVersion, appData.version);

View file

@ -1,8 +1,6 @@
import 'dart:async';
import 'package:dart_framework/platform/process.dart';
import 'package:dart_framework/utils/path.dart';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
class BuildDart extends Command {
@ -19,12 +17,10 @@ class BuildDart extends Command {
Future execute(DataCommand command) async {
Completer<bool> c = Completer<bool>();
var data = DataBuildDart.fromJson(command.param);
var workspace = Path.getNormal(Application.instance.jenkinsData!.workspace);
var targetPath =
Path.getNormal(Command.replaceTag(data.targetPath ?? workspace));
var workspace = getWorkspace(data.workspace);
var shell = StringBuffer();
shell.write('cd $targetPath');
shell.write('cd $workspace');
shell.write(' && flutter clean');
shell.write(' && flutter pub upgrade --major-versions');
shell.write(' && flutter packages upgrade');

View file

@ -1,14 +1,10 @@
import 'dart:async';
import 'dart:io';
import 'package:oto_cli/oto/build/build_dart.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/build/build_dart.dart';
import 'package:oto_cli/oto/data/command_data.dart';
import 'package:dart_framework/utils/path.dart';
// ignore: depend_on_referenced_packages
import 'package:path/path.dart' as path;
import '../application.dart';
class BuildDartCompile extends BuildDart {
@override
Future<StringBuffer> appendShell(
@ -16,10 +12,8 @@ class BuildDartCompile extends BuildDart {
var c = Completer<StringBuffer>();
var data = DataBuildDartCompile.fromJson(command.param);
var extension = getExeExtension();
var workspace = Path.getNormal(Application.instance.jenkinsData!.workspace);
var targetPath =
Path.getNormal(Command.replaceTag(data.targetPath ?? workspace));
var binPath = path.join(targetPath, 'bin');
var workspace = getWorkspace(data.workspace);
var binPath = path.join(workspace, 'bin');
//find build target
var targetDir = Directory(binPath);
@ -29,20 +23,19 @@ class BuildDartCompile extends BuildDart {
findedDartFile = path.basename(file.path);
break;
}
findedDartFile = path.join(targetPath, 'bin', findedDartFile);
var targetDartFile =
Command.replaceTag(data.targetDartFile ?? findedDartFile);
findedDartFile = path.join(workspace, 'bin', findedDartFile);
var targetDartFile = replaceTag(data.targetDartFile ?? findedDartFile);
//clear build path
var buildFolderName = 'release';
var buildPath = path.join(targetPath, buildFolderName);
var buildPath = path.join(workspace, buildFolderName);
var buildDir = Directory(buildPath);
var buildFileName = data.buildFileName ?? 'release';
if (!buildDir.existsSync()) {
buildDir.createSync();
}
buildPath =
path.join(targetPath, buildFolderName, '$buildFileName$extension');
path.join(workspace, buildFolderName, '$buildFileName$extension');
var preBuildFile = File(buildPath);
if (preBuildFile.existsSync()) {
preBuildFile.deleteSync();

View file

@ -1,7 +1,6 @@
import 'dart:async';
import 'package:dart_framework/platform/process.dart';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
class BuildDotNet extends Command {
@ -9,13 +8,14 @@ class BuildDotNet extends Command {
@override
Future execute(DataCommand command) async {
Completer<bool> c = Completer<bool>();
var data = DataBuildDotNet.fromJson(command.param);
var workspace = Application.instance.jenkinsData!.workspace;
var workspace = getWorkspace(data.workspace);
var shell = StringBuffer();
shell.writeln('cd $workspace');
shell.writeln(
'MSBuild ${data.projectFile} /t:build /p:Configuration=Release;Platform=x86');
var process = await ProcessExecutor.start(shell,
workspace: workspace, printStderr: false);

View file

@ -1,6 +1,7 @@
import 'dart:async';
import 'package:oto_cli/oto/build/build_dart.dart';
import 'package:dart_framework/utils/system_util.dart';
import 'package:oto_cli/oto/commands/build/build_dart.dart';
import 'package:oto_cli/oto/data/command_data.dart';
// ignore: constant_identifier_names
@ -10,13 +11,11 @@ class BuildFlutter extends BuildDart {
@override
Future<StringBuffer> appendShell(
StringBuffer shell, DataCommand command) async {
var c = Completer<StringBuffer>();
var data = DataBuildFlutter.fromJson(command.param);
var platform =
data.platform.toString().replaceAll('BuildPlatform.', '').toLowerCase();
var additional = data.additional == null ? '' : ' ${data.additional!}';
shell.write(' && flutter build $platform$additional');
c.complete(shell);
return c.future;
return dataFutrue(shell);
}
}

View file

@ -1,7 +1,7 @@
import 'dart:async';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
import 'package:dart_framework/platform/process.dart';
import 'package:dart_framework/utils/path.dart';
@ -13,8 +13,8 @@ class BuildiOS extends Command {
Future execute(DataCommand command) async {
Completer<bool> c = Completer<bool>();
var data = DataBuildiOS.fromJson(command.param);
var workspace = Path.getNormal(Application.instance.jenkinsData!.workspace);
var workspacePath = Path.getNormal(Command.replaceTag(data.workspacePath));
var workspace = getWorkspace(data.workspace);
var xcworkspaceFilePath = getPathNormal(data.xcworkspaceFilePath);
var destination = data.destination ?? 'generic/platform=iOS build';
var cleanPod = data.cleanPod ?? false;
@ -32,7 +32,7 @@ class BuildiOS extends Command {
shell.write(' && pod install');
}
shell.write(
' && xcodebuild -workspace $workspacePath -scheme ${data.scheme} -destination $destination');
' && xcodebuild -workspace $xcworkspaceFilePath -scheme ${data.scheme} -destination $destination');
var processData = await ProcessExecutor.start(shell,
workspace: workspace, printStderr: false);
@ -60,9 +60,9 @@ class ArchiveiOS extends Command {
Future execute(DataCommand command) async {
Completer<bool> c = Completer<bool>();
var data = DataArchiveiOS.fromJson(command.param);
var workspace = Path.getNormal(Application.instance.jenkinsData!.workspace);
var workspacePath = Path.getNormal(Command.replaceTag(data.workspacePath));
var archivePath = Path.getNormal(Command.replaceTag(data.archivePath));
var workspace = getWorkspace(data.workspace);
var workspacePath = getPathNormal(data.xcworkspaceFilePath);
var archivePath = getPathNormal(data.archivePath);
var shell = StringBuffer();
shell.write(
@ -83,11 +83,10 @@ class ExportiOS extends Command {
Future execute(DataCommand command) async {
Completer<bool> c = Completer<bool>();
var data = DataExportiOS.fromJson(command.param);
var workspace = Path.getNormal(Application.instance.jenkinsData!.workspace);
var archivePath = Path.getNormal(Command.replaceTag(data.archivePath));
var exportPath = Path.getNormal(Command.replaceTag(data.exportPath));
var exportOptionPlistPath =
Path.getNormal(Command.replaceTag(data.exportOptionPlistPath));
var workspace = getWorkspace(data.workspace);
var archivePath = getPathNormal(data.archivePath);
var exportPath = getPathNormal(data.exportPath);
var exportOptionPlistPath = getPathNormal(data.exportOptionPlistPath);
var shell = StringBuffer();
shell.write(

View file

@ -1,24 +1,26 @@
// ignore_for_file: constant_identifier_names
import 'dart:async';
import 'package:dart_framework/utils/path.dart';
import 'package:dart_framework/utils/system_util.dart';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/build/app_data_creator.dart';
import 'package:oto_cli/oto/build/build_dart.dart';
import 'package:oto_cli/oto/build/build_dart_compile.dart';
import 'package:oto_cli/oto/build/build_dot_net.dart';
import 'package:oto_cli/oto/build/build_flutter.dart';
import 'package:oto_cli/oto/build/build_ios.dart';
import 'package:oto_cli/oto/commands/build/app_data_creator.dart';
import 'package:oto_cli/oto/commands/build/build_dart.dart';
import 'package:oto_cli/oto/commands/build/build_dart_compile.dart';
import 'package:oto_cli/oto/commands/build/build_dot_net.dart';
import 'package:oto_cli/oto/commands/build/build_flutter.dart';
import 'package:oto_cli/oto/commands/build/build_ios.dart';
import 'package:oto_cli/oto/data/command_data.dart';
import 'package:oto_cli/oto/file/delete.dart';
import 'package:oto_cli/oto/file/rename.dart';
import 'package:oto_cli/oto/shell/shell.dart';
import 'package:oto_cli/oto/file/copy.dart';
import 'package:oto_cli/oto/util/execute_app.dart';
import 'package:oto_cli/oto/util/publish_ios.dart';
import 'package:oto_cli/oto/util/slack.dart';
import 'package:oto_cli/oto/util/zip.dart';
import 'package:oto_cli/oto/uploader/uploader.dart';
import 'package:oto_cli/oto/data/jenkins_data.dart';
import 'package:oto_cli/oto/commands/file/delete.dart';
import 'package:oto_cli/oto/commands/file/rename.dart';
import 'package:oto_cli/oto/commands/shell/shell.dart';
import 'package:oto_cli/oto/commands/file/copy.dart';
import 'package:oto_cli/oto/commands/util/execute_app.dart';
import 'package:oto_cli/oto/commands/util/publish_ios.dart';
import 'package:oto_cli/oto/commands/util/slack.dart';
import 'package:oto_cli/oto/commands/util/zip.dart';
import 'package:oto_cli/oto/commands/uploader/uploader.dart';
enum CommandType {
SimpleCommand,
@ -72,19 +74,6 @@ abstract class Command {
Command();
static final Map<String, dynamic> _cache = <String, dynamic>{};
static String replaceTag(String raw) {
var regEx = RegExp(r'(<!)([a-zA-Z0-9.]+)(>)');
var list = regEx.allMatches(raw);
for (var match in list) {
var param = match.group(2);
if (!_cache.containsKey(param)) {
_cache[param!] = _getTagValue(param);
}
var target = '<!${param!}>';
raw = raw.replaceAll(target, _cache[param]);
}
return raw;
}
static void setReturnValue(String tag, dynamic value) {
var regEx = RegExp(r'(<!)([a-zA-Z0-9.]+)(>)');
@ -92,7 +81,7 @@ abstract class Command {
tag = match!.group(2)!;
if (tag.startsWith('property')) {
var key = tag.replaceFirst('property.', '');
Application.instance.property![key] = value;
Application.instance.property[key] = value;
}
}
@ -102,7 +91,7 @@ abstract class Command {
if (value.startsWith('property.')) {
var map = Application.instance.property;
var param = value.replaceFirst('property.', '');
if (map!.containsKey(param)) {
if (map.containsKey(param)) {
data = map[param];
setted = true;
} else {
@ -119,6 +108,40 @@ abstract class Command {
return data;
}
static String replaceTagValue(String raw) {
var regEx = RegExp(r'(<!)([a-zA-Z0-9.]+)(>)');
var list = regEx.allMatches(raw);
for (var match in list) {
var param = match.group(2);
if (!_cache.containsKey(param)) {
_cache[param!] = _getTagValue(param);
}
var target = '<!${param!}>';
raw = raw.replaceAll(target, _cache[param]);
}
return raw;
}
Map<String, dynamic> get property {
return Application.instance.property;
}
DataJenkins? get jenkinsData {
return Application.instance.jenkinsData;
}
String getWorkspace(String? dataWorkspace) {
return getPathNormal(dataWorkspace ?? jenkinsData!.workspace);
}
String getPathNormal(String path) {
return replaceTag(Path.getNormal(path));
}
String replaceTag(String raw) {
return Command.replaceTagValue(raw);
}
Future execute(DataCommand command) async {
return simpleFuture;
}

View file

@ -2,24 +2,20 @@ import 'dart:async';
import 'dart:io';
import 'package:dart_framework/utils/path.dart';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
class Copy extends Command {
@override
Future execute(DataCommand command) async {
var common = Application.instance.property;
var jenkins = Application.instance.jenkinsData;
var data = DataCopy.fromJson(command.param);
var result = true;
var isMove = data.isMove == null ? false : data.isMove!;
var entries = data.copyMap.entries;
try {
var ignoredList = <String>[];
for (var entry in entries) {
var start = Path.getNormal(Command.replaceTag(entry.key));
var dest = Path.getNormal(Command.replaceTag(entry.value));
var start = getPathNormal(entry.key);
var dest = getPathNormal(entry.value);
var destDir = Directory(dest);
var name = Path.getName(start);
if (name == "*") {
@ -72,7 +68,6 @@ class Copy extends Command {
}
} on Exception catch (e) {
print('Copy General Exception: $e');
result = false;
}
return complete(0, command);
}

View file

@ -2,20 +2,17 @@ import 'dart:async';
import 'package:dart_framework/utils/path.dart';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
class Delete extends Command {
@override
Future execute(DataCommand command) async {
var common = Application.instance.property;
var jenkins = Application.instance.jenkinsData;
var data = DataDelete.fromJson(command.param);
var result = true;
try {
var ignoredList = <String>[];
for (var item in data.list) {
var path = Path.getNormal(Command.replaceTag(item));
var path = getPathNormal(item);
var name = Path.getName(path);
if (name == "*") {
//Delete & recreate dest folder
@ -31,7 +28,6 @@ class Delete extends Command {
}
} on Exception catch (e) {
print('Copy General Exception: $e');
result = false;
}
return complete(0, command);
}

View file

@ -3,22 +3,18 @@ import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:dart_framework/utils/path.dart';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
class Rename extends Command {
@override
Future execute(DataCommand command) async {
var common = Application.instance.property;
var jenkins = Application.instance.jenkinsData;
var data = DataRename.fromJson(command.param);
var result = true;
var entries = data.renameMap.entries;
try {
for (var entry in entries) {
var start = Path.getNormal(Command.replaceTag(entry.key));
var targetName = Command.replaceTag(entry.value);
var start = getPathNormal(entry.key);
var targetName = replaceTag(entry.value);
var type = Path.getType(start);
var parentPath = Path.getParent(start)!;
var newPath = path.join(parentPath, targetName);
@ -32,7 +28,6 @@ class Rename extends Command {
}
} on Exception catch (e) {
print('Copy General Exception: $e');
result = false;
}
return complete(0, command);
}

View file

@ -1,19 +1,17 @@
import 'dart:async';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
import 'package:dart_framework/platform/process.dart';
class Git extends Command {
@override
Future execute(DataCommand command) async {
var common = Application.instance.property;
var jenkins = Application.instance.jenkinsData;
var data = DataExecuteApp.fromJson(command.param);
var exe = Command.replaceTag(data.executable);
var desktop = Command.replaceTag(data.desktopServicePath);
var exe = replaceTag(data.executable);
var desktop = replaceTag(data.desktopServicePath);
print('Process Start: $exe');
var content = 'start "" "$exe" & exit';

View file

@ -2,7 +2,7 @@ import 'dart:async';
import 'dart:io';
import 'package:dart_framework/platform/process.dart';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
class Shell extends Command {
@ -13,8 +13,8 @@ class Shell extends Command {
var data = DataShell.fromJson(command.param);
print(command.param);
//Start here
var workspace = Command.replaceTag(data.workspace ?? jenkins.workspace);
var path = Command.replaceTag(data.path);
var workspace = getWorkspace(data.workspace);
var path = getPathNormal(data.path);
var shell = StringBuffer();
if (Platform.isWindows) {
shell.writeln('call $path');

View file

@ -4,7 +4,7 @@ import 'package:ftpconnect/ftpconnect.dart';
// ignore: implementation_imports
import 'package:ftpconnect/src/ftp_entry.dart';
import 'package:dart_framework/utils/path.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
class FTP {
final String _host;
@ -84,8 +84,8 @@ class FTP {
}
Future<void> _upload(String local, String remote) async {
local = Command.replaceTag(local);
remote = Command.replaceTag(remote);
local = Command.replaceTagValue(local);
remote = Command.replaceTagValue(remote);
if (await Directory(local).exists()) {
var name = Path.getName(local);
var childRemoteFolder = '$remote/$name';
@ -259,10 +259,7 @@ brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Librar
class SFTP extends FTP {
SFTP(super.host,
{super.port = 22,
super.user,
super.password,
super.timeout});
{super.port = 22, super.user, super.password, super.timeout});
@override
Future<void> connect() async {}

View file

@ -3,9 +3,9 @@ import 'dart:core';
import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
import 'package:oto_cli/oto/uploader/ftp.dart';
import 'package:oto_cli/oto/commands/uploader/ftp.dart';
import 'package:dart_framework/utils/path.dart';
class Uploader extends Command {

View file

@ -1,7 +1,7 @@
import 'dart:async';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
import 'package:dart_framework/platform/process.dart';
@ -12,8 +12,8 @@ class ExecuteApp extends Command {
var jenkins = Application.instance.jenkinsData;
var data = DataExecuteApp.fromJson(command.param);
var exe = Command.replaceTag(data.executable);
var desktop = Command.replaceTag(data.desktopServicePath);
var exe = replaceTag(data.executable);
var desktop = replaceTag(data.desktopServicePath);
print('Process Start: $exe');
var content = 'start "" "$exe" & exit';

View file

@ -2,7 +2,7 @@ import 'dart:async';
import 'dart:io';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
import 'package:dart_framework/utils/path.dart';
// ignore: depend_on_referenced_packages
@ -15,8 +15,8 @@ class PublishiOS extends Command {
Future execute(DataCommand command) async {
var data = DataPublishiOS.fromJson(command.param);
var workspace = Path.getNormal(Application.instance.jenkinsData!.workspace);
var menifestURL = Command.replaceTag(data.menifestURL);
var destinationPath = Command.replaceTag(data.destinationPath);
var menifestURL = replaceTag(data.menifestURL);
var destinationPath = replaceTag(data.destinationPath);
var templatePath = path.normalize(
'${path.dirname(Platform.script.toFilePath())}/../assets/template');
@ -35,14 +35,12 @@ class PublishiOS extends Command {
var menifestContent =
await File('$templatePath/manifest.plist').readAsString();
menifestContent = menifestContent
.replaceFirst('IPA_URL', Command.replaceTag(data.ipaURL))
.replaceFirst('BUNDLE_ID', Command.replaceTag(data.bundleID))
.replaceFirst('VERSION', Command.replaceTag(data.version))
.replaceFirst('APP_NAME', Command.replaceTag(data.appName))
.replaceFirst(
'DISPLAY_IMAGE_URL', Command.replaceTag(data.displayImageURL))
.replaceFirst(
'FULL_SIZE_IMAGE_URL', Command.replaceTag(data.fullSizeImageURL));
.replaceFirst('IPA_URL', replaceTag(data.ipaURL))
.replaceFirst('BUNDLE_ID', replaceTag(data.bundleID))
.replaceFirst('VERSION', replaceTag(data.version))
.replaceFirst('APP_NAME', replaceTag(data.appName))
.replaceFirst('DISPLAY_IMAGE_URL', replaceTag(data.displayImageURL))
.replaceFirst('FULL_SIZE_IMAGE_URL', replaceTag(data.fullSizeImageURL));
var menifestFile = File('$destinationPath/manifest.plist');
await menifestFile.writeAsString(menifestContent);

View file

@ -2,7 +2,7 @@ import 'dart:async';
import 'package:dart_framework/utils/system_util.dart';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
import 'package:color/color.dart';
import 'package:dart_framework/utils/slack/slack_sender.dart';
@ -24,16 +24,14 @@ class Slack extends Command {
class SlackBuild extends Command {
@override
Future execute(DataCommand command) async {
var common = Application.instance.property;
var jenkins = Application.instance.jenkinsData;
var data = DataSlackBuild.fromJson(command.param);
var result = true;
var version = Command.replaceTag(data.version);
var download = Command.replaceTag(data.downloadURL);
var version = replaceTag(data.version);
var download = replaceTag(data.downloadURL);
var channel = data.channel ?? 'build';
var color = Color.hex(data.color);
var sender = SlackSender();
await sender.sendBuild(data.appName, data.type, color, version, download,
channel: channel);

View file

@ -3,18 +3,15 @@ import 'dart:io';
import 'package:archive/archive_io.dart';
import 'package:dart_framework/utils/path.dart';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
class Zip extends Command {
@override
Future execute(DataCommand command) async {
var common = Application.instance.property;
var jenkins = Application.instance.jenkinsData;
var data = DataZip.fromJson(command.param);
try {
var zipFilePath = Path.getNormal(Command.replaceTag(data.zipFile));
var zipFilePath = Path.getNormal(replaceTag(data.zipFile));
print('Start Compress...');
var parent = Directory(Path.getParent(zipFilePath)!);
if (!parent.existsSync()) parent.createSync(recursive: true);
@ -26,7 +23,7 @@ class Zip extends Command {
encoder.create(zipFilePath);
var list = data.zipList;
for (var path in list) {
path = Path.getNormal(Command.replaceTag(path));
path = Path.getNormal(replaceTag(path));
var name = Path.getName(path);
if (name == '*') {
parent = Directory(Path.getParent(path)!);

View file

@ -0,0 +1,120 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:dart_framework/utils/system_util.dart';
import 'package:oto_cli/cli/cli.dart';
import 'package:oto_cli/oto/data/jenkins_data.dart';
import 'package:oto_cli/oto/core/defined_data.dart';
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;
}
}

View file

@ -3,7 +3,7 @@ import 'dart:io';
// ignore: depend_on_referenced_packages
import 'package:yaml/yaml.dart' as yaml;
import 'package:oto_cli/oto/build/build_flutter.dart';
import 'package:oto_cli/oto/commands/build/build_flutter.dart';
class FileData {
static Map<String, dynamic>? get jenkinsMap {

View file

@ -3,7 +3,7 @@
import 'package:dart_framework/utils/slack/slack_sender.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:dart_framework/core/app_data_manager.dart';
import 'package:oto_cli/oto/command.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/pipeline_data.dart';
part 'command_data.g.dart';
@ -38,10 +38,17 @@ class DataCommand {
Map<String, dynamic> toJson() => _$DataCommandToJson(this);
}
@JsonSerializable()
class DataParam {
DataParam();
late String? workspace;
}
/// ***************************** Command List ****************************///
//SimpleCommand
@JsonSerializable()
class DataSimpleCommand {
class DataSimpleCommand extends DataParam {
DataSimpleCommand();
late String message;
@ -53,11 +60,10 @@ class DataSimpleCommand {
//AppDataCreator
@JsonSerializable()
class DataAppDataCreator {
class DataAppDataCreator extends DataParam {
DataAppDataCreator();
late SCMType scm;
late String? workspace;
late String relativeAssetPath;
late String returnVersion;
late String returnHash;
@ -70,10 +76,9 @@ class DataAppDataCreator {
//BuildDart
@JsonSerializable()
class DataBuildDart {
class DataBuildDart extends DataParam {
DataBuildDart();
late String? targetPath;
late bool? executeBuildRunner;
factory DataBuildDart.fromJson(Map<String, dynamic> json) =>
@ -111,7 +116,7 @@ class DataBuildDartCompile extends DataBuildDart {
//BuildDotNet
@JsonSerializable()
class DataBuildDotNet {
class DataBuildDotNet extends DataParam {
DataBuildDotNet();
late String projectFile;
@ -123,12 +128,12 @@ class DataBuildDotNet {
//BuildiOS
@JsonSerializable()
class DataBuildiOS {
class DataBuildiOS extends DataParam {
DataBuildiOS();
late String workspacePath;
late String scheme;
late String? destination;
late String xcworkspaceFilePath;
late bool? cleanPod;
factory DataBuildiOS.fromJson(Map<String, dynamic> json) =>
@ -138,10 +143,10 @@ class DataBuildiOS {
//ArchiveiOS
@JsonSerializable()
class DataArchiveiOS {
class DataArchiveiOS extends DataParam {
DataArchiveiOS();
late String workspacePath;
late String xcworkspaceFilePath;
late String scheme;
late String archivePath;
@ -152,7 +157,7 @@ class DataArchiveiOS {
//ExportiOS
@JsonSerializable()
class DataExportiOS {
class DataExportiOS extends DataParam {
DataExportiOS();
late String archivePath;
@ -166,7 +171,7 @@ class DataExportiOS {
//PublishiOS
@JsonSerializable()
class DataPublishiOS {
class DataPublishiOS extends DataParam {
DataPublishiOS();
late String bundleID;
@ -185,7 +190,7 @@ class DataPublishiOS {
//ExecuteApp
@JsonSerializable()
class DataExecuteApp {
class DataExecuteApp extends DataParam {
DataExecuteApp();
late String executable;
@ -198,7 +203,7 @@ class DataExecuteApp {
//Uploader
@JsonSerializable()
class DataUploader {
class DataUploader extends DataParam {
DataUploader();
late bool sftp;
@ -213,7 +218,7 @@ class DataUploader {
Map<String, dynamic> toJson() => _$DataUploaderToJson(this);
}
class DataFile {
class DataFile extends DataParam {
DataFile();
late List<String>? ignorePattern;
}
@ -257,7 +262,7 @@ class DataRename extends DataFile {
//Slack
@JsonSerializable()
class DataSlack {
class DataSlack extends DataParam {
DataSlack();
factory DataSlack.fromJson(Map<String, dynamic> json) =>
@ -267,7 +272,7 @@ class DataSlack {
//Slack Build
@JsonSerializable()
class DataSlackBuild {
class DataSlackBuild extends DataParam {
DataSlackBuild();
late String appName;
@ -284,7 +289,7 @@ class DataSlackBuild {
//Zip
@JsonSerializable()
class DataZip {
class DataZip extends DataParam {
DataZip();
late String zipFile;
@ -297,10 +302,9 @@ class DataZip {
//Shell
@JsonSerializable()
class DataShell {
class DataShell extends DataParam {
DataShell();
late String? workspace;
late String path;
factory DataShell.fromJson(Map<String, dynamic> json) =>
@ -310,10 +314,9 @@ class DataShell {
//Git
@JsonSerializable()
class DataGit {
class DataGit extends DataParam {
DataGit();
late String? workspace;
late List<String> commands;
factory DataGit.fromJson(Map<String, dynamic> json) =>
@ -323,10 +326,9 @@ class DataGit {
//Git
@JsonSerializable()
class DataGitRev {
class DataGitRev extends DataParam {
DataGitRev();
late String? workspace;
@JsonKey(name: 'result-value')
late String result_value;

View file

@ -55,18 +55,28 @@ const _$CommandTypeEnumMap = {
CommandType.Shell: 'Shell',
};
DataParam _$DataParamFromJson(Map<String, dynamic> json) =>
DataParam()..workspace = json['workspace'] as String?;
Map<String, dynamic> _$DataParamToJson(DataParam instance) => <String, dynamic>{
'workspace': instance.workspace,
};
DataSimpleCommand _$DataSimpleCommandFromJson(Map<String, dynamic> json) =>
DataSimpleCommand()..message = json['message'] as String;
DataSimpleCommand()
..workspace = json['workspace'] as String?
..message = json['message'] as String;
Map<String, dynamic> _$DataSimpleCommandToJson(DataSimpleCommand instance) =>
<String, dynamic>{
'workspace': instance.workspace,
'message': instance.message,
};
DataAppDataCreator _$DataAppDataCreatorFromJson(Map<String, dynamic> json) =>
DataAppDataCreator()
..scm = $enumDecode(_$SCMTypeEnumMap, json['scm'])
..workspace = json['workspace'] as String?
..scm = $enumDecode(_$SCMTypeEnumMap, json['scm'])
..relativeAssetPath = json['relativeAssetPath'] as String
..returnVersion = json['returnVersion'] as String
..returnHash = json['returnHash'] as String
@ -74,8 +84,8 @@ DataAppDataCreator _$DataAppDataCreatorFromJson(Map<String, dynamic> json) =>
Map<String, dynamic> _$DataAppDataCreatorToJson(DataAppDataCreator instance) =>
<String, dynamic>{
'scm': _$SCMTypeEnumMap[instance.scm]!,
'workspace': instance.workspace,
'scm': _$SCMTypeEnumMap[instance.scm]!,
'relativeAssetPath': instance.relativeAssetPath,
'returnVersion': instance.returnVersion,
'returnHash': instance.returnHash,
@ -89,25 +99,25 @@ const _$SCMTypeEnumMap = {
DataBuildDart _$DataBuildDartFromJson(Map<String, dynamic> json) =>
DataBuildDart()
..targetPath = json['targetPath'] as String?
..workspace = json['workspace'] as String?
..executeBuildRunner = json['executeBuildRunner'] as bool?;
Map<String, dynamic> _$DataBuildDartToJson(DataBuildDart instance) =>
<String, dynamic>{
'targetPath': instance.targetPath,
'workspace': instance.workspace,
'executeBuildRunner': instance.executeBuildRunner,
};
DataBuildFlutter _$DataBuildFlutterFromJson(Map<String, dynamic> json) =>
DataBuildFlutter()
..targetPath = json['targetPath'] as String?
..workspace = json['workspace'] as String?
..executeBuildRunner = json['executeBuildRunner'] as bool?
..platform = json['platform'] as String
..additional = json['additional'] as String?;
Map<String, dynamic> _$DataBuildFlutterToJson(DataBuildFlutter instance) =>
<String, dynamic>{
'targetPath': instance.targetPath,
'workspace': instance.workspace,
'executeBuildRunner': instance.executeBuildRunner,
'platform': instance.platform,
'additional': instance.additional,
@ -116,7 +126,7 @@ Map<String, dynamic> _$DataBuildFlutterToJson(DataBuildFlutter instance) =>
DataBuildDartCompile _$DataBuildDartCompileFromJson(
Map<String, dynamic> json) =>
DataBuildDartCompile()
..targetPath = json['targetPath'] as String?
..workspace = json['workspace'] as String?
..executeBuildRunner = json['executeBuildRunner'] as bool?
..targetDartFile = json['targetDartFile'] as String?
..buildFileName = json['buildFileName'] as String?;
@ -124,55 +134,64 @@ DataBuildDartCompile _$DataBuildDartCompileFromJson(
Map<String, dynamic> _$DataBuildDartCompileToJson(
DataBuildDartCompile instance) =>
<String, dynamic>{
'targetPath': instance.targetPath,
'workspace': instance.workspace,
'executeBuildRunner': instance.executeBuildRunner,
'targetDartFile': instance.targetDartFile,
'buildFileName': instance.buildFileName,
};
DataBuildDotNet _$DataBuildDotNetFromJson(Map<String, dynamic> json) =>
DataBuildDotNet()..projectFile = json['projectFile'] as String;
DataBuildDotNet()
..workspace = json['workspace'] as String?
..projectFile = json['projectFile'] as String;
Map<String, dynamic> _$DataBuildDotNetToJson(DataBuildDotNet instance) =>
<String, dynamic>{
'workspace': instance.workspace,
'projectFile': instance.projectFile,
};
DataBuildiOS _$DataBuildiOSFromJson(Map<String, dynamic> json) => DataBuildiOS()
..workspacePath = json['workspacePath'] as String
..workspace = json['workspace'] as String?
..scheme = json['scheme'] as String
..destination = json['destination'] as String?
..xcworkspaceFilePath = json['xcworkspaceFilePath'] as String
..cleanPod = json['cleanPod'] as bool?;
Map<String, dynamic> _$DataBuildiOSToJson(DataBuildiOS instance) =>
<String, dynamic>{
'workspacePath': instance.workspacePath,
'workspace': instance.workspace,
'scheme': instance.scheme,
'destination': instance.destination,
'xcworkspaceFilePath': instance.xcworkspaceFilePath,
'cleanPod': instance.cleanPod,
};
DataArchiveiOS _$DataArchiveiOSFromJson(Map<String, dynamic> json) =>
DataArchiveiOS()
..workspacePath = json['workspacePath'] as String
..workspace = json['workspace'] as String?
..xcworkspaceFilePath = json['xcworkspaceFilePath'] as String
..scheme = json['scheme'] as String
..archivePath = json['archivePath'] as String;
Map<String, dynamic> _$DataArchiveiOSToJson(DataArchiveiOS instance) =>
<String, dynamic>{
'workspacePath': instance.workspacePath,
'workspace': instance.workspace,
'xcworkspaceFilePath': instance.xcworkspaceFilePath,
'scheme': instance.scheme,
'archivePath': instance.archivePath,
};
DataExportiOS _$DataExportiOSFromJson(Map<String, dynamic> json) =>
DataExportiOS()
..workspace = json['workspace'] as String?
..archivePath = json['archivePath'] as String
..exportOptionPlistPath = json['exportOptionPlistPath'] as String
..exportPath = json['exportPath'] as String;
Map<String, dynamic> _$DataExportiOSToJson(DataExportiOS instance) =>
<String, dynamic>{
'workspace': instance.workspace,
'archivePath': instance.archivePath,
'exportOptionPlistPath': instance.exportOptionPlistPath,
'exportPath': instance.exportPath,
@ -180,6 +199,7 @@ Map<String, dynamic> _$DataExportiOSToJson(DataExportiOS instance) =>
DataPublishiOS _$DataPublishiOSFromJson(Map<String, dynamic> json) =>
DataPublishiOS()
..workspace = json['workspace'] as String?
..bundleID = json['bundleID'] as String
..version = json['version'] as String
..appName = json['appName'] as String
@ -191,6 +211,7 @@ DataPublishiOS _$DataPublishiOSFromJson(Map<String, dynamic> json) =>
Map<String, dynamic> _$DataPublishiOSToJson(DataPublishiOS instance) =>
<String, dynamic>{
'workspace': instance.workspace,
'bundleID': instance.bundleID,
'version': instance.version,
'appName': instance.appName,
@ -203,16 +224,19 @@ Map<String, dynamic> _$DataPublishiOSToJson(DataPublishiOS instance) =>
DataExecuteApp _$DataExecuteAppFromJson(Map<String, dynamic> json) =>
DataExecuteApp()
..workspace = json['workspace'] as String?
..executable = json['executable'] as String
..desktopServicePath = json['desktopServicePath'] as String;
Map<String, dynamic> _$DataExecuteAppToJson(DataExecuteApp instance) =>
<String, dynamic>{
'workspace': instance.workspace,
'executable': instance.executable,
'desktopServicePath': instance.desktopServicePath,
};
DataUploader _$DataUploaderFromJson(Map<String, dynamic> json) => DataUploader()
..workspace = json['workspace'] as String?
..sftp = json['sftp'] as bool
..port = json['port'] as int
..host = json['host'] as String
@ -222,6 +246,7 @@ DataUploader _$DataUploaderFromJson(Map<String, dynamic> json) => DataUploader()
Map<String, dynamic> _$DataUploaderToJson(DataUploader instance) =>
<String, dynamic>{
'workspace': instance.workspace,
'sftp': instance.sftp,
'port': instance.port,
'host': instance.host,
@ -231,6 +256,7 @@ Map<String, dynamic> _$DataUploaderToJson(DataUploader instance) =>
};
DataCopy _$DataCopyFromJson(Map<String, dynamic> json) => DataCopy()
..workspace = json['workspace'] as String?
..ignorePattern = (json['ignorePattern'] as List<dynamic>?)
?.map((e) => e as String)
.toList()
@ -238,12 +264,14 @@ DataCopy _$DataCopyFromJson(Map<String, dynamic> json) => DataCopy()
..copyMap = Map<String, String>.from(json['copyMap'] as Map);
Map<String, dynamic> _$DataCopyToJson(DataCopy instance) => <String, dynamic>{
'workspace': instance.workspace,
'ignorePattern': instance.ignorePattern,
'isMove': instance.isMove,
'copyMap': instance.copyMap,
};
DataDelete _$DataDeleteFromJson(Map<String, dynamic> json) => DataDelete()
..workspace = json['workspace'] as String?
..ignorePattern = (json['ignorePattern'] as List<dynamic>?)
?.map((e) => e as String)
.toList()
@ -251,11 +279,13 @@ DataDelete _$DataDeleteFromJson(Map<String, dynamic> json) => DataDelete()
Map<String, dynamic> _$DataDeleteToJson(DataDelete instance) =>
<String, dynamic>{
'workspace': instance.workspace,
'ignorePattern': instance.ignorePattern,
'list': instance.list,
};
DataRename _$DataRenameFromJson(Map<String, dynamic> json) => DataRename()
..workspace = json['workspace'] as String?
..ignorePattern = (json['ignorePattern'] as List<dynamic>?)
?.map((e) => e as String)
.toList()
@ -263,17 +293,21 @@ DataRename _$DataRenameFromJson(Map<String, dynamic> json) => DataRename()
Map<String, dynamic> _$DataRenameToJson(DataRename instance) =>
<String, dynamic>{
'workspace': instance.workspace,
'ignorePattern': instance.ignorePattern,
'renameMap': instance.renameMap,
};
DataSlack _$DataSlackFromJson(Map<String, dynamic> json) => DataSlack();
DataSlack _$DataSlackFromJson(Map<String, dynamic> json) =>
DataSlack()..workspace = json['workspace'] as String?;
Map<String, dynamic> _$DataSlackToJson(DataSlack instance) =>
<String, dynamic>{};
Map<String, dynamic> _$DataSlackToJson(DataSlack instance) => <String, dynamic>{
'workspace': instance.workspace,
};
DataSlackBuild _$DataSlackBuildFromJson(Map<String, dynamic> json) =>
DataSlackBuild()
..workspace = json['workspace'] as String?
..appName = json['appName'] as String
..type = $enumDecode(_$SlackBuildTypeEnumMap, json['type'])
..color = json['color'] as String
@ -283,6 +317,7 @@ DataSlackBuild _$DataSlackBuildFromJson(Map<String, dynamic> json) =>
Map<String, dynamic> _$DataSlackBuildToJson(DataSlackBuild instance) =>
<String, dynamic>{
'workspace': instance.workspace,
'appName': instance.appName,
'type': _$SlackBuildTypeEnumMap[instance.type]!,
'color': instance.color,
@ -300,11 +335,13 @@ const _$SlackBuildTypeEnumMap = {
};
DataZip _$DataZipFromJson(Map<String, dynamic> json) => DataZip()
..workspace = json['workspace'] as String?
..zipFile = json['zipFile'] as String
..zipList =
(json['zipList'] as List<dynamic>).map((e) => e as String).toList();
Map<String, dynamic> _$DataZipToJson(DataZip instance) => <String, dynamic>{
'workspace': instance.workspace,
'zipFile': instance.zipFile,
'zipList': instance.zipList,
};

View file

@ -1,7 +1,7 @@
// ignore_for_file: non_constant_identifier_names
import 'package:json_annotation/json_annotation.dart';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/pipeline/pipeline.dart';
part 'pipeline_data.g.dart';
/// ***************************** Base Data ****************************///

View file

@ -0,0 +1,131 @@
//####################### Pipeline #######################//
import 'package:dart_framework/utils/system_util.dart';
import 'package:oto_cli/cli/cli.dart';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/commands/command.dart';
import 'package:oto_cli/oto/data/command_data.dart';
import 'package:oto_cli/oto/data/pipeline_data.dart';
class Pipeline {
List<PipelineExecutor> _exeList;
Pipeline(this._exeList);
Future execute() async {
for (var exe in _exeList) {
await exe.execute();
}
return simpleFuture;
}
}
class PipelineValidateResult {
late String? message;
late bool enable = true;
late List<PipelineExecutor> exeList = [];
Pipeline? get pipeline {
if (exeList.isNotEmpty) {
return Pipeline(exeList);
} else {
return null;
}
}
}
abstract class PipelineExecutor {
//set & validate data
PipelineValidateResult initialize(Map<String, dynamic> set);
Future execute();
PipelineValidateResult validateTasks(List<dynamic>? list) {
var result = PipelineValidateResult();
if (list != null) {
return Application.instance.pipelineInitialize(list);
}
return result;
}
}
class PipelineExe extends PipelineExecutor {
late String targetCommandID;
@override
PipelineValidateResult initialize(Map<String, dynamic> set) {
var result = PipelineValidateResult();
targetCommandID = set.values.first as String;
if (!Application.instance.dataCommandMap.containsKey(targetCommandID)) {
result.enable = false;
result.message =
'The "$targetCommandID" command does not exist in the command list.';
}
return result;
}
Future<DataCommand> get commandData async {
var commandData = Application.instance.dataCommandMap[targetCommandID]!;
await Application.instance
.printBuildStep('Phase Start: ${commandData.name}', Color.green);
return dataFutrue(commandData);
}
@override
Future execute() async {
var now = DateTime.now();
var time =
'${now.minute.toString().padLeft(2)}:${now.second.toString().padLeft(2)}:${now.millisecond.toString().padLeft(2)}';
print('==================> [$time] Execute: $targetCommandID');
var data = await commandData;
await Command.byType(data.command).execute(data);
return simpleFuture;
}
}
class PipelineAsync extends PipelineExe {
@override
Future execute() async {
executeAsync(await commandData);
return simpleFuture;
}
void executeAsync(DataCommand data) async {
await Command.byType(data.command).execute(data);
}
}
class PipelineIf extends PipelineExecutor {
late DataIf _data;
late Pipeline? _pipelineTrue;
late Pipeline? _pipelineFalse;
@override
PipelineValidateResult initialize(Map<String, dynamic> set) {
var result = PipelineValidateResult();
_data = DataIf.fromJson(set.values.first);
var dataValidateResult = _data.validate();
if (!dataValidateResult.enable) {
return dataValidateResult;
}
//set true task
var validateResult = validateTasks(_data.on_true);
if (!validateResult.enable) {
return validateResult;
}
_pipelineTrue = validateResult.pipeline;
//set false task
validateResult = validateTasks(_data.on_false);
if (!validateResult.enable) {
return validateResult;
}
_pipelineFalse = validateResult.pipeline;
return result;
}
@override
Future execute() async {
//To-do: check true or false
await _pipelineTrue?.execute();
await _pipelineFalse?.execute();
return simpleFuture;
}
}