jenkins_api_client 1.4.5 → 1.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/jenkins_api_client.gemspec +15 -136
- data/lib/jenkins_api_client/version.rb +2 -2
- metadata +6 -180
- data/.gitignore +0 -41
- data/.jenkins.yml +0 -9
- data/.travis.yml +0 -15
- data/CHANGELOG.md +0 -391
- data/CONTRIBUTORS.md +0 -3
- data/Gemfile +0 -20
- data/LICENCE +0 -21
- data/README.md +0 -454
- data/Rakefile +0 -107
- data/Vagrantfile +0 -83
- data/config/login.yml.example +0 -27
- data/jenkins_api_client_class_diagram.png +0 -0
- data/scripts/login_with_irb.rb +0 -54
- data/scripts/login_with_pry.rb +0 -54
- data/spec/func_tests/client_spec.rb +0 -109
- data/spec/func_tests/job_spec.rb +0 -669
- data/spec/func_tests/node_spec.rb.pending +0 -217
- data/spec/func_tests/plugin_spec.rb +0 -148
- data/spec/func_tests/spec_helper.rb +0 -41
- data/spec/func_tests/system_spec.rb +0 -84
- data/spec/func_tests/user_spec.rb +0 -49
- data/spec/func_tests/view_spec.rb +0 -276
- data/spec/unit_tests/build_queue_spec.rb +0 -152
- data/spec/unit_tests/client_spec.rb +0 -471
- data/spec/unit_tests/fake_http_response.rb +0 -9
- data/spec/unit_tests/fixtures/files/available_plugins.json +0 -1
- data/spec/unit_tests/fixtures/files/computer_sample.xml +0 -17
- data/spec/unit_tests/fixtures/files/installed_plugins.json +0 -1
- data/spec/unit_tests/fixtures/files/job_sample.xml +0 -16
- data/spec/unit_tests/fixtures/files/updatable_plugins.json +0 -1
- data/spec/unit_tests/job_spec.rb +0 -783
- data/spec/unit_tests/node_spec.rb +0 -342
- data/spec/unit_tests/plugin_settings/colllection_spec.rb +0 -62
- data/spec/unit_tests/plugin_settings/hipchat_spec.rb +0 -44
- data/spec/unit_tests/plugin_settings/workspace_cleanup_spec.rb +0 -31
- data/spec/unit_tests/plugin_spec.rb +0 -165
- data/spec/unit_tests/spec_helper.rb +0 -19
- data/spec/unit_tests/system_spec.rb +0 -76
- data/spec/unit_tests/user_spec.rb +0 -144
- data/spec/unit_tests/view_spec.rb +0 -149
- data/travis/hudson.model.UpdateCenter.xml +0 -7
- data/travis/jenkins_config.xml +0 -63
- data/travis/jenkins_config_with_crumb.xml +0 -67
- data/travis/setup.sh +0 -23
- data/travis/setup_crumb.sh +0 -11
- data/travis/spec.yml +0 -14
- data/travis/user_config.xml +0 -29
data/Rakefile
DELETED
@@ -1,107 +0,0 @@
|
|
1
|
-
lib = File.expand_path('../lib', __FILE__)
|
2
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
require 'jenkins_api_client/version'
|
4
|
-
require 'rake'
|
5
|
-
require 'jeweler'
|
6
|
-
require 'yard'
|
7
|
-
|
8
|
-
Jeweler::Tasks.new do |gemspec|
|
9
|
-
gemspec.name = 'jenkins_api_client'
|
10
|
-
gemspec.version = JenkinsApi::Client::VERSION
|
11
|
-
gemspec.platform = Gem::Platform::RUBY
|
12
|
-
gemspec.date = Time.now.utc.strftime("%Y-%m-%d")
|
13
|
-
gemspec.require_paths = ["lib"]
|
14
|
-
gemspec.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f)}
|
15
|
-
gemspec.files = `git ls-files`.split("\n")
|
16
|
-
gemspec.extra_rdoc_files = ['CHANGELOG.rdoc', 'LICENSE', 'README.rdoc']
|
17
|
-
gemspec.authors = [ 'Kannan Manickam' ]
|
18
|
-
gemspec.email = [ 'arangamani.kannan@gmail.com' ]
|
19
|
-
gemspec.homepage = 'https://github.com/arangamani/jenkins_api_client'
|
20
|
-
gemspec.summary = 'Jenkins JSON API Client'
|
21
|
-
gemspec.description = %{
|
22
|
-
This is a simple and easy-to-use Jenkins Api client with features focused on
|
23
|
-
automating Job configuration programaticaly and so forth}
|
24
|
-
gemspec.test_files = `git ls-files -- {spec}/*`.split("\n")
|
25
|
-
gemspec.required_ruby_version = '>= 1.9.2'
|
26
|
-
gemspec.rubygems_version = '1.8.17'
|
27
|
-
end
|
28
|
-
|
29
|
-
require 'rspec/core'
|
30
|
-
require 'rspec/core/rake_task'
|
31
|
-
RSpec::Core::RakeTask.new(:unit_tests) do |spec|
|
32
|
-
spec.pattern = FileList['spec/unit_tests/*_spec.rb']
|
33
|
-
spec.rspec_opts = ['--color', '--format documentation']
|
34
|
-
end
|
35
|
-
|
36
|
-
RSpec::Core::RakeTask.new(:func_tests) do |spec|
|
37
|
-
spec.pattern = FileList['spec/func_tests/*_spec.rb']
|
38
|
-
spec.rspec_opts = ['--color', '--format documentation']
|
39
|
-
end
|
40
|
-
|
41
|
-
RSpec::Core::RakeTask.new(:test) do |spec|
|
42
|
-
spec.pattern = FileList['spec/*/*.rb']
|
43
|
-
spec.rspec_opts = ['--color', '--format documentation']
|
44
|
-
end
|
45
|
-
|
46
|
-
YARD::Config.load_plugin 'thor'
|
47
|
-
YARD::Rake::YardocTask.new do |t|
|
48
|
-
t.files = ['lib/**/*.rb', 'lib/**/**/*.rb']
|
49
|
-
end
|
50
|
-
|
51
|
-
namespace :doc do
|
52
|
-
# This task requires that graphviz is installed locally. For more info:
|
53
|
-
# http://www.graphviz.org/
|
54
|
-
desc "Generates the class diagram using the yard generated dot file"
|
55
|
-
task :generate_class_diagram do
|
56
|
-
puts "Generating the dot file..."
|
57
|
-
`yard graph --file jenkins_api_client.dot`
|
58
|
-
puts "Generating class diagram from the dot file..."
|
59
|
-
`dot jenkins_api_client.dot -Tpng -o jenkins_api_client_class_diagram.png`
|
60
|
-
end
|
61
|
-
|
62
|
-
desc "Applies Google Analytics tracking script to all generated html files"
|
63
|
-
task :apply_google_analytics do
|
64
|
-
files = Dir.glob("**/*.html")
|
65
|
-
|
66
|
-
string_to_replace = "</body>"
|
67
|
-
string_to_replace_with = <<-EOF
|
68
|
-
<script type="text/javascript">
|
69
|
-
var _gaq = _gaq || [];
|
70
|
-
_gaq.push(['_setAccount', 'UA-37519629-2']);
|
71
|
-
_gaq.push(['_trackPageview']);
|
72
|
-
|
73
|
-
(function() {
|
74
|
-
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
75
|
-
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
76
|
-
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
77
|
-
})();
|
78
|
-
</script>
|
79
|
-
</body>
|
80
|
-
EOF
|
81
|
-
|
82
|
-
files.each do |html_file|
|
83
|
-
puts "Processing file: #{html_file}"
|
84
|
-
contents = ""
|
85
|
-
# Read the file contents
|
86
|
-
file = File.open(html_file)
|
87
|
-
file.each { |line| contents << line }
|
88
|
-
file.close
|
89
|
-
|
90
|
-
# If the file already has google analytics tracking info, skip it.
|
91
|
-
if contents.include?(string_to_replace_with)
|
92
|
-
puts "Skipped..."
|
93
|
-
next
|
94
|
-
end
|
95
|
-
|
96
|
-
# Apply google analytics tracking info to the html file
|
97
|
-
contents.gsub!(string_to_replace, string_to_replace_with)
|
98
|
-
|
99
|
-
# Write the contents with the google analytics info to the file
|
100
|
-
file = File.open(html_file, "w")
|
101
|
-
file.write(contents)
|
102
|
-
file.close
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
task :default => [:unit_tests]
|
data/Vagrantfile
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
# -*- mode: ruby -*-
|
2
|
-
# vi: set ft=ruby :
|
3
|
-
|
4
|
-
Vagrant.configure("2") do |config|
|
5
|
-
# All Vagrant configuration is done here. The most common configuration
|
6
|
-
# options are documented and commented below. For a complete reference,
|
7
|
-
# please see the online documentation at vagrantup.com.
|
8
|
-
|
9
|
-
config.vm.hostname = "jenkins-api-client"
|
10
|
-
|
11
|
-
# Every Vagrant virtual environment requires a box to build off of.
|
12
|
-
config.vm.box = "opscode-ubuntu-12.04"
|
13
|
-
|
14
|
-
# The url from where the 'config.vm.box' box will be fetched if it
|
15
|
-
# doesn't already exist on the user's system.
|
16
|
-
config.vm.box_url = "https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box"
|
17
|
-
|
18
|
-
# Assign this VM to a host-only network IP, allowing you to access it
|
19
|
-
# via the IP. Host-only networks can talk to the host machine as well as
|
20
|
-
# any other machines on the same network, but cannot be accessed (through this
|
21
|
-
# network interface) by any external networks.
|
22
|
-
config.vm.network :private_network, ip: "33.33.33.10"
|
23
|
-
|
24
|
-
# Create a public network, which generally matched to bridged network.
|
25
|
-
# Bridged networks make the machine appear as another physical device on
|
26
|
-
# your network.
|
27
|
-
|
28
|
-
# config.vm.network :public_network
|
29
|
-
|
30
|
-
# Create a forwarded port mapping which allows access to a specific port
|
31
|
-
# within the machine from a port on the host machine. In the example below,
|
32
|
-
# accessing "localhost:8080" will access port 80 on the guest machine.
|
33
|
-
|
34
|
-
# Share an additional folder to the guest VM. The first argument is
|
35
|
-
# the path on the host to the actual folder. The second argument is
|
36
|
-
# the path on the guest to mount the folder. And the optional third
|
37
|
-
# argument is a set of non-required options.
|
38
|
-
# config.vm.synced_folder "../data", "/vagrant_data"
|
39
|
-
|
40
|
-
# Provider-specific configuration so you can fine-tune various
|
41
|
-
# backing providers for Vagrant. These expose provider-specific options.
|
42
|
-
# Example for VirtualBox:
|
43
|
-
#
|
44
|
-
# config.vm.provider :virtualbox do |vb|
|
45
|
-
# # Don't boot with headless mode
|
46
|
-
# vb.gui = true
|
47
|
-
#
|
48
|
-
# # Use VBoxManage to customize the VM. For example to change memory:
|
49
|
-
# vb.customize ["modifyvm", :id, "--memory", "1024"]
|
50
|
-
# end
|
51
|
-
#
|
52
|
-
# View the documentation for the provider you're using for more
|
53
|
-
# information on available options.
|
54
|
-
|
55
|
-
# The path to the Berksfile to use with Vagrant Berkshelf
|
56
|
-
# config.berkshelf.berksfile_path = "./Berksfile"
|
57
|
-
|
58
|
-
# Enabling the Berkshelf plugin. To enable this globally, add this configuration
|
59
|
-
# option to your ~/.vagrant.d/Vagrantfile file
|
60
|
-
#config.berkshelf.enabled = true
|
61
|
-
|
62
|
-
# An array of symbols representing groups of cookbook described in the Vagrantfile
|
63
|
-
# to exclusively install and copy to Vagrant's shelf.
|
64
|
-
# config.berkshelf.only = []
|
65
|
-
|
66
|
-
# An array of symbols representing groups of cookbook described in the Vagrantfile
|
67
|
-
# to skip installing and copying to Vagrant's shelf.
|
68
|
-
# config.berkshelf.except = []
|
69
|
-
|
70
|
-
config.vm.synced_folder ".", "/opt/jenkins_api_client"
|
71
|
-
|
72
|
-
config.vm.provision :shell, :inline =>
|
73
|
-
" sudo apt-get update;" +
|
74
|
-
" sudo apt-get install -y git ruby1.9.1-full rubygems libxslt-dev libxml2-dev;" +
|
75
|
-
" cd /opt/jenkins_api_client;" +
|
76
|
-
" ls -lrt;" +
|
77
|
-
" ruby1.9.1 --version;" +
|
78
|
-
" sudo gem1.9.1 install bundler;" +
|
79
|
-
" bundle install;" +
|
80
|
-
" travis/setup.sh;" +
|
81
|
-
" bundle exec rake unit_tests;" +
|
82
|
-
" bundle exec rake func_tests"
|
83
|
-
end
|
data/config/login.yml.example
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
# The Jenkins server and login information can be stored in a YAML file like this
|
2
|
-
# so we don't have to pass in the parameters every we login to the server
|
3
|
-
# through this API client.
|
4
|
-
|
5
|
-
# This file contains the following four parameters
|
6
|
-
|
7
|
-
# The IP address of the Jenkins CI Server
|
8
|
-
|
9
|
-
:server_ip: 0.0.0.0
|
10
|
-
|
11
|
-
# The port number on which the Jenkins listens on. The default is 8080
|
12
|
-
|
13
|
-
:server_port: 8080
|
14
|
-
|
15
|
-
# If there is a web server routing your Jenkins requests you might need this
|
16
|
-
|
17
|
-
:jenkins_path: ""
|
18
|
-
|
19
|
-
# The username and password to authenticate to the server
|
20
|
-
|
21
|
-
:username: my_username
|
22
|
-
|
23
|
-
:password: my_password
|
24
|
-
|
25
|
-
# The private key file for Jenkins CLI authentication
|
26
|
-
# remember to upload the public key to http://#{server_ip}:#{server_port}/user/#{my_username}/configure
|
27
|
-
:identity_file: ~/.ssh/id_rsa
|
Binary file
|
data/scripts/login_with_irb.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
# This script provides an easier way to login to Jenkins server API.
|
2
|
-
# It logs you in with the credentials and server details you proided and then
|
3
|
-
# starts an IRB session so you can interactively play with the API.
|
4
|
-
|
5
|
-
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
|
6
|
-
require 'jenkins_api_client'
|
7
|
-
require 'yaml'
|
8
|
-
require 'irb'
|
9
|
-
|
10
|
-
def prompt_for_username
|
11
|
-
get_from_stdin("Username: ", false)
|
12
|
-
end
|
13
|
-
|
14
|
-
def prompt_for_password
|
15
|
-
get_from_stdin("Password: ", true)
|
16
|
-
end
|
17
|
-
|
18
|
-
def get_from_stdin(prompt, mask = false)
|
19
|
-
$stdout.write(prompt)
|
20
|
-
|
21
|
-
begin
|
22
|
-
Kernel::system "stty -echo" if mask == true
|
23
|
-
ret = gets.chomp!
|
24
|
-
ensure
|
25
|
-
if mask == true
|
26
|
-
Kernel::system "stty echo"
|
27
|
-
puts ""
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
ret
|
32
|
-
end
|
33
|
-
|
34
|
-
if ARGV.empty?
|
35
|
-
config_file = '~/.jenkins_api_client/login.yml'
|
36
|
-
else
|
37
|
-
config_file = ARGV.shift
|
38
|
-
end
|
39
|
-
|
40
|
-
begin
|
41
|
-
client_opts = Hash[YAML.load_file(File.expand_path(config_file)).map { | (k,v) | [k.to_sym, v]} ]
|
42
|
-
|
43
|
-
unless client_opts.has_key?(:username)
|
44
|
-
client_opts[:username] = prompt_for_username()
|
45
|
-
end
|
46
|
-
unless client_opts.has_key?(:password) or client_opts.has_key?(:password_base64)
|
47
|
-
client_opts[:password] = prompt_for_password()
|
48
|
-
end
|
49
|
-
|
50
|
-
@client = JenkinsApi::Client.new(client_opts)
|
51
|
-
puts "logged-in to the Jenkins API, use the '@client' variable to use the client"
|
52
|
-
end
|
53
|
-
|
54
|
-
IRB.start
|
data/scripts/login_with_pry.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# This script provides an easier way to login to Jenkins server API.
|
3
|
-
# It logs you in with the credentials and server details you proided and then
|
4
|
-
# starts an IRB session so you can interactively play with the API.
|
5
|
-
|
6
|
-
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
|
7
|
-
require 'jenkins_api_client'
|
8
|
-
require 'yaml'
|
9
|
-
require 'pry'
|
10
|
-
|
11
|
-
def prompt_for_username
|
12
|
-
get_from_stdin("Username: ", false)
|
13
|
-
end
|
14
|
-
|
15
|
-
def prompt_for_password
|
16
|
-
get_from_stdin("Password: ", true)
|
17
|
-
end
|
18
|
-
|
19
|
-
def get_from_stdin(prompt, mask = false)
|
20
|
-
$stdout.write(prompt)
|
21
|
-
|
22
|
-
begin
|
23
|
-
Kernel::system "stty -echo" if mask == true
|
24
|
-
ret = gets.chomp!
|
25
|
-
ensure
|
26
|
-
if mask == true
|
27
|
-
Kernel::system "stty echo"
|
28
|
-
puts ""
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
ret
|
33
|
-
end
|
34
|
-
|
35
|
-
if ARGV.empty?
|
36
|
-
config_file = '~/.jenkins_api_client/spec.yml'
|
37
|
-
else
|
38
|
-
config_file = ARGV.shift
|
39
|
-
end
|
40
|
-
|
41
|
-
begin
|
42
|
-
client_opts = YAML.load_file(File.expand_path(config_file))
|
43
|
-
unless client_opts.has_key?(:username)
|
44
|
-
client_opts[:username] = prompt_for_username()
|
45
|
-
end
|
46
|
-
unless client_opts.has_key?(:password) or client_opts.has_key?(:password_base64)
|
47
|
-
client_opts[:password] = prompt_for_password()
|
48
|
-
end
|
49
|
-
|
50
|
-
@client = JenkinsApi::Client.new(client_opts)
|
51
|
-
puts "logged-in to the Jenkins API, use the '@client' variable to use the client"
|
52
|
-
end
|
53
|
-
|
54
|
-
Pry.start
|
@@ -1,109 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Specifying JenkinsApi::Client class capabilities
|
3
|
-
# Author: Kannan Manickam <arangamani.kannan@gmail.com>
|
4
|
-
#
|
5
|
-
|
6
|
-
require File.expand_path('../spec_helper', __FILE__)
|
7
|
-
require 'yaml'
|
8
|
-
|
9
|
-
describe JenkinsApi::Client do
|
10
|
-
context "Given valid credentials and server information are given" do
|
11
|
-
before(:all) do
|
12
|
-
@creds_file = '~/.jenkins_api_client/spec.yml'
|
13
|
-
# Grabbing just the server IP in a variable so we can check
|
14
|
-
# for wrong credentials
|
15
|
-
@server_ip = YAML.load_file(
|
16
|
-
File.expand_path(@creds_file, __FILE__)
|
17
|
-
)[:server_ip]
|
18
|
-
begin
|
19
|
-
@client = JenkinsApi::Client.new(
|
20
|
-
YAML.load_file(File.expand_path(@creds_file, __FILE__))
|
21
|
-
)
|
22
|
-
rescue Exception => e
|
23
|
-
puts "WARNING: Credentials are not set properly."
|
24
|
-
puts e.message
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe "InstanceMethods" do
|
29
|
-
|
30
|
-
describe "#initialize" do
|
31
|
-
it "Should be able to initialize with valid credentials" do
|
32
|
-
client1 = JenkinsApi::Client.new(
|
33
|
-
YAML.load_file(File.expand_path(@creds_file, __FILE__))
|
34
|
-
)
|
35
|
-
client1.class.should == JenkinsApi::Client
|
36
|
-
end
|
37
|
-
|
38
|
-
it "Should accept a YAML argument when creating a new client" do
|
39
|
-
client3 = JenkinsApi::Client.new(
|
40
|
-
YAML.load_file(File.expand_path(@creds_file, __FILE__))
|
41
|
-
)
|
42
|
-
client3.class.should == JenkinsApi::Client
|
43
|
-
end
|
44
|
-
|
45
|
-
it "Should fail if wrong credentials are given" do
|
46
|
-
client2 = JenkinsApi::Client.new(
|
47
|
-
:server_ip => @server_ip,
|
48
|
-
:username => 'stranger',
|
49
|
-
:password => 'hacked',
|
50
|
-
:log_location => '/dev/null'
|
51
|
-
)
|
52
|
-
expect(
|
53
|
-
lambda { client2.job.list_all }
|
54
|
-
).to raise_error(JenkinsApi::Exceptions::Unauthorized)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
describe "#get_jenkins_version" do
|
58
|
-
it "Should the jenkins version" do
|
59
|
-
@client.get_jenkins_version.class.should == String
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
describe "#get_hudson_version" do
|
64
|
-
it "Should get the hudson version" do
|
65
|
-
@client.get_hudson_version.class.should == String
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
describe "#exec_script" do
|
70
|
-
it "Should execute the provided groovy script" do
|
71
|
-
@client.exec_script('println("hi")').should == "hi\n"
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
describe "SubClassAccessorMethods" do
|
77
|
-
describe "#job" do
|
78
|
-
it "Should return a job object on call" do
|
79
|
-
@client.job.class.should == JenkinsApi::Client::Job
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
describe "#node" do
|
84
|
-
it "Should return a node object on call" do
|
85
|
-
@client.node.class.should == JenkinsApi::Client::Node
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
describe "#view" do
|
90
|
-
it "Should return a view object on call" do
|
91
|
-
@client.view.class.should == JenkinsApi::Client::View
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
describe "#system" do
|
96
|
-
it "Should return a system object on call" do
|
97
|
-
@client.system.class.should == JenkinsApi::Client::System
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
describe "#queue" do
|
102
|
-
it "Should return a build queue object on call" do
|
103
|
-
@client.queue.class.should == JenkinsApi::Client::BuildQueue
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
end
|
109
|
-
end
|
data/spec/func_tests/job_spec.rb
DELETED
@@ -1,669 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Specifying JenkinsApi::Client::Job class capabilities
|
3
|
-
# Author: Kannan Manickam <arangamani.kannan@gmail.com>
|
4
|
-
#
|
5
|
-
|
6
|
-
require File.expand_path('../spec_helper', __FILE__)
|
7
|
-
require 'yaml'
|
8
|
-
|
9
|
-
describe JenkinsApi::Client::Job do
|
10
|
-
context "With properly initialized client" do
|
11
|
-
before(:all) do
|
12
|
-
@helper = JenkinsApiSpecHelper::Helper.new
|
13
|
-
@creds_file = '~/.jenkins_api_client/spec.yml'
|
14
|
-
@creds = YAML.load_file(File.expand_path(@creds_file, __FILE__))
|
15
|
-
@job_name_prefix = 'awesome_rspec_test_job'
|
16
|
-
@filter = "^#{@job_name_prefix}.*"
|
17
|
-
@job_name = ''
|
18
|
-
@valid_post_responses = [200, 201, 302]
|
19
|
-
begin
|
20
|
-
@client = JenkinsApi::Client.new(@creds)
|
21
|
-
rescue Exception => e
|
22
|
-
puts "WARNING: Credentials are not set properly."
|
23
|
-
puts e.message
|
24
|
-
end
|
25
|
-
# Creating 10 jobs to run the spec tests on
|
26
|
-
begin
|
27
|
-
10.times do |num|
|
28
|
-
xml = @helper.create_job_xml
|
29
|
-
job = "#{@job_name_prefix}_#{num}"
|
30
|
-
@job_name = job if num == 0
|
31
|
-
@client.job.create(job, xml).to_i.should == 200
|
32
|
-
end
|
33
|
-
rescue Exception => e
|
34
|
-
puts "WARNING: Can't create jobs for preparing to spec tests"
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe "InstanceMethods" do
|
39
|
-
|
40
|
-
describe "#initialize" do
|
41
|
-
it "Initializes without any exception" do
|
42
|
-
expect(
|
43
|
-
lambda { job = JenkinsApi::Client::Job.new(@client) }
|
44
|
-
).not_to raise_error
|
45
|
-
end
|
46
|
-
it "Raises an error if a reference of client is not passed" do
|
47
|
-
expect(
|
48
|
-
lambda { job = JenkinsApi::Client::Job.new() }
|
49
|
-
).to raise_error
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe "#create" do
|
54
|
-
it "Should be able to create a job by getting an xml" do
|
55
|
-
xml = @helper.create_job_xml
|
56
|
-
name = "qwerty_nonexistent_job"
|
57
|
-
@valid_post_responses.should include(
|
58
|
-
@client.job.create(name, xml).to_i
|
59
|
-
)
|
60
|
-
@client.job.list(name).include?(name).should be_true
|
61
|
-
end
|
62
|
-
it "Should raise proper exception when the job already exists" do
|
63
|
-
xml = @helper.create_job_xml
|
64
|
-
name = "the_duplicate_job"
|
65
|
-
@valid_post_responses.should include(
|
66
|
-
@client.job.create(name, xml).to_i
|
67
|
-
)
|
68
|
-
@client.job.list(name).include?(name).should be_true
|
69
|
-
expect(
|
70
|
-
lambda { @client.job.create(name, xml) }
|
71
|
-
).to raise_error(JenkinsApi::Exceptions::JobAlreadyExists)
|
72
|
-
@valid_post_responses.should include(
|
73
|
-
@client.job.delete(name).to_i
|
74
|
-
)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
describe "#create_freestyle" do
|
79
|
-
|
80
|
-
def test_and_validate(name, params, config_line = nil)
|
81
|
-
@valid_post_responses.should include(
|
82
|
-
@client.job.create_freestyle(params).to_i
|
83
|
-
)
|
84
|
-
@client.job.list(name).include?(name).should be_true
|
85
|
-
# Test for the existense of the given line in the config.xml of the
|
86
|
-
# job created
|
87
|
-
unless config_line.nil?
|
88
|
-
config = @client.job.get_config(name)
|
89
|
-
config.should =~ /#{config_line}/
|
90
|
-
end
|
91
|
-
@valid_post_responses.should include(
|
92
|
-
@client.job.delete(name).to_i
|
93
|
-
)
|
94
|
-
@client.job.list(name).include?(name).should be_false
|
95
|
-
end
|
96
|
-
|
97
|
-
it "Should create a freestyle job with just name" do
|
98
|
-
name = "test_job_name_using_params"
|
99
|
-
params = {
|
100
|
-
:name => name
|
101
|
-
}
|
102
|
-
test_and_validate(name, params)
|
103
|
-
end
|
104
|
-
it "Should create a freestyle job with shell command" do
|
105
|
-
name = "test_job_using_params_shell"
|
106
|
-
params = {
|
107
|
-
:name => name,
|
108
|
-
:shell_command => "echo this is a free style project"
|
109
|
-
}
|
110
|
-
test_and_validate(
|
111
|
-
name,
|
112
|
-
params,
|
113
|
-
"<command>echo this is a free style project</command>"
|
114
|
-
)
|
115
|
-
end
|
116
|
-
it "Should create a freestyle job with Git SCM provider" do
|
117
|
-
name = "test_job_with_git_scm"
|
118
|
-
params = {
|
119
|
-
:name => name,
|
120
|
-
:scm_provider => "git",
|
121
|
-
:scm_url => "git://github.com./arangamani/jenkins_api_client.git",
|
122
|
-
:scm_branch => "master"
|
123
|
-
}
|
124
|
-
test_and_validate(
|
125
|
-
name,
|
126
|
-
params,
|
127
|
-
"<url>git://github.com./arangamani/jenkins_api_client.git</url>"
|
128
|
-
)
|
129
|
-
end
|
130
|
-
it "Should create a freestyle job with SVN SCM provider" do
|
131
|
-
name = "test_job_with_subversion_scm"
|
132
|
-
params = {
|
133
|
-
:name => name,
|
134
|
-
:scm_provider => "subversion",
|
135
|
-
:scm_url => "http://svn.freebsd.org/base/",
|
136
|
-
:scm_branch => "master"
|
137
|
-
}
|
138
|
-
test_and_validate(
|
139
|
-
name,
|
140
|
-
params,
|
141
|
-
"<remote>http://svn.freebsd.org/base/</remote>"
|
142
|
-
)
|
143
|
-
end
|
144
|
-
it "Should create a freestyle job with CVS SCM provider with branch" do
|
145
|
-
name = "test_job_with_cvs_scm_branch"
|
146
|
-
params = {
|
147
|
-
:name => name,
|
148
|
-
:scm_provider => "cvs",
|
149
|
-
:scm_url => "http://cvs.NetBSD.org",
|
150
|
-
:scm_module => "src",
|
151
|
-
:scm_branch => "MAIN"
|
152
|
-
}
|
153
|
-
test_and_validate(
|
154
|
-
name,
|
155
|
-
params,
|
156
|
-
"<cvsroot>http://cvs.NetBSD.org</cvsroot>"
|
157
|
-
)
|
158
|
-
end
|
159
|
-
it "Should create a freestyle job with CVS SCM provider with tag" do
|
160
|
-
name = "test_job_with_cvs_scm_tag"
|
161
|
-
params = {
|
162
|
-
:name => name,
|
163
|
-
:scm_provider => "cvs",
|
164
|
-
:scm_url => "http://cvs.NetBSD.org",
|
165
|
-
:scm_module => "src",
|
166
|
-
:scm_tag => "MAIN"
|
167
|
-
}
|
168
|
-
test_and_validate(
|
169
|
-
name,
|
170
|
-
params,
|
171
|
-
"<cvsroot>http://cvs.NetBSD.org</cvsroot>"
|
172
|
-
)
|
173
|
-
end
|
174
|
-
it "Should raise an error if unsupported SCM is specified" do
|
175
|
-
name = "test_job_unsupported_scm"
|
176
|
-
params = {
|
177
|
-
:name => name,
|
178
|
-
:scm_provider => "non-existent",
|
179
|
-
:scm_url => "http://non-existent.com/non-existent.non",
|
180
|
-
:scm_branch => "master"
|
181
|
-
}
|
182
|
-
expect(
|
183
|
-
lambda{ @client.job.create_freestyle(params) }
|
184
|
-
).to raise_error
|
185
|
-
end
|
186
|
-
it "Should create a freestyle job with restricted_node option" do
|
187
|
-
name = "test_job_restricted_node"
|
188
|
-
params = {
|
189
|
-
:name => name,
|
190
|
-
:restricted_node => "master"
|
191
|
-
}
|
192
|
-
test_and_validate(name, params)
|
193
|
-
end
|
194
|
-
it "Should create a freestyle job with" +
|
195
|
-
" block_build_when_downstream_building option" do
|
196
|
-
name = "test_job_block_build_when_downstream_building"
|
197
|
-
params = {
|
198
|
-
:name => name,
|
199
|
-
:block_build_when_downstream_building => true,
|
200
|
-
}
|
201
|
-
test_and_validate(name, params)
|
202
|
-
end
|
203
|
-
it "Should create a freestyle job with" +
|
204
|
-
" block_build_when_upstream_building option" do
|
205
|
-
name = "test_job_block_build_when_upstream_building"
|
206
|
-
params = {
|
207
|
-
:name => name,
|
208
|
-
:block_build_when_upstream_building => true
|
209
|
-
}
|
210
|
-
test_and_validate(name, params)
|
211
|
-
end
|
212
|
-
it "Should create a freestyle job with concurrent_build option" do
|
213
|
-
name = "test_job_concurrent_build"
|
214
|
-
params = {
|
215
|
-
:name => name,
|
216
|
-
:concurrent_build => true
|
217
|
-
}
|
218
|
-
test_and_validate(name, params)
|
219
|
-
end
|
220
|
-
it "Should create a freestyle job with timer option" do
|
221
|
-
name = "test_job_using_timer"
|
222
|
-
params = {
|
223
|
-
:name => name,
|
224
|
-
:timer => "* * * * *"
|
225
|
-
}
|
226
|
-
test_and_validate(name, params)
|
227
|
-
end
|
228
|
-
it "Should create a freestyle job with child projects option" do
|
229
|
-
name = "test_job_child_projects"
|
230
|
-
params = {
|
231
|
-
:name => name,
|
232
|
-
:child_projects => @job_name,
|
233
|
-
:child_threshold => "success"
|
234
|
-
}
|
235
|
-
test_and_validate(name, params)
|
236
|
-
end
|
237
|
-
it "Should create a freestyle job with notification_email option" do
|
238
|
-
name = "test_job_notification_email"
|
239
|
-
params = {
|
240
|
-
:name => name,
|
241
|
-
:notification_email => "kannan@testdomain.com"
|
242
|
-
}
|
243
|
-
test_and_validate(name, params)
|
244
|
-
end
|
245
|
-
it "Should create a freestyle job with notification for" +
|
246
|
-
" individual skype targets" do
|
247
|
-
name = "test_job_with_individual_skype_targets"
|
248
|
-
params = {
|
249
|
-
:name => name,
|
250
|
-
:skype_targets => "testuser"
|
251
|
-
}
|
252
|
-
test_and_validate(name, params)
|
253
|
-
end
|
254
|
-
it "Should create a freestyle job with notification for" +
|
255
|
-
" group skype targets" do
|
256
|
-
name = "test_job_with_group_skype_targets"
|
257
|
-
params = {
|
258
|
-
:name => name,
|
259
|
-
:skype_targets => "*testgroup"
|
260
|
-
}
|
261
|
-
test_and_validate(name, params)
|
262
|
-
end
|
263
|
-
it "Should create a freestyle job with complex skype" +
|
264
|
-
" configuration" do
|
265
|
-
name = "test_job_with_complex_skype_configuration"
|
266
|
-
params = {
|
267
|
-
:name => name,
|
268
|
-
:skype_targets => "testuser *testgroup anotheruser *anothergroup",
|
269
|
-
:skype_strategy => "failure_and_fixed",
|
270
|
-
:skype_notify_on_build_start => true,
|
271
|
-
:skype_notify_suspects => true,
|
272
|
-
:skype_notify_culprits => true,
|
273
|
-
:skype_notify_fixers => true,
|
274
|
-
:skype_notify_upstream_committers => false,
|
275
|
-
:skype_message => "summary_and_scm_changes"
|
276
|
-
}
|
277
|
-
test_and_validate(name, params)
|
278
|
-
end
|
279
|
-
it "Should raise an error if the input parameters is not a Hash" do
|
280
|
-
expect(
|
281
|
-
lambda {
|
282
|
-
@client.job.create_freestyle("a_string")
|
283
|
-
}
|
284
|
-
).to raise_error(ArgumentError)
|
285
|
-
end
|
286
|
-
it "Should raise an error if the required name paremeter is missing" do
|
287
|
-
expect(
|
288
|
-
lambda {
|
289
|
-
@client.job.create_freestyle(:shell_command => "sleep 60")
|
290
|
-
}
|
291
|
-
).to raise_error(ArgumentError)
|
292
|
-
end
|
293
|
-
end
|
294
|
-
|
295
|
-
describe "#copy" do
|
296
|
-
it "accepts the from and to job name and copies the job" do
|
297
|
-
xml = @helper.create_job_xml
|
298
|
-
@client.job.create("from_job_copy_test", xml)
|
299
|
-
@client.job.copy("from_job_copy_test", "to_job_copy_test")
|
300
|
-
@client.job.list(".*_job_copy_test").should == [
|
301
|
-
"from_job_copy_test", "to_job_copy_test"
|
302
|
-
]
|
303
|
-
@client.job.delete("from_job_copy_test")
|
304
|
-
@client.job.delete("to_job_copy_test")
|
305
|
-
end
|
306
|
-
it "accepts the from job name and copies the from job to the" +
|
307
|
-
" copy_of_from job" do
|
308
|
-
xml = @helper.create_job_xml
|
309
|
-
@client.job.create("from_job_copy_test", xml)
|
310
|
-
@client.job.copy("from_job_copy_test")
|
311
|
-
@client.job.list(".*_job_copy_test").should == [
|
312
|
-
"copy_of_from_job_copy_test", "from_job_copy_test"
|
313
|
-
]
|
314
|
-
@client.job.delete("from_job_copy_test")
|
315
|
-
@client.job.delete("copy_of_from_job_copy_test")
|
316
|
-
end
|
317
|
-
end
|
318
|
-
|
319
|
-
describe "#add_email_notification" do
|
320
|
-
it "Should accept email address and add to existing job" do
|
321
|
-
name = "email_notification_test_job"
|
322
|
-
params = {:name => name}
|
323
|
-
@valid_post_responses.should include(
|
324
|
-
@client.job.create_freestyle(params).to_i
|
325
|
-
)
|
326
|
-
@valid_post_responses.should include(
|
327
|
-
@client.job.add_email_notification(
|
328
|
-
:name => name,
|
329
|
-
:notification_email => "testuser@testdomain.com"
|
330
|
-
).to_i
|
331
|
-
)
|
332
|
-
@valid_post_responses.should include(
|
333
|
-
@client.job.delete(name).to_i
|
334
|
-
)
|
335
|
-
end
|
336
|
-
end
|
337
|
-
|
338
|
-
describe "#add_skype_notification" do
|
339
|
-
it "Should accept skype configuration and add to existing job" do
|
340
|
-
name = "skype_notification_test_job"
|
341
|
-
params = {
|
342
|
-
:name => name
|
343
|
-
}
|
344
|
-
@valid_post_responses.should include(
|
345
|
-
@client.job.create_freestyle(params).to_i
|
346
|
-
)
|
347
|
-
@valid_post_responses.should include(
|
348
|
-
@client.job.add_skype_notification(
|
349
|
-
:name => name,
|
350
|
-
:skype_targets => "testuser"
|
351
|
-
).to_i
|
352
|
-
)
|
353
|
-
@valid_post_responses.should include(
|
354
|
-
@client.job.delete(name).to_i
|
355
|
-
)
|
356
|
-
end
|
357
|
-
end
|
358
|
-
|
359
|
-
describe "#rename" do
|
360
|
-
it "Should accept new and old job names and rename the job" do
|
361
|
-
xml = @helper.create_job_xml
|
362
|
-
@client.job.create("old_job_rename_test", xml)
|
363
|
-
@client.job.rename("old_job_rename_test", "new_job_rename_test")
|
364
|
-
@client.job.list("old_job_rename_test").should == []
|
365
|
-
resp = @client.job.list("new_job_rename_test")
|
366
|
-
resp.size.should == 1
|
367
|
-
resp.first.should == "new_job_rename_test"
|
368
|
-
@client.job.delete("new_job_rename_test")
|
369
|
-
end
|
370
|
-
end
|
371
|
-
|
372
|
-
describe "#recreate" do
|
373
|
-
it "Should be able to re-create a job" do
|
374
|
-
@valid_post_responses.should include(
|
375
|
-
@client.job.recreate("qwerty_nonexistent_job").to_i
|
376
|
-
)
|
377
|
-
end
|
378
|
-
end
|
379
|
-
|
380
|
-
describe "#change_description" do
|
381
|
-
it "Should be able to change the description of a job" do
|
382
|
-
@valid_post_responses.should include(
|
383
|
-
@client.job.change_description("qwerty_nonexistent_job",
|
384
|
-
"The description has been changed by the spec test").to_i
|
385
|
-
)
|
386
|
-
end
|
387
|
-
end
|
388
|
-
|
389
|
-
describe "#delete" do
|
390
|
-
it "Should be able to delete a job" do
|
391
|
-
@valid_post_responses.should include(
|
392
|
-
@client.job.delete("qwerty_nonexistent_job").to_i
|
393
|
-
)
|
394
|
-
end
|
395
|
-
end
|
396
|
-
|
397
|
-
describe "#wipe_out_workspace" do
|
398
|
-
it "Should be able to wipe out the workspace of a job" do
|
399
|
-
xml = @helper.create_job_xml
|
400
|
-
@client.job.create("wipeout_job_test", xml)
|
401
|
-
@valid_post_responses.should include(
|
402
|
-
@client.job.wipe_out_workspace("wipeout_job_test").to_i
|
403
|
-
)
|
404
|
-
@client.job.delete("wipeout_job_test")
|
405
|
-
end
|
406
|
-
end
|
407
|
-
|
408
|
-
describe "#list_all" do
|
409
|
-
it "Should list all jobs" do
|
410
|
-
@client.job.list_all.class.should == Array
|
411
|
-
end
|
412
|
-
end
|
413
|
-
|
414
|
-
describe "#list" do
|
415
|
-
it "Should return job names based on the filter" do
|
416
|
-
names = @client.job.list(@filter)
|
417
|
-
names.class.should == Array
|
418
|
-
names.each { |name|
|
419
|
-
name.should match /#{@filter}/i
|
420
|
-
}
|
421
|
-
end
|
422
|
-
end
|
423
|
-
|
424
|
-
describe "#list_by_status" do
|
425
|
-
it "Should be able to list jobs by status" do
|
426
|
-
names = @client.job.list_by_status('success')
|
427
|
-
names.class.should == Array
|
428
|
-
names.each do |name|
|
429
|
-
status = @client.job.get_current_build_status(name)
|
430
|
-
status.should == 'success'
|
431
|
-
end
|
432
|
-
end
|
433
|
-
end
|
434
|
-
|
435
|
-
describe "#list_all_with_details" do
|
436
|
-
it "Should return all job names with details" do
|
437
|
-
@client.job.list_all_with_details.class.should == Array
|
438
|
-
end
|
439
|
-
end
|
440
|
-
|
441
|
-
describe "#list_details" do
|
442
|
-
it "Should list details of a particular job" do
|
443
|
-
job_name = @client.job.list(@filter)[0]
|
444
|
-
job_name.class.should == String
|
445
|
-
@client.job.list_details(job_name).class.should == Hash
|
446
|
-
end
|
447
|
-
end
|
448
|
-
|
449
|
-
describe "#get_upstream_projects" do
|
450
|
-
it "Should list upstream projects of the specified job" do
|
451
|
-
@client.job.get_upstream_projects(@job_name).class.should == Array
|
452
|
-
end
|
453
|
-
end
|
454
|
-
|
455
|
-
describe "#get_downstream_projects" do
|
456
|
-
it "Should list downstream projects of the specified job" do
|
457
|
-
@client.job.get_downstream_projects(@job_name).class.should == Array
|
458
|
-
end
|
459
|
-
end
|
460
|
-
|
461
|
-
describe "#get_builds" do
|
462
|
-
it "Should get builds of a specified job" do
|
463
|
-
@client.job.get_builds(@job_name).class.should == Array
|
464
|
-
end
|
465
|
-
end
|
466
|
-
|
467
|
-
describe "#get_current_build_status" do
|
468
|
-
it "Should obtain the current build status for the specified job" do
|
469
|
-
build_status = @client.job.get_current_build_status(@job_name)
|
470
|
-
build_status.class.should == String
|
471
|
-
valid_build_status = [
|
472
|
-
"not_run",
|
473
|
-
"aborted",
|
474
|
-
"success",
|
475
|
-
"failure",
|
476
|
-
"unstable",
|
477
|
-
"running"
|
478
|
-
]
|
479
|
-
valid_build_status.include?(build_status).should be_true
|
480
|
-
end
|
481
|
-
end
|
482
|
-
|
483
|
-
describe "#build" do
|
484
|
-
|
485
|
-
def wait_for_job_to_finish(job_name)
|
486
|
-
while @client.job.get_current_build_status(@job_name) == "running" do
|
487
|
-
# Waiting for this job to finish so it doesn't affect other tests
|
488
|
-
sleep 10
|
489
|
-
end
|
490
|
-
end
|
491
|
-
|
492
|
-
it "Should build the specified job" do
|
493
|
-
@client.job.get_current_build_status(
|
494
|
-
@job_name
|
495
|
-
).should_not == "running"
|
496
|
-
response = @client.job.build(@job_name)
|
497
|
-
# As of Jenkins version 1.519 the job build responds with a 201
|
498
|
-
# status code.
|
499
|
-
@valid_post_responses.should include(response.to_i)
|
500
|
-
# Sleep for 10 seconds so we don't hit the Jenkins quiet period (5
|
501
|
-
# seconds)
|
502
|
-
sleep 10
|
503
|
-
@client.job.get_current_build_status(@job_name).should == "running"
|
504
|
-
wait_for_job_to_finish(@job_name)
|
505
|
-
end
|
506
|
-
|
507
|
-
it "Should build the specified job (wait for start)" do
|
508
|
-
@client.job.get_current_build_status(
|
509
|
-
@job_name
|
510
|
-
).should_not == "running"
|
511
|
-
expected_build_id = (@client.job.get_current_build_number(@job_name) || 0) + 1
|
512
|
-
|
513
|
-
build_opts = {
|
514
|
-
'build_start_timeout' => 10,
|
515
|
-
'progress_proc' => lambda do |max_wait, curr_wait, poll_count|
|
516
|
-
puts "Waited #{curr_wait}s of #{max_wait}s max - poll count = #{poll_count}"
|
517
|
-
end,
|
518
|
-
'completion_proc' => lambda do |build_number, cancelled|
|
519
|
-
if build_number
|
520
|
-
puts "Wait over: build #{build_number} started"
|
521
|
-
else
|
522
|
-
puts "Wait over: build not started, build #{cancelled ? "" : "NOT "} cancelled"
|
523
|
-
end
|
524
|
-
end
|
525
|
-
}
|
526
|
-
build_id = @client.job.build(@job_name, {}, build_opts)
|
527
|
-
build_id.should_not be_nil
|
528
|
-
build_id.should eql(expected_build_id)
|
529
|
-
@client.job.get_current_build_status(@job_name).should == "running"
|
530
|
-
wait_for_job_to_finish(@job_name)
|
531
|
-
end
|
532
|
-
|
533
|
-
# This build doesn't start in time, but we don't cancel it, so it will run if
|
534
|
-
# Jenkins gets to it
|
535
|
-
it "Should build the specified job (wait for start - but not long enough)" do
|
536
|
-
@client.job.get_current_build_status(
|
537
|
-
@job_name
|
538
|
-
).should_not == "running"
|
539
|
-
|
540
|
-
build_opts = {
|
541
|
-
'build_start_timeout' => 1,
|
542
|
-
'progress_proc' => lambda do |max_wait, curr_wait, poll_count|
|
543
|
-
puts "Waited #{curr_wait}s of #{max_wait}s max - poll count = #{poll_count}"
|
544
|
-
end,
|
545
|
-
'completion_proc' => lambda do |build_number, cancelled|
|
546
|
-
if build_number
|
547
|
-
puts "Wait over: build #{build_number} started"
|
548
|
-
else
|
549
|
-
puts "Wait over: build not started, build #{cancelled ? "" : "NOT "}cancelled"
|
550
|
-
end
|
551
|
-
end
|
552
|
-
}
|
553
|
-
expect( lambda { @client.job.build(@job_name, {}, build_opts) } ).to raise_error(Timeout::Error)
|
554
|
-
# Sleep for 10 seconds so we don't hit the Jenkins quiet period (5
|
555
|
-
# seconds)
|
556
|
-
sleep 10
|
557
|
-
@client.job.get_current_build_status(@job_name).should == "running"
|
558
|
-
wait_for_job_to_finish(@job_name)
|
559
|
-
end
|
560
|
-
|
561
|
-
# This build doesn't start in time, and we will attempt to cancel it so it
|
562
|
-
# doesn't run
|
563
|
-
it "Should build the specified job (wait for start - but not long enough, cancelled)" do
|
564
|
-
@client.job.get_current_build_status(
|
565
|
-
@job_name
|
566
|
-
).should_not == "running"
|
567
|
-
|
568
|
-
build_opts = {
|
569
|
-
'build_start_timeout' => 1,
|
570
|
-
'cancel_on_build_start_timeout' => true,
|
571
|
-
'progress_proc' => lambda do |max_wait, curr_wait, poll_count|
|
572
|
-
puts "Waited #{curr_wait}s of #{max_wait}s max - poll count = #{poll_count}"
|
573
|
-
end,
|
574
|
-
'completion_proc' => lambda do |build_number, cancelled|
|
575
|
-
if build_number
|
576
|
-
puts "Wait over: build #{build_number} started"
|
577
|
-
else
|
578
|
-
puts "Wait over: build not started, build #{cancelled ? "" : "NOT "}cancelled"
|
579
|
-
end
|
580
|
-
end
|
581
|
-
}
|
582
|
-
expect( lambda { @client.job.build(@job_name, {}, build_opts) } ).to raise_error(Timeout::Error)
|
583
|
-
end
|
584
|
-
end
|
585
|
-
|
586
|
-
describe "#poll" do
|
587
|
-
it "Should poll the specified job for scm changes" do
|
588
|
-
response = @client.job.poll(@job_name)
|
589
|
-
@valid_post_responses.should include(response.to_i)
|
590
|
-
end
|
591
|
-
end
|
592
|
-
|
593
|
-
describe "#disable" do
|
594
|
-
it "Should disable the specified job and then enable it again" do
|
595
|
-
@client.job.list_details(@job_name)['buildable'].should == true
|
596
|
-
response = @client.job.disable(@job_name)
|
597
|
-
response.to_i.should == 302
|
598
|
-
sleep 3
|
599
|
-
@client.job.list_details(@job_name)['buildable'].should == false
|
600
|
-
response = @client.job.enable(@job_name)
|
601
|
-
response.to_i.should == 302
|
602
|
-
sleep 3
|
603
|
-
@client.job.list_details(@job_name)['buildable'].should == true
|
604
|
-
end
|
605
|
-
end
|
606
|
-
|
607
|
-
describe "#stop" do
|
608
|
-
it "Should be able to abort a recent build of a running job" do
|
609
|
-
@client.job.get_current_build_status(
|
610
|
-
@job_name
|
611
|
-
).should_not == "running"
|
612
|
-
@client.job.build(@job_name)
|
613
|
-
sleep 10
|
614
|
-
@client.job.get_current_build_status(@job_name).should == "running"
|
615
|
-
sleep 5
|
616
|
-
@valid_post_responses.should include(
|
617
|
-
@client.job.stop_build(@job_name).to_i
|
618
|
-
)
|
619
|
-
sleep 5
|
620
|
-
@client.job.get_current_build_status(@job_name).should == "aborted"
|
621
|
-
end
|
622
|
-
end
|
623
|
-
|
624
|
-
describe "#restrict_to_node" do
|
625
|
-
it "Should be able to restrict a job to a node" do
|
626
|
-
@valid_post_responses.should include(
|
627
|
-
@client.job.restrict_to_node(@job_name, 'master').to_i
|
628
|
-
)
|
629
|
-
# Run it again to make sure that the replace existing node works
|
630
|
-
@valid_post_responses.should include(
|
631
|
-
@client.job.restrict_to_node(@job_name, 'master').to_i
|
632
|
-
)
|
633
|
-
end
|
634
|
-
end
|
635
|
-
|
636
|
-
describe "#chain" do
|
637
|
-
it "Should be able to chain all jobs" do
|
638
|
-
# Filter jobs to be chained
|
639
|
-
jobs = @client.job.list(@filter)
|
640
|
-
jobs.class.should == Array
|
641
|
-
start_jobs = @client.job.chain(jobs, 'success', ["all"])
|
642
|
-
start_jobs.class.should == Array
|
643
|
-
start_jobs.length.should == 1
|
644
|
-
end
|
645
|
-
it "Should be able to chain jobs based on the specified criteria" do
|
646
|
-
jobs = @client.job.list(@filter)
|
647
|
-
jobs.class.should == Array
|
648
|
-
start_jobs = @client.job.chain(
|
649
|
-
jobs,
|
650
|
-
'failure',
|
651
|
-
["not_run", "aborted", 'failure'],
|
652
|
-
3
|
653
|
-
)
|
654
|
-
start_jobs.class.should == Array
|
655
|
-
start_jobs.length.should == 3
|
656
|
-
end
|
657
|
-
end
|
658
|
-
|
659
|
-
end
|
660
|
-
|
661
|
-
after(:all) do
|
662
|
-
job_names = @client.job.list(@filter)
|
663
|
-
job_names.each { |job_name|
|
664
|
-
@client.job.delete(job_name)
|
665
|
-
}
|
666
|
-
end
|
667
|
-
|
668
|
-
end
|
669
|
-
end
|