class R10kDeployer

Attributes

control_repo_path[R]
options[R]
path[R]
previous_branch[R]

Public Class Methods

new(path, opts) click to toggle source
# File lib/release_manager/r10k_deployer.rb, line 14
def initialize(path, opts)
  @path = path
  @options = opts
end
run(path, options) click to toggle source
# File lib/release_manager/r10k_deployer.rb, line 38
def self.run(path, options)
  begin
    deploy = new(path, options)
    deploy.check_requirements
    deploy.logger.info "Deploying R10k-Control #{options[:dest_ref]} with version: #{options[:src_ref]}"
    deploy.run
  rescue GitError => e
    deploy.logger.fatal(e.message)
    code = 1
  rescue Gitlab::Error::Forbidden => e
    logger.fatal(e.message)
    logger.fatal("You don't have access to modify the repository")
  rescue Gitlab::Error::MissingCredentials => e
    deploy.logger.fatal(e.message)
    code = 1
  rescue PatchError => e
    deploy.logger.fatal(e.message)
    code = 1
  rescue ModNotFoundException => e
    deploy.logger.fatal(e.message)
    code = 1
  rescue InvalidBranchName => e
    deploy.logger.fatal(e.message)
    code = 1
  rescue InvalidMetadataSource
    deploy.logger.fatal "The puppet module's metadata.json source field must be a git url: ie. git@someserver.com:devops/module.git"
    code = 1
  rescue PuppetfileNotFoundException
    deploy.logger.fatal "Cannot find the puppetfile at #{puppetfile_path}"
    code = 1
  rescue InvalidModuleNameException => e
    deploy.logger.fatal e.message
    code = 1
  rescue Gitlab::Error::NotFound => e
    deploy.logger.fatal e.message
    deploy.logger.fatal "Either the project does not exist or you do not have enough permissions"
    code = 1
  rescue Exception => e
    deploy.logger.fatal e.message
    deploy.logger.fatal e.backtrace.join("\n")
    code = 1
  ensure
    exit code.to_i
  end
end

Public Instance Methods

check_requirements() click to toggle source
# File lib/release_manager/r10k_deployer.rb, line 88
def check_requirements
  raise PuppetfileNotFoundException unless File.exists?(control_repo_path)
end
cleanup(branch = nil) click to toggle source
# File lib/release_manager/r10k_deployer.rb, line 31
def cleanup(branch = nil)
  control_repo.checkout_branch(previous_branch, strategy: :force)
  control_repo.delete_branch(branch) if branch
end
control_repo() click to toggle source
# File lib/release_manager/r10k_deployer.rb, line 84
def control_repo
  @control_repo ||= setup_control_repo(puppetfile.source)
end
run() click to toggle source
# File lib/release_manager/r10k_deployer.rb, line 19
def run
  begin
    @previous_branch = options[:src_ref]
    mr, branch_name = create_mr(options[:src_ref], options[:dest_ref], options[:remote])
  ensure
    # cleanup branch, checkout previous branch
  end
  if mr
    puts mr.web_url
  end
end

Private Instance Methods

create_mr(src_ref, dest_ref, remote = false) click to toggle source
# File lib/release_manager/r10k_deployer.rb, line 94
def create_mr(src_ref, dest_ref, remote = false)
  url = puppetfile.source
  message = "auto deploy #{src_ref} to #{dest_ref}"
  branch_name = "#{dest_ref}_#{rand(10000)}"
  control_repo.create_branch(branch_name, "upstream/#{dest_ref}")
  control_repo.checkout_branch(branch_name, strategy: :force )
  diff = control_repo.create_diff(src_ref,branch_name)
  return control_repo.logger.info("nothing to commit or deploy") if diff.deltas.count < 1
  Tempfile.open('git_patch') do |patchfile|
    patchfile.write(diff.patch)
    patchfile.rewind  # allows us to read from the beginning of the file
    control_repo.apply_patch(patchfile.path)
    control_repo.add_all
  end
  # since we added everything locally we don't create a remote commit
  successful_commit = control_repo.commit(message, nil, nil, false)
  control_repo.push_branch('myfork', branch_name, true) if successful_commit
  mr = control_repo.create_merge_request(control_repo.url, message, {
      source_branch: branch_name,
      target_branch: dest_ref,
      remove_source_branch: true,
      target_project_url: url
  })  if successful_commit
  return [mr, branch_name]
end
puppetfile() click to toggle source

@return [Puppetfile] - instance of Puppetfile object

# File lib/release_manager/r10k_deployer.rb, line 135
def puppetfile
  @puppetfile ||= begin
    file = options[:puppetfile] || File.join(path, 'Puppetfile')
    Puppetfile.new(file)
  end
end
setup_control_repo(url) click to toggle source

@return [ControlRepo] - creates a new control repo object and clones the url unless already cloned @param [String] url - the url to clone and fork

# File lib/release_manager/r10k_deployer.rb, line 122
def setup_control_repo(url)
  # clone r10k unless already cloned
  fork = create_repo_fork(url)
  c = ControlRepo.create(control_repo_path, fork.ssh_url_to_repo)
  c.add_remote(fork.ssh_url_to_repo, 'myfork',true)
  c.fetch('myfork')
  c.fetch('origin')
  c.add_remote(url, 'upstream', true)
  c.fetch('upstream')
  c
end