diff --git a/CHANGELOG b/CHANGELOG index 14bb88f22a5..7e6e0f5f64b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -12,6 +12,7 @@ v 7.4.0 - API: Add support for forking a project via the API (Bernhard Kaindl) - API: filter project issues by milestone (Julien Bianchi) - Fail harder in the backup script + - Changes to Slack service structure, only webhook url needed - Zen mode for wiki and milestones (Robert Schilling) - Move Emoji parsing to html-pipeline-gitlab (Robert Schilling) - Font Awesome 4.2 integration (Sullivan Senechal) diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index 4c558e137ea..b50f6286459 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -40,7 +40,7 @@ class Projects::ServicesController < Projects::ApplicationController def service_params params.require(:service).permit( :title, :token, :type, :active, :api_key, :subdomain, - :room, :recipients, :project_url, + :room, :recipients, :project_url, :webhook, :user_key, :device, :priority, :sound ) end diff --git a/app/models/project_services/slack_service.rb b/app/models/project_services/slack_service.rb index 4bda93f6006..dfa1e9c9820 100644 --- a/app/models/project_services/slack_service.rb +++ b/app/models/project_services/slack_service.rb @@ -13,10 +13,8 @@ # class SlackService < Service - prop_accessor :room, :subdomain, :token - validates :room, presence: true, if: :activated? - validates :subdomain, presence: true, if: :activated? - validates :token, presence: true, if: :activated? + prop_accessor :webhook + validates :webhook, presence: true, if: :activated? def title 'Slack' @@ -32,9 +30,7 @@ class SlackService < Service def fields [ - { type: 'text', name: 'subdomain', placeholder: '' }, - { type: 'text', name: 'token', placeholder: '' }, - { type: 'text', name: 'room', placeholder: 'Ex. #general' }, + { type: 'text', name: 'webhook', placeholder: '' } ] end @@ -44,10 +40,13 @@ class SlackService < Service project_name: project_name )) - notifier = Slack::Notifier.new(subdomain, token) - notifier.channel = room - notifier.username = 'GitLab' - notifier.ping(message.pretext, attachments: message.attachments) + credentials = webhook.match(/(\w*).slack.com.*services\/(.*)/) + if credentials.present? + subdomain = credentials[1] + token = credentials[2].split("token=").last + notifier = Slack::Notifier.new(subdomain, token) + notifier.ping(message.pretext, attachments: message.attachments) + end end private diff --git a/db/migrate/20141006143943_move_slack_service_to_webhook.rb b/db/migrate/20141006143943_move_slack_service_to_webhook.rb new file mode 100644 index 00000000000..4b62b223cbf --- /dev/null +++ b/db/migrate/20141006143943_move_slack_service_to_webhook.rb @@ -0,0 +1,17 @@ +class MoveSlackServiceToWebhook < ActiveRecord::Migration + def change + SlackService.all.each do |slack_service| + if ["token", "subdomain"].all? { |property| slack_service.properties.key? property } + token = slack_service.properties['token'] + subdomain = slack_service.properties['subdomain'] + webhook = "https://#{subdomain}.slack.com/services/hooks/incoming-webhook?token=#{token}" + slack_service.properties['webhook'] = webhook + slack_service.properties.delete('token') + slack_service.properties.delete('subdomain') + # Room is configured on the Slack side + slack_service.properties.delete('room') + slack_service.save! + end + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 4e249caa022..84fd1256677 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20140914173417) do +ActiveRecord::Schema.define(version: 20141006143943) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" diff --git a/features/steps/project/services.rb b/features/steps/project/services.rb index d816fcafbaa..5bd60f99c84 100644 --- a/features/steps/project/services.rb +++ b/features/steps/project/services.rb @@ -108,16 +108,12 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps step 'I fill Slack settings' do check 'Active' - fill_in 'Subdomain', with: 'gitlab' - fill_in 'Room', with: '#gitlab' - fill_in 'Token', with: 'verySecret' + fill_in 'Webhook', with: 'https://gitlabhq.slack.com/services/hooks?token=cdIj4r4LfXUOySDUjp0tk3OI' click_button 'Save' end step 'I should see Slack service settings saved' do - find_field('Subdomain').value.should == 'gitlab' - find_field('Room').value.should == '#gitlab' - find_field('Token').value.should == 'verySecret' + find_field('Webhook').value.should == 'https://gitlabhq.slack.com/services/hooks?token=cdIj4r4LfXUOySDUjp0tk3OI' end step 'I click Pushover service link' do diff --git a/spec/models/slack_service_spec.rb b/spec/models/slack_service_spec.rb index 4576913b473..3e555193b32 100644 --- a/spec/models/slack_service_spec.rb +++ b/spec/models/slack_service_spec.rb @@ -26,31 +26,28 @@ describe SlackService do subject.active = true end - it { should validate_presence_of :room } - it { should validate_presence_of :subdomain } - it { should validate_presence_of :token } + it { should validate_presence_of :webhook } end end describe "Execute" do let(:slack) { SlackService.new } + let(:slack_service) { SlackService.new } let(:user) { create(:user) } let(:project) { create(:project) } let(:sample_data) { GitPushService.new.sample_data(project, user) } - let(:subdomain) { 'gitlab' } - let(:token) { 'verySecret' } + let(:webhook) { 'https://gitlabhq.slack.com/services/hooks?token=cdIj4r4LfXUOySDUjp0tk3OI' } + let(:new_webhook) { 'https://hooks.gitlabhq.slack.com/services/cdIj4r4LfXUOySDUjp0tk3OI' } let(:api_url) { - "https://#{subdomain}.slack.com/services/hooks/incoming-webhook?token=#{token}" + 'https://gitlabhq.slack.com/services/hooks/incoming-webhook?token=cdIj4r4LfXUOySDUjp0tk3OI' } before do slack.stub( project: project, project_id: project.id, - room: '#gitlab', service_hook: true, - subdomain: subdomain, - token: token + webhook: webhook ) WebMock.stub_request(:post, api_url) @@ -61,5 +58,24 @@ describe SlackService do WebMock.should have_requested(:post, api_url).once end + + context 'with new webhook syntax' do + before do + slack_service.stub( + project: project, + project_id: project.id, + service_hook: true, + webhook: new_webhook + ) + + WebMock.stub_request(:post, api_url) + end + + it "should call Slack API" do + slack_service.execute(sample_data) + + WebMock.should have_requested(:post, api_url).once + end + end end end