summaryrefslogtreecommitdiff
path: root/app/models/integrations
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-11-18 13:16:36 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2021-11-18 13:16:36 +0000
commit311b0269b4eb9839fa63f80c8d7a58f32b8138a0 (patch)
tree07e7870bca8aed6d61fdcc810731c50d2c40af47 /app/models/integrations
parent27909cef6c4170ed9205afa7426b8d3de47cbb0c (diff)
downloadgitlab-ce-056d9df33865790d1b3c10f77912e00f61193000.tar.gz
Add latest changes from gitlab-org/gitlab@14-5-stable-eev14.5.0-rc42
Diffstat (limited to 'app/models/integrations')
-rw-r--r--app/models/integrations/bamboo.rb2
-rw-r--r--app/models/integrations/base_chat_notification.rb7
-rw-r--r--app/models/integrations/buildkite.rb2
-rw-r--r--app/models/integrations/discord.rb7
-rw-r--r--app/models/integrations/drone_ci.rb4
-rw-r--r--app/models/integrations/emails_on_push.rb9
-rw-r--r--app/models/integrations/hangouts_chat.rb7
-rw-r--r--app/models/integrations/jira.rb15
-rw-r--r--app/models/integrations/microsoft_teams.rb7
-rw-r--r--app/models/integrations/pipelines_email.rb18
-rw-r--r--app/models/integrations/shimo.rb47
-rw-r--r--app/models/integrations/teamcity.rb4
-rw-r--r--app/models/integrations/unify_circuit.rb7
-rw-r--r--app/models/integrations/webex_teams.rb7
-rw-r--r--app/models/integrations/zentao.rb34
15 files changed, 150 insertions, 27 deletions
diff --git a/app/models/integrations/bamboo.rb b/app/models/integrations/bamboo.rb
index 1a7cbaa34c7..0774b84b69f 100644
--- a/app/models/integrations/bamboo.rb
+++ b/app/models/integrations/bamboo.rb
@@ -3,7 +3,7 @@
module Integrations
class Bamboo < BaseCi
include ActionView::Helpers::UrlHelper
- include ReactiveService
+ include ReactivelyCached
prop_accessor :bamboo_url, :build_key, :username, :password
diff --git a/app/models/integrations/base_chat_notification.rb b/app/models/integrations/base_chat_notification.rb
index c6335782b5e..ca72de47d30 100644
--- a/app/models/integrations/base_chat_notification.rb
+++ b/app/models/integrations/base_chat_notification.rb
@@ -73,7 +73,12 @@ module Integrations
{ type: 'text', name: 'webhook', placeholder: "#{webhook_placeholder}", required: true }.freeze,
{ type: 'text', name: 'username', placeholder: 'GitLab-integration' }.freeze,
{ type: 'checkbox', name: 'notify_only_broken_pipelines', help: 'Do not send notifications for successful pipelines.' }.freeze,
- { type: 'select', name: 'branches_to_be_notified', choices: branch_choices }.freeze,
+ {
+ type: 'select',
+ name: 'branches_to_be_notified',
+ title: s_('Integrations|Branches for which notifications are to be sent'),
+ choices: branch_choices
+ }.freeze,
{
type: 'text',
name: 'labels_to_be_notified',
diff --git a/app/models/integrations/buildkite.rb b/app/models/integrations/buildkite.rb
index 94a37f0c4f2..9fad3a42647 100644
--- a/app/models/integrations/buildkite.rb
+++ b/app/models/integrations/buildkite.rb
@@ -5,7 +5,7 @@ require "addressable/uri"
module Integrations
class Buildkite < BaseCi
include HasWebHook
- include ReactiveService
+ include ReactivelyCached
extend Gitlab::Utils::Override
ENDPOINT = "https://buildkite.com"
diff --git a/app/models/integrations/discord.rb b/app/models/integrations/discord.rb
index 76160a61bc3..21993dd3c43 100644
--- a/app/models/integrations/discord.rb
+++ b/app/models/integrations/discord.rb
@@ -41,7 +41,12 @@ module Integrations
[
{ type: "text", name: "webhook", placeholder: "https://discordapp.com/api/webhooks/…", help: "URL to the webhook for the Discord channel." },
{ type: "checkbox", name: "notify_only_broken_pipelines" },
- { type: 'select', name: 'branches_to_be_notified', choices: branch_choices }
+ {
+ type: 'select',
+ name: 'branches_to_be_notified',
+ title: s_('Integrations|Branches for which notifications are to be sent'),
+ choices: branch_choices
+ }
]
end
diff --git a/app/models/integrations/drone_ci.rb b/app/models/integrations/drone_ci.rb
index c93ae432fe9..856d14c022d 100644
--- a/app/models/integrations/drone_ci.rb
+++ b/app/models/integrations/drone_ci.rb
@@ -3,8 +3,8 @@
module Integrations
class DroneCi < BaseCi
include HasWebHook
- include ReactiveService
- include ServicePushDataValidations
+ include PushDataValidations
+ include ReactivelyCached
extend Gitlab::Utils::Override
prop_accessor :drone_url, :token
diff --git a/app/models/integrations/emails_on_push.rb b/app/models/integrations/emails_on_push.rb
index e277633664f..a9cd67550dc 100644
--- a/app/models/integrations/emails_on_push.rb
+++ b/app/models/integrations/emails_on_push.rb
@@ -76,7 +76,12 @@ module Integrations
help: s_("EmailsOnPushService|Send notifications from the committer's email address if the domain matches the domain used by your GitLab instance (such as %{domains}).") % { domains: domains } },
{ type: 'checkbox', name: 'disable_diffs', title: s_("EmailsOnPushService|Disable code diffs"),
help: s_("EmailsOnPushService|Don't include possibly sensitive code diffs in notification body.") },
- { type: 'select', name: 'branches_to_be_notified', choices: branch_choices },
+ {
+ type: 'select',
+ name: 'branches_to_be_notified',
+ title: s_('Integrations|Branches for which notifications are to be sent'),
+ choices: branch_choices
+ },
{
type: 'textarea',
name: 'recipients',
@@ -92,7 +97,7 @@ module Integrations
return if recipients.blank?
if self.class.valid_recipients(recipients).size > RECIPIENTS_LIMIT
- errors.add(:recipients, s_("EmailsOnPushService|can't exceed %{recipients_limit}") % { recipients_limit: RECIPIENTS_LIMIT })
+ errors.add(:recipients, s_("Integrations|can't exceed %{recipients_limit}") % { recipients_limit: RECIPIENTS_LIMIT })
end
end
end
diff --git a/app/models/integrations/hangouts_chat.rb b/app/models/integrations/hangouts_chat.rb
index d02cfe4ec56..0d6b9fb1019 100644
--- a/app/models/integrations/hangouts_chat.rb
+++ b/app/models/integrations/hangouts_chat.rb
@@ -40,7 +40,12 @@ module Integrations
[
{ type: 'text', name: 'webhook', placeholder: "#{webhook_placeholder}" },
{ type: 'checkbox', name: 'notify_only_broken_pipelines' },
- { type: 'select', name: 'branches_to_be_notified', choices: branch_choices }
+ {
+ type: 'select',
+ name: 'branches_to_be_notified',
+ title: s_('Integrations|Branches for which notifications are to be sent'),
+ choices: branch_choices
+ }
]
end
diff --git a/app/models/integrations/jira.rb b/app/models/integrations/jira.rb
index ec6adc87bf4..42c291abf55 100644
--- a/app/models/integrations/jira.rb
+++ b/app/models/integrations/jira.rb
@@ -89,7 +89,6 @@ module Integrations
site: URI.join(url, '/').to_s.delete_suffix('/'), # Intended to find the root
context_path: (url.path.presence || '/').delete_suffix('/'),
auth_type: :basic,
- read_timeout: 120,
use_cookies: true,
additional_cookies: ['OBBasicAuth=fromDialog'],
use_ssl: url.scheme == 'https'
@@ -303,6 +302,14 @@ module Integrations
private
+ def branch_name(noteable)
+ if Feature.enabled?(:jira_use_first_ref_by_oid, project, default_enabled: :yaml)
+ noteable.first_ref_by_oid(project.repository)
+ else
+ noteable.ref_names(project.repository).first
+ end
+ end
+
def server_info
strong_memoize(:server_info) do
client_url.present? ? jira_request { client.ServerInfo.all.attrs } : nil
@@ -496,7 +503,7 @@ module Integrations
{
id: noteable.short_id,
description: noteable.safe_message,
- branch: noteable.ref_names(project.repository).first
+ branch: branch_name(noteable)
}
elsif noteable.is_a?(MergeRequest)
{
@@ -521,7 +528,9 @@ module Integrations
yield
rescue StandardError => error
@error = error
- log_error("Error sending message", client_url: client_url, error: @error.message)
+ payload = { client_url: client_url }
+ Gitlab::ExceptionLogFormatter.format!(error, payload)
+ log_error("Error sending message", payload)
nil
end
diff --git a/app/models/integrations/microsoft_teams.rb b/app/models/integrations/microsoft_teams.rb
index 5aad25e8ddc..71cd4ddaf82 100644
--- a/app/models/integrations/microsoft_teams.rb
+++ b/app/models/integrations/microsoft_teams.rb
@@ -37,7 +37,12 @@ module Integrations
[
{ type: 'text', name: 'webhook', placeholder: "#{webhook_placeholder}" },
{ type: 'checkbox', name: 'notify_only_broken_pipelines', help: 'If selected, successful pipelines do not trigger a notification event.' },
- { type: 'select', name: 'branches_to_be_notified', choices: branch_choices }
+ {
+ type: 'select',
+ name: 'branches_to_be_notified',
+ title: s_('Integrations|Branches for which notifications are to be sent'),
+ choices: branch_choices
+ }
]
end
diff --git a/app/models/integrations/pipelines_email.rb b/app/models/integrations/pipelines_email.rb
index efba35cc2a8..6dc41958daa 100644
--- a/app/models/integrations/pipelines_email.rb
+++ b/app/models/integrations/pipelines_email.rb
@@ -4,9 +4,12 @@ module Integrations
class PipelinesEmail < Integration
include NotificationBranchSelection
+ RECIPIENTS_LIMIT = 30
+
prop_accessor :recipients, :branches_to_be_notified
boolean_accessor :notify_only_broken_pipelines, :notify_only_default_branch
validates :recipients, presence: true, if: :validate_recipients?
+ validate :number_of_recipients_within_limit, if: :validate_recipients?
def initialize_properties
if properties.nil?
@@ -49,7 +52,7 @@ module Integrations
return unless supported_events.include?(data[:object_kind])
return unless force || should_pipeline_be_notified?(data)
- all_recipients = retrieve_recipients(data)
+ all_recipients = retrieve_recipients
return unless all_recipients.any?
@@ -71,6 +74,7 @@ module Integrations
name: 'notify_only_broken_pipelines' },
{ type: 'select',
name: 'branches_to_be_notified',
+ title: s_('Integrations|Branches for which notifications are to be sent'),
choices: branch_choices }
]
end
@@ -98,8 +102,18 @@ module Integrations
end
end
- def retrieve_recipients(data)
+ def retrieve_recipients
recipients.to_s.split(/[,\r\n ]+/).reject(&:empty?)
end
+
+ private
+
+ def number_of_recipients_within_limit
+ return if recipients.blank?
+
+ if retrieve_recipients.size > RECIPIENTS_LIMIT
+ errors.add(:recipients, s_("Integrations|can't exceed %{recipients_limit}") % { recipients_limit: RECIPIENTS_LIMIT })
+ end
+ end
end
end
diff --git a/app/models/integrations/shimo.rb b/app/models/integrations/shimo.rb
new file mode 100644
index 00000000000..4f42fda2577
--- /dev/null
+++ b/app/models/integrations/shimo.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Integrations
+ class Shimo < Integration
+ prop_accessor :external_wiki_url
+ validates :external_wiki_url, presence: true, public_url: true, if: :activated?
+
+ def render?
+ valid? && activated?
+ end
+
+ def title
+ s_('Shimo|Shimo')
+ end
+
+ def description
+ s_('Shimo|Link to a Shimo Workspace from the sidebar.')
+ end
+
+ def self.to_param
+ 'shimo'
+ end
+
+ # support for `test` method
+ def execute(_data)
+ response = Gitlab::HTTP.get(properties['external_wiki_url'], verify: true, use_read_total_timeout: true)
+ response.body if response.code == 200
+ rescue StandardError
+ nil
+ end
+
+ def self.supported_events
+ %w()
+ end
+
+ def fields
+ [
+ {
+ type: 'text',
+ name: 'external_wiki_url',
+ title: s_('Shimo|Shimo Workspace URL'),
+ required: true
+ }
+ ]
+ end
+ end
+end
diff --git a/app/models/integrations/teamcity.rb b/app/models/integrations/teamcity.rb
index 3f868b57597..008b591c304 100644
--- a/app/models/integrations/teamcity.rb
+++ b/app/models/integrations/teamcity.rb
@@ -2,8 +2,8 @@
module Integrations
class Teamcity < BaseCi
- include ReactiveService
- include ServicePushDataValidations
+ include PushDataValidations
+ include ReactivelyCached
prop_accessor :teamcity_url, :build_type, :username, :password
diff --git a/app/models/integrations/unify_circuit.rb b/app/models/integrations/unify_circuit.rb
index e3e180ae959..f085423d229 100644
--- a/app/models/integrations/unify_circuit.rb
+++ b/app/models/integrations/unify_circuit.rb
@@ -34,7 +34,12 @@ module Integrations
[
{ type: 'text', name: 'webhook', placeholder: "https://yourcircuit.com/rest/v2/webhooks/incoming/…", required: true },
{ type: 'checkbox', name: 'notify_only_broken_pipelines' },
- { type: 'select', name: 'branches_to_be_notified', choices: branch_choices }
+ {
+ type: 'select',
+ name: 'branches_to_be_notified',
+ title: s_('Integrations|Branches for which notifications are to be sent'),
+ choices: branch_choices
+ }
]
end
diff --git a/app/models/integrations/webex_teams.rb b/app/models/integrations/webex_teams.rb
index 6fd82a32035..7660eda6f83 100644
--- a/app/models/integrations/webex_teams.rb
+++ b/app/models/integrations/webex_teams.rb
@@ -36,7 +36,12 @@ module Integrations
[
{ type: 'text', name: 'webhook', placeholder: "https://api.ciscospark.com/v1/webhooks/incoming/...", required: true },
{ type: 'checkbox', name: 'notify_only_broken_pipelines' },
- { type: 'select', name: 'branches_to_be_notified', choices: branch_choices }
+ {
+ type: 'select',
+ name: 'branches_to_be_notified',
+ title: s_('Integrations|Branches for which notifications are to be sent'),
+ choices: branch_choices
+ }
]
end
diff --git a/app/models/integrations/zentao.rb b/app/models/integrations/zentao.rb
index 68c02f54c61..493d42cc40b 100644
--- a/app/models/integrations/zentao.rb
+++ b/app/models/integrations/zentao.rb
@@ -2,6 +2,8 @@
module Integrations
class Zentao < Integration
+ include Gitlab::Routing
+
data_field :url, :api_url, :api_token, :zentao_product_xid
validates :url, public_url: true, presence: true, if: :activated?
@@ -9,16 +11,29 @@ module Integrations
validates :api_token, presence: true, if: :activated?
validates :zentao_product_xid, presence: true, if: :activated?
+ # License Level: EEP_FEATURES
+ def self.issues_license_available?(project)
+ project&.licensed_feature_available?(:zentao_issues_integration)
+ end
+
def data_fields
zentao_tracker_data || self.build_zentao_tracker_data
end
def title
- self.class.name.demodulize
+ 'ZenTao'
end
def description
- s_("ZentaoIntegration|Use Zentao as this project's issue tracker.")
+ s_("ZentaoIntegration|Use ZenTao as this project's issue tracker.")
+ end
+
+ def help
+ s_("ZentaoIntegration|Before you enable this integration, you must configure ZenTao. For more details, read the %{link_start}ZenTao integration documentation%{link_end}.") % {
+ link_start: '<a href="%{url}" target="_blank" rel="noopener noreferrer">'
+ .html_safe % { url: help_page_url('user/project/integrations/zentao') },
+ link_end: '</a>'.html_safe
+ }
end
def self.to_param
@@ -42,28 +57,29 @@ module Integrations
{
type: 'text',
name: 'url',
- title: s_('ZentaoIntegration|Zentao Web URL'),
+ title: s_('ZentaoIntegration|ZenTao Web URL'),
placeholder: 'https://www.zentao.net',
- help: s_('ZentaoIntegration|Base URL of the Zentao instance.'),
+ help: s_('ZentaoIntegration|Base URL of the ZenTao instance.'),
required: true
},
{
type: 'text',
name: 'api_url',
- title: s_('ZentaoIntegration|Zentao API URL (optional)'),
+ title: s_('ZentaoIntegration|ZenTao API URL (optional)'),
help: s_('ZentaoIntegration|If different from Web URL.')
},
{
type: 'password',
name: 'api_token',
- title: s_('ZentaoIntegration|Zentao API token'),
- non_empty_password_title: s_('ZentaoIntegration|Enter API token'),
+ title: s_('ZentaoIntegration|ZenTao API token'),
+ non_empty_password_title: s_('ZentaoIntegration|Enter new ZenTao API token'),
+ non_empty_password_help: s_('ProjectService|Leave blank to use your current token.'),
required: true
},
{
type: 'text',
name: 'zentao_product_xid',
- title: s_('ZentaoIntegration|Zentao Product ID'),
+ title: s_('ZentaoIntegration|ZenTao Product ID'),
required: true
}
]
@@ -76,3 +92,5 @@ module Integrations
end
end
end
+
+::Integrations::Zentao.prepend_mod