Skip to content

Instantly share code, notes, and snippets.

@misterdjules
Created February 28, 2018 00:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save misterdjules/b69ac2a437847ecae310bc34e2411f00 to your computer and use it in GitHub Desktop.
Save misterdjules/b69ac2a437847ecae310bc34e2411f00 to your computer and use it in GitHub Desktop.
var assert = require('assert-plus');
var fs = require('fs');
var https = require('https');
var url = require('url');
var util = require('util');
var vasync = require('vasync');
var XML = require('xml-simple');
var JENKINS_API_TOKEN = process.env.JENKINS_API_TOKEN;
assert.string(JENKINS_API_TOKEN, 'JENKINS_API_TOKEN');
var JENKINS_USER_ID = process.env.JENKINS_USER_ID;
assert.string(JENKINS_USER_ID, 'JENKINS_USER_ID');
var allJenkinsJobsUrls;
var jobsReqs = {
noFilter: []
};
vasync.pipeline({funcs: [
function getAllJobs(_, next) {
var allJobsJsonData = '';
var reqOpts = {
headers: {
Authorization: 'Basic ' + new Buffer(JENKINS_USER_ID + ':' +
JENKINS_API_TOKEN).toString('base64'),
},
hostname: 'jenkins.joyent.us',
port: 443,
method: 'GET',
path: '/view/All/api/json',
rejectUnauthorized: false
};
var req = https.request(reqOpts, function onReq(res) {
res.on('data', function onData(data) {
allJobsJsonData += data;
});
res.on('end', function onGotAllJobs() {
var parsedJobs = JSON.parse(allJobsJsonData).jobs;
allJenkinsJobsUrls = parsedJobs.map(function getUrl(job) {
assert.object(job, 'job');
return job.url
});
allJenkinsJobsUrls =
allJenkinsJobsUrls.filter(function keepBuildJobs(url) {
assert.string(url, 'url');
var excludePattern;
var excludePatternIdx;
var excludePatterns = [
/nightly1/,
/nightly2/,
/nightly3/,
/jenkins-agent/,
/joyent-retro/,
/pkgsrc/,
/TEST-/,
/java-manta/,
/env%20test/,
/pipeline-imgapi/
];
for (excludePatternIdx in excludePatterns) {
excludePattern = excludePatterns[excludePatternIdx];
if (excludePattern.test(url)) {
return false;
}
}
return true;
});
next();
});
});
req.end();
req.on('error', next);
},
function processEachJob(_, next) {
vasync.forEachParallel({func: function updateJobsReqs(jobUrl, done) {
var configXmlData = '';
var parsedUrl = url.parse(jobUrl + 'config.xml');
var reqOpts = {
headers: {
Authorization: 'Basic ' + new Buffer(JENKINS_USER_ID + ':' +
JENKINS_API_TOKEN).toString('base64'),
},
hostname: parsedUrl.hostname,
port: 443,
method: 'GET',
path: parsedUrl.path,
rejectUnauthorized: false
};
var req = https.request(reqOpts, function onReq(res) {
res.on('data', function onData(data) {
configXmlData += data.toString();
});
res.on('end', function onEnd() {
var assignedNode = XML.parse(configXmlData,
function onParsed(parseErr, parsed) {
var arch;
var filterComponent;
var filterComponentIdx;
var filterComponents;
var filterVals;
var imageVer;
var nonKvm = false;
var pi;
if (parseErr) {
console.error('parse error:', parseErr);
} else {
if (!parsed || !parsed.assignedNode) {
jobsReqs.noFilter.push(jobUrl);
} else {
filterComponents = parsed.assignedNode.split('&&').map(function trim(componentStr) {
return componentStr.trim();
});
for (filterComponentIdx in filterComponents) {
filterComponent = filterComponents[filterComponentIdx];
filterVals = filterComponent.split(':');
if (filterVals[0] === 'image_ver') {
imageVer = filterVals[1];
} else if (filterVals[0] === 'pkgsrc_arch') {
arch = filterVals[1];
} else if (filterVals[0] === '!virt' && filterVals[1] === 'kvm') {
nonKvm = true;
} else if (filterVals[0] === 'pi') {
pi = filterVals[1];
}
}
if (imageVer && arch) {
if (nonKvm) {
if (jobsReqs[pi] == undefined) {
jobsReqs[pi] = {};
}
if (jobsReqs[pi].nonKvm === undefined) {
jobsReqs[pi].nonKvm = {};
}
if (jobsReqs[pi].nonKvm[arch] === undefined) {
jobsReqs[pi].nonKvm[arch] = {};
}
if (jobsReqs[pi].nonKvm[arch][imageVer] === undefined) {
jobsReqs[pi].nonKvm[arch][imageVer] = [];
}
jobsReqs[pi].nonKvm[arch][imageVer].push(jobUrl);
} else {
if (jobsReqs[pi] == undefined) {
jobsReqs[pi] = {};
}
if (jobsReqs[pi][arch] === undefined) {
jobsReqs[pi][arch] = {};
}
if (jobsReqs[pi][arch][imageVer] === undefined) {
jobsReqs[pi][arch][imageVer] = [];
}
jobsReqs[pi][arch][imageVer].push(jobUrl);
}
}
}
}
done(parseErr);
});
});
res.on('error', done);
});
req.on('error', function onErr(reqErr) {
console.log('request error:', reqErr);
});
req.end();
},
inputs: allJenkinsJobsUrls
}, next);
}
]}, function allDone(err) {
if (err) {
console.log('err:', err);
} else {
console.log(util.inspect(jobsReqs, false, null));
}
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment