Commit 0c062811ba80b56a1d18b8d36ba5e9011ca7247b

Authored by Vasiliy Ermolovich
2 parents 80789d35 715216ac
Exists in master and in 1 other branch production

Merge pull request #339 from jozefvaclavik/master

Updated Gitlab integration.
@@ -37,7 +37,7 @@ gem 'ruby-fogbugz', :require => 'fogbugz' @@ -37,7 +37,7 @@ gem 'ruby-fogbugz', :require => 'fogbugz'
37 # Github Issues 37 # Github Issues
38 gem 'octokit', '~> 1.0.0' 38 gem 'octokit', '~> 1.0.0'
39 # Gitlab 39 # Gitlab
40 -gem 'gitlab' 40 +gem 'gitlab', :git => 'git://github.com/NARKOZ/gitlab'
41 41
42 # Bitbucket Issues 42 # Bitbucket Issues
43 gem 'bitbucket_rest_api' 43 gem 'bitbucket_rest_api'
  1 +GIT
  2 + remote: git://github.com/NARKOZ/gitlab
  3 + revision: e4d7dd7dd4be587e44de388eb64d164cab5d464f
  4 + specs:
  5 + gitlab (2.2.0)
  6 + httparty
  7 +
1 GEM 8 GEM
2 remote: http://rubygems.org/ 9 remote: http://rubygems.org/
3 specs: 10 specs:
@@ -99,8 +106,6 @@ GEM @@ -99,8 +106,6 @@ GEM
99 ffi (1.1.4) 106 ffi (1.1.4)
100 foreman (0.60.2) 107 foreman (0.60.2)
101 thor (>= 0.13.6) 108 thor (>= 0.13.6)
102 - gitlab (2.1.0)  
103 - httparty  
104 haml (3.1.6) 109 haml (3.1.6)
105 happymapper (0.4.0) 110 happymapper (0.4.0)
106 libxml-ruby (~> 2.0) 111 libxml-ruby (~> 2.0)
@@ -387,9 +387,7 @@ card_type = Defect, status = Open, priority = Essential @@ -387,9 +387,7 @@ card_type = Defect, status = Open, priority = Essential
387 387
388 * Account is the host of your gitlab installation. i.e. **http://gitlab.example.com** 388 * Account is the host of your gitlab installation. i.e. **http://gitlab.example.com**
389 * To authenticate, Errbit uses token-based authentication. Get your API Key in your user settings (or create special user for this purpose) 389 * To authenticate, Errbit uses token-based authentication. Get your API Key in your user settings (or create special user for this purpose)
390 -* You also need to provide project name (shortname) or ID (number) for issues to be created  
391 -* **Currently (as of 3.0), Gitlab has 2000 character limit for issue description.** It is necessary to turn it off at your instance, because Errbit issues body is much longer. Please comment validation line in issue model in models folder https://github.com/gitlabhq/gitlabhq/blob/master/app/models/issue.rb#L10  
392 - 390 +* You also need to provide project ID (it needs to be Number) for issues to be created
393 391
394 392
395 What if Errbit has an error? 393 What if Errbit has an error?
app/models/issue_trackers/gitlab_tracker.rb
@@ -10,7 +10,7 @@ if defined? Gitlab @@ -10,7 +10,7 @@ if defined? Gitlab
10 :placeholder => "API Token for your account" 10 :placeholder => "API Token for your account"
11 }], 11 }],
12 [:project_id, { 12 [:project_id, {
13 - :label => "Ticket Project Short Name / ID", 13 + :label => "Ticket Project ID (use Number)",
14 :placeholder => "Gitlab Project where issues will be created" 14 :placeholder => "Gitlab Project where issues will be created"
15 }] 15 }]
16 ] 16 ]
@@ -23,19 +23,25 @@ if defined? Gitlab @@ -23,19 +23,25 @@ if defined? Gitlab
23 23
24 def create_issue(problem, reported_by = nil) 24 def create_issue(problem, reported_by = nil)
25 Gitlab.configure do |config| 25 Gitlab.configure do |config|
26 - config.endpoint = "#{account}/api/v2" 26 + config.endpoint = "#{account}/api/v3"
27 config.private_token = api_token 27 config.private_token = api_token
28 config.user_agent = 'Errbit User Agent' 28 config.user_agent = 'Errbit User Agent'
29 end 29 end
30 title = issue_title problem 30 title = issue_title problem
31 - description = body_template.result(binding)  
32 - Gitlab.create_issue(project_id, title, { :description => description, :labels => "errbit" } ) 31 + description_summary = summary_template.result(binding)
  32 + description_body = body_template.result(binding)
  33 + ticket = Gitlab.create_issue(project_id, title, { :description => description_summary, :labels => "errbit" } )
  34 + Gitlab.create_issue_note(project_id, ticket.id, description_body)
  35 + end
  36 +
  37 + def summary_template
  38 + @@summary_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/gitlab_summary.txt.erb").gsub(/^\s*/, ''))
33 end 39 end
34 40
35 def body_template 41 def body_template
36 @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/gitlab_body.txt.erb").gsub(/^\s*/, '')) 42 @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/gitlab_body.txt.erb").gsub(/^\s*/, ''))
37 end 43 end
38 - 44 +
39 def url 45 def url
40 "#{account}/#{project_id}/issues" 46 "#{account}/#{project_id}/issues"
41 end 47 end
app/views/issue_trackers/gitlab_body.txt.erb
1 -[See this exception on Errbit](<%= app_problem_url problem.app, problem %> "See this exception on Errbit")  
2 <% if notice = problem.notices.first %> 1 <% if notice = problem.notices.first %>
3 -# <%= notice.message %> #  
4 -## Summary ##  
5 -<% if notice.request['url'].present? %>  
6 - ### URL ###  
7 - [<%= notice.request['url'] %>](<%= notice.request['url'] %>)"  
8 -<% end %>  
9 -### Where ###  
10 -<%= notice.where %>  
11 -  
12 -### Occured ###  
13 -<%= notice.created_at.to_s(:micro) %>  
14 -  
15 -### Similar ###  
16 -<%= (notice.problem.notices_count - 1).to_s %>  
17 -  
18 ## Params ## 2 ## Params ##
19 ``` 3 ```
20 <%= pretty_hash(notice.params) %> 4 <%= pretty_hash(notice.params) %>
app/views/issue_trackers/gitlab_summary.txt.erb 0 → 100644
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
  1 +[See this exception on Errbit](<%= app_problem_url problem.app, problem %> "See this exception on Errbit")
  2 +<% if notice = problem.notices.first %>
  3 +# <%= notice.message %> #
  4 +## Summary ##
  5 +<% if notice.request['url'].present? %>
  6 + ### URL ###
  7 + [<%= notice.request['url'] %>](<%= notice.request['url'] %>)"
  8 +<% end %>
  9 +### Where ###
  10 +<%= notice.where %>
  11 +
  12 +### Occured ###
  13 +<%= notice.created_at.to_s(:micro) %>
  14 +
  15 +### Similar ###
  16 +<%= (notice.problem.notices_count - 1).to_s %>
  17 +<% end %>
0 \ No newline at end of file 18 \ No newline at end of file
spec/models/issue_trackers/github_issues_tracker_spec 2.rb
@@ -1,30 +0,0 @@ @@ -1,30 +0,0 @@
1 -require 'spec_helper'  
2 -  
3 -describe IssueTrackers::GitlabTracker do  
4 - it "should create an issue on Gitlab with problem params" do  
5 - notice = Fabricate :notice  
6 - tracker = Fabricate :gitlab_tracker, :app => notice.app  
7 - problem = notice.problem  
8 -  
9 - number = 5  
10 - @issue_link = "#{tracker.account}/#{tracker.project_id}/issues/#{number}/#{tracker.api_token}"  
11 - body = <<EOF  
12 -{  
13 - "title": "Title"  
14 -}  
15 -EOF  
16 -  
17 - stub_request(:post, "#{tracker.account}/#{tracker.project_id}/issues/#{tracker.api_token}").  
18 - to_return(:status => 201, :headers => {'Location' => @issue_link}, :body => body )  
19 -  
20 - problem.app.issue_tracker.create_issue(problem)  
21 - problem.reload  
22 -  
23 - requested = have_requested(:post, "#{tracker.account}/#{tracker.project_id}/issues/#{tracker.api_token}")  
24 - WebMock.should requested.with(:body => /[production][foo#bar] FooError: Too Much Bar/)  
25 - WebMock.should requested.with(:body => /See this exception on Errbit/)  
26 -  
27 - problem.issue_link.should == @issue_link  
28 - end  
29 -end  
30 -  
spec/models/issue_trackers/gitlab_issues_tracker_spec.rb 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +require 'spec_helper'
  2 +
  3 +describe IssueTrackers::GitlabTracker do
  4 + it "should create an issue on Gitlab with problem params" do
  5 + notice = Fabricate :notice
  6 + tracker = Fabricate :gitlab_tracker, :app => notice.app
  7 + problem = notice.problem
  8 +
  9 + number = 5
  10 + @issue_link = "#{tracker.account}/api/v3/projects/#{tracker.project_id}/issues/#{number}/?private_token=#{tracker.api_token}"
  11 + body = <<EOF
  12 +{
  13 + "title": "Title"
  14 +}
  15 +EOF
  16 +
  17 + stub_request(:post, "#{tracker.account}/api/v3/projects/#{tracker.project_id}/issues/?private_token=#{tracker.api_token}").
  18 + to_return(:status => 201, :headers => {'Location' => @issue_link}, :body => body )
  19 +
  20 + problem.app.issue_tracker.create_issue(problem)
  21 + problem.reload
  22 +
  23 + requested = have_requested(:post, "#{tracker.account}/api/v3/projects/#{tracker.project_id}/issues/?private_token=#{tracker.api_token}")
  24 + WebMock.should requested.with(:body => /[production][foo#bar] FooError: Too Much Bar/)
  25 + WebMock.should requested.with(:body => /See this exception on Errbit/)
  26 +
  27 + problem.issue_link.should == @issue_link
  28 + end
  29 +end
  30 +