From befe6b76e797b1faf7c45d140ec162f1ab6fcb3e Mon Sep 17 00:00:00 2001 From: Tim Meusel Date: Mon, 7 Oct 2019 22:15:58 +0200 Subject: [PATCH 1/2] implement travis event handling --- app/controllers/incoming_controller.rb | 12 +++++++++ app/lib/travis_event.rb | 27 +++++++++++++++++++ app/lib/travis_event/base.rb | 12 +++++++++ app/lib/travis_event/push.rb | 9 +++++++ app/models/travis.rb | 36 ++++++++++++++++++++++++++ config/routes.rb | 2 ++ 6 files changed, 98 insertions(+) create mode 100644 app/lib/travis_event.rb create mode 100644 app/lib/travis_event/base.rb create mode 100644 app/lib/travis_event/push.rb create mode 100644 app/models/travis.rb diff --git a/app/controllers/incoming_controller.rb b/app/controllers/incoming_controller.rb index 5a9eb414..9775e89b 100644 --- a/app/controllers/incoming_controller.rb +++ b/app/controllers/incoming_controller.rb @@ -7,6 +7,7 @@ class IncomingController < ApplicationController ## # Parse the whole payload from Github and hand it over to the GithubEvent handler def github + # TODO: verify the payload payload = request.body.read useable_body = JSON.parse(payload).to_h @@ -15,6 +16,17 @@ def github GithubEvent.new(useable_body, request.headers['X-GitHub-Event']) end + ## + # Parse the whole payload from travis and hand it over to the TravisEvent handler + def travis + # TODO: verify the payload + # https://github.com/travis-ci/webhook-signature-verifier/blob/master/lib/webhook-signature-verifier.rb#L40 + # https://docs.travis-ci.com/user/notifications/#verifying-webhook-requests + payload = request.body.read + useable_body = JSON.parse(payload).to_h + TravisEvent.new(useable_body) + end + private def verify_signature(payload) diff --git a/app/lib/travis_event.rb b/app/lib/travis_event.rb new file mode 100644 index 00000000..f51638af --- /dev/null +++ b/app/lib/travis_event.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +class TravisEvent + attr_reader :processor + delegate :process, to: :processor + + ## + # The TravisEvent handler checks which type of event we are dealing with. + # + # If it is a known event, create a specific handler and let it take care of + # the next steps. If not kick off a Sentry error. + + def initialize(payload) + case payload['type'] + when 'push' + TravisEvent::Push.new(payload) + when 'pull_request' + TravisEvent::Push.new(payload) + when 'cron' + TravisEvent::Push.new(payload) + when 'api' + TravisEvent::Push.new(payload) + else + Raven.capture_message("Unknown Hook Received: #{payload['type']}", extra: payload) + end + end +end diff --git a/app/lib/travis_event/base.rb b/app/lib/travis_event/base.rb new file mode 100644 index 00000000..e91d361d --- /dev/null +++ b/app/lib/travis_event/base.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class TravisEvent + class Base + attr_reader :payload + + def initialize(payload) + @payload = payload + process + end + end +end diff --git a/app/lib/travis_event/push.rb b/app/lib/travis_event/push.rb new file mode 100644 index 00000000..2497255a --- /dev/null +++ b/app/lib/travis_event/push.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class TravisEvent + class Push < TravisEvent::Base + def process + ::TravisEvent.new(payload) + end + end +end diff --git a/app/models/travis.rb b/app/models/travis.rb new file mode 100644 index 00000000..e93150b4 --- /dev/null +++ b/app/models/travis.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +class Travis < ApplicationRecord + belongs_to(:pull_requests) + + def sef.update_with_travis_payload(payload) + Travis.where(travis_id: payload['id']).first_or_initialize.tap do |travis| + travis.type = payload['type'] + travis.state = payload['state'] + travis.status = payload['status'] + travis.result = payload['result'] + travis.status_message = payload['status_message'] + travis.result_message = payload['result_message'] + travis.started_at = payload['started_at'] + travis.finished_at = payload['finished_at'] + travis.duration = payload['duration'] + travis.build_url = payload['build_url'] + travis.commit_id = payload['commit_id'] + travis.commit = payload['commit'] + travis.base_commit = payload['base_commit'] + travis.head_commit = payload['head_commit'] + travis.branch = payload['branch'] + travis.message = payload['message'] + travis.compare_url = payload['compare_url'] + travis.committed_at = payload['committed_at'] + travis.author_name = payload['author_name'] + travis.author_email = payload['author_email'] + travis.committer_name = payload['committer_name'] + travis._committer_email = payload['committer_email'] + travis.pull_request = payload['pull_request'] + travis.pull_request_number = payload['payload_request_number'] + travis.request_title = payload['request_title'] + travis.tag = payload['tag'] + end + end +end diff --git a/config/routes.rb b/config/routes.rb index 98957c5b..f9a8f29c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -21,6 +21,8 @@ post 'incoming/github', to: 'incoming#github' + post 'incoming/travis', to: 'incoming#travis' + constraints ->(req) { req.session['user_id'] } do mount Sidekiq::Web => '/sidekiq' end From 093ef3c50cefcc0bf27202b830deaaa0bc556ad3 Mon Sep 17 00:00:00 2001 From: Tim Meusel Date: Sun, 22 Dec 2019 00:45:08 +0100 Subject: [PATCH 2/2] implement travis logging --- app/lib/travis_event.rb | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/app/lib/travis_event.rb b/app/lib/travis_event.rb index f51638af..2d0dddd9 100644 --- a/app/lib/travis_event.rb +++ b/app/lib/travis_event.rb @@ -11,17 +11,18 @@ class TravisEvent # the next steps. If not kick off a Sentry error. def initialize(payload) - case payload['type'] - when 'push' - TravisEvent::Push.new(payload) - when 'pull_request' - TravisEvent::Push.new(payload) - when 'cron' - TravisEvent::Push.new(payload) - when 'api' - TravisEvent::Push.new(payload) - else - Raven.capture_message("Unknown Hook Received: #{payload['type']}", extra: payload) - end + Raven.capture_message("Unknown Hook Received: #{payload['type']}", extra: payload) + # case payload['type'] + # when 'push' + # TravisEvent::Push.new(payload) + # when 'pull_request' + # TravisEvent::Push.new(payload) + # when 'cron' + # TravisEvent::Push.new(payload) + # when 'api' + # TravisEvent::Push.new(payload) + # else + # Raven.capture_message("Unknown Hook Received: #{payload['type']}", extra: payload) + # end end end