Class: JenkinsApi::Client::Job

Inherits:
Object
  • Object
show all
Includes:
UriHelper
Defined in:
lib/jenkins_api_client/job.rb

Overview

This class communicates with the Jenkins “/job” API to obtain details about jobs, creating, deleting, building, and various other operations.

Constant Summary collapse

JENKINS_QUEUE_ID_SUPPORT_VERSION =

Version that jenkins started to include queued build info in build response

'1.519'

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from UriHelper

#form_encode, #path_encode

Constructor Details

#initialize(client, *plugin_settings) ⇒ Job

Initialize the Job object and store the reference to Client object

Parameters:

  • client (Client)

    the client object



44
45
46
47
48
# File 'lib/jenkins_api_client/job.rb', line 44

def initialize(client, *plugin_settings)
  @client = client
  @logger = @client.logger
  @plugin_collection = JenkinsApi::Client::PluginSettings::Collection.new(*plugin_settings)
end

Instance Attribute Details

#plugin_collectionObject (readonly)

Returns the value of attribute plugin_collection.



36
37
38
# File 'lib/jenkins_api_client/job.rb', line 36

def plugin_collection
  @plugin_collection
end

Instance Method Details

#add_downstream_projects(job_name, downstream_projects, threshold, overwrite = false) ⇒ String

Add downstream projects to a specific job given the job name, projects to be added as downstream projects, and the threshold

Parameters:

  • job_name (String)
  • downstream_projects (String)
  • threshold (String)
    • failure, success, or unstable

  • overwrite (Boolean) (defaults to: false)
    • true or false

Returns:

  • (String)

    response_code return code from HTTP POST



1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
# File 'lib/jenkins_api_client/job.rb', line 1326

def add_downstream_projects(job_name,
                            downstream_projects,
                            threshold, overwrite = false)
  @logger.info "Adding #{downstream_projects.inspect} as downstream" +
    " projects for '#{job_name}' with the threshold of '#{threshold}'" +
    " and overwrite option of '#{overwrite}'"
  name, ord, col = get_threshold_params(threshold)
  xml = get_config(job_name)
  n_xml = Nokogiri::XML(xml)
  child_projects_node = n_xml.xpath("//childProjects").first
  if child_projects_node
    if overwrite
      child_projects_node.content = "#{downstream_projects}"
    else
      to_replace = child_projects_node.content +
        ", #{downstream_projects}"
      child_projects_node.content = to_replace
    end
  else
    publisher_node = n_xml.xpath("//publishers").first
    build_trigger_node = publisher_node.add_child(
      "<hudson.tasks.BuildTrigger/>"
    )
    child_project_node = build_trigger_node.first.add_child(
      "<childProjects>#{downstream_projects}</childProjects>"
    )
    threshold_node = child_project_node.first.add_next_sibling(
      "<threshold/>"
    )
    threshold_node.first.add_child(
      "<name>#{name}</name><ordinal>#{ord}</ordinal><color>#{col}</color>"
    )
  end
  xml_modified = n_xml.to_xml
  post_config(job_name, xml_modified)
end

#add_email_notification(params) ⇒ Object

Adding email notification to a job

Parameters:

  • params (Hash)

    parameters to add email notification

Options Hash (params):

  • :name (String)

    Name of the job

  • :notification_email (String)

    Email address to send

  • :notification_email_for_every_unstable (Boolean)

    Send email notification email for every unstable build



376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
# File 'lib/jenkins_api_client/job.rb', line 376

def add_email_notification(params)
  raise "No job name specified" unless params[:name]
  raise "No email address specified" unless params[:notification_email]
  @logger.info "Adding '#{params[:notification_email]}' to be" +
    " notified for '#{params[:name]}'"
  xml = get_config(params[:name])
  n_xml = Nokogiri::XML(xml)
  if n_xml.xpath("//hudson.tasks.Mailer").empty?
    p_xml = Nokogiri::XML::Builder.new(:encoding => "UTF-8") do |b_xml|
      notification_email(params, b_xml)
    end
    email_xml = Nokogiri::XML(p_xml.to_xml).xpath(
      "//hudson.tasks.Mailer"
    ).first
    n_xml.xpath("//publishers").first.add_child(email_xml)
    post_config(params[:name], n_xml.to_xml)
  end
end

#add_plugin(plugin) ⇒ JenkinsApi::Client::PluginSettings::Collection

Add a plugin to be included in job’s xml configureation

Parameters:

  • plugin (Jenkins::Api::Client::PluginSettings::Base)

Returns:



55
56
57
# File 'lib/jenkins_api_client/job.rb', line 55

def add_plugin(plugin)
  plugin_collection.add(plugin)
end

#add_skype_notification(params) ⇒ Object

Adding skype notificaiton to a job

Parameters:

  • params (Hash)

    parameters for adding skype notification

    • :name name of the job to add skype notification

    • :skype_targets skype targets for sending notifications to. Use * to specify group chats. Use space to separate multiple targets. Example: testuser, *testgroup.

    • :skype_strategy skype strategy to be used for sending notifications. Valid values: all, failure, failure_and_fixed, change. Default: change.

    • :skype_notify_on_build_start Default: false

    • :skype_notify_suspects Default: false

    • :skype_notify_culprits Default: false

    • :skype_notify_fixers Default: false

    • :skype_notify_upstream_committers Default: false

    • :skype_message what should be sent as notification message. Valid: just_summary, summary_and_scm_changes, summary_and_build_parameters, summary_scm_changes_and_failed_tests. Default: summary_and_scm_changes



415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
# File 'lib/jenkins_api_client/job.rb', line 415

def add_skype_notification(params)
  raise "No job name specified" unless params[:name]
  raise "No Skype target specified" unless params[:skype_targets]
  @logger.info "Adding Skype notification for '#{params[:name]}'"
  xml = get_config(params[:name])
  n_xml = Nokogiri::XML(xml)
  if n_xml.xpath("//hudson.plugins.skype.im.transport.SkypePublisher").empty?
    p_xml = Nokogiri::XML::Builder.new(:encoding => "UTF-8") do |b_xml|
      skype_notification(params, b_xml)
    end
    skype_xml = Nokogiri::XML(p_xml.to_xml).xpath(
      "//hudson.plugins.skype.im.transport.SkypePublisher"
    ).first
    n_xml.xpath("//publishers").first.add_child(skype_xml)
    post_config(params[:name], n_xml.to_xml)
  end
end

#artifact_archiver(artifact_params, xml) ⇒ Nokogiri::XML::Builder

Configure post-build step to archive artifacts

Parameters:

  • artifact_params (Hash)

    parameters controlling how artifacts are archived

Options Hash (artifact_params):

  • :artifact_files (String)

    pattern or names of files to archive

  • :excludes (String)

    pattern or names of files to exclude

  • :fingerprint (Boolean) — default: false

    fingerprint the archives

  • :allow_empty_archive (Boolean) — default: false

    whether to allow empty archives

  • :only_if_successful (Boolean) — default: false

    only archive if successful

  • :default_excludes (Boolean) — default: false

    exclude defaults automatically

Returns:

  • (Nokogiri::XML::Builder)


452
453
454
455
456
457
458
459
460
461
462
463
464
465
# File 'lib/jenkins_api_client/job.rb', line 452

def artifact_archiver(artifact_params, xml)
  return xml if artifact_params.nil?

  xml.send('hudson.tasks.ArtifactArchiver') do |x|
    x.artifacts artifact_params.fetch(:artifact_files) { '' }
    x.excludes artifact_params.fetch(:excludes) { '' }
    x.fingerprint artifact_params.fetch(:fingerprint) { false }
    x.allowEmptyArchive artifact_params.fetch(:allow_empty_archive) { false }
    x.onlyIfSuccessful artifact_params.fetch(:only_if_successful) { false }
    x.defaultExcludes artifact_params.fetch(:default_excludes) { false }
  end

  xml
end

#block_build_when_downstream_building(job_name) ⇒ String

Block the build of the job when downstream is building

Parameters:

  • job_name (String)

Returns:

  • (String)

    response_code return code from HTTP POST



1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
# File 'lib/jenkins_api_client/job.rb', line 1120

def block_build_when_downstream_building(job_name)
  @logger.info "Blocking builds of '#{job_name}' when downstream" +
    " projects are building"
  xml = get_config(job_name)
  n_xml = Nokogiri::XML(xml)
  node = n_xml.xpath("//blockBuildWhenDownstreamBuilding").first
  if node.content == "false"
    node.content = "true"
    xml_modified = n_xml.to_xml
    post_config(job_name, xml_modified)
  end
end

#block_build_when_upstream_building(job_name) ⇒ String

Block the build of the job when upstream is building

Parameters:

  • job_name (String)

Returns:

  • (String)

    response_code return code from HTTP POST



1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
# File 'lib/jenkins_api_client/job.rb', line 1158

def block_build_when_upstream_building(job_name)
  @logger.info "Blocking builds of '#{job_name}' when upstream" +
    " projects are building"
  xml = get_config(job_name)
  n_xml = Nokogiri::XML(xml)
  node = n_xml.xpath("//blockBuildWhenUpstreamBuilding").first
  if node.content == "false"
    node.content = "true"
    xml_modified = n_xml.to_xml
    post_config(job_name, xml_modified)
  end
end

#build(job_name, params = {}, opts = {}) ⇒ Integer, String

Build a Jenkins job, optionally waiting for build to start and returning the build number. Adds support for new/old Jenkins servers where build_queue id may not be available. Also adds support for periodic callbacks, and optional cancellation of queued_job if not started within allowable time window (if build_queue option available)

Notes:
  'opts' may be a 'true' or 'false' value to maintain
    compatibility with old method signature, where true indicates
  'return_build_number'. In this case, true is translated to:
    { 'build_start_timeout' => @client_timeout }
    which simulates earlier behavior.

progress_proc
  Optional proc that is called periodically while waiting for
  build to start.
  Initial call (with poll_count == 0) indicates build has been
  requested, and that polling is starting.
  Final call will indicate one of build_started or cancelled.
  params:
    max_wait [Integer] Same as opts['build_start_timeout']
    current_wait [Integer]
    poll_count [Integer] How many times has queue been polled

completion_proc
  Optional proc that is called <just before> the 'build' method
  exits.
  params:
    build_number [Integer]  Present if build started or nil
    build_cancelled [Boolean]  True if build timed out and was
      successfully removed from build-queue

Parameters:

  • job_name (String)

    the name of the job

  • params (Hash) (defaults to: {})

    the parameters for parameterized build

  • opts (Hash) (defaults to: {})

    options for this method

    • build_start_timeout [Integer] How long to wait for queued build to start before giving up. Default: 0/nil

    • cancel_on_build_start_timeout [Boolean] Should an attempt be made to cancel the queued build if it hasn’t started within ‘build_start_timeout’ seconds? This only works on newer versions of Jenkins where JobQueue is exposed in build post response. Default: false

    • poll_interval [Integer] How often should we check with CI Server while waiting for start. Default: 2 (seconds)

    • progress_proc [Proc] A proc that will receive progress notitications. Default: nil

    • completion_proc [Proc] A proc that is called <just before> this method (build) exits. Default: nil

Returns:

  • (Integer)

    build number, or nil if not started (IF TIMEOUT SPECIFIED)

  • (String)

    HTTP response code (per prev. behavior) (NO TIMEOUT SPECIFIED)



827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
# File 'lib/jenkins_api_client/job.rb', line 827

def build(job_name, params={}, opts = {})
  if opts.nil? || opts.class.is_a?(FalseClass)
    opts = {}
  elsif opts.class.is_a?(TrueClass)
    opts = { 'build_start_timeout' => @client_timeout }
  end

  opts['job_name'] = job_name

  msg = "Building job '#{job_name}'"
  msg << " with parameters: #{params.inspect}" unless params.empty?
  @logger.info msg

  if (opts['build_start_timeout'] || 0) > 0
    # Best-guess build-id
    # This is only used if we go the old-way below... but we can use this number to detect if multiple
    # builds were queued
    current_build_id = get_current_build_number(job_name)
    expected_build_id = current_build_id > 0 ? current_build_id + 1 : 1
  end

  if (params.nil? or params.empty?)
    response = @client.api_post_request("/job/#{path_encode job_name}/build",
      {},
      true)
  else
    response = @client.api_post_request("/job/#{path_encode job_name}/buildWithParameters",
      params,
      true)
  end

  if (opts['build_start_timeout'] || 0) > 0
    if @client.compare_versions(@client.get_jenkins_version, JENKINS_QUEUE_ID_SUPPORT_VERSION) >= 0
      return get_build_id_from_queue(response, expected_build_id, opts)
    else
      return get_build_id_the_old_way(expected_build_id, opts)
    end
  else
    return response.code
  end
