UNPKG

nexus-deployer

Version:

Deploy artifacts with classifiers to release/snapshot maven repository.

203 lines (159 loc) 7.47 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 exec; 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'; options.parallel = options.parallel === undefined ? false : options.parallel; if (!directoryExists(pomDir)) { fs.mkdirSync(pomDir); } 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")); } var curlOptions = [ '--silent', '--output', '/dev/stderr', '--write-out', '"%{http_code}"', '--upload-file', fileLocation, '--noproxy', options.noproxy ? options.noproxy : '127.0.0.1' ]; if (options.auth) { curlOptions.push('-u'); curlOptions.push('"'+options.auth.username + ":" + options.auth.password+'"'); } if (options.insecure) { curlOptions.push('--insecure'); } var execOptions = {}; options.cwd && (execOptions.cwd = options.cwd); var curlCmd = ['curl', curlOptions.join(' '), targetUri].join(' '); var childProcess = exec(curlCmd, execOptions, function (error) { if (error) { console.log(chalk.red(error)); } }); childProcess.stdout.on('data', function (data) { status = data; }); childProcess.on('close', function (code) { if ((status && status.substring(0, 1) == "2") || code == 0) { cb(null, "Ok"); } else { cb("Status code " + status + " 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) { var binaryChunk = chunk.toString('binary'); md5Hash.update(binaryChunk); sha1Hash.update(binaryChunk); }); 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; 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 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'; } var remoteArtifactName = options.artifactId + '-' + 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."}; } exec = process.env.MOCK_NEXUS ? require('./mockexec') : require('child_process').exec; options.lastUpdated = process.env.MOCK_NEXUS ? '11111111111111': dateformat(new Date(), "yyyymmddHHMMss"); createAndUploadArtifacts(options, cb); };