class JenkinsPipelineBuilder::Generator

Attributes

job_collection[RW]
job_templates[RW]
module_registry[RW]
no_files[RW]

Public Class Methods

new() click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 29
def initialize
  @job_templates = {}
  @extensions = {}
  @module_registry = ModuleRegistry.new
  @job_collection = JobCollection.new
end

Public Instance Methods

bootstrap(path, project_name = nil) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 53
def bootstrap(path, project_name = nil)
  logger.info "Bootstrapping pipeline from path #{path}"
  load_job_collection path unless job_collection.loaded?
  publish(project_name || job_collection.projects.first[:name])
end
client() click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 40
def client
  JenkinsPipelineBuilder.client
end
dump(job_name) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 82
def dump(job_name)
  logger.info "Debug #{JenkinsPipelineBuilder.debug}"
  logger.info "Dumping #{job_name} into #{job_name}.xml"
  xml = client.job.get_config(job_name)
  File.open(job_name + '.xml', 'w') { |f| f.write xml }
end
file(path, project_name) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 76
def file(path, project_name)
  logger.info "Generating files from path #{path}"
  JenkinsPipelineBuilder.file_mode!
  bootstrap(path, project_name)
end
logger() click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 36
def logger
  JenkinsPipelineBuilder.logger
end
projects(path) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 48
def projects(path)
  load_job_collection path unless job_collection.loaded?
  job_collection.projects.map { |p| p[:name] }
end
pull_request(path, project_name, base_branch_only = false) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 59
def pull_request(path, project_name, base_branch_only = false)
  logger.info "Pull Request Generator Running from path #{path}"
  load_job_collection path unless job_collection.loaded?
  defaults = job_collection.defaults[:value]
  pr_generator = PullRequestGenerator.new defaults
  pr_generator.delete_closed_prs
  errors = []
  pr_generator.open_prs.each do |pr|
    next if base_branch_only && defaults[:git_branch] != pr[:base]

    pr_generator.convert! job_collection, pr[:number]
    error = publish(project_name)
    errors << error unless error.empty?
  end
  errors.empty?
end
resolve_job_by_name(name, settings = {}) click to toggle source

Works for jobs, views, and promotions

# File lib/jenkins_pipeline_builder/generator.rb, line 104
def resolve_job_by_name(name, settings = {})
  job = job_collection.get_item(name)
  raise "Failed to locate job by name '#{name}'" if job.nil?

  job_value = job[:value]
  logger.debug "Compiling job #{name}"
  compiler = JenkinsPipelineBuilder::Compiler.new self
  success, payload = compiler.compile_job(job_value, settings)
  [success, payload]
end
Also aliased as: resolve_section_by_name
resolve_project(project) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 89
def resolve_project(project)
  defaults = job_collection.defaults
  settings = defaults.nil? ? {} : defaults[:value] || {}
  compiler = JenkinsPipelineBuilder::Compiler.new self
  project[:settings] = compiler.get_settings_bag(project, settings)

  errors = process_project project

  print_project_errors errors
  return false, 'Encountered errors exiting' unless errors.empty?

  [true, project]
end
resolve_section_by_name(name, settings = {})
Alias for: resolve_job_by_name
view() click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 44
def view
  JenkinsPipelineBuilder::View.new(self)
end

Private Instance Methods

create_jobs_and_views(project) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 190
def create_jobs_and_views(project)
  success, payload = resolve_project(project)
  return { project[:name].to_s => 'Failed to resolve' } unless success

  logger.info 'successfully resolved project'
  compiled_project = payload

  errors = publish_jobs(compiled_project[:value][:jobs])

  publish_views(compiled_project[:value][:views]) if compiled_project[:value][:views]

  if compiled_project[:value][:promotions]
    publish_promotions(compiled_project[:value][:promotions], compiled_project[:value][:jobs])
  end
  errors
end
load_job_collection(path) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 118
def load_job_collection(path)
  job_collection.load_from_path(path)
  job_collection.remote_dependencies.cleanup
end
print_compile_errors(errors) click to toggle source
print_project_errors(errors) click to toggle source
process_job_changes!(jobs) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 163
def process_job_changes!(jobs)
  jobs.each do |job|
    job_id = job.keys.first
    j = job_collection.get_item(job_id)

    next unless j

    Utils.hash_merge!(j, job[job_id])
    j[:value][:name] = j[:value][:job_name] if j[:value][:job_name]
  end
end
process_pipeline_section(section, project, errors = {}) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 175
def process_pipeline_section(section, project, errors = {})
  section.each do |item|
    item_id = item.keys.first
    settings = project[:settings].clone.merge(item[item_id])
    success, payload = resolve_section_by_name(item_id, settings)

    if success
      item[:result] = payload
    else
      errors[item_id] = payload
    end
  end
  errors
end
process_project(project) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 133
def process_project(project)
  errors = {}
  project_body = project[:value]

  %i[jobs views promotions].each do |key|
    next unless project_body[key]

    Utils.symbolize_with_empty_hash!(project_body[key])
    process_job_changes!(project_body[:jobs]) if key == :jobs
    process_pipeline_section(project_body[key], project, errors)
  end

  logger.info project
  errors
end
publish(project_name) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 123
def publish(project_name)
  errors = if job_collection.projects.any?
             publish_project(project_name)
           else
             publish_jobs(job_collection.standalone_jobs)
           end
  print_compile_errors errors
  errors
end
publish_jobs(jobs, errors = {}) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 237
def publish_jobs(jobs, errors = {})
  jobs.each do |i|
    logger.info "Processing #{i}"
    job = i[:result]
    raise "Result is empty for #{i}" if job.nil?

    job = Job.new job
    success, payload = job.create_or_update
    errors[job.name] = payload unless success
  end
  errors
end
publish_project(project_name) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 207
def publish_project(project_name)
  project = job_collection.projects.find { |p| p[:name] == project_name }
  create_jobs_and_views(project || raise("Project #{project_name} not found!"))
end
publish_promotions(promotions, jobs) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 212
def publish_promotions(promotions, jobs)
  # Converts a list of jobs that might have a list of promoted_builds to
  # A hash of promoted_builds names => associated job names
  promotion_job_pairs = jobs.each_with_object({}) do |j, acc|
    next unless j[:result][:promoted_builds]

    j[:result][:promoted_builds].each do |promotion_name|
      acc[promotion_name] = j[:result][:name]
    end
  end

  promotions.each do |promotion|
    compiled_promotion = promotion[:result]
    associated_job_name = promotion_job_pairs[compiled_promotion[:name]]
    Promotion.new(self).create(compiled_promotion, associated_job_name)
  end
end
publish_views(views) click to toggle source
# File lib/jenkins_pipeline_builder/generator.rb, line 230
def publish_views(views)
  views.each do |view|
    compiled_view = view[:result]
    View.new(self).create(compiled_view)
  end
end