class Jenkins::Builder::App

Attributes

client[RW]
config[RW]
options[RW]

Public Class Methods

new(service = nil, options={}) click to toggle source
# File lib/jenkins/builder/app.rb, line 33
def initialize(service = nil, options={})
  @options = options
  @service = service
  @config = Jenkins::Builder::Config.new(@service)

  if @config.url && @config.username && @config.password
    @client = JenkinsApi::Client.new(server_url: @config.url,
                                    username: @config.username,
                                    password: @config.password)
  end
end

Public Instance Methods

all_branches() click to toggle source
# File lib/jenkins/builder/app.rb, line 134
def all_branches
  @config.branches
end
all_jobs() click to toggle source
# File lib/jenkins/builder/app.rb, line 130
def all_jobs
  @client.job.list_all
end
build(job) click to toggle source
# File lib/jenkins/builder/app.rb, line 105
def build(job)
  job_name, branch = job.split(':')
  latest_build_no = @client.job.get_current_build_number(job_name)
  start_build(job_name, branch)
  check_and_show_result(job_name, latest_build_no)
end
build_each(jobs) click to toggle source
# File lib/jenkins/builder/app.rb, line 87
def build_each(jobs)
  if @options[:failfast]
    failed_job = jobs.find { |job| build(job).nil? }
    if failed_job
      exit 1
    else
      exit 0
    end
  else
    results = jobs.map { |job| build(job) }
    if results.any? { |r| r.nil? }
      exit 1
    else
      exit 0
    end
  end
end
check_and_show_result(job_name, latest_build_no) click to toggle source
# File lib/jenkins/builder/app.rb, line 187
def check_and_show_result(job_name, latest_build_no)
  while (build_no = @client.job.get_current_build_number(job_name)) <= latest_build_no
    sleep 1
  end
  printed_size = 0
  if @options[:silent]
    spinner = TTY::Spinner.new(':spinner Building ...', format: :bouncing_ball)
    spinner.auto_spin
  end

  all_console_output = ''

  loop do
    console_output = @client.job.get_console_output(job_name, build_no, 0, 'text')
    all_console_output = console_output['output']
    print console_output['output'][printed_size..-1] unless @options[:silent]
    printed_size = console_output['output'].size
    break unless console_output['more']
    sleep 0.5
  end
  if @options[:silent]
    spinner.stop
  end
  status = @client.job.get_build_details(job_name, build_no)
  msg = "Build Result: [#{status['result']}]"
  pastel = Pastel.new
  if msg =~ /SUCCESS/
    puts pastel.green.bold(msg)
  else
    puts pastel.red.bold(msg)
  end

  if hooks = @config.hooks_of(job_name)
    hooks.each do |hook|
      puts pastel.green('Execute hook: "%s"' % hook)
      begin
        IO.popen(hook, 'r+') do |process|
          process.print(all_console_output)
          process.each { |line| print line }
        end
      rescue Interrupt
        puts
        puts pastel.red('User Canceld hook: "%s"' % hook)
      end
    end
  end

  msg =~ /SUCCESS/
end
create_alias(name, command) click to toggle source
# File lib/jenkins/builder/app.rb, line 66
def create_alias(name, command)
  @config.aliases ||= {}
  @config.aliases[name] = command
  @config.save!
end
delete_alias(name) click to toggle source
# File lib/jenkins/builder/app.rb, line 72
def delete_alias(name)
  if @config.aliases.nil? || @config.aliases.empty?
    return
  end

  @config.aliases.delete(name)
  @config.save!
end
fetch_all_jobs() click to toggle source
# File lib/jenkins/builder/app.rb, line 112
def fetch_all_jobs
  refresh_jobs_cache unless validate_jobs_cache
  @config['services'][@service]['jobs-cache']['jobs']
end
job_detail(job_name) click to toggle source
# File lib/jenkins/builder/app.rb, line 138
def job_detail(job_name)
  @client.job.list_details(job_name)
end
list_aliases() click to toggle source
# File lib/jenkins/builder/app.rb, line 81
def list_aliases
  @config.aliases.each do |k, v|
    puts "%-10s -->     %s" % [k, v]
  end
end
print_info(options) click to toggle source
refresh_jobs_cache() click to toggle source
# File lib/jenkins/builder/app.rb, line 117
def refresh_jobs_cache
  @config['services'][@service]['jobs-cache'] = {
    'expire' => (Time.now + 86400*30).strftime('%F %T'),
    'jobs' => all_jobs
  }
  @config.save!
end
setup(options) click to toggle source
# File lib/jenkins/builder/app.rb, line 45
def setup(options)
  validate_credentials!(options)

  config.url = options[:url]
  config.username = options[:username]
  config.branches = options[:branches]
  config.password = options[:password]
  config.save!

  puts 'Credentials setup successfully.'
end
start_build(job_name, branch) click to toggle source
# File lib/jenkins/builder/app.rb, line 146
def start_build(job_name, branch)
  if use_mbranch?(job_name)
    msg = "#{job_name} with branch #{branch}"
    mbranch_param = {name: 'mbranch', value: branch}
    params = mbranch_param.merge(json: {parameter: mbranch_param}.to_json)
    begin
      @client.api_post_request("/job/#{job_name}/build?delay=0sec", params, true)
    rescue JenkinsApi::Exceptions::ForbiddenWithCrumb => e
      start_build_use_ferrum(job_name, branch)
    end
  else
    msg = job_name
    begin
      @client.api_post_request("/job/#{job_name}/build?delay=0sec")
    rescue JenkinsApi::Exceptions::ForbiddenWithCrumb => e
      start_build_use_ferrum(job_name, nil)
    end
  end
  puts Pastel.new.cyan.bold("\n%s%s  %s  %s%s\n" % [' '*30, '★ '*5, msg, '★ '*5, ' '*30])
end
start_build_use_ferrum(job_name, branch) click to toggle source
# File lib/jenkins/builder/app.rb, line 167
def start_build_use_ferrum(job_name, branch)
  browser = Ferrum::Browser.new(headless: true)
  browser.goto("#{config.url}/login")
  username_input = browser.at_css('input[name=j_username]')
  password_input = browser.at_css('input[name=j_password]')
  username_input.focus.type(config.username)
  password_input.focus.type(config.password)
  browser.at_css('input[name=Submit]').click
  if branch
    browser.goto("#{config.url}/job/#{job_name}/build?delay=0sec")
    sleep(2)
    browser.evaluate("document.querySelector('#gitParameterSelect').value = '#{branch}'")
    browser.at_css('#yui-gen1-button').click
  else
    browser.goto("#{config.url}/job/#{job_name}/")
    browser.at_css('#tasks a.task-link[onclick^=return\ build]').click
  end
  browser.quit
end
use_mbranch?(job_name) click to toggle source
# File lib/jenkins/builder/app.rb, line 142
def use_mbranch?(job_name)
  job_detail(job_name).to_s =~ /mbranch/
end
validate_jobs_cache() click to toggle source
# File lib/jenkins/builder/app.rb, line 125
def validate_jobs_cache
  @config['services'][@service]['jobs-cache'] && !@config['services'][@service]['jobs-cache'].empty? && \
    Time.parse(@config['services'][@service]['jobs-cache']['expire']) > Time.now
end

Private Instance Methods

validate_credentials!(options) click to toggle source
# File lib/jenkins/builder/app.rb, line 239
def validate_credentials!(options)
  @client = JenkinsApi::Client.new(server_url: options[:url],
                                   username: options[:username],
                                   password: options[:password])
  @client.job.list_all
rescue JenkinsApi::Exceptions::Unauthorized => e
  raise e.message
end