end

#build_freestyle_config(params) ⇒ String

Builds the XML configuration based on the parameters passed as a Hash

Parameters:

  • params (Hash)

    the parameters for building XML configuration

Returns:

  • (String)

    the generated XML configuration of the project

Raises:

  • (ArgumentError)


248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
# File 'lib/jenkins_api_client/job.rb', line 248

def build_freestyle_config(params)
  # Supported SCM providers
  supported_scm = ["git", "subversion", "cvs"]

  # Set default values for params that are not specified.
  raise ArgumentError, "Job name must be specified" \
    unless params.is_a?(Hash) && params[:name]

  [
    :keep_dependencies,
    :block_build_when_downstream_building,
    :block_build_when_upstream_building,
    :concurrent_build
  ].each do |param|
    params[param] = false if params[param].nil?
  end

  if params[:notification_email]
    if params[:notification_email_for_every_unstable].nil?
      params[:notification_email_for_every_unstable] = false
    end
    if params[:notification_email_send_to_individuals].nil?
      params[:notification_email_send_to_individuals] ||= false
    end
  end

  # SCM configurations and Error handling.
  unless params[:scm_provider].nil?
    unless supported_scm.include?(params[:scm_provider])
      raise "SCM #{params[:scm_provider]} is currently not supported"
    end
    raise "SCM URL must be specified" if params[:scm_url].nil?
    params[:scm_branch] = "master" if params[:scm_branch].nil?
    if params[:scm_use_head_if_tag_not_found].nil?
      params[:scm_use_head_if_tag_not_found] = false
    end
  end

  # Child projects configuration and Error handling
  if params[:child_threshold].nil? && !params[:child_projects].nil?
    params[:child_threshold] = "failure"
  end

  @logger.debug "Creating a freestyle job with params: #{params.inspect}"

  # Build the Job xml file based on the parameters given
  builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
    xml.project do
      xml.actions
      xml.description
      xml.keepDependencies "#{params[:keep_dependencies]}"
      xml.properties
      # SCM related stuff
      if params[:scm_provider] == 'subversion'
        # Build subversion related XML portion
        scm_subversion(params, xml)
      elsif params[:scm_provider] == "cvs"
        # Build CVS related XML portion
        scm_cvs(params, xml)
      elsif params[:scm_provider] == "git"
        # Build Git related XML portion
        scm_git(params, xml)
      else
        xml.scm(:class => "hudson.scm.NullSCM")
      end
      # Restrict job to run in a specified node
      if params[:restricted_node]
        xml.assignedNode "#{params[:restricted_node]}"
        xml.canRoam "false"
      else
        xml.canRoam "true"
      end
      xml.disabled "false"
      xml.blockBuildWhenDownstreamBuilding(
        "#{params[:block_build_when_downstream_building]}")
      xml.blockBuildWhenUpstreamBuilding(
        "#{params[:block_build_when_upstream_building]}")
      xml.triggers.vector do 
        if params[:timer]
          xml.send("hudson.triggers.TimerTrigger") do
            xml.spec params[:timer]
          end
        end

        if params[:scm_trigger]
          xml.send("hudson.triggers.SCMTrigger") do
            xml.spec params[:scm_trigger]
            xml.ignorePostCommitHooks params.fetch(:ignore_post_commit_hooks) { false }
          end
        end
      end
      xml.concurrentBuild "#{params[:concurrent_build]}"
      # Shell command stuff
      xml.builders do
        if params[:shell_command]
          xml.send("hudson.tasks.Shell") do
            xml.command "#{params[:shell_command]}"
          end
        end
      end
      # Adding Downstream projects
      xml.publishers do
        # Build portion of XML that adds child projects
        child_projects(params, xml) if params[:child_projects]
        # Build portion of XML that adds email notification
        notification_email(params, xml) if params[:notification_email]
        # Build portion of XML that adds skype notification
        skype_notification(params, xml) if params[:skype_targets]
        artifact_archiver(params[:artifact_archiver], xml)
      end
      xml.buildWrappers
    end
  end
  
  xml_doc = Nokogiri::XML(builder.to_xml)
  plugin_collection.configure(xml_doc).to_xml
end

#chain(job_names, threshold, criteria, parallel = 1) ⇒ Array

Chain the jobs given based on specified criteria

Parameters:

  • job_names (Array)

    Array of job names to be chained

  • threshold (String)

    threshold for running the next job

  • criteria (Array)

    criteria which should be applied for picking the jobs for the chain

  • parallel (Integer) (defaults to: 1)

    Number of jobs that should be considered for parallel run

Returns:

  • (Array)

    job_names Names of jobs that are in the top of the chain



1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
# File 'lib/jenkins_api_client/job.rb', line 1440

def chain(job_names, threshold, criteria, parallel = 1)
  raise "Parallel jobs should be at least 1" if parallel < 1
  unchain(job_names)

  @logger.info "Chaining jobs: #{job_names.inspect}" +
    " with threshold of '#{threshold}' and criteria as '#{criteria}'" +
    " with #{parallel} number of parallel jobs"
  filtered_job_names = []
  if criteria.include?("all") || criteria.empty?
    filtered_job_names = job_names
  else
    job_names.each do |job|
      filtered_job_names << job if criteria.include?(
        @client.job.get_current_build_status(job)
      )
    end
  end

  filtered_job_names.each_with_index do |job_name, index|
    break if index >= (filtered_job_names.length - parallel)
    @client.job.add_downstream_projects(
      job_name, filtered_job_names[index + parallel], threshold, true
    )
  end
  if parallel > filtered_job_names.length
    parallel = filtered_job_names.length
  end
  filtered_job_names[0..parallel-1]
end

#change_description(job_name, description) ⇒ String

Change the description of a specific job

Parameters:

  • job_name (String)
  • description (String)

Returns:

  • (String)

    response_code return code from HTTP POST



1104
1105
1106
1107
1108
1109
1110
1111
1112
# File 'lib/jenkins_api_client/job.rb', line 1104

