From f4bc18d237413ac55e32ce16a23b3d2ab35a6976 Mon Sep 17 00:00:00 2001 From: Drew Blessing <drew@gitlab.com> Date: Thu, 14 Jan 2016 08:20:23 -0600 Subject: [PATCH] Refactor JIRA service to use gem --- Gemfile | 3 + app/controllers/concerns/service_params.rb | 2 +- app/models/project_services/jira_service.rb | 201 +++++++++--------- .../20160122231710_migrate_jira_to_gem.rb | 52 +++++ doc/integration/README.md | 53 ++--- doc/integration/img/jira_service_page.png | Bin 0 -> 45089 bytes doc/integration/jira.md | 147 ++++++++++++- 7 files changed, 313 insertions(+), 145 deletions(-) create mode 100644 db/migrate/20160122231710_migrate_jira_to_gem.rb create mode 100644 doc/integration/img/jira_service_page.png diff --git a/Gemfile b/Gemfile index 46245ab62d116..033bbe91296ee 100644 --- a/Gemfile +++ b/Gemfile @@ -161,6 +161,9 @@ gem 'connection_pool', '~> 2.0' # HipChat integration gem 'hipchat', '~> 1.5.0' +# JIRA integration +gem 'jira-ruby', '~> 0.1.17' + # Flowdock integration gem 'gitlab-flowdock-git-hook', '~> 1.0.1' diff --git a/app/controllers/concerns/service_params.rb b/app/controllers/concerns/service_params.rb index 4cb3be410645e..c33d7eecb9f79 100644 --- a/app/controllers/concerns/service_params.rb +++ b/app/controllers/concerns/service_params.rb @@ -18,7 +18,7 @@ module ServiceParams :add_pusher, :send_from_committer_email, :disable_diffs, :external_wiki_url, :notify, :color, :server_host, :server_port, :default_irc_uri, :enable_ssl_verification, - :jira_issue_transition_id] + :jira_issue_transition_id, :url, :project_key] # Parameters to ignore if no value is specified FILTER_BLANK_PARAMS = [:password] diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb index f81b66fd21971..580adcfba991f 100644 --- a/app/models/project_services/jira_service.rb +++ b/app/models/project_services/jira_service.rb @@ -1,15 +1,35 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# template :boolean default(FALSE) +# push_events :boolean default(TRUE) +# issues_events :boolean default(TRUE) +# merge_requests_events :boolean default(TRUE) +# tag_push_events :boolean default(TRUE) +# note_events :boolean default(TRUE), not null +# build_events :boolean default(FALSE), not null +# +require 'jira' + class JiraService < IssueTrackerService include HTTParty - include Gitlab::Routing.url_helpers + include Gitlab::Application.routes.url_helpers DEFAULT_API_VERSION = 2 - prop_accessor :username, :password, :api_url, :jira_issue_transition_id, - :title, :description, :project_url, :issues_url, :new_issue_url - - validates :api_url, presence: true, url: true, if: :activated? + prop_accessor :username, :password, :url, :project_key, + :jira_issue_transition_id, :title, :description - before_validation :set_api_url, :set_jira_issue_transition_id + before_validation :set_jira_issue_transition_id before_update :reset_password @@ -20,14 +40,34 @@ def reference_pattern def reset_password # don't reset the password if a new one is provided - if api_url_changed? && !password_touched? + if url_changed? && !password_touched? self.password = nil end end + def options + url = URI.parse(self.url) + { + :username => self.username, + :password => self.password, + :site => URI.join(url, '/').to_s, + :context_path => url.path, + :auth_type => :basic, + :read_timeout => 120, + :use_ssl => url.scheme == 'https' + } + end + + def client + @client ||= ::JIRA::Client.new(options) + end + + def jira_project + @jira_project ||= client.Project.find(project_key) + end + def help - 'Setting `project_url`, `issues_url` and `new_issue_url` will '\ - 'allow a user to easily navigate to the Jira issue tracker. See the '\ + 'See the ' \ '[integration doc](http://doc.gitlab.com/ce/integration/external-issue-tracker.html) '\ 'for details.' end @@ -53,12 +93,25 @@ def to_param end def fields - super.push( - { type: 'text', name: 'api_url', placeholder: 'https://jira.example.com/rest/api/2' }, + [ + { type: 'text', name: 'url', title: 'URL', placeholder: 'https://jira.example.com' }, + { type: 'text', name: 'project_key', placeholder: 'PROJ' }, { type: 'text', name: 'username', placeholder: '' }, { type: 'password', name: 'password', placeholder: '' }, { type: 'text', name: 'jira_issue_transition_id', placeholder: '2' } - ) + ] + end + + def project_url + "#{url}/issues/?jql=project=#{project_key}" + end + + def issues_url + "#{url}/browse/:id" + end + + def new_issue_url + "#{url}/secure/CreateIssue.jspa" end def execute(push, issue = nil) @@ -72,7 +125,7 @@ def execute(push, issue = nil) end def create_cross_reference_note(mentioned, noteable, author) - issue_name = mentioned.id + issue_key = mentioned.id project = self.project noteable_name = noteable.class.name.underscore.downcase noteable_id = if noteable.is_a?(Commit) @@ -94,53 +147,25 @@ def create_cross_reference_note(mentioned, noteable, author) }, entity: { name: noteable_name.humanize.downcase, - url: entity_url, - title: noteable.title + url: entity_url } } - add_comment(data, issue_name) + add_comment(data, issue_key) end def test_settings - return unless api_url.present? - result = JiraService.get( - jira_api_test_url, - headers: { - 'Content-Type' => 'application/json', - 'Authorization' => "Basic #{auth}" - } - ) + return unless api_utrl.present? + # Test settings by getting the project + jira_project - case result.code - when 201, 200 - Rails.logger.info("#{self.class.name} SUCCESS #{result.code}: Successfully connected to #{api_url}.") - true - else - Rails.logger.info("#{self.class.name} ERROR #{result.code}: #{result.parsed_response}") - false - end - rescue Errno::ECONNREFUSED => e - Rails.logger.info "#{self.class.name} ERROR: #{e.message}. API URL: #{api_url}." + rescue Errno::ECONNREFUSED, JIRA::HTTPError => e + Rails.logger.info "#{self.class.name} Test ERROR: #{url} - #{e.message}" false end private - def build_api_url_from_project_url - server = URI(project_url) - default_ports = [["http", 80], ["https", 443]].include?([server.scheme, server.port]) - server_url = "#{server.scheme}://#{server.host}" - server_url.concat(":#{server.port}") unless default_ports - "#{server_url}/rest/api/#{DEFAULT_API_VERSION}" - rescue - "" # looks like project URL was not valid - end - - def set_api_url - self.api_url = build_api_url_from_project_url if self.api_url.blank? - end - def set_jira_issue_transition_id self.jira_issue_transition_id ||= "2" end @@ -149,7 +174,7 @@ def close_issue(entity, issue) commit_id = if entity.is_a?(Commit) entity.id elsif entity.is_a?(MergeRequest) - entity.diff_head_sha + entity.last_commit.id end commit_url = build_entity_url(:commit, commit_id) @@ -161,69 +186,47 @@ def close_issue(entity, issue) end def transition_issue(issue) - message = { - transition: { - id: jira_issue_transition_id - } - } - send_message(close_issue_url(issue.iid), message.to_json) + issue = client.Issue.find(issue.iid) + issue.transitions.build.save(transition: { id: jira_issue_transition_id }) end def add_issue_solved_comment(issue, commit_id, commit_url) - comment = { - body: "Issue solved with [#{commit_id}|#{commit_url}]." - } - - send_message(comment_url(issue.iid), comment.to_json) + comment = "Issue solved with [#{commit_id}|#{commit_url}]." + send_message(issue.iid, comment) end - def add_comment(data, issue_name) - url = comment_url(issue_name) + def add_comment(data, issue_key) user_name = data[:user][:name] user_url = data[:user][:url] entity_name = data[:entity][:name] entity_url = data[:entity][:url] - entity_title = data[:entity][:title] project_name = data[:project][:name] - message = { - body: %Q{[#{user_name}|#{user_url}] mentioned this issue in [a #{entity_name} of #{project_name}|#{entity_url}]:\n'#{entity_title}'} - } - - unless existing_comment?(issue_name, message[:body]) - send_message(url, message.to_json) - end - end + message = "[#{user_name}|#{user_url}] mentioned this issue in [a #{entity_name} of #{project_name}|#{entity_url}]." - def auth - require 'base64' - Base64.urlsafe_encode64("#{self.username}:#{self.password}") + # unless existing_comment?(issue_name, message[:body]) + send_message(issue_key, message) + # end end - def send_message(url, message) + def send_message(issue_key, message) return unless api_url.present? - result = JiraService.post( - url, - body: message, - headers: { - 'Content-Type' => 'application/json', - 'Authorization' => "Basic #{auth}" - } - ) - - message = case result.code - when 201, 200, 204 - "#{self.class.name} SUCCESS #{result.code}: Successfully posted to #{url}." - when 401 - "#{self.class.name} ERROR 401: Unauthorized. Check the #{self.username} credentials and JIRA access permissions and try again." - else - "#{self.class.name} ERROR #{result.code}: #{result.parsed_response}" - end + issue = client.Issue.find(issue_key) + issue.comments.build.save!(body: message) + + # message = case result.code + # when 201, 200, 204 + # "#{self.class.name} SUCCESS #{result.code}: Successfully posted to #{url}." + # when 401 + # "#{self.class.name} ERROR 401: Unauthorized. Check the #{self.username} credentials and JIRA access permissions and try again." + # else + # "#{self.class.name} ERROR #{result.code}: #{result.parsed_response}" + # end Rails.logger.info(message) message rescue URI::InvalidURIError, Errno::ECONNREFUSED => e - Rails.logger.info "#{self.class.name} ERROR: #{e.message}. Hostname: #{url}." + Rails.logger.info "#{self.class.name} Send message ERROR: #{url} - #{e.message}" end def existing_comment?(issue_name, new_comment) @@ -267,16 +270,4 @@ def build_entity_url(entity_name, entity_id) ) ) end - - def close_issue_url(issue_name) - "#{self.api_url}/issue/#{issue_name}/transitions" - end - - def comment_url(issue_name) - "#{self.api_url}/issue/#{issue_name}/comment" - end - - def jira_api_test_url - "#{self.api_url}/myself" - end end diff --git a/db/migrate/20160122231710_migrate_jira_to_gem.rb b/db/migrate/20160122231710_migrate_jira_to_gem.rb new file mode 100644 index 0000000000000..972aea323d957 --- /dev/null +++ b/db/migrate/20160122231710_migrate_jira_to_gem.rb @@ -0,0 +1,52 @@ +class MigrateJiraToGem < ActiveRecord::Migration + def change + reversible do |dir| + select_all("SELECT id, properties FROM services WHERE services.type IN ('JiraService')").each do |service| + id = service['id'] + properties = JSON.parse(service['properties']) + properties_was = properties.clone + + dir.up do + # Migrate `project_url` to `project_key` + # Ignore if `project_url` doesn't have jql project query with project key + if properties['project_url'].present? + jql = properties['project_url'].match('project=([A-Za-z]*)') + properties['project_key'] = jql.captures.first if jql + end + + # Migrate `api_url` to `url` + if properties['api_url'].present? + url = properties['api_url'].match('(.*)\/rest\/api') + properties['url'] = url.captures.first if url + end + + # Delete now unnecessary properties + properties.delete('api_url') + properties.delete('project_url') + properties.delete('new_issue_url') + properties.delete('issues_url') + end + + dir.down do + # Rebuild old properties based on sane defaults + if properties['url'].present? + properties['api_url'] = "#{properties['url']}/rest/api/2" + properties['project_url'] = + "#{properties['url']}/issues/?jql=project=#{properties['project_key']}" + properties['issues_url'] = "#{properties['url']}/browse/:id" + properties['new_issue_url'] = "#{properties['url']}/secure/CreateIssue.jspa" + end + + # Delete the new properties + properties.delete('url') + properties.delete('project_key') + end + + # Update changes properties + if properties != properties_was + execute("UPDATE services SET properties = '#{quote_string(properties.to_json)}' WHERE id = #{id}") + end + end + end + end +end diff --git a/doc/integration/README.md b/doc/integration/README.md index c2fd299db07a1..0fc0be4ffcedd 100644 --- a/doc/integration/README.md +++ b/doc/integration/README.md @@ -5,57 +5,36 @@ trackers and external authentication. See the documentation below for details on how to configure these services. -- [Jira](../project_services/jira.md) Integrate with the JIRA issue tracker +- [JIRA](jira.md) Integrate with the JIRA issue tracker - [External issue tracker](external-issue-tracker.md) Redmine, JIRA, etc. - [LDAP](ldap.md) Set up sign in via LDAP -- [OmniAuth](omniauth.md) Sign in via Twitter, GitHub, GitLab.com, Google, Bitbucket, Facebook, Shibboleth, SAML, Crowd and Azure +- [OmniAuth](omniauth.md) Sign in via Twitter, GitHub, GitLab, and Google via OAuth. - [SAML](saml.md) Configure GitLab as a SAML 2.0 Service Provider - [CAS](cas.md) Configure GitLab to sign in using CAS +- [Slack](slack.md) Integrate with the Slack chat service - [OAuth2 provider](oauth_provider.md) OAuth2 application creation - [Gmail actions buttons](gmail_action_buttons_for_gitlab.md) Adds GitLab actions to messages - [reCAPTCHA](recaptcha.md) Configure GitLab to use Google reCAPTCHA for new users -- [Akismet](akismet.md) Configure Akismet to stop spam -- [Koding](../administration/integration/koding.md) Configure Koding to use IDE integration GitLab Enterprise Edition contains [advanced Jenkins support][jenkins]. -[jenkins]: http://docs.gitlab.com/ee/integration/jenkins.html - - ## Project services Integration with services such as Campfire, Flowdock, Gemnasium, HipChat, Pivotal Tracker, and Slack are available in the form of a [Project Service][]. +You can find these within GitLab in the Services page under Project Settings if +you are at least a master on the project. +Project Services are a bit like plugins in that they allow a lot of freedom in +adding functionality to GitLab. For example there is also a service that can +send an email every time someone pushes new commits. -[Project Service]: ../project_services/project_services.md - -## SSL certificate errors - -When trying to integrate GitLab with services that are using self-signed certificates, -it is very likely that SSL certificate errors will occur on different parts of the -application, most likely Sidekiq. There are 2 approaches you can take to solve this: - -1. Add the root certificate to the trusted chain of the OS. -1. If using Omnibus, you can add the certificate to GitLab's trusted certificates. - -**OS main trusted chain** +Because GitLab is open source we can ship with the code and tests for all +plugins. This allows the community to keep the plugins up to date so that they +always work in newer GitLab versions. -This [resource](http://kb.kerio.com/product/kerio-connect/server-configuration/ssl-certificates/adding-trusted-root-certificates-to-the-server-1605.html) -has all the information you need to add a certificate to the main trusted chain. +For an overview of what projects services are available without logging in, +please see the [project_services directory][projects-code]. -This [answer](http://superuser.com/questions/437330/how-do-you-add-a-certificate-authority-ca-to-ubuntu) -at SuperUser also has relevant information. - -**Omnibus Trusted Chain** - -It is enough to concatenate the certificate to the main trusted certificate: - -```bash -cat jira.pem >> /opt/gitlab/embedded/ssl/certs/cacert.pem -``` - -After that restart GitLab with: - -```bash -sudo gitlab-ctl restart -``` +[jenkins]: http://doc.gitlab.com/ee/integration/jenkins.html +[Project Service]: ../project_services/project_services.md +[projects-code]: https://gitlab.com/gitlab-org/gitlab-ce/tree/master/app/models/project_services diff --git a/doc/integration/img/jira_service_page.png b/doc/integration/img/jira_service_page.png new file mode 100644 index 0000000000000000000000000000000000000000..0cc160bebe2fda31497afd077b7cd0f5b0930dec GIT binary patch literal 45089 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 literal 0 HcmV?d00001 diff --git a/doc/integration/jira.md b/doc/integration/jira.md index 78aa66341161d..de373bd94ff37 100644 --- a/doc/integration/jira.md +++ b/doc/integration/jira.md @@ -1,3 +1,146 @@ -# GitLab JIRA integration +# GitLab Jira integration -This document was moved under [project_services/jira](../project_services/jira.md). +GitLab can be configured to interact with Jira. Configuration happens via +username and password. Connecting to a Jira server via CAS is not possible. + +Each project can be configured to connect to a different Jira instance, see the +[configuration](#configuration) section. If you have one Jira instance you can +pre-fill the settings page with a default template. To configure the template +see the [Services Templates][services-templates] document. + +Once the project is connected to Jira, you can reference and close the issues +in Jira directly from GitLab. + +## Table of Contents + +* [Referencing Jira Issues from GitLab](#referencing-jira-issues) +* [Closing Jira Issues from GitLab](#closing-jira-issues) +* [Configuration](#configuration) + +### Referencing Jira Issues + +When GitLab project has Jira issue tracker configured and enabled, mentioning +Jira issue in GitLab will automatically add a comment in Jira issue with the +link back to GitLab. This means that in comments in merge requests and commits +referencing an issue, eg. `PROJECT-7`, will add a comment in Jira issue in the +format: + +``` + USER mentioned this issue in LINK_TO_THE_MENTION +``` + +* `USER` A user that mentioned the issue. This is the link to the user profile in GitLab. +* `LINK_TO_THE_MENTION` Link to the origin of mention with a name of the entity where Jira issue was mentioned. +Can be commit or merge request. + + + +--- + +### Closing Jira Issues + +Jira issues can be closed directly from GitLab by using trigger words, eg. +`Resolves PROJECT-1`, `Closes PROJECT-1` or `Fixes PROJECT-1`, in commits and +merge requests. When a commit which contains the trigger word in the commit +message is pushed, GitLab will add a comment in the mentioned Jira issue. + +For example, for project named `PROJECT` in Jira, we implemented a new feature +and created a merge request in GitLab. + +This feature was requested in Jira issue `PROJECT-7`. Merge request in GitLab +contains the improvement and in merge request description we say that this +merge request `Closes PROJECT-7` issue. + +Once this merge request is merged, the Jira issue will be automatically closed +with a link to the commit that resolved the issue. + + + +--- + + + +--- + +## Configuration + +### Configuring JIRA + +We need to create a user in JIRA which will have access to all projects that +need to integrate with GitLab. Login to your JIRA instance as admin and under +Administration go to User Management and create a new user. + +As an example, we'll create a user named `gitlab` and add it to `jira-developers` +group. + +**It is important that the user `gitlab` has write-access to projects in JIRA** + +### Configuring GitLab + +JIRA configuration in GitLab is done via a project's **Services**. + +#### GitLab 7.8 and up with JIRA v6.x + +See next section. + +#### GitLab 7.8 and up + +_The currently supported JIRA versions are v6.x and v7.x._ + +To enable JIRA integration in a project, navigate to the project's +**Settings > Services > JIRA**. + +Fill in the required details on the page as described in the table below. + +| Field | Description | +| ----- | ----------- | +| `URL` | The base URL to the JIRA project which is being linked to this GitLab project. Ex. https://jira.example.com | +| `Project key` | The short, all capital letter identifier for your JIRA project. | +| `Username` | The username of the user created in [configuring JIRA step](#configuring-jira). | +| `Password` |The password of the user created in [configuring JIRA step](#configuring-jira). | +| `Jira issue transition` | This is the ID of a transition that moves issues to a closed state. You can find this number under JIRA workflow administration ([see screenshot](img/jira_workflow_screenshot.png)). By default, this ID is `2` (in the example image, this is `2` as well) | + +After saving the configuration, your GitLab project will be able to interact +with the linked JIRA project. + + + +--- + +#### GitLab 6.x-7.7 with JIRA v6.x + +_**Note:** GitLab versions 7.8 and up contain various integration improvements. +We strongly recommend upgrading._ + +In `gitlab.yml` enable the JIRA issue tracker section by +[uncommenting these lines][jira-gitlab-yml]. This will make sure that all +issues within GitLab are pointing to the JIRA issue tracker. + +After you set this, you will be able to close issues in JIRA by a commit in +GitLab. + +Go to your project's **Settings** page and fill in the project name for the +JIRA project: + + + +--- + +You can also enable the JIRA service that will allow you to interact with JIRA +issues. Go to the **Settings > Services > JIRA** and: + +1. Tick the active check box to enable the service +1. Supply the URL to JIRA server, for example http://jira.example.com +1. Supply the username of a user we created under `Configuring JIRA` section, + for example `gitlab` +1. Supply the password of the user +1. Optional: supply the JIRA API version, default is version `2` +1. Optional: supply the JIRA issue transition ID (issue transition to closed). + This is dependent on JIRA settings, default is `2` +1. Hit save + + + + +[services-templates]: ../project_services/services_templates.md +[jira-gitlab-yml]: https://gitlab.com/subscribers/gitlab-ee/blob/6-8-stable-ee/config/gitlab.yml.example#L111-115 -- GitLab