Files
js-scripts/scripts/build.js
2025-04-05 16:57:26 +08:00

261 lines
11 KiB
JavaScript

#!/usr/bin/env runjs
var Integrity = Packages.me.hatter.tools.commons.security.digest.Integrity;
var counter = require('component-counter.js');
var javahomejs = require('component-javahome.js');
var colorprint = require('component-colorprint-ex.js');
var doGetPackage = (name, bin, version) => {
var gradleHome = '~/.jssp/builder/' + name + '-' + version;
var gradleInfoRFile = __.rfile.from(gradleHome).file('info.json');
if (gradleInfoRFile.exists()) {
return gradleInfoRFile.parseJSON();
}
if (__.rfile.from(gradleHome).notExists()) { __.rfile.from(gradleHome).file().mkdirs(); }
var toolPackageDetail = $$.httpRequest().url('https://hatter.ink/tool/tool_package_detail.jsonp')
.param('__auth_token', 'GpsVz8uxoxFW34CFhyGnTwKXQRtL3FoTA')
.param('name', name)
.param('version', version)
.get();
var toolPackageDetailJSON = JSON.parse(toolPackageDetail.toString());
if (toolPackageDetailJSON.status != 200) {
return null;
}
var packageName = toolPackageDetailJSON.data.name;
if (packageName.endsWith('.zip')) { packageName = packageName.substring(0, packageName.length - 4); }
else if (packageName.endsWith('.tgz')) { packageName = packageName.substring(0, packageName.length - 4); }
else if (packageName.endsWith('.tar.gz')) { packageName = packageName.substring(0, packageName.length - 7); }
if (packageName.endsWith('-bin')) { packageName = packageName.substring(0, packageName.length - 4); }
var gradleInfoJSON = {
'package': toolPackageDetailJSON.data.url,
'sha256': Integrity.parse(toolPackageDetailJSON.data.integrity).getDigest().asHex(),
'path': gradleHome + '/' + packageName,
'bin': bin
};
gradleInfoRFile.write(JSON.stringify(gradleInfoJSON));
return gradleInfoJSON;
};
var builders = {
'ant': {
'1.7': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/ant1.7.tar.gz',
//'package': 'https://playsecurity.org/getdoc/1248_A7AA5F48FD4AD6CC21731D6DA7412028/ant1.7.tar.gz',
'sha256': 'fb91927e662d415b6d377434a79b9ba416295d5b27c7cfdee651016e103d933f',
'path': '~/.jssp/builder/ant-1.7/ant1.7',
'bin': 'bin/ant'
},
'@system': {
'bin': 'ant'
}
},
'gradle': {
'1.0': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/gradle-1.0-bin.zip',
//'package': 'https://playsecurity.org/getdoc/1319_8CF093FD477F8C991C586A3FF1DDAC53/gradle-1.0-bin.zip',
'sha256': '894bca0360a7e2040815096788f118a2dd106ff6694221b274efb9c32bce0384',
'path': '~/.jssp/builder/gradle-1.0/gradle-1.0',
'bin': 'bin/gradle'
},
'3.1': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/gradle-3.1-bin.zip',
//'package': 'https://playsecurity.org/getdoc/1250_66CED6B096F6BF7C88F718F2FDFA17DD/gradle-3.1-bin.zip',
'sha256': 'c7de3442432253525902f7e8d7eac8b5fd6ce1623f96d76916af6d0e383010fc',
'path': '~/.jssp/builder/gradle-3.1/gradle-3.1',
'bin': 'bin/gradle'
},
'4.4': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/gradle-4.4-bin.zip',
//'package': 'https://playsecurity.org/getdoc/1400_ECE7856BD68513DE9BF6E8D66990443F/gradle-4.4-bin.zip',
'sha256': 'fa4873ae2c7f5e8c02ec6948ba95848cedced6134772a0169718eadcb39e0a2f',
'path': '~/.jssp/builder/gradle-4.4/gradle-4.4',
'bin': 'bin/gradle'
},
'getPackage': (version) => {
return doGetPackage('gradle', 'bin/gradle', version);
},
'@system': {
'bin': 'gradle'
}
},
'maven': {
'2.2.1': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/apache-maven-2.2.1-bin.zip',
//'package': 'https://playsecurity.org/getdoc/1422_ABA87C5E2BD1C06F8DD898CFF67E3BDB/apache-maven-2.2.1-bin.zip',
'sha256': 'a509c03f10ba8c7c503338c0870ae9abbb59cb06279f705d12f69b454c8cf6a1',
'path': '~/.jssp/builder/maven-2.2.1/apache-maven-2.2.1',
'bin': 'bin/mvn'
},
'3.5.2': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/apache-maven-3.5.2-bin.zip',
//'package': 'https://playsecurity.org/getdoc/1421_182A3E008816352359E0690E14BD2C10/apache-maven-3.5.2-bin.zip',
'sha256': '90e9f0d700743516d1f610fcd63a5d49751d0743db713909f9ef933747a38b8a',
'path': '~/.jssp/builder/maven-3.5.2/apache-maven-3.5.2',
'bin': 'bin/mvn'
},
'getPackage': (version) => {
return doGetPackage('maven', 'bin/mvn', version);
},
'@system': {
'bin': 'mvn'
}
}
};
var getBuildJSONInParents = (buildJSONFile) => {
var f = buildJSONFile.getAbsoluteFile();
while (f.getParentFile() != null) {
f = f.getParentFile();
if ($$.file(f, 'build.json').exists()) {
return $$.file(f, 'build.json');
}
}
return null;
};
var main = () => {
var buildJSONFile = $$.file('build.json');
if (!buildJSONFile.exists()) {
xprintln('[WARN] Build config file not found in current dir: build.json');
buildJSONFile = getBuildJSONInParents(buildJSONFile);
if (buildJSONFile == null) {
xprintln('[ERROR] Build config file not found: build.json');
return;
}
}
var buildJSON = JSON.parse($$.rFile(buildJSONFile).string());
var builderInfo = buildJSON.builder || buildJSON.compiler;
var javaVersion = buildJSON.java;
if (!javaVersion) { xprintln('[ERROR] Java version is not assigned!'); return; }
if (!builderInfo) { xprintln('[ERROR] Builder info is not assigned!'); return; }
var builder = builders[builderInfo['name']][builderInfo['version']];
if ((builder == null) && builders[builderInfo['name']].getPackage) {
builder = builders[builderInfo['name']].getPackage(builderInfo['version']);
}
if (!builder) { xprintln('[ERROR] Builder version not found: ' + builderInfo['name'] + '-' + builderInfo['version']); return; }
var builderBin = (builderInfo['version'] == '@system') ? builder.bin : (builder.path + '/' + builder.bin);
if (builderBin.startsWith('~')) {
builderBin = $$.prop('user.home') + builderBin.substring(1);
}
var javaHome = null;
if ($STR(javaVersion) != '@system') { // TODO ...
javaHome = javahomejs.getJavaHome(javaVersion);
if (javaHome == null) {
xprintln('[ERROR] Java version is not found: ' + javaVersion);
return;
}
}
var commandArgs = [];
var buildCommands = [];
buildCommands.push(builderBin);
if (buildJSON.args) {
buildJSON.args.forEach((a) => { buildCommands.push(a); commandArgs.push(a); });
}
var hasXArgsNotMatch = false;
var hasXRunsNotMatch = false;
$ARR($ARGS).forEach((a) => {
if ($STR(a).startsWith('::')) {
var aCmd = $STR(a).substring(2);
if (buildJSON.xArgs && buildJSON.xArgs[aCmd]) {
buildJSON.xArgs[aCmd].forEach((a) => { buildCommands.push(a); commandArgs.push(a); });
return; // process next argument!
} else {
hasXArgsNotMatch = true;
xprintln('[WARN] xArgs "build.json#xArgs#' + aCmd + '" not found!');
}
} else if ($STR(a).startsWith('...')) {
buildCommands = [];
var aCmd = $STR(a).substring(3);
if (buildJSON.xRuns && buildJSON.xRuns[aCmd]) {
buildJSON.xRuns[aCmd].forEach((a) => { buildCommands.push(a); commandArgs.push(a); });
return; // process next argument!
} else {
hasXRunsNotMatch = true;
xprintln('[ERROR] xRuns "build.json#xRuns#' + aCmd + '" not found!');
}
}
buildCommands.push(a); commandArgs.push(a);
});
if (hasXArgsNotMatch && ($ARRAY($ARGS).length == 1)) {
print('xArgs argument not found, do you want to continue(yes/no, default no)? ');
var yesNo = java.lang.System.console().readLine();
yesNo = $STR(yesNo || 'no').toLowerCase();
if (!(['yes', 'y'].contains(yesNo))) {
xprintln('[INFO] Exited.')
return;
}
}
if (hasXRunsNotMatch) {
return;
}
if ((builderInfo['version'] != '@system') && (!($$.file(builderBin).exists()))) {
xprintln('[INFO] Builder not exists, downloading...');
var nameAndVersion = builderInfo['name'] + '-' + builderInfo['version'];
var fn = builder.package.substring(builder.package.lastIndexOf('/') + 1);
if (fn.indexOf('?') > 0) { fn = fn.substring(0, fn.indexOf('?')); }
var f = $$.file('~', '.jssp', 'builder', nameAndVersion, fn);
if (!(f.exists())) {
f.getParentFile().mkdirs();
var fos = new java.io.FileOutputStream(f);
$$.httpRequest()
.url(builder.package)
.addHeader('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36')
.get(fos, counter.getCounter2());
fos.close();
println();
var sha256 = $$.rFile(f).digest($$.digests().sha256()).asHex();
if ($STR(sha256) == builder.sha256) {
xprintln('[SUCCESS] Check SHA256 success.')
} else {
xprintln('[ERROR] Check SHA256 failed, actual is: ' + sha256 + ',expected: ' + builder.sha256);
f.renameTo($$.file('~', '.jssp', 'builder', nameAndVersion, fn + '.invalid.' + $$.date().millis()));
return;
}
// installBuilderScripts.push('runjs -u https://repo.examp1e.org/app/get.js ' + builder.package);
}
var installBuilderScripts = [];
installBuilderScripts.push('cd ~/.jssp/builder/' + nameAndVersion);
if (/.*\.tar\.gz$/.test(fn) || /.*\.tgz$/.test(fn)) {
installBuilderScripts.push('tar xzvf ' + fn);
} else if (/.*\.zip$/.test(fn)) {
installBuilderScripts.push('unzip ' + fn);
} else {
xprintln('[ERROR] Extract package failed: ' + fn);
return;
}
installBuilderScripts.push('');
var builderIntall = $$.file('.builder_install.sh');
$$.rFile(builderIntall).write(installBuilderScripts.join('\n'));
$$.shell().inheritIO().commands('sh', builderIntall.getName()).run();
builderIntall.delete();
}
if ((builderInfo['version'] != '@system') && (!($$.file(builderBin).exists()))) {
xprintln('[ERROR] Builder bin not found!');
return;
}
xprintln('[INFO] JAVA_HOME = ' + (javaHome || ($$.env('JAVA_HOME') + colorprint.okgreen.render(' @system'))));
xprintln('[INFO] BUILDER = ' + builderBin + ((builderInfo['version'] == '@system') ? colorprint.okgreen.render(' @system') : ''));
xprintln('[INFO] ARGUMENTS = ' + $ARR(commandArgs).toJavaList());
println();
var shell = $$.shell();
if (javaHome) { shell.env('JAVA_HOME', javaHome).env('PATH', javaHome + '/bin:' + $$.env('PATH')); }
shell.inheritIO().commands(buildCommands).run();
};
main();