def change_description(job_name, description)
  @logger.info "Changing the description of '#{job_name}' to '#{description}'"
  xml = get_config(job_name)
  n_xml = Nokogiri::XML(xml)
  desc = n_xml.xpath("//description").first
  desc.content = "#{description}"
  xml_modified = n_xml.to_xml
  post_config(job_name, xml_modified)
end

#color_to_status(color) ⇒ String

This method maps the color to status of a job

Parameters:

  • color (String)

    color given by the API for a job

Returns:

  • (String)

    status status of the given job matching the color



725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
# File 'lib/jenkins_api_client/job.rb', line 725

def color_to_status(color)
  case color
  when "blue"
    "success"
  when "red"
    "failure"
  when "yellow"
    "unstable"
  when /anime/
    "running"
  # In the recent version of Jenkins (> 1.517), jobs that are not built
  # yet have a color of "notbuilt" instead of "grey". Include that to the
  # not_run condition so it is backward compatible.
  when "grey", "notbuilt"
    "not_run"
  when "aborted"
    "aborted"
  else
    "invalid"
  end
end

#copy(from_job_name, to_job_name = nil) ⇒ String

Copy a job

Parameters:

  • from_job_name (String)

    the name of the job to copy from

  • to_job_name (String) (defaults to: nil)

    the name of the job to copy to

Returns:

  • (String)

    the response from the HTTP POST request



553
554
555
556
557
558
559
# File 'lib/jenkins_api_client/job.rb', line 553

def copy(from_job_name, to_job_name=nil)
  to_job_name = "copy_of_#{from_job_name}" if to_job_name.nil?
  @logger.info "Copying job '#{from_job_name}' to '#{to_job_name}'"
  @client.api_post_request(
    "/createItem?name=#{path_encode to_job_name}&mode=copy&from=#{path_encode from_job_name}"
  )
end

#create(job_name, xml) ⇒ String

Create a job with the name specified and the xml given

Parameters:

  • job_name (String)

    the name of the job

  • xml (String)

    the xml configuration of the job

Returns:

  • (String)

    the HTTP status code from the POST request

See Also:



102
103
104
105
# File 'lib/jenkins_api_client/job.rb', line 102

def create(job_name, xml)
  @logger.info "Creating job '#{job_name}'"
  @client.post_config("/createItem?name=#{form_encode job_name}", xml)
end

#create_freestyle(params) ⇒ String

Create a freestyle project by accepting a Hash of parameters. For the parameter description see #create_of_update_freestyle

Examples:

Create a Freestype Project

create_freestyle(
  :name => "test_freestyle_job",
  :keep_dependencies => true,
  :concurrent_build => true,
  :scm_provider => "git",
  :scm_url => "git://github.com./arangamani/jenkins_api_client.git",
  :scm_branch => "master",
  :shell_command => "bundle install\n rake func_tests"
)

Parameters:

  • params (Hash)

    the parameters for creating a job

Returns:

  • (String)

    the HTTP status code from the POST request

See Also:



221
222
223
224
# File 'lib/jenkins_api_client/job.rb', line 221

def create_freestyle(params)
  xml = build_freestyle_config(params)
  create(params[:name], xml)
end

#create_or_update(job_name, xml) ⇒ String

Create or Update a job with the name specified and the xml given

Parameters:

  • job_name (String)

    the name of the job

  • xml (String)

    the xml configuration of the job

Returns:

  • (String)

    the HTTP status code from the POST request

See Also:



84
85
86
87
88
89
90
# File 'lib/jenkins_api_client/job.rb', line 84

def create_or_update(job_name, xml)
  if exists?(job_name)
    update(job_name, xml)
  else
    create(job_name, xml)
  end
end

#create_or_update_freestyle(params) ⇒ String

Create or Update a job with params given as a hash instead of the xml This gives some flexibility for creating/updating simple jobs so the user doesn’t have to learn about handling xml.

Parameters:

  • params (Hash)

    parameters to create a freestyle project

Options Hash (params):

  • :name (String)

    the name of the job

  • :keep_dependencies (Boolean) — default: false

    whether to keep the dependencies or not

  • :block_build_when_downstream_building (Boolean) — default: false

    whether to block build when the downstream project is building

  • :block_build_when_upstream_building (Boolean) — default: false

    whether to block build when the upstream project is building

  • :concurrent_build (Boolean) — default: false

    whether to allow concurrent execution of builds

  • :scm_provider (String)

    the type of source control. Supported providers: git, svn, and cvs

  • :scm_url (String)

    the remote url for the selected scm provider

  • :scm_credentials_id (String)

    the id of the credentials to use for authenticating with scm. Only for “git”

  • :scm_module (String)

    the module to download. Only for use with “cvs” scm provider

  • :scm_branch (String) — default: master

    the branch to use in scm.

  • :scm_tag (String)

    the tag to download from scm. Only for use with “cvs” scm provider

  • :scm_use_head_if_tag_not_found (Boolean)

    whether to use head if specified tag is not found. Only for “cvs”

  • :timer (String)

    the timer for running builds periodically

  • :shell_command (String)

    the command to execute in the shell

  • :notification_email (String)

    the email for sending notification

  • :skype_targets (String)

    the skype targets for sending notifications to. Use * to specify group chats. Use space to separate multiple targets. Note that this option requires the “skype” plugin to be installed in jenkins. Example: testuser *testgroup

  • :skype_strategy (String) — default: change

    the skype strategy to be used for sending notifications. Valid values: all, failure, failure_and_fixed, change.

  • :skype_notify_on_build_start (Boolean) — default: false

    whether to notify skype targets on build start

  • :skype_notify_suspects (Boolean) — default: false

    whether to notify suspects on skype

  • :skype_notify_culprits (Boolean) — default: false

    whether to notify culprits on skype

  • :skype_notify_fixers (Boolean) — default: false

    whether to notify fixers on skype

  • :skype_notify_upstream_committers (Boolean) — default: false

    whether to notify upstream committers on skype

  • :skype_message (String) — default: summary_and_scm_changes

    the information to be sent as notification message. Valid: just_summary, summary_and_scm_changes, summary_and_build_parameters, summary_scm_changes_and_failed_tests.

  • :child_projects (String)

    the projects to add as downstream projects

  • :child_threshold (String) — default: failure

    the threshold for child projects. Valid options: success, failure, or unstable.

Returns:

  • (String)

    the HTTP status code from the POST request

See Also:



191
192
193
194
195
196
197
# File 'lib/jenkins_api_client/job.rb', line 191

