UNPKG

hubot-scripts

Version:

Allows you to opt in to a variety of scripts

90 lines (76 loc) 2.92 kB
# Notifies about Jenkins build errors via Jenkins Notification Plugin # # Dependencies: # "url": "" # "querystring": "" # # Configuration: # Just put this url <HUBOT_URL>:<PORT>/hubot/jenkins-notify?room=<room> to your Jenkins # Notification config. See here: https://wiki.jenkins-ci.org/display/JENKINS/Notification+Plugin # # Commands: # None # # URLS: # POST /hubot/jenkins-notify?room=<room>[&type=<type>][&notstrat=<notificationSTrategy>] # # Notification Strategy is [Ff][Ss] which stands for "Failure" and "Success" # Capitalized letter means: notify always # small letter means: notify only if buildstatus has changed # "Fs" is the default # # Authors: # spajus # k9ert (notification strategy feature) url = require('url') querystring = require('querystring') buildStatusChanged = (data, @failing) -> if data.build.status == 'FAILURE' and data.name in @failing return false if data.build.status == 'FAILURE' and not (data.name in @failing) return true if data.build.status == 'SUCCESS' and data.name in @failing return true if data.build.status == 'SUCCESS' and not (data.name in @failing) return false console.log "this should not happen" shouldNotify = (notstrat, data, @failing) -> if data.build.status == 'FAILURE' if /F/.test(notstrat) return true return buildStatusChanged(data, @failing) if data.build.status == 'SUCCESS' if /S/.test(notstrat) return true return buildStatusChanged(data, @failing) module.exports = (robot) -> robot.router.post "/hubot/jenkins-notify", (req, res) -> @failing ||= [] query = querystring.parse(url.parse(req.url).query) res.end('') envelope = {notstrat:"Fs"} envelope.room = query.room if query.room envelope.notstrat = query.notstrat if query.notstrat if query.type envelope.user = {type: query.type} try data = req.body if data.build.phase == 'FINISHED' or data.build.phase == 'FINALIZED' if data.build.status == 'FAILURE' if data.name in @failing build = "is still" else build = "started" robot.send envelope, "#{data.name} build ##{data.build.number} #{build} failing (#{encodeURI(data.build.full_url)})" if shouldNotify(envelope.notstrat, data, @failing) @failing.push data.name unless data.name in @failing if data.build.status == 'SUCCESS' if data.name in @failing build = "was restored" else build = "succeeded" robot.send envelope, "#{data.name} build ##{data.build.number} #{build} (#{encodeURI(data.build.full_url)})" if shouldNotify(envelope.notstrat, data, @failing) index = @failing.indexOf data.name @failing.splice index, 1 if index isnt -1 catch error console.log "jenkins-notify error: #{error}. Data: #{req.body}" console.log error.stack