Exception thrown when jenkins posts to /_builder
ejholmes opened this issue · comments
Somehow the build has a nil url. Any ideas?
ERROR: NoMethodError - undefined method `+' for nil:NilClass
app janky
method POST
user_agent Java/1.6.0_23
params "{\"parameter\":[{\"name\":\"JANKY_SHA1\",\"value\":\"737b877e\"},{\"name\":\"JANKY_ID\",\"value\":13}]}"
session {}
referrer
remote_ip 127.0.0.1
url http://ci.company.com/_builder
base_url #<URI::HTTP:0xaacc344 URL:http://localhost:8080/>
build #<Janky::Build id: 13, green: false, url: nil, compare: "https://github.com/company/repo/compar...", started_at: "2012-06-13 02:51:08", completed_at: nil, commit_id: 2, branch_id: 1, created_at: "2012-06-13 02:51:03", updated_at: "2012-06-13 02:51:08", output: nil, room_id: 494049>
adapter #<Janky::Builder::HTTP:0xb0daf88 @username=nil, @password=nil>
create_url #<URI::HTTP:0xb0b9e14 URL:http://localhost:8080/job/818b5a544998ebee78592280c9f1de16/build>
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/janky-0.9.11/lib/janky/builder/runner.rb:28:in `output_url'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/janky-0.9.11/lib/janky/builder/runner.rb:17:in `output'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/janky-0.9.11/lib/janky/builder/client.rb:30:in `output'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/janky-0.9.11/lib/janky/build.rb:127:in `output_remote'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/janky-0.9.11/lib/janky/build.rb:163:in `complete'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/janky-0.9.11/lib/janky/build.rb:28:in `complete'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/janky-0.9.11/lib/janky/builder/receiver.rb:11:in `call'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/rack-1.4.1/lib/rack/builder.rb:134:in `call'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/rack-1.4.1/lib/rack/urlmap.rb:64:in `block in call'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/rack-1.4.1/lib/rack/urlmap.rb:49:in `each'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/rack-1.4.1/lib/rack/urlmap.rb:49:in `call'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/janky-0.9.11/lib/janky/exception.rb:44:in `call'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/thin-1.3.1/lib/thin/connection.rb:80:in `block in pre_process'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/thin-1.3.1/lib/thin/connection.rb:78:in `catch'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/thin-1.3.1/lib/thin/connection.rb:78:in `pre_process'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/thin-1.3.1/lib/thin/connection.rb:53:in `process'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/thin-1.3.1/lib/thin/connection.rb:38:in `receive_data'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/thin-1.3.1/lib/thin/backends/base.rb:61:in `start'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/thin-1.3.1/lib/thin/server.rb:159:in `start'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/thin-1.3.1/lib/thin/controllers/controller.rb:86:in `start'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/thin-1.3.1/lib/thin/runner.rb:185:in `run_command'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/thin-1.3.1/lib/thin/runner.rb:151:in `run!'
/var/lib/janky/vendor/gems/ruby/1.9.1/gems/thin-1.3.1/bin/thin:6:in `<top (required)>'
/var/lib/janky/vendor/gems/ruby/1.9.1/bin/thin:23:in `load'
/var/lib/janky/vendor/gems/ruby/1.9.1/bin/thin:23:in `<main>'
!! Unexpected error while processing request: undefined method `+' for nil:NilClass
Digging a little further, the Notification plugin is posting the following:
{
"name": "818b5a544998ebee78592280c9f1de16",
"url": "job/818b5a544998ebee78592280c9f1de16/",
"build": {
"number": 17,
"phase": "STARTED",
"url": "job/818b5a544998ebee78592280c9f1de16/17/",
"parameters": {
"JANKY_ID": "20",
"JANKY_SHA1": "737b877e"
}
}
}
janky/builder/payload.rb expects there to be a full_url field under build, but from the JSON, there is no full_url just url.
For the record, monkey patching Janky::Builder::Payload.parse
with the following fixed the issue for me.
require "janky"
class Janky::Builder::Payload
def self.parse(json)
parsed = Yajl.load(json)
build = parsed["build"]
new(
build["phase"],
build["parameters"]["JANKY_ID"],
"#{ENV["JANKY_BUILDER_DEFAULT"]}#{build["url"]}",
build["status"]
)
end
end
Janky.setup(ENV)
The notification plugin ignores errors when it's unable to get an absolute URL. See: jenkinsci/notification-plugin@cb5e8e4. This happens when no absolute URL is configured:
Your fix works assuming there's only one Jenkins master configured. It's good enough though and I think it fixes #81 as well. Applied in 60ab327. Thanks!