def create_or_update_freestyle(params)
  if exists?(params[:name])
    update_freestyle(params)
  else
    create_freestyle(params)
  end
end

#delete(job_name) ⇒ String

Delete a job given the name

Parameters:

  • job_name (String)

    the name of the job to delete

Returns:

  • (String)

    the response from the HTTP POST request



483
484
485
486
# File 'lib/jenkins_api_client/job.rb', line 483

def delete(job_name)
  @logger.info "Deleting job '#{job_name}'"
  @client.api_post_request("/job/#{path_encode job_name}/doDelete")
end

#delete_all!Object

Note:

This method will remove all jobs from Jenkins. Please use with caution.

Deletes all jobs from Jenkins



493
494
495
496
# File 'lib/jenkins_api_client/job.rb', line 493

def delete_all!
  @logger.info "Deleting all jobs from jenkins"
  list_all.each { |job| delete(job) }
end

#disable(job_name) ⇒ Object

Disable a job given the name of the job

Parameters:

  • job_name (String)


1040
1041
1042
1043
# File 'lib/jenkins_api_client/job.rb', line 1040

def disable(job_name)
  @logger.info "Disabling job '#{job_name}'"
  @client.api_post_request("/job/#{path_encode job_name}/disable")
end

#enable(job_name) ⇒ Object

Enable a job given the name of the job

Parameters:

  • job_name (String)


1031
1032
1033
1034
# File 'lib/jenkins_api_client/job.rb', line 1031

def enable(job_name)
  @logger.info "Enabling job '#{job_name}'"
  @client.api_post_request("/job/#{path_encode job_name}/enable")
end

#execute_concurrent_builds(job_name, option) ⇒ String

Allow or disable concurrent build execution

Parameters:

  • job_name (String)
  • option (Bool)

    true or false

Returns:

  • (String)

    response_code return code from HTTP POST



1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
# File 'lib/jenkins_api_client/job.rb', line 1197

def execute_concurrent_builds(job_name, option)
  @logger.info "Setting the concurrent build execution option of" +
    " '#{job_name}' to #{option}"
  xml = get_config(job_name)
  n_xml = Nokogiri::XML(xml)
  node = n_xml.xpath("//concurrentBuild").first
  if node.content != "#{option}"
    node.content = option == true ? "true" : "false"
    xml_modified = n_xml.to_xml
    post_config(job_name, xml_modified)
  end
end

#exists?(job_name) ⇒ Boolean

Checks if the given job exists in Jenkins

Parameters:

  • job_name (String)

    the name of the job to check

Returns:

  • (Boolean)

    whether the job exists in jenkins or not



617
618
619
# File 'lib/jenkins_api_client/job.rb', line 617

def exists?(job_name)
  list(job_name).include?(job_name)
end

#find_artifact(job_name) ⇒ Object

A Method to find artifacts path from the Current Build

Parameters:

  • job_name (String)


1499
1500
1501
1502
1503
1504
1505
1506
1507
# File 'lib/jenkins_api_client/job.rb', line 1499

def find_artifact(job_name)
  current_build_number  = get_current_build_number(job_name)
  job_path              = "job/#{path_encode job_name}/"
  response_json         = @client.api_get_request("/#{job_path}#{current_build_number}")
  relative_build_path   = response_json['artifacts'][0]['relativePath']
  jenkins_path          = response_json['url']
  artifact_path         = URI.escape("#{jenkins_path}artifact/#{relative_build_path}")
  return artifact_path
end

#get_build_details(job_name, build_num) ⇒ Object

Obtain detailed build info for a job

Parameters:

  • job_name (String)
  • build_num (Number)


1089
1090
1091
1092
1093
1094
1095
# File 'lib/jenkins_api_client/job.rb', line 1089

def get_build_details(job_name, build_num)
  build_num = get_current_build_number(job_name) if build_num == 0
  @logger.info "Obtaining the build details of '#{job_name}'" +
    " Build ##{build_num}"

  @client.api_get_request("/job/#{path_encode job_name}/#{build_num}/")
end

#get_build_params(job_name) ⇒ Array

Obtain the build parameters of a job. It returns an array of hashes with details of job params.

Parameters:

  • job_name (String)

Returns:

  • (Array)

    params_array Array of parameters for the given job



1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
# File 'lib/jenkins_api_client/job.rb', line 1217

def get_build_params(job_name)
  @logger.info "Obtaining the build params of '#{job_name}'"
  xml = get_config(job_name)
  n_xml = Nokogiri::XML(xml)
  params = n_xml.xpath("//parameterDefinitions").first
  params_array = []
  if params
    params.children.each do |param|
      param_hash = {}
      case param.name
      when "hudson.model.StringParameterDefinition",
           "hudson.model.BooleanParameterDefinition",
           "hudson.model.TextParameterDefinition",
           "hudson.model.PasswordParameterDefinition"
        param_hash[:type] = 'string' if param.name =~ /string/i
        param_hash[:type] = 'boolean' if param.name =~ /boolean/i
        param_hash[:type] = 'text' if param.name =~ /text/i
        param_hash[:type] = 'password' if param.name =~ /password/i
        param.children.each do |value|
          param_hash[:name] = value.content if value.name == "name"
          if value.name == "description"
            param_hash[:description] = value.content
          end
          if value.name == "defaultValue"
            param_hash[:default] = value.content
          end
        end
      when "hudson.model.RunParameterDefinition"
        param_hash[:type] = 'run'
        param.children.each do |value|
          param_hash[:name] = value.content if value.name == "name"
          if value.name == "description"
            param_hash[:description] = value.content
          end
          if value.name == "projectName"
            param_hash[:project] = value.content
          end
        end
      when "hudson.model.FileParameterDefinition"
        param_hash[:type] = 'file'
        param.children.each do |value|
          param_hash[:name] = value.content if value.name == "name"
          if value.name == "description"
            param_hash[:description] = value.content
          end
        end
      when "hudson.scm.listtagsparameter.ListSubversionTagsParameterDefinition"
        param_hash[:type] = 'list_tags'
        param.children.each do |value|
          if value.name == "name"
            param_hash[:name] = value.content
          end
          if value.name == "description"
            param_hash[:description] = value.content
          end
          if value.name == "tagsDir"
            param_hash[:tags_dir] = value.content
          end
          if value.name == "tagsFilter"
            param_hash[:tags_filter] = value.content
          end
          if value.name == "reverseByDate"
            param_hash[:reverse_by_date] = value.content
          end
          if value.name == "reverseByName"
            param_hash[:reverse_by_name] = value.content
          end
          if value.name == "defaultValue"
            param_hash[:default] = value.content
          end
          param_hash[:max_tags] = value.content if value.name == "maxTags"
          param_hash[:uuid] = value.content if value.name == "uuid"
        end
      when "hudson.model.ChoiceParameterDefinition"
        param_hash[:type] = 'choice'
        param.children.each do |value|
          param_hash[:name] = value.content if value.name == "name"
          param_hash[:description] = value.content \
            if value.name == "description"
          choices = []
          if value.name == "choices"
            value.children.each do |value_child|
              if value_child.name == "a"
                value_child.children.each do |choice_child|
                  choices << choice_child.content.strip \
                    unless choice_child.content.strip.empty?
                end
              end
            end
          end
          param_hash[:choices] = choices unless choices.empty?
        end
      end
      params_array << param_hash unless param_hash.empty?
    end
  end
  params_array
