UNPKG

hubot-scripts

Version:

Allows you to opt in to a variety of scripts

240 lines (195 loc) 7.9 kB
# Description: # Interact with your Jenkins CI server # # Dependencies: # None # # Configuration: # HUBOT_JENKINS_URL # HUBOT_JENKINS_AUTH # # Auth should be in the "user:password" format. # # Commands: # hubot jenkins b <jobNumber> - builds the job specified by jobNumber. List jobs to get number. # hubot jenkins build <job> - builds the specified Jenkins job # hubot jenkins build <job>, <params> - builds the specified Jenkins job with parameters as key=value&key2=value2 # hubot jenkins list <filter> - lists Jenkins jobs # hubot jenkins describe <job> - Describes the specified Jenkins job # hubot jenkins last <job> - Details about the last build for the specified Jenkins job # # Author: # dougcole querystring = require 'querystring' # Holds a list of jobs, so we can trigger them with a number # instead of the job's name. Gets populated on when calling # list. jobList = [] jenkinsBuildById = (msg) -> # Switch the index with the job name job = jobList[parseInt(msg.match[1]) - 1] if job msg.match[1] = job jenkinsBuild(msg) else msg.reply "I couldn't find that job. Try `jenkins list` to get a list." jenkinsBuild = (msg, buildWithEmptyParameters) -> url = process.env.HUBOT_JENKINS_URL job = querystring.escape msg.match[1] params = msg.match[3] command = if buildWithEmptyParameters then "buildWithParameters" else "build" path = if params then "#{url}/job/#{job}/buildWithParameters?#{params}" else "#{url}/job/#{job}/#{command}" req = msg.http(path) if process.env.HUBOT_JENKINS_AUTH auth = new Buffer(process.env.HUBOT_JENKINS_AUTH).toString('base64') req.headers Authorization: "Basic #{auth}" req.header('Content-Length', 0) req.post() (err, res, body) -> if err msg.reply "Jenkins says: #{err}" else if 200 <= res.statusCode < 400 # Or, not an error code. msg.reply "(#{res.statusCode}) Build started for #{job} #{url}/job/#{job}" else if 400 == res.statusCode jenkinsBuild(msg, true) else if 404 == res.statusCode msg.reply "Build not found, double check that it exists and is spelt correctly." else msg.reply "Jenkins says: Status #{res.statusCode} #{body}" jenkinsDescribe = (msg) -> url = process.env.HUBOT_JENKINS_URL job = msg.match[1] path = "#{url}/job/#{job}/api/json" req = msg.http(path) if process.env.HUBOT_JENKINS_AUTH auth = new Buffer(process.env.HUBOT_JENKINS_AUTH).toString('base64') req.headers Authorization: "Basic #{auth}" req.header('Content-Length', 0) req.get() (err, res, body) -> if err msg.send "Jenkins says: #{err}" else response = "" try content = JSON.parse(body) response += "JOB: #{content.displayName}\n" response += "URL: #{content.url}\n" if content.description response += "DESCRIPTION: #{content.description}\n" response += "ENABLED: #{content.buildable}\n" response += "STATUS: #{content.color}\n" tmpReport = "" if content.healthReport.length > 0 for report in content.healthReport tmpReport += "\n #{report.description}" else tmpReport = " unknown" response += "HEALTH: #{tmpReport}\n" parameters = "" for item in content.actions if item.parameterDefinitions for param in item.parameterDefinitions tmpDescription = if param.description then " - #{param.description} " else "" tmpDefault = if param.defaultParameterValue then " (default=#{param.defaultParameterValue.value})" else "" parameters += "\n #{param.name}#{tmpDescription}#{tmpDefault}" if parameters != "" response += "PARAMETERS: #{parameters}\n" msg.send response if not content.lastBuild return path = "#{url}/job/#{job}/#{content.lastBuild.number}/api/json" req = msg.http(path) if process.env.HUBOT_JENKINS_AUTH auth = new Buffer(process.env.HUBOT_JENKINS_AUTH).toString('base64') req.headers Authorization: "Basic #{auth}" req.header('Content-Length', 0) req.get() (err, res, body) -> if err msg.send "Jenkins says: #{err}" else response = "" try content = JSON.parse(body) console.log(JSON.stringify(content, null, 4)) jobstatus = content.result || 'PENDING' jobdate = new Date(content.timestamp); response += "LAST JOB: #{jobstatus}, #{jobdate}\n" msg.send response catch error msg.send error catch error msg.send error jenkinsLast = (msg) -> url = process.env.HUBOT_JENKINS_URL job = msg.match[1] path = "#{url}/job/#{job}/lastBuild/api/json" req = msg.http(path) if process.env.HUBOT_JENKINS_AUTH auth = new Buffer(process.env.HUBOT_JENKINS_AUTH).toString('base64') req.headers Authorization: "Basic #{auth}" req.header('Content-Length', 0) req.get() (err, res, body) -> if err msg.send "Jenkins says: #{err}" else response = "" try content = JSON.parse(body) response += "NAME: #{content.fullDisplayName}\n" response += "URL: #{content.url}\n" if content.description response += "DESCRIPTION: #{content.description}\n" response += "BUILDING: #{content.building}\n" msg.send response jenkinsList = (msg) -> url = process.env.HUBOT_JENKINS_URL filter = new RegExp(msg.match[2], 'i') req = msg.http("#{url}/api/json") if process.env.HUBOT_JENKINS_AUTH auth = new Buffer(process.env.HUBOT_JENKINS_AUTH).toString('base64') req.headers Authorization: "Basic #{auth}" req.get() (err, res, body) -> response = "" if err msg.send "Jenkins says: #{err}" else try content = JSON.parse(body) for job in content.jobs # Add the job to the jobList index = jobList.indexOf(job.name) if index == -1 jobList.push(job.name) index = jobList.indexOf(job.name) state = if job.color == "red" "FAIL" else if job.color == "aborted" "ABORTED" else if job.color == "aborted_anime" "CURRENTLY RUNNING" else if job.color == "red_anime" "CURRENTLY RUNNING" else if job.color == "blue_anime" "CURRENTLY RUNNING" else "PASS" if (filter.test job.name) or (filter.test state) response += "[#{index + 1}] #{state} #{job.name}\n" msg.send response catch error msg.send error module.exports = (robot) -> robot.respond /j(?:enkins)? build ([\w\.\-_ ]+)(, (.+))?/i, (msg) -> jenkinsBuild(msg, false) robot.respond /j(?:enkins)? b (\d+)/i, (msg) -> jenkinsBuildById(msg) robot.respond /j(?:enkins)? list( (.+))?/i, (msg) -> jenkinsList(msg) robot.respond /j(?:enkins)? describe (.*)/i, (msg) -> jenkinsDescribe(msg) robot.respond /j(?:enkins)? last (.*)/i, (msg) -> jenkinsLast(msg) robot.jenkins = { list: jenkinsList, build: jenkinsBuild describe: jenkinsDescribe last: jenkinsLast }