diff --git a/lib/travis/listener/app.rb b/lib/travis/listener/app.rb index da57684..67b8984 100644 --- a/lib/travis/listener/app.rb +++ b/lib/travis/listener/app.rb @@ -99,6 +99,7 @@ def dispatch_event debug "Event payload for #{uuid}: #{payload.inspect}" log_event + handle_service_hook case event_type when 'installation' @@ -112,6 +113,10 @@ def dispatch_event end end + def handle_service_hook + Travis::Sidekiq::GithubSync.update_hook(data) if came_from_service_hook? + end + def handle_event? if accepted_event_excluding_checks? || rerequested_check? Metriks.meter("listener.handle.accept").mark @@ -178,6 +183,10 @@ def delivery_guid env['HTTP_X_GITHUB_DELIVERY'] || env['HTTP_X_GITHUB_GUID'] end + def came_from_service_hook? + env.has_key?('HTTP_X_GITHUB_GUID') + end + def integration_type if !params[:payload].blank? "webhook" diff --git a/lib/travis/sidekiq.rb b/lib/travis/sidekiq.rb index e396068..fd0d1c8 100644 --- a/lib/travis/sidekiq.rb +++ b/lib/travis/sidekiq.rb @@ -38,6 +38,12 @@ def self.gh_app_member(data) push('sync', :gh_app_member, data) end + def self.update_hook(data) + Metriks.meter('listener.event.update_hook').mark + + push('sync', :update_hook, data) + end + def self.client @@client ||= ::Sidekiq::Client.new( ::Sidekiq::RedisConnection.create(Travis.config.redis.to_h) diff --git a/spec/travis/app_spec.rb b/spec/travis/app_spec.rb index a1fcb3e..76f1166 100644 --- a/spec/travis/app_spec.rb +++ b/spec/travis/app_spec.rb @@ -6,10 +6,12 @@ let(:payload) { Payloads.load('push') } let(:redis) { Redis.new } let(:queue) { Travis::Sidekiq::Gatekeeper } + let(:sync_queue) { Travis::Sidekiq::GithubSync } before do authorize(*auth) allow(queue).to receive(:push) + allow(sync_queue).to receive(:update_hook) end def create(opts = {}) @@ -21,6 +23,7 @@ def create(opts = {}) headers = { 'HTTP_X_GITHUB_EVENT' => 'push', 'HTTP_X_GITHUB_GUID' => 'abc123' } headers.merge!(opts.delete(:headers) || {}) + headers = headers.delete_if { |k, v| v == nil } # allows removal for testing purposes post(opts[:url] || '/', params, headers) end @@ -111,4 +114,16 @@ def create(opts = {}) last_response.status.should be == 403 end end + + context 'service hook' do + it 'enqueues update_hook if service hook detected' do + create + expect(sync_queue).to have_received(:update_hook).once + end + + it 'does not if no service hook detected' do + create headers: { 'HTTP_X_GITHUB_GUID' => nil, 'HTTP_X_GITHUB_DELIVERY' => 'abc123' } + expect(sync_queue).not_to have_received(:update_hook) + end + end end