end

#get_builds(job_name) ⇒ Object

Obtain build details of a specific job

Parameters:

  • job_name (String)


713
714
715
716
717
# File 'lib/jenkins_api_client/job.rb', line 713

def get_builds(job_name)
  @logger.info "Obtaining the build details of '#{job_name}'"
  response_json = @client.api_get_request("/job/#{path_encode job_name}")
  response_json["builds"]
end

#get_config(job_name) ⇒ String

Obtain the configuration stored in config.xml of a specific job

Parameters:

  • job_name (String)

Returns:

  • (String)

    XML Config.xml of the job



1051
1052
1053
1054
# File 'lib/jenkins_api_client/job.rb', line 1051

def get_config(job_name)
  @logger.info "Obtaining the config.xml of '#{job_name}'"
  @client.get_config("/job/#{path_encode job_name}")
end

#get_console_output(job_name, build_num = 0, start = 0, mode = 'text') ⇒ Hash

Get progressive console output from Jenkins server for a job

Parameters:

  • job_name (String)

    Name of the Jenkins job

  • build_num (Number) (defaults to: 0)

    Specific build number to obtain the console output from. Default is the recent build

  • start (Number) (defaults to: 0)

    start offset to get only a portion of the text

  • mode (String) (defaults to: 'text')

    Mode of text output. ‘text’ or ‘html’

Returns:

  • (Hash)

    response

    • output console output of the job

    • size size of the text. This can be used as ‘start’ for the next call to get progressive output

    • more more data available for the job. ‘true’ if available and nil otherwise



576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
# File 'lib/jenkins_api_client/job.rb', line 576

def get_console_output(job_name, build_num = 0, start = 0, mode = 'text')
  build_num = get_current_build_number(job_name) if build_num == 0
  if build_num == 0
    puts "No builds for this job '#{job_name}' yet."
    return nil
  end
  if mode == 'text'
    mode = 'Text'
  elsif mode == 'html'
    mode = 'Html'
  else
    raise "Mode should either be 'text' or 'html'. You gave: #{mode}"
  end
  get_msg = "/job/#{path_encode job_name}/#{build_num}/logText/progressive#{mode}?"
  get_msg << "start=#{start}"
  raw_response = true
  api_response = @client.api_get_request(get_msg, nil, nil, raw_response)
  #puts "Response: #{api_response.header['x-more-data']}"
  response = {}
  response['output'] = api_response.body
  response['size'] = api_response.header['x-text-size']
  response['more'] = api_response.header['x-more-data']

  response
end

#get_current_build_number(job_name) ⇒ Integer Also known as: build_number

Obtain the current build number of the given job This function returns nil if there were no builds for the given job.

Parameters:

  • job_name (String)

Returns:

  • (Integer)

    current build number of the given job



769
770
771
772
# File 'lib/jenkins_api_client/job.rb', line 769

def get_current_build_number(job_name)
  @logger.info "Obtaining the current build number of '#{job_name}'"
  @client.api_get_request("/job/#{path_encode job_name}")['nextBuildNumber'].to_i - 1
end

#get_current_build_status(job_name) ⇒ String Also known as: status

Obtain the current build status of the job By defaule Jenkins returns the color of the job status icon This function translates the color into a meaningful status

Parameters:

  • job_name (String)

Returns:

  • (String)

    status current status of the given job



755
756
757
758
759
# File 'lib/jenkins_api_client/job.rb', line 755

def get_current_build_status(job_name)
  @logger.info "Obtaining the current build status of '#{job_name}'"
  response_json = @client.api_get_request("/job/#{path_encode job_name}")
  color_to_status(response_json["color"])
end

#get_downstream_projects(job_name) ⇒ Object

List downstream projects of a specific job

Parameters:

  • job_name (String)

    the name of the job to obtain downstream projects for



703
704
705
706
707
# File 'lib/jenkins_api_client/job.rb', line 703

def get_downstream_projects(job_name)
  @logger.info "Obtaining the down stream projects of '#{job_name}'"
  response_json = @client.api_get_request("/job/#{path_encode job_name}")
  response_json["downstreamProjects"]
end

#get_promotions(job_name) ⇒ Hash

Get a list of promoted builds for given job

Parameters:

  • job_name (String)

Returns:

  • (Hash)

    Hash map of promitions and the promoted builds. Promotions that didn’t took place yet return nil



1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
# File 'lib/jenkins_api_client/job.rb', line 1475

def get_promotions(job_name)
  result = {}

  @logger.info "Obtaining the promotions of '#{job_name}'"
  response_json = @client.api_get_request("/job/#{job_name}/promotion")

  response_json["processes"].each do |promotion|
    @logger.info "Getting promotion details of '#{promotion['name']}'"

    if promotion['color'] == 'notbuilt'
      result[promotion['name']] = nil
    else
      promo_json = @client.api_get_request("/job/#{job_name}/promotion/latest/#{promotion['name']}")
      result[promotion['name']] = promo_json['target']['number']
    end
  end

  result
end

#get_test_results(job_name, build_num) ⇒ Object

Obtain the test results for a specific build of a job

Parameters:

  • job_name (String)
  • build_num (Number)


1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
# File 'lib/jenkins_api_client/job.rb', line 1073

