Created
February 28, 2018 00:22
-
-
Save misterdjules/b69ac2a437847ecae310bc34e2411f00 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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