class JenkinsPipelineBuilder::Job

Attributes

job[RW]

Public Class Methods

new(job) click to toggle source
# File lib/jenkins_pipeline_builder/job.rb, line 5
def initialize(job)
  @job = job
end

Public Instance Methods

create_or_update() click to toggle source
# File lib/jenkins_pipeline_builder/job.rb, line 17
def create_or_update
  success, payload = to_xml
  return success, payload unless success

  xml = payload
  return local_output(xml) if JenkinsPipelineBuilder.debug || JenkinsPipelineBuilder.file_mode

  JenkinsPipelineBuilder.client.job.create_or_update(name, xml)
  [true, nil]
end
logger() click to toggle source
# File lib/jenkins_pipeline_builder/job.rb, line 13
def logger
  JenkinsPipelineBuilder.logger
end
name() click to toggle source
# File lib/jenkins_pipeline_builder/job.rb, line 9
def name
  job[:name]
end
to_xml() click to toggle source
# File lib/jenkins_pipeline_builder/job.rb, line 28
def to_xml
  raise 'Job name is not specified' unless name

  logger.info "Creating Yaml Job #{job}"
  job[:job_type] = 'free_style' unless job[:job_type]
  type = job[:job_type]
  return false, "Job type: #{type} is not one of #{job_methods.join(', ')}" unless known_type? type

  @xml = setup_freestyle_base(job)
  payload = send("update_#{type}")

  [true, payload]
end

Private Instance Methods

build_job_dsl(job, xml) click to toggle source
# File lib/jenkins_pipeline_builder/job.rb, line 79
def build_job_dsl(job, xml)
  xml.send('javaposse.jobdsl.plugin.ExecuteDslScripts') do
    if job.key?(:job_dsl)
      xml.scriptText job[:job_dsl]
      xml.usingScriptText true
    else
      xml.targets job[:job_dsl_targets]
      xml.usingScriptText false
    end
    xml.ignoreExisting false
    xml.removedJobAction 'IGNORE'
  end
end
job_methods() click to toggle source
# File lib/jenkins_pipeline_builder/job.rb, line 54
def job_methods
  %w[job_dsl multi_project build_flow free_style pull_request_generator]
end
known_type?(type) click to toggle source
# File lib/jenkins_pipeline_builder/job.rb, line 50
def known_type?(type)
  job_methods.include? type
end
local_output(xml) click to toggle source
# File lib/jenkins_pipeline_builder/job.rb, line 58
def local_output(xml)
  logger.info "Will create job #{job}"
  logger.info xml.to_s if @debug
  FileUtils.mkdir_p(out_dir) unless File.exist?(out_dir)
  File.open("#{out_dir}/#{name}.xml", 'w') { |f| f.write xml }
  [true, nil]
end
out_dir() click to toggle source
# File lib/jenkins_pipeline_builder/job.rb, line 66
def out_dir
  'out/xml'
end
setup_freestyle_base(params) click to toggle source
# File lib/jenkins_pipeline_builder/job.rb, line 109
def setup_freestyle_base(params)
  # I'm pretty unclear what these templates are...
  if params.key?(:template)
    template_name = params[:template]
    raise "Job template '#{template_name}' can't be resolved." unless @job_templates.key?(template_name)

    params.delete(:template)
    template = @job_templates[template_name]
    params = template.deep_merge(params)
  end

  xml = JenkinsPipelineBuilder.client.job.build_freestyle_config(params)
  n_xml = Nokogiri::XML(xml, &:noblanks)

  logger.debug 'Loading the required modules'
  JenkinsPipelineBuilder.registry.traverse_registry_path('job', params, n_xml)
  logger.debug 'Module loading complete'

  n_xml.to_xml
end
update_build_flow() click to toggle source
# File lib/jenkins_pipeline_builder/job.rb, line 100
def update_build_flow
  n_xml = Nokogiri::XML(@xml)
  n_xml.root.name = 'com.cloudbees.plugins.flow.BuildFlow'
  Nokogiri::XML::Builder.with(n_xml.root) do |b_xml|
    b_xml.dsl job[:build_flow]
  end
  n_xml.to_xml
end
update_job_dsl() click to toggle source
# File lib/jenkins_pipeline_builder/job.rb, line 70
def update_job_dsl
  n_xml = Nokogiri::XML(@xml)
  n_builders = n_xml.xpath('//builders').first
  Nokogiri::XML::Builder.with(n_builders) do |b_xml|
    build_job_dsl(job, b_xml)
  end
  n_xml.to_xml
end
update_multi_project() click to toggle source
# File lib/jenkins_pipeline_builder/job.rb, line 93
def update_multi_project
  n_xml = Nokogiri::XML(@xml)
  root = n_xml.root
  root.name = 'com.tikal.jenkins.plugins.multijob.MultiJobProject'
  n_xml.to_xml
end