def get_test_results(job_name, build_num)
  build_num = get_current_build_number(job_name) if build_num == 0
  @logger.info "Obtaining the test results of '#{job_name}'" +
    " Build ##{build_num}"
  @client.api_get_request("/job/#{path_encode job_name}/#{build_num}/testReport")
rescue Exceptions::NotFound
  # Not found is acceptable, as not all builds will have test results
  # and this is what jenkins throws at us in that case
  nil
end

#get_upstream_projects(job_name) ⇒ Object

List upstream projects of a specific job

Parameters:

  • job_name (String)

    the name of the job to obtain upstream projects for



692
693
694
695
696
# File 'lib/jenkins_api_client/job.rb', line 692

def get_upstream_projects(job_name)
  @logger.info "Obtaining the upstream projects of '#{job_name}'"
  response_json = @client.api_get_request("/job/#{path_encode job_name}")
  response_json["upstreamProjects"]
end

#list(filter, ignorecase = true) ⇒ Array<String>

List all jobs that match the given regex

Parameters:

  • filter (String)

    a regular expression or a string to filter jobs

  • ignorecase (Boolean) (defaults to: true)

    whether to ignore case or not

Returns:

  • (Array<String>)

    jobs matching the given pattern



652
653
654
655
656
657
658
659
660
661
662
663
664
# File 'lib/jenkins_api_client/job.rb', line 652

def list(filter, ignorecase = true)
  @logger.info "Obtaining jobs matching filter '#{filter}'"
  response_json = @client.api_get_request("")
  jobs = []
  response_json["jobs"].each do |job|
    if ignorecase
      jobs << job["name"] if job["name"] =~ /#{filter}/i
    else
      jobs << job["name"] if job["name"] =~ /#{filter}/
    end
  end
  jobs
end

#list_allArray<String>

List all jobs on the Jenkins CI server

Returns:

  • (Array<String>)

    the names of all jobs in jenkins



606
607
608
609
# File 'lib/jenkins_api_client/job.rb', line 606

def list_all
  response_json = @client.api_get_request("", "tree=jobs[name]")["jobs"]
  response_json.map { |job| job["name"] }.sort
end

#list_all_with_detailsArray<Hash>

List all jobs on the Jenkins CI server along with their details

Returns:

  • (Array<Hash>)

    the details of all jobs in jenkins



670
671
672
673
674
# File 'lib/jenkins_api_client/job.rb', line 670

def list_all_with_details
  @logger.info "Obtaining the details of all jobs"
  response_json = @client.api_get_request("")
  response_json["jobs"]
end

#list_by_status(status, jobs = []) ⇒ Array<String>

List all Jobs matching the given status You can optionally pass in jobs list to filter the status from

Parameters:

  • status (String)

    the job status to filter

  • jobs (Array<String>) (defaults to: [])

    if specified this array will be used for filtering by the status otherwise the filtering will be done using all jobs available in jenkins

Returns:

  • (Array<String>)

    filtered jobs



631
632
633
634
635
636
637
638
639
640
641
642
643
# File 'lib/jenkins_api_client/job.rb', line 631

def list_by_status(status, jobs = [])
  jobs = list_all if jobs.empty?
  @logger.info "Obtaining jobs matching status '#{status}'"
  json_response = @client.api_get_request("", "tree=jobs[name,color]")
  filtered_jobs = []
  json_response["jobs"].each do |job|
    if color_to_status(job["color"]) == status &&
       jobs.include?(job["name"])
      filtered_jobs << job["name"]
    end
  end
  filtered_jobs
end

#list_details(job_name) ⇒ Hash

List details of a specific job

Parameters:

  • job_name (String)

    the name of the job to obtain the details from

Returns:

  • (Hash)

    the details of the specified job



682
683
684
685
# File 'lib/jenkins_api_client/job.rb', line 682

def list_details(job_name)
  @logger.info "Obtaining the details of '#{job_name}'"
  @client.api_get_request("/job/#{path_encode job_name}")
end

#poll(job_name) ⇒ String

Programatically schedule SCM polling for the specified job

Parameters:

  • job_name (String)

    the name of the job

Returns:

  • (String)

    the response code from the HTTP post request



1022
1023
1024
1025
# File 'lib/jenkins_api_client/job.rb', line 1022

def poll(job_name)
  @logger.info "Polling SCM changes for job '#{job_name}'"
  @client.api_post_request("/job/#{job_name}/polling")
end

#post_config(job_name, xml) ⇒ String

Post the configuration of a job given the job name and the config.xml

Parameters:

  • job_name (String)
  • xml (String)

Returns:

  • (String)

    response_code return code from HTTP POST



1063
1064
1065
1066
# File 'lib/jenkins_api_client/job.rb', line 1063

def post_config(job_name, xml)
  @logger.info "Posting the config.xml of '#{job_name}'"
  @client.post_config("/job/#{path_encode job_name}/config.xml", xml)
end

#recreate(job_name) ⇒ String

Re-create the same job This is a hack to clear any existing builds

Parameters:

  • job_name (String)

    the name of the job to recreate

Returns:

  • (String)

    the response from the HTTP POST request



539
540
541
542
543
544
# File 'lib/jenkins_api_client/job.rb', line 539

def recreate(job_name)
  @logger.info "Recreating job '#{job_name}'"
  job_xml = get_config(job_name)
  delete(job_name)
  create(job_name, job_xml)
end

#remove_downstream_projects(job_name) ⇒ String

Remove all downstream projects of a specific job

Parameters:

  • job_name (String)

Returns:

  • (String)

    response_code return code from HTTP POST



1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
# File 'lib/jenkins_api_client/job.rb', line 1369

def remove_downstream_projects(job_name)
  @logger.info "Removing the downstream projects of '#{job_name}'"
  xml = get_config(job_name)
  n_xml = Nokogiri::XML(xml)
  n_xml.search("//hudson.tasks.BuildTrigger").each do |node|
    child_project_trigger = false
    node.search("//childProjects").each do |child_node|
      child_project_trigger = true
      child_node.search("//threshold").each do |threshold_node|
        threshold_node.children.each do |threshold_value_node|
          threshold_value_node.content = nil
          threshold_value_node.remove
        end
        threshold_node.content = nil
        threshold_node.remove
      end
      child_node.content = nil
      child_node.remove
    end
    node.content = nil
    node.remove
  end
  publisher_node = n_xml.search("//publishers").first
  publisher_node.content = nil if publisher_node.children.empty?
  xml_modified = n_xml.to_xml
  post_config(job_name, xml_modified)
