From cb7c24b9894adab2f1d1511e723011895f2fee27 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Thu, 21 Jan 2021 12:07:08 +0100 Subject: [PATCH] Removed remote and seperated discord messages --- package.json | 73 ++++++----- resources/discord-messages.json | 40 ++++++ src/config.js | 12 +- src/discord.js | 45 ++++--- src/github.js | 42 +++--- src/logger.js | 7 +- src/main.js | 51 ++++---- src/maven.js | 5 +- src/projects.js | 23 ++-- src/remote.js | 220 -------------------------------- src/sonar.js | 31 ++--- test/TestConfig.js | 2 +- test/TestSystem.js | 4 +- 13 files changed, 189 insertions(+), 366 deletions(-) create mode 100644 resources/discord-messages.json delete mode 100644 src/remote.js diff --git a/package.json b/package.json index c06078030..f61ea80cd 100644 --- a/package.json +++ b/package.json @@ -1,39 +1,38 @@ { - "name": "maven-builds-server", - "version": "2.1.2", - "description": "A simple Builds Server for all my Maven Projects", - "main": "src/remote.js", - "scripts": { - "remote": "node ./src/remote.js", - "iteration": "node ./src/single-run.js", - "regen": "node ./src/force-update.js", - "test": "nyc --reporter=lcov --reporter=text-lcov mocha test/*.js --reporter mocha-multi-reporters --reporter-options configFile=resources/mocha.json", - "sonar": "node ./src/sonar.js" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/TheBusyBiscuit/builds.git" - }, - "author": "TheBusyBiscuit", - "license": "MIT", - "bugs": { - "url": "https://github.com/TheBusyBiscuit/builds/issues" - }, - "homepage": "https://github.com/TheBusyBiscuit/builds#readme", - "dependencies": { - "child-process-promise": "^2.2.1", - "discord.js": "^11.5.1", - "lodash": "^4.17.14", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "xml-library": "0.2.0" - }, - "devDependencies": { - "chai": "4.2.0", - "chai-as-promised": "7.1.1", - "mocha": "8.2.1", - "mocha-multi-reporters": "1.5.1", - "mocha-sonarqube-reporter": "1.0.2", - "nyc": "15.1.0" - } + "name": "maven-builds-server", + "version": "2.1.2", + "description": "A simple Builds Server for all my Maven Projects", + "main": "src/single-run.js", + "scripts": { + "iteration": "node ./src/single-run.js", + "regen": "node ./src/force-update.js", + "test": "nyc --reporter=lcov --reporter=text-lcov mocha test/*.js --reporter mocha-multi-reporters --reporter-options configFile=resources/mocha.json", + "sonar": "node ./src/sonar.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/TheBusyBiscuit/builds.git" + }, + "author": "TheBusyBiscuit", + "license": "MIT", + "bugs": { + "url": "https://github.com/TheBusyBiscuit/builds/issues" + }, + "homepage": "https://github.com/TheBusyBiscuit/builds#readme", + "dependencies": { + "child-process-promise": "^2.2.1", + "discord.js": "^11.5.1", + "lodash": "^4.17.14", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "xml-library": "0.2.0" + }, + "devDependencies": { + "chai": "4.2.0", + "chai-as-promised": "7.1.1", + "mocha": "8.2.1", + "mocha-multi-reporters": "1.5.1", + "mocha-sonarqube-reporter": "1.0.2", + "nyc": "15.1.0" + } } diff --git a/resources/discord-messages.json b/resources/discord-messages.json new file mode 100644 index 000000000..7afed90d4 --- /dev/null +++ b/resources/discord-messages.json @@ -0,0 +1,40 @@ +{ + "success": [ + "Is it a bird?\nIs it a plane?\nNo, it's Build # of ", + "Wow, that actually worked?\nI mean, of course, yes, sure.", + "It'sa me, Build # of ", + " has been updated to Build #", + " really outdid themselves!\nBuild # of was a success!", + " # compiled successfully!\n must be so proud!", + "Oh cool another build of ...", + "Look!\nA new Build of just dropped from the sky!", + "Did someone order a large with some extra on top?", + "Ding Dong!\nBuild # of is here!", + "Knock Knock!\nWho's there?\nBuild #!\nBuild # who?\n\nBuild # of !", + "Now entering... Build # of ", + "A new challenger approached!\nBuild # of ", + "A wild has appeared!", + "Whooooooooooooosh\n\nA build flew by!", + "Pssst...\nYou want some ?\nHere's a fresh build!", + "Build of has just graduated!\nIt is now ready for your servers!", + " just grew another Tree in his garden.\nLook! There is already a juicy build # hanging beneath it!", + "Another fresh oven-baked piece of is ready!\nBe careful not to burn yourself!", + "Did someone say ?\nNo?\nWell, here you go anyway..." + ], + "failure": [ + "Oh no!\nWhat has done?\n did not compile!", + "Well, ...\nThat did not work out, did it?", + " failed to compile! No Build # for you :(", + "A new build of is...\nOh damn it, it broke...", + "Build # of fell into the void.", + "Build # of failed to compile.\nPress 'F' to pay respect.", + "Another one bites the dust!\nIt was this time...", + "Uh oh, got snapped out of existance", + "Someone ate Build of \n, was it you?", + ", there is a problem! *over*", + "Mission failed. We'll get 'em next time, ", + "How... Just how?", + ", I believed in you...", + " believed it could fly.\n\nSoon after... it hit the ground." + ] +} diff --git a/src/config.js b/src/config.js index 2aca83aa2..be8ae37a1 100644 --- a/src/config.js +++ b/src/config.js @@ -1,4 +1,5 @@ const fs = require('fs'); +const path = require('path'); const lodash = require("lodash/object"); const defaultConfig = { @@ -29,7 +30,7 @@ const defaultConfig = { } } -module.exports = (file) => { +module.exports = file => { let cfg = {}; if (file != 'null' && process.env.JSON_CONFIG) { @@ -39,8 +40,7 @@ module.exports = (file) => { try { // Sadly this has to be a sync-process, otherwise a Promise would be more appropriate here cfg = JSON.parse(fs.readFileSync(file, 'UTF-8')); - } - catch(err) {} + } catch (err) { } cfg = lodash.defaultsDeep(cfg, defaultConfig); @@ -52,6 +52,8 @@ module.exports = (file) => { }; function structure(json) { + let messages = JSON.stringify(fs.readFileSync(path.resolve(__dirname, "../resources/discord-messages.json"), 'UTF-8')); + return { server: { getPort: () => json.server.port, @@ -64,8 +66,8 @@ function structure(json) { isEnabled: () => json.discord.enabled, getID: () => json.discord.id, getToken: () => json.discord.token, - getMessages: (success) => { - return success ? json.discord.messages.success: json.discord.messages.failure; + getMessages: success => { + return success ? messages.success : messages.failure; } }, sonar: { diff --git a/src/discord.js b/src/discord.js index 2034efc0a..a2ed6ff9a 100644 --- a/src/discord.js +++ b/src/discord.js @@ -3,21 +3,22 @@ const lodash = require("lodash/collection"); const projects = require('../src/projects.js'); module.exports = (cfg) => { - var config = cfg; + var config = cfg; var webhook = { send: () => Promise.resolve() }; if (config) { - if (config.isEnabled()) webhook = new Discord.WebhookClient(config.getID(), config.getToken()); - } - else config = { - isEnabled: () => true, - getMessages: (success) => { - return success ? "This Build was a success!": "This Build was a failure!"; - } - } + if (config.isEnabled()) { + webhook = new Discord.WebhookClient(config.getID(), config.getToken()); + } + } else config = { + isEnabled: () => true, + getMessages: (success) => { + return success ? "This Build was a success!" : "This Build was a failure!"; + } + } return { /** @@ -31,11 +32,11 @@ module.exports = (cfg) => { */ sendUpdate: (job) => sendUpdate(webhook, job, config), - /** - * This method returns the discord config used by this instance - * - * @return {Object} Config - */ + /** + * This method returns the discord config used by this instance + * + * @return {Object} Config + */ getConfig: () => config } }; @@ -51,23 +52,25 @@ module.exports = (cfg) => { */ function sendUpdate(webhook, job, cfg) { return new Promise((resolve, reject) => { - if (!cfg.isEnabled()) resolve(); + if (!cfg.isEnabled()) { + resolve(); + } if (!projects.isValid(job, true)) { reject("Invalid Job"); return; } - var message = lodash.sample(cfg.getMessages(job.success)); + let message = lodash.sample(cfg.getMessages(job.success)); message = message.replace(//g, job.author).replace(//g, job.repo).replace(//g, job.branch).replace(//g, job.id); webhook.send( new Discord.RichEmbed() - .setTitle(job.author + "/" + job.repo + ":" + job.branch + " ( #" + job.id + " )") - .setColor(job.success ? 0X00FF00: 0XFF0000) - .setDescription(message) - .setURL("https://thebusybiscuit.github.io/builds/" + job.directory + "#" + job.id) - .setTimestamp(Date.now()) + .setTitle(job.author + "/" + job.repo + ":" + job.branch + " ( #" + job.id + " )") + .setColor(job.success ? 0X00FF00 : 0XFF0000) + .setDescription(message) + .setURL("https://thebusybiscuit.github.io/builds/" + job.directory + "#" + job.id) + .setTimestamp(Date.now()) ).then(resolve, reject); }); } diff --git a/src/github.js b/src/github.js index 16f3e3f37..66c3e457c 100644 --- a/src/github.js +++ b/src/github.js @@ -50,10 +50,10 @@ module.exports = (cfg) => { exists: (job) => exists(job, cfg), /** - * This method returns the discord config used by this instance - * - * @return {Object} Config - */ + * This method returns the discord config used by this instance + * + * @return {Object} Config + */ getConfig: () => cfg, clone, @@ -140,8 +140,7 @@ function getJSON(job, cfg, logging, endpoint, resolve, reject) { if (json.documentation_url) { reject("Missing License file"); - } - else { + } else { resolve(json); } }, reject); @@ -188,16 +187,15 @@ function hasUpdate(job, timestamp) { if (FileSystem.existsSync(file)) { fs.readFile(file, "utf8") - .then((data) => { - if (!data) resolve(0); // Pretend like there is an Update if no local builds exist - var json = JSON.parse(data); - - if (!json.latest) resolve(0); // Pretend like there is an Update if no local builds exist - else if (timestamp > json[json.latest].timestamp) resolve(json.latest); - else reject(); - }, () => resolve(0)) - } - else resolve(0); // Pretend like there is an Update if no local builds exist + .then((data) => { + if (!data) resolve(0); // Pretend like there is an Update if no local builds exist + var json = JSON.parse(data); + + if (!json.latest) resolve(0); // Pretend like there is an Update if no local builds exist + else if (timestamp > json[json.latest].timestamp) resolve(json.latest); + else reject(); + }, () => resolve(0)) + } else resolve(0); // Pretend like there is an Update if no local builds exist }); } @@ -238,8 +236,8 @@ function clone(job, commit, logging) { "--hard", commit ], { - cwd: path.resolve(__dirname, "../" + job.directory + "/files") - }); + cwd: path.resolve(__dirname, "../" + job.directory + "/files") + }); refresh.childProcess.stdout.on('data', (data) => log(logging, "-> " + data)); refresh.childProcess.stderr.on('data', (data) => log(logging, "-> " + data)); @@ -283,7 +281,7 @@ function pushChanges(job, logging) { var commit = process.spawn("git", [ "commit", "-m", - (job.success ? "Successfully compiled: ": "Failed to compile: ") + job.author + "/" + job.repo + ":" + job.branch + " (" + job.id + ")" + (job.success ? "Successfully compiled: " : "Failed to compile: ") + job.author + "/" + job.repo + ":" + job.branch + " (" + job.id + ")" ]); commit.childProcess.stdout.on('data', (data) => log(logging, "-> " + data)); @@ -317,9 +315,9 @@ function pushChanges(job, logging) { function getURL(job, cfg, endpoint) { var url = "https://api.github.com/repos/" + job.author + "/" + job.repo + endpoint; var headers = { - "Accept": "application/vnd.github.v3+json", - "User-Agent": "The Busy Biscuit's Repository Compiler", - "Time-Zone": "UTC" + "Accept": "application/vnd.github.v3+json", + "User-Agent": "The Busy Biscuit's Repository Compiler", + "Time-Zone": "UTC" }; if (cfg.getToken()) { diff --git a/src/logger.js b/src/logger.js index 6b2c857c4..219cb9db3 100644 --- a/src/logger.js +++ b/src/logger.js @@ -3,7 +3,10 @@ */ module.exports = (logging, str, direct) => { if (logging) { - if (direct) process.stdout.write(str); - else console.log(str); + if (direct) { + process.stdout.write(str); + } else { + console.log(str); + } } } diff --git a/src/main.js b/src/main.js index 7d22f6432..73a363104 100644 --- a/src/main.js +++ b/src/main.js @@ -51,27 +51,28 @@ function start(logging) { if (!global.status.running || i >= jobs.length) { done(); - } - else { + } else { log(logging, ""); log(logging, "Watching: " + jobs[i].author + "/" + jobs[i].repo + ":" + jobs[i].branch) let job = jobs[i]; // Project Lifecycle - check(job, logging).then(() => - update(job, logging).then(() => - compile(job, logging).then(() => - gatherResources(job, logging).then(() => - upload(job, logging).then(() => - finish(job, logging).then(() => { - global.status.task[jobs[i].author + "/" + jobs[i].repo + "/" + jobs[i].branch] = "Finished" - }).then(nextJob, fail) - , fail) - , fail) - , fail) - , fail) - , nextJob); + check(job, logging) + .then(() => update(job, logging) + .then(() => compile(job, logging) + .then(() => gatherResources(job, logging) + .then(() => upload(job, logging) + .then(() => finish(job, logging) + .then(() => { + global.status.task[jobs[i].author + "/" + jobs[i].repo + "/" + jobs[i].branch] = "Finished" + }) + .then(nextJob, fail), + fail), + fail), + fail), + fail), + nextJob); } }; @@ -138,7 +139,7 @@ function update(job, logging) { log(logging, "Updating: " + job.author + "/" + job.repo + ":" + job.branch + " (" + job.id + ")"); github.clone(job, job.commit.sha, logging).then(() => { - maven.setVersion(job, (job.options ? job.options.prefix: "DEV") + " - " + job.id + " (git " + job.commit.sha.substr(0, 8) + ")", true).then(resolve, reject); + maven.setVersion(job, (job.options ? job.options.prefix : "DEV") + " - " + job.id + " (git " + job.commit.sha.substr(0, 8) + ")", true).then(resolve, reject); }, reject); }); } @@ -161,15 +162,15 @@ function compile(job, logging) { log(logging, "Compiling: " + job.author + "/" + job.repo + ":" + job.branch + " (" + job.id + ")"); maven.compile(job, cfg, logging) - .then(() => { - job.success = true; - resolve(); - }) - .catch((err) => { - log(logging, err.stack); - job.success = false; - resolve(); - }); + .then(() => { + job.success = true; + resolve(); + }) + .catch((err) => { + log(logging, err.stack); + job.success = false; + resolve(); + }); }); } diff --git a/src/maven.js b/src/maven.js index 3e48d8312..4368c909d 100644 --- a/src/maven.js +++ b/src/maven.js @@ -75,12 +75,11 @@ function updatePOM(job, json, version, compact) { if (node) { node.setValue(job.repo + "-" + job.id); - } - else { + } else { json.getChild("build").addChild(new XML.XMLNode("finalName", job.repo + "-" + job.id)); } - XML.promises.toXML(json, compact ? minify: beautify).then((xml) => { + XML.promises.toXML(json, compact ? minify : beautify).then((xml) => { resolve(xml); }, reject); }); diff --git a/src/projects.js b/src/projects.js index b4feffdc3..6958035be 100644 --- a/src/projects.js +++ b/src/projects.js @@ -38,13 +38,13 @@ function getProjects(logging) { job.directory = job.author + "/" + job.repo + "/" + job.branch; - if (json[repo].options) { - job.options = json[repo].options; + if (json[repo].options) { + job.options = json[repo].options; if (json[repo].options.custom_directory) { job.directory = json[repo].options.custom_directory; } - } + } if (json[repo].sonar && json[repo].sonar.enabled) { job.sonar = json[repo].sonar; @@ -88,7 +88,7 @@ function addBuild(job, logging) { avatar: job.commit.avatar, license: job.license, candidate: "DEVELOPMENT", - status: (job.success ? "SUCCESS": "FAILURE") + status: (job.success ? "SUCCESS" : "FAILURE") } if (job.success) builds.last_successful = job.id; @@ -117,8 +117,7 @@ function addBuild(job, logging) { builds = JSON.parse(data); append(); }, append); - } - else append(); + } else append(); }); } @@ -169,8 +168,8 @@ function generateBadge(job, logging) { } fs.readFile(path.resolve(__dirname, "../resources/badge.svg"), "utf8").then((svg) => { - svg = svg.replace(/\${status}/g, job.success ? "SUCCESS": "FAILURE"); - svg = svg.replace(/\${color}/g, job.success ? "rgb(30, 220, 30)": "rgb(220, 30, 30)"); + svg = svg.replace(/\${status}/g, job.success ? "SUCCESS" : "FAILURE"); + svg = svg.replace(/\${color}/g, job.success ? "rgb(30, 220, 30)" : "rgb(220, 30, 30)"); log(logging, "-> Saving 'badge.svg'..."); @@ -215,11 +214,10 @@ async function clearFolder(file, logging) { if (length === index) { fs.rmdir(file).then(resolve, reject); return true; - } - else return false; + } else return false; } - if(!check()) { + if (!check()) { var next = () => { index++; check(); @@ -235,8 +233,7 @@ async function clearFolder(file, logging) { } } }) - } - else { + } else { return fs.unlink(file); } } diff --git a/src/remote.js b/src/remote.js deleted file mode 100644 index beeb49c85..000000000 --- a/src/remote.js +++ /dev/null @@ -1,220 +0,0 @@ -const http = require('http'); -const url = require('url'); -const dns = require('dns'); -const os = require('os'); -const FileSystem = require('fs'); -const path = require('path'); -const child_process = require('child_process'); - -const program = require('./main.js'); - -global.status = { - log: "", - task: {}, - version: {}, - updates: {}, - cpu: 0, - running: true, - timestamp: Date.now() -}; - -var cpu = [0, 0]; -var log = console.log; -var instance, timer; - -console.log = function(msg) { - log(msg); - status.log += msg + "
"; -} - -var libraries = [ - { - name: "Node.js", - command: "node -v" - }, - { - name: "Java", - command: "java -version" - }, - { - name: "Apache Maven", - command: "mvn -v" - }, - { - name: "Git", - command: "git --version" - } -] - -for (let library of libraries) { - child_process.exec(library.command, callback(library)); -} - -function callback(lib) { - return function(err, stdout, stderr) { - console.log(""); - console.log("==== Environment: " + lib.name + " ====") - - if (stderr) { - console.log(stderr); - } - - if (!err) { - console.log(stdout); - var index = libraries.indexOf(lib); - libraries.splice(index, 1); - run(); - } - else { - console.log("ERROR: " + lib.name + " not found!"); - throw err; - } - }; -} - -function start() { - if (instance) { - console.log("The program is still running!"); - return; - } - - if (timer) { - clearTimeout(timer); - } - - var done = (err) => { - if (err) console.log(err.stack); - instance = null; - console.log(""); - console.log("-- FINISHED --"); - - var elapsedTime = Date.now() - global.status.timestamp; - var delta = (program.getConfig().server.getInterval() * 60 * 1000) - elapsedTime; - - if (delta < 0) delta = 0; - - console.log("\n\n"); - console.log("Elapsed time: " + (elapsedTime / 1000) + "s") - console.log("Time until next iteration: " + (delta / 1000) + "s"); - console.log("\n\n"); - - timer = setTimeout(start, delta); - }; - - global.status.timestamp = Date.now(); - instance = program.start(true).then(done, done); -} - -function run() { - if (libraries.length > 0) { - return; - } - - var port = program.getConfig().server.getPort(); - - console.log(""); - FileSystem.readFile(path.resolve(__dirname, "../resources/remote.html"), 'UTF-8', function(err, page) { - if (!err) { - http.createServer(function(request, response) { - switch(url.parse(request.url, true).pathname) { - case '/': { - response.writeHead(200, {'Content-Type': 'text/html'}); - response.write(page); - response.end(); - break; - } - case '/status.json': { - response.writeHead(200, {'Content-Type': 'application/json'}); - response.write(JSON.stringify(global.status)); - response.end(); - break; - } - case '/run': { - response.writeHead(302, {'Location': "/"}); - response.end(); - - console.log("Restarting Submodule..."); - start(); - - break; - } - case '/prompt': { - var project = url.parse(request.url, true).query.project; - var version = global.status.version[project]; - - response.writeHead(200, {'Content-Type': 'text/html'}); - response.write(''); - response.end(); - - break; - } - case '/update': { - var query = url.parse(request.url, true).query; - global.status.updates[query.project] = query.version; - console.log("Scheduled Update: " + query.project + " => " + query.version); - - console.log("Restarting Submodule..."); - start(); - - response.writeHead(302, {'Location': "/"}); - response.end(); - - break; - } - case '/shutdown': { - response.writeHead(200, {'Content-Type': 'text/html'}); - response.write("Goodbye!"); - response.end(); - - child_process.exec("sudo shutdown -h now"); - - break; - } - default: { - response.end(); - break; - } - } - - }).listen(port); - - dns.lookup(os.hostname(), function (e, ip) { - if (e) console.log(e); - log("Now serving at " + ip + ":" + port); - - console.log("Starting Submodule..."); - start(); - }) - - usage(); - } - else { - console.log(err); - } - }) -} - -function usage() { - var idle = 0; - var tick = 0; - var cpus = os.cpus(); - - for(let id = 0; id < cpus.length; id++) { - var core = cpus[id]; - - for (let type in core.times) { - tick += core.times[type]; - } - - idle += core.times.idle; - } - - var p = 100 - ~~(100 * (idle / cpus.length - cpu[1]) / (tick / cpus.length - cpu[0])); - - cpu[0] = tick / cpus.length; - cpu[1] = idle / cpus.length; - - global.status.cpu = p; - - setTimeout(usage, 200); -} diff --git a/src/sonar.js b/src/sonar.js index 08bb7d6ca..09ff58cfa 100644 --- a/src/sonar.js +++ b/src/sonar.js @@ -4,18 +4,19 @@ const path = require('path'); const cfg = require('../src/config.js')(path.resolve(__dirname, "../resources/config.json")); if (cfg.sonar.isEnabled()) { - console.log("Connecting with Sonar..."); - - var args = cfg.sonar.getArguments().splice(0); - args.push("-Dsonar.login=" + cfg.sonar.getToken()); - - var scanner = process.spawn("sonar-scanner", args, {shell: true}); - - scanner.childProcess.stdout.on('data', (data) => console.log("-> " + data)); - scanner.childProcess.stderr.on('data', (data) => console.log("-> " + data)); - - scanner.then(() => { - console.log("-> Finished!"); - }) - .catch((err) => console.log(err.stack)); -} \ No newline at end of file + console.log("Connecting with Sonar..."); + + let args = cfg.sonar.getArguments().splice(0); + args.push("-Dsonar.login=" + cfg.sonar.getToken()); + + let scanner = process.spawn("sonar-scanner", args, { + shell: true + }); + + scanner.childProcess.stdout.on('data', data => console.log("-> " + data)); + scanner.childProcess.stderr.on('data', data => console.log("-> " + data)); + + scanner.then(() => { + console.log("-> Finished!"); + }).catch(err => console.log(err.stack)); +} diff --git a/test/TestConfig.js b/test/TestConfig.js index 6f802046c..25cdb9768 100644 --- a/test/TestConfig.js +++ b/test/TestConfig.js @@ -1,6 +1,6 @@ const chai = require('chai'); chai.use(require('chai-as-promised')); -const {assert} = chai; +const { assert } = chai; const config = require('../src/config.js'); diff --git a/test/TestSystem.js b/test/TestSystem.js index 9c85ee490..1f8988e52 100644 --- a/test/TestSystem.js +++ b/test/TestSystem.js @@ -5,7 +5,7 @@ const projects = require('../src/projects.js'); const chai = require('chai'); chai.use(require('chai-as-promised')); -const {assert} = chai; +const { assert } = chai; const testJobs = require('../test/TestJobs.js'); @@ -14,7 +14,7 @@ var job = { author: "jitpack", repo: "maven-simple", branch: "master", - directory: "jitpack/maven-simple/master" + directory: "jitpack/maven-simple/master" } describe("Full System Test", function() {