Last active
October 18, 2017 13:45
-
-
Save LetItRock/e39c682be3136ba0f814857faa58120f to your computer and use it in GitHub Desktop.
Alexa skill to be able to run Jenkins jobs
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 http = require('http'); | |
exports.handler = (event, context, callback) => { | |
try { | |
switch(event.request.intent.name) { | |
case 'JenkinsBuild': { | |
processJenkinsBuildIntent(event, context); | |
break; | |
} | |
case 'JenkinsProjectName': { | |
processJenkinsProjectNameIntent(event, context); | |
break; | |
} | |
default: console.log('default', event.request.type); break; | |
} | |
} catch(e) { | |
context.fail('Invalid request type: ', event.request.type); | |
} | |
}; | |
processJenkinsProjectNameIntent = (event, context) => { | |
var projectName = event.request.intent.slots.project.value; | |
var projectExist = event.session.attributes.projects.indexOf(projectName) >= 0; | |
var options = getOptions(); | |
var text = ''; | |
if(projectName !== 'no name project' && projectExist) { | |
// make post to build project | |
options.path = '/job/' + projectName + '/build'; | |
options.method = 'POST'; | |
makeRestCall(options, | |
() => { | |
text = "Start building project " + projectName; | |
context.succeed(generateResponse(buildSpeechletResponse(text, true), {})); | |
}, | |
() => { | |
text = 'Something went wrong with requesting to build ' + projectName + ' on jenkins server'; | |
context.succeed(generateResponse(buildSpeechletResponse(text, true), {})); | |
} | |
); | |
} else { | |
text = "The project name you provided is not exist."; | |
context.succeed(generateResponse(buildSpeechletResponse(text, true), {})); | |
} | |
}; | |
processJenkinsBuildIntent = (event, context) => { | |
var options = getOptions(); | |
if(event.session.new) { | |
options.path = '/api/json?pretty=true&tree=jobs[name,color]'; | |
makeRestCall(options, | |
(response) => { | |
var jobs = response.jobs; | |
var projectNames = []; | |
var jobNames = ''; | |
for(var i = 0; i < jobs.length; i++) { | |
var jobName = jobs[i].name; | |
jobNames += jobName + ', '; | |
projectNames.push(jobName); | |
} | |
var text = "I've found "+ jobNames +" which one you want to build?"; | |
context.succeed(generateResponse(buildSpeechletResponse(text, false), {projects: projectNames})); | |
}, | |
(err) => { | |
console.log('Error', err); | |
} | |
); | |
} | |
}; | |
makeRestCall = (options, onSuccess, onError) => { | |
http.request(options, (response) => { | |
var str = ''; | |
response.on('data', (chunk) => { | |
str += chunk; | |
}); | |
response.on('end', () => { | |
if(str && str.trim().length > 0) { | |
onSuccess(JSON.parse(str)); | |
} else { | |
onSuccess(); | |
} | |
}); | |
}, (err) => { | |
onError(err); | |
}).end(); | |
}; | |
getOptions = () => { | |
var auth = 'Basic ' + new Buffer('admin:ce5e9c70315ffdea4d7f80263dd83fe6').toString('base64'); | |
return { | |
host: 'ec2-54-164-5-152.compute-1.amazonaws.com', | |
port: '8080', | |
headers: { | |
Authorization: auth | |
} | |
}; | |
}; | |
generateResponse = (res, sessionAttributes) => { | |
return { | |
version: '1.0', | |
sessionAttributes: sessionAttributes, | |
response: res | |
}; | |
}; | |
buildSpeechletResponse = (outputText, shouldEnd) => { | |
return { | |
outputSpeech: { | |
type: 'PlainText', | |
text: outputText | |
}, | |
shouldEndSession: shouldEnd, | |
}; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment