class Reina::GitHubController
Constants
- DEPLOY_TRIGGER
- EVENTS
- SINGLE_DEPLOY_TRIGGER
Attributes
config[R]
request[R]
Public Class Methods
new(config)
click to toggle source
# File lib/reina/github_controller.rb, line 15 def initialize(config) @config = config end
Public Instance Methods
deployed_url()
click to toggle source
# File lib/reina/github_controller.rb, line 35 def deployed_url [ 'https://', CONFIG[:app_name_prefix], repo_name, '-', issue_number, '.herokuapp.com' ].join end
dispatch(request)
click to toggle source
# File lib/reina/github_controller.rb, line 19 def dispatch(request) @request = request raise UnsupportedEventError unless EVENTS.include?(event) authenticate! if deploy_requested? deploy! elsif single_deploy_requested? deploy!(true) elsif issue_closed? destroy! end end
Private Instance Methods
action()
click to toggle source
# File lib/reina/github_controller.rb, line 135 def action payload['action'] end
authenticate!()
click to toggle source
# File lib/reina/github_controller.rb, line 45 def authenticate! hash = OpenSSL::HMAC.hexdigest(hmac_digest, config[:webhook_secret], raw_payload) hash.prepend('sha1=') raise SignatureError unless Rack::Utils.secure_compare(hash, signature) end
comment_body()
click to toggle source
# File lib/reina/github_controller.rb, line 151 def comment_body payload.dig('comment', 'body')&.strip.to_s end
deploy!(strict = false)
click to toggle source
# File lib/reina/github_controller.rb, line 63 def deploy!(strict = false) reina = Controller.new(params, strict) should_comment = config[:oauth_token].present? reply = ->(msg) { octokit.add_comment(repo_full_name, issue_number, msg) } url = deployed_url fork do apps_count = reina.apps.size if should_comment if apps_count > 1 reply.call("Starting to deploy #{apps_count} apps...") else reply.call("Starting to deploy one app...") end end reina.create_netrc if reina.heroku? reina.delete_existing_apps! reina.deploy_parallel_apps! reina.deploy_non_parallel_apps! s = 's'.freeze if apps_count > 1 reply.call("Deployment#{s} finished. Live at #{url}.") if should_comment end end
deploy_requested?()
click to toggle source
# File lib/reina/github_controller.rb, line 51 def deploy_requested? action == 'created'.freeze && comment_body.start_with?(DEPLOY_TRIGGER) end
destroy!()
click to toggle source
# File lib/reina/github_controller.rb, line 90 def destroy! reina = Controller.new(params) return if reina.existing_apps.empty? should_comment = config[:oauth_token].present? reply = ->(msg) { octokit.add_comment(repo_full_name, issue_number, msg) } fork do reina.create_netrc if reina.heroku? reina.delete_existing_apps! reply.call('All the staging apps related to this issue have been deleted.') if should_comment end end
event()
click to toggle source
# File lib/reina/github_controller.rb, line 131 def event request.env['HTTP_X_GITHUB_EVENT'] end
hmac_digest()
click to toggle source
# File lib/reina/github_controller.rb, line 172 def hmac_digest @_hmac_digest ||= OpenSSL::Digest.new('sha1') end
issue_closed?()
click to toggle source
# File lib/reina/github_controller.rb, line 59 def issue_closed? action == 'closed'.freeze end
issue_number()
click to toggle source
# File lib/reina/github_controller.rb, line 139 def issue_number payload.dig('issue', 'number') end
octokit()
click to toggle source
# File lib/reina/github_controller.rb, line 105 def octokit return @_octokit if @_octokit.present? client = Octokit::Client.new(access_token: config[:oauth_token]) user = client.user user.login @_octokit = client end
params()
click to toggle source
# File lib/reina/github_controller.rb, line 114 def params return [issue_number] if comment_body.blank? [ issue_number, comment_body .lines[0] .split(/#{DEPLOY_TRIGGER}|#{SINGLE_DEPLOY_TRIGGER}/)[1] .split(' ') .reject(&:blank?) ].flatten end
payload()
click to toggle source
# File lib/reina/github_controller.rb, line 159 def payload return @_payload if @_payload.present? @_payload ||= JSON.parse(raw_payload) end
raw_payload()
click to toggle source
# File lib/reina/github_controller.rb, line 165 def raw_payload return @_raw_payload if @_raw_payload.present? request.body.rewind @_raw_payload ||= request.body.read end
repo_full_name()
click to toggle source
# File lib/reina/github_controller.rb, line 147 def repo_full_name payload.dig('repository', 'full_name') end
repo_name()
click to toggle source
# File lib/reina/github_controller.rb, line 143 def repo_name payload.dig('repository', 'name') end
signature()
click to toggle source
# File lib/reina/github_controller.rb, line 127 def signature request.env['HTTP_X_HUB_SIGNATURE'] end
single_deploy_requested?()
click to toggle source
# File lib/reina/github_controller.rb, line 55 def single_deploy_requested? action == 'created'.freeze && comment_body.start_with?(SINGLE_DEPLOY_TRIGGER) end