Commit e012272c11cd3581404aa6bb42313565aafc076c
1 parent
5c3489a2
Exists in
master
and in
1 other branch
Redmine issue tracker integration.
Showing
4 changed files
with
56 additions
and
10 deletions
Show diff stats
Gemfile.lock
app/models/issue_tracker.rb
| ... | ... | @@ -21,7 +21,16 @@ class IssueTracker |
| 21 | 21 | |
| 22 | 22 | protected |
| 23 | 23 | def create_redmine_issue err |
| 24 | - | |
| 24 | + token = api_token | |
| 25 | + RedmineClient::Base.configure do | |
| 26 | + self.token = token | |
| 27 | + end | |
| 28 | + RedmineClient::Issue.site = account + "/projects/:project_id" | |
| 29 | + issue = RedmineClient::Issue.new(:project_id => project_id) | |
| 30 | + issue.subject = issue_title err | |
| 31 | + issue.description = ERB.new(File.read(Rails.root + "app/views/errs/redmine_body.txt.erb").gsub(/^\s*/, '')).result(binding) | |
| 32 | + issue.save! | |
| 33 | + err.update_attribute :issue_link, "#{RedmineClient::Issue.site.to_s.sub(/#{RedmineClient::Issue.site.path}$/, '')}#{RedmineClient::Issue.element_path(issue.id, :project_id => project_id)}".sub(/\.xml$/, '') | |
| 25 | 34 | end |
| 26 | 35 | |
| 27 | 36 | def create_lighthouseapp_issue err |
| ... | ... | @@ -32,7 +41,7 @@ class IssueTracker |
| 32 | 41 | Lighthouse::Ticket.site |
| 33 | 42 | |
| 34 | 43 | ticket = Lighthouse::Ticket.new(:project_id => project_id) |
| 35 | - ticket.title = "[#{ err.environment }][#{ err.where }] #{err.message.to_s.truncate(100)}" | |
| 44 | + ticket.title = issue_title err | |
| 36 | 45 | |
| 37 | 46 | ticket.body = ERB.new(File.read(Rails.root + "app/views/errs/lighthouseapp_body.txt.erb").gsub(/^\s*/, '')).result(binding) |
| 38 | 47 | |
| ... | ... | @@ -41,6 +50,10 @@ class IssueTracker |
| 41 | 50 | err.update_attribute :issue_link, "#{Lighthouse::Ticket.site.to_s.sub(/#{Lighthouse::Ticket.site.path}$/, '')}#{Lighthouse::Ticket.element_path(ticket.id, :project_id => project_id)}".sub(/\.xml$/, '') |
| 42 | 51 | end |
| 43 | 52 | |
| 53 | + def issue_title err | |
| 54 | + "[#{ err.environment }][#{ err.where }] #{err.message.to_s.truncate(100)}" | |
| 55 | + end | |
| 56 | + | |
| 44 | 57 | def check_params |
| 45 | 58 | blank_flags = %w( api_token project_id account ).map {|m| self[m].blank? } |
| 46 | 59 | if blank_flags.any? && !blank_flags.all? | ... | ... |
| ... | ... | @@ -0,0 +1,34 @@ |
| 1 | +"See this exception on Errbit":<%= app_err_url err.app, err %> | |
| 2 | +<% if notice = err.notices.first %> | |
| 3 | + h1. <%= notice.message %> | |
| 4 | + h2. Summary | |
| 5 | + <% if notice.request['url'].present? %> | |
| 6 | + h3. URL | |
| 7 | + [<%= notice.request['url'] %>](<%= notice.request['url'] %>)" | |
| 8 | + <% end %> | |
| 9 | + h3. Where | |
| 10 | + <%= notice.err.where %> | |
| 11 | + | |
| 12 | + h3. Occured | |
| 13 | + <%= notice.created_at.to_s(:micro) %> | |
| 14 | + | |
| 15 | + h3. Similar | |
| 16 | + <%= (notice.err.notices.count - 1).to_s %> | |
| 17 | + | |
| 18 | + h2. Params | |
| 19 | + <pre><%= pretty_hash(notice.params) %></pre> | |
| 20 | + | |
| 21 | + h2. Session | |
| 22 | + <pre><%= pretty_hash(notice.session) %></pre> | |
| 23 | + | |
| 24 | + h2. Backtrace | |
| 25 | + <pre> | |
| 26 | + <% for line in notice.backtrace %><%= line['number'] %>: <%= line['file'].sub(/^\[PROJECT_ROOT\]/, '') %> -> *<%= line['method'] %>* | |
| 27 | + <% end %> | |
| 28 | + </pre> | |
| 29 | + | |
| 30 | + h2. Environment | |
| 31 | + <% for key, val in notice.env_vars %> | |
| 32 | + <%= key %>: <%= val %> | |
| 33 | + <% end %> | |
| 34 | +<% end %> | ... | ... |
spec/controllers/errs_controller_spec.rb
| ... | ... | @@ -262,19 +262,18 @@ describe ErrsController do |
| 262 | 262 | before(:each) do |
| 263 | 263 | number = 5 |
| 264 | 264 | @issue_link = "#{tracker.account}/projects/#{tracker.project_id}/issues/#{number}.xml" |
| 265 | - body = "<issue></issue>" | |
| 265 | + body = "<issue><id type=\"integer\">#{number}</id></issue>" | |
| 266 | 266 | stub_request(:post, "#{tracker.account}/projects/#{tracker.project_id}/issues.xml").to_return(:status => 201, :headers => {'Location' => @issue_link}, :body => body ) |
| 267 | 267 | |
| 268 | 268 | post :create_issue, :app_id => err.app.id, :id => err.id |
| 269 | 269 | err.reload |
| 270 | 270 | end |
| 271 | 271 | |
| 272 | - it "should make request to Lighthouseapp with err params" do | |
| 273 | - requested = have_requested(:post, "http://#{tracker.account}.lighthouseapp.com/projects/#{tracker.project_id}/tickets.xml") | |
| 274 | - WebMock.should requested.with(:headers => {'X-Lighthousetoken' => tracker.api_token}) | |
| 275 | - WebMock.should requested.with(:body => /<tag>errbit<\/tag>/) | |
| 276 | - WebMock.should requested.with(:body => /<title>\[#{ err.environment }\]\[#{err.where}\] #{err.message.to_s.truncate(100)}<\/title>/) | |
| 277 | - WebMock.should requested.with(:body => /<body>.+<\/body>/m) | |
| 272 | + it "should make request to Redmine with err params" do | |
| 273 | + requested = have_requested(:post, "#{tracker.account}/projects/#{tracker.project_id}/issues.xml") | |
| 274 | + WebMock.should requested.with(:headers => {'X-Redmine-API-Key' => tracker.api_token}) | |
| 275 | + WebMock.should requested.with(:body => /<subject>\[#{ err.environment }\]\[#{err.where}\] #{err.message.to_s.truncate(100)}<\/subject>/) | |
| 276 | + WebMock.should requested.with(:body => /<description>.+<\/description>/m) | |
| 278 | 277 | end |
| 279 | 278 | |
| 280 | 279 | it "should redirect to err page" do | ... | ... |