github / janky

Continuous integration server built on top of Jenkins and Hubot

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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!