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_author() click to toggle source
# File lib/reina/github_controller.rb, line 155
def comment_author
  payload.dig('comment', 'user', 'login')
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