Skip to content

Instantly share code, notes, and snippets.

@LetItRock
Last active October 18, 2017 13:45
Show Gist options
  • Save LetItRock/e39c682be3136ba0f814857faa58120f to your computer and use it in GitHub Desktop.
Save LetItRock/e39c682be3136ba0f814857faa58120f to your computer and use it in GitHub Desktop.
Alexa skill to be able to run Jenkins jobs
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