UNPKG

@lyra-network/nexus-deployer

Version:

Deploy artifacts with classifiers to release/snapshot maven repository.

269 lines (232 loc) 8.39 kB
"use strict"; var ejs = require("ejs"); var dateformat = require("dateformat"); var crypto = require("crypto"); var async = require("async"); var fs = require("fs"); var chalk = require("chalk"); var path = require("path"); var mkdirp = require("mkdirp"); var request; ejs.open = "{{"; ejs.close = "}}"; var cwd = __dirname; var createFile = function (template, options) { var outerMetadata = fs .readFileSync(path.resolve(cwd, "../template/" + template)) .toString(); var metadata = ejs.render(outerMetadata, options); return metadata; }; var md5 = function (str) { var hash = crypto.createHash("md5"); return hash.update(str).digest("hex"); }; var sha1 = function (str) { var hash = crypto.createHash("sha1"); return hash.update(str).digest("hex"); }; var save = function (fileContent, pomDir, fileName) { mkdirp.sync(pomDir); fs.writeFileSync(pomDir + "/" + fileName, fileContent); fs.writeFileSync(pomDir + "/" + fileName + ".md5", md5(fileContent)); fs.writeFileSync(pomDir + "/" + fileName + ".sha1", sha1(fileContent)); }; var directoryExists = function (dir) { try { return fs.statSync(dir).isDirectory(); } catch (e) { // error is thrown by statSync when path does not exist if (e.code === "ENOENT") { return false; } throw e; } }; var createAndUploadArtifacts = function (options, done) { var pomDir = options.pomDir || "test/poms"; var buildNumber = 1; var extractBuildNumberRegex = /SNAPSHOT\.(\d+)/; var extractSnapshotBuildNumberRegex = /SNAPSHOT-(\d+)(?:\.\d+)?/; var extractSnapshotPrefixRegex = /(?:-(.*))(-SNAPSHOT-.*$)/gi; var matches; if ((matches = extractSnapshotPrefixRegex.exec(options.version))) { var prefix = matches[1]; options.version = prefix + "-" + options.version.replace(extractSnapshotPrefixRegex, "$2"); } if ((matches = extractSnapshotBuildNumberRegex.exec(options.version))) { buildNumber = +matches[1]; options.version = options.version.replace( extractSnapshotBuildNumberRegex, "SNAPSHOT" ); } if ((matches = extractBuildNumberRegex.exec(options.version))) { buildNumber = +matches[1]; options.version = options.version.replace( extractBuildNumberRegex, "SNAPSHOT" ); } options.parallel = options.parallel === undefined ? false : options.parallel; if (!directoryExists(pomDir)) { fs.mkdirSync(pomDir); } options.timestamp = options.lastUpdated.replace(/(\d{8})(\d{6})/, "$1.$2"); options.buildNumber = buildNumber; options.isSnapshot = options.version.indexOf("SNAPSHOT") > -1; options.timestampVersion = options.version.replace("SNAPSHOT", options.timestamp) + "-" + buildNumber; save(createFile("project-metadata.xml", options), pomDir, "outer.xml"); save(createFile("latest-metadata.xml", options), pomDir, "inner.xml"); save(createFile("pom.xml", options), pomDir, "pom.xml"); var upload = function (fileLocation, targetFile) { var uploadArtifact = function (cb) { var targetUri = options.url + "/" + targetFile, status; if (!options.quiet) { console.log(chalk.blue("Uploading to " + targetUri + "\n\n")); } if (!options.auth) { console.log(chalk.red("You must provide authentication info!")); cb("Missing authentication!", null); } if (options.insecure) { process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0; } fs.createReadStream(fileLocation).pipe( request .put({ uri: targetUri, rejectUnauthorized: false }) .auth(options.auth.username, options.auth.password) .on("response", function (response) { if (response.statusCode == 200 || response.statusCode == 201) { console.log(chalk.green(response.statusMessage)); console.log(chalk.green(response.statusCode)); cb(null, "Ok"); } else { console.log(chalk.red(response.statusMessage)); console.log(chalk.red(response.statusCode)); cb("Error during request for " + targetUri, null); } }) .on("error", function (error) { console.log(chalk.red(error)); cb("Error during request for " + targetUri, null); }) ); }; return uploadArtifact; }; var artifactStream = fs.createReadStream(options.artifact); var md5Hash = crypto.createHash("md5"); var sha1Hash = crypto.createHash("sha1"); artifactStream.on("data", function (chunk) { md5Hash.update(chunk); sha1Hash.update(chunk); }); artifactStream.on("error", function (error) { console.log(chalk.red(error)); done(error); }); artifactStream.on("end", function () { fs.writeFileSync( pomDir + "/artifact." + options.packaging + ".md5", md5Hash.digest("hex") ); fs.writeFileSync( pomDir + "/artifact." + options.packaging + ".sha1", sha1Hash.digest("hex") ); var uploads = {}; var groupIdAsPath = options.groupId.replace(/\./g, "/"); var groupArtifactPath = groupIdAsPath + "/" + options.artifactId; var SNAPSHOT_VER = /.*SNAPSHOT$/i; var groupArtifactVersionPath = groupArtifactPath + "/" + options.version; if (SNAPSHOT_VER.test(options.version)) { uploads[pomDir + "/inner.xml"] = groupArtifactVersionPath + "/" + "maven-metadata.xml"; uploads[pomDir + "/inner.xml.sha1"] = groupArtifactVersionPath + "/" + "maven-metadata.xml.sha1"; uploads[pomDir + "/inner.xml.md5"] = groupArtifactVersionPath + "/" + "maven-metadata.xml.md5"; } else { uploads[pomDir + "/outer.xml"] = groupArtifactPath + "/" + "maven-metadata.xml"; uploads[pomDir + "/outer.xml.sha1"] = groupArtifactPath + "/" + "maven-metadata.xml.sha1"; uploads[pomDir + "/outer.xml.md5"] = groupArtifactPath + "/" + "maven-metadata.xml.md5"; } var remoteArtifactName = options.artifactId + "-" + (SNAPSHOT_VER.test(options.version) ? options.timestampVersion : options.version); uploads[pomDir + "/pom.xml"] = groupArtifactVersionPath + "/" + remoteArtifactName + ".pom"; uploads[pomDir + "/pom.xml.sha1"] = groupArtifactVersionPath + "/" + remoteArtifactName + ".pom.sha1"; uploads[pomDir + "/pom.xml.md5"] = groupArtifactVersionPath + "/" + remoteArtifactName + ".pom.md5"; if (options.classifier) { remoteArtifactName = remoteArtifactName + "-" + options.classifier; } uploads[options.artifact] = groupArtifactVersionPath + "/" + remoteArtifactName + "." + options.packaging; uploads[pomDir + "/artifact." + options.packaging + ".sha1"] = groupArtifactVersionPath + "/" + remoteArtifactName + "." + options.packaging + ".sha1"; uploads[pomDir + "/artifact." + options.packaging + ".md5"] = groupArtifactVersionPath + "/" + remoteArtifactName + "." + options.packaging + ".md5"; var fns = []; for (var u in uploads) { if (uploads.hasOwnProperty(u)) { fns.push(upload(u, uploads[u])); } } var asyncFn = options.parallel ? async.parallel : async.series; asyncFn(fns, function (err) { if (!options.quiet) { console.log( chalk.blue("-------------------------------------------\n") ); if (err) { console.log(chalk.red("Artifact Upload failed\n" + String(err))); } else { console.log(chalk.green("Artifacts uploaded successfully")); } } done(err); }); }); }; module.exports = function (options, cb) { if (!options) { throw { name: "IllegalArgumentException", message: "upload artifact options required.", }; } request = process.env.MOCK_NEXUS ? require("./mockrequest") : require("request"); options.lastUpdated = process.env.MOCK_NEXUS ? "11111111111111" : dateformat(new Date(), "yyyymmddHHMMss"); createAndUploadArtifacts(options, cb); };