end

#remove_plugin(plugin) ⇒ JenkinsApi::Client::PluginSettings::Collection

Remove a plugin to be included in job’s xml configureation

Parameters:

  • plugin (Jenkins::Api::Client::PluginSettings::Base)

Returns:



64
65
66
# File 'lib/jenkins_api_client/job.rb', line 64

def remove_plugin(plugin)
  plugin_collection.remove(plugin)
end

#rename(old_job, new_job) ⇒ Object

Rename a job given the old name and new name

Parameters:

  • old_job (String)

    Name of the old job

  • new_job (String)

    Name of the new job.



472
473
474
475
# File 'lib/jenkins_api_client/job.rb', line 472

def rename(old_job, new_job)
  @logger.info "Renaming job '#{old_job}' to '#{new_job}'"
  @client.api_post_request("/job/#{path_encode old_job}/doRename?newName=#{form_encode new_job}")
end

#restrict_to_node(job_name, node_name) ⇒ String

Resctrict the given job to a specific node

Parameters:

  • job_name (String)
  • node_name (String)

Returns:

  • (String)

    response_code return code from HTTP POST



1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
# File 'lib/jenkins_api_client/job.rb', line 1404

def restrict_to_node(job_name, node_name)
  @logger.info "Restricting '#{job_name}' to '#{node_name}' node"
  xml = get_config(job_name)
  n_xml = Nokogiri::XML(xml)
  if (node = n_xml.xpath("//assignedNode").first)
    node.content = node_name
  else
    project = n_xml.xpath("//scm").first
    project.add_next_sibling("<assignedNode>#{node_name}</assignedNode>")
    roam_node = n_xml.xpath("//canRoam").first
    roam_node.content = "false"
  end
  xml_modified = n_xml.to_xml
  post_config(job_name, xml_modified)
end

#stop_build(job_name, build_number = 0) ⇒ Object Also known as: stop, abort

Stops a running build of a job This method will stop the current/most recent build if no build number is specified. The build will be stopped only if it was in ‘running’ state.

Parameters:

  • job_name (String)

    the name of the job to stop the build

  • build_number (Number) (defaults to: 0)

    the build number to stop



517
518
519
520
521
522
523
524
525
526
527
528
# File 'lib/jenkins_api_client/job.rb', line 517

def stop_build(job_name, build_number = 0)
  build_number = get_current_build_number(job_name) if build_number == 0
  raise "No builds for #{job_name}" unless build_number
  @logger.info "Stopping job '#{job_name}' Build ##{build_number}"
  # Check and see if the build is running
  is_building = @client.api_get_request(
    "/job/#{path_encode job_name}/#{build_number}"
  )["building"]
  if is_building
    @client.api_post_request("/job/#{path_encode job_name}/#{build_number}/stop")
  end
end

#to_sObject

Return a string representation of the object



70
71
72
# File 'lib/jenkins_api_client/job.rb', line 70

def to_s
  "#<JenkinsApi::Client::Job>"
end

#unblock_build_when_downstream_building(job_name) ⇒ String

Unblock the build of the job when downstream is building

Parameters:

  • job_name (String)

Returns:

  • (String)

    response_code return code from HTTP POST



1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
# File 'lib/jenkins_api_client/job.rb', line 1139

def unblock_build_when_downstream_building(job_name)
  @logger.info "Unblocking builds of '#{job_name}' when downstream" +
    " projects are building"
  xml = get_config(job_name)
  n_xml = Nokogiri::XML(xml)
  node = n_xml.xpath("//blockBuildWhenDownstreamBuilding").first
  if node.content == "true"
    node.content = "false"
    xml_modified = n_xml.to_xml
    post_config(job_name, xml_modified)
  end
end

#unblock_build_when_upstream_building(job_name) ⇒ String

Unblock the build of the job when upstream is building

Parameters:

  • job_name (String)

Returns:

  • (String)

    response_code return code from HTTP POST



1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
# File 'lib/jenkins_api_client/job.rb', line 1177

def unblock_build_when_upstream_building(job_name)
  @logger.info "Unblocking builds of '#{job_name}' when upstream" +
    " projects are building"
  xml = get_config(job_name)
  n_xml = Nokogiri::XML(xml)
  node = n_xml.xpath("//blockBuildWhenUpstreamBuilding").first
  if node.content == "true"
    node.content = "false"
    xml_modified = n_xml.to_xml
    post_config(job_name, xml_modified)
  end
end

#unchain(job_names) ⇒ Object

Unchain any existing chain between given job names

Parameters:

  • job_names (Array)

    Array of job names to be unchained



1424
1425
1426
1427
# File 'lib/jenkins_api_client/job.rb', line 1424

def unchain(job_names)
  @logger.info "Unchaining jobs: #{job_names.inspect}"
  job_names.each { |job| remove_downstream_projects(job) }
end

#update(job_name, xml) ⇒ String

Update a job with the name specified and the xml given

Parameters:

  • job_name (String)

    the name of the job

  • xml (String)

    the xml configuration of the job

Returns:

  • (String)

    the HTTP status code from the POST request

See Also:



117
118
119
120
# File 'lib/jenkins_api_client/job.rb', line 117

def update(job_name, xml)
  @logger.info "Updating job '#{job_name}'"
  post_config(job_name, xml)
end

#update_freestyle(params) ⇒ String

Update a job with params given as a hash instead of the xml. For the parameter description see #create_or_update_freestyle

Parameters:

  • params (Hash)

    parameters to update a freestyle project

Returns:

  • (String)

    the HTTP status code from the POST request

See Also:



237
238
239
240
# File 'lib/jenkins_api_client/job.rb', line 237

def update_freestyle(params)
  xml = build_freestyle_config(params)
  update(params[:name], xml)
end

#wipe_out_workspace(job_name) ⇒ String

Wipe out the workspace for a job given the name

Parameters:

  • job_name (String)

    the name of the job to wipe out the workspace

Returns:

  • (String)

    response from the HTTP POST request



504
505
506
507
# File 'lib/jenkins_api_client/job.rb', line 504

def wipe_out_workspace(job_name)
  @logger.info "Wiping out the workspace of job '#{job_name}'"
  @client.api_post_request("/job/#{path_encode job_name}/doWipeOutWorkspace")
end