class Escobar::Heroku::BuildRequest

Class representing a heroku build request

Attributes

app_id[R]
custom_payload[RW]
environment[RW]
forced[RW]
github_deployment_url[R]
pipeline[R]
ref[RW]
sha[R]

Public Class Methods

new(pipeline, app_id) click to toggle source
# File lib/escobar/heroku/build_request.rb, line 38
def initialize(pipeline, app_id)
  @app_id   = app_id
  @pipeline = pipeline
end

Public Instance Methods

app() click to toggle source
# File lib/escobar/heroku/build_request.rb, line 43
def app
  @app ||= Escobar::Heroku::App.new(pipeline.client, app_id)
end
cache_key() click to toggle source
# File lib/escobar/heroku/build_request.rb, line 51
def cache_key
  app.cache_key
end
create(task, environment, ref, forced, custom_payload) click to toggle source
# File lib/escobar/heroku/build_request.rb, line 55
def create(task, environment, ref, forced, custom_payload)
  raise_2fa_error if app.locked?

  @environment = environment
  @ref = ref
  @forced = forced
  @custom_payload = custom_payload

  create_in_api(task)
end
create_deployment_status(url, payload) click to toggle source
# File lib/escobar/heroku/build_request.rb, line 140
def create_deployment_status(url, payload)
  github_client.create_deployment_status(url, payload)
end
create_github_deployment(task) click to toggle source
# File lib/escobar/heroku/build_request.rb, line 127
def create_github_deployment(task)
  options = {
    ref: ref,
    task: task,
    auto_merge: !forced,
    payload: custom_payload.merge(custom_deployment_payload),
    environment: environment,
    required_contexts: required_commit_contexts
  }
  response = github_client.create_deployment(options)
  handle_github_deployment_response(response)
end
create_github_deployment_status(url, target_url, state, description) click to toggle source
# File lib/escobar/heroku/build_request.rb, line 153
def create_github_deployment_status(url, target_url, state, description)
  payload = {
    state: state,
    target_url: target_url,
    description: description
  }
  create_deployment_status(url, payload)
end
create_github_pending_deployment_status(heroku_build) click to toggle source
# File lib/escobar/heroku/build_request.rb, line 144
def create_github_pending_deployment_status(heroku_build)
  create_github_deployment_status(
    github_deployment_url,
    heroku_build.dashboard_build_output_url,
    "pending",
    "Build running."
  )
end
create_heroku_build() click to toggle source
# File lib/escobar/heroku/build_request.rb, line 98
def create_heroku_build
  body = {
    source_blob: {
      url: github_client.archive_link(sha),
      version: sha,
      version_description: "#{pipeline.github_repository}:#{sha}"
    }
  }
  app.client.heroku.post("/apps/#{app.name}/builds", body)
end
create_in_api(task) click to toggle source
# File lib/escobar/heroku/build_request.rb, line 71
def create_in_api(task)
  create_github_deployment(task)

  build = create_heroku_build
  if build["id"] =~ Escobar::UUID_REGEX
    process_heroku_build(build)
  else
    raise error_for(
      "Unable to create heroku build for #{app.name}: #{build['message']}"
    )
  end
end
custom_deployment_payload() click to toggle source
# File lib/escobar/heroku/build_request.rb, line 162
def custom_deployment_payload
  { name: app.name, pipeline: pipeline.to_hash, provider: "slash-heroku" }
end
error_for(message) click to toggle source
# File lib/escobar/heroku/build_request.rb, line 47
def error_for(message)
  Error.new_from_build_request(self, message)
end
github_client() click to toggle source
# File lib/escobar/heroku/build_request.rb, line 171
def github_client
  @github_client ||= Escobar::GitHub::Client.new(
    app.client.github_token,
    pipeline.github_repository
  )
end
handle_github_deployment_error(response) click to toggle source
# File lib/escobar/heroku/build_request.rb, line 119
def handle_github_deployment_error(response)
  error = Escobar::GitHub::DeploymentError.new(
    pipeline.github_repository, response, required_commit_contexts
  )
  raise error_for(error.default_message) unless error.missing_contexts?
  raise MissingContextsError.new_from_build_request_and_error(self, error)
end
handle_github_deployment_response(response) click to toggle source
# File lib/escobar/heroku/build_request.rb, line 109
def handle_github_deployment_response(response)
  unless response["sha"]
    handle_github_deployment_error(response)
  end

  @sha = response["sha"]
  @github_deployment_url = response["url"]
  response
end
process_heroku_build(build) click to toggle source
# File lib/escobar/heroku/build_request.rb, line 84
def process_heroku_build(build)
  heroku_build = Escobar::Heroku::Build.new(
    pipeline.client, app_id, build["id"]
  )

  create_github_pending_deployment_status(heroku_build)

  heroku_build.github_url = github_deployment_url
  heroku_build.pipeline_name = pipeline.name
  heroku_build.sha = sha

  heroku_build
end
raise_2fa_error() click to toggle source
# File lib/escobar/heroku/build_request.rb, line 66
def raise_2fa_error
  message = "Application requires second factor: #{app.name}"
  raise RequiresTwoFactorError.new_from_build_request(self, message)
end
required_commit_contexts() click to toggle source
# File lib/escobar/heroku/build_request.rb, line 166
def required_commit_contexts
  return [] if forced
  pipeline.required_commit_contexts(false)
end