jenkins_api_client 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +14 -0
- data/lib/jenkins_api_client/client.rb +28 -2
- data/lib/jenkins_api_client/job.rb +100 -9
- data/lib/jenkins_api_client/version.rb +1 -1
- metadata +5 -5
- data/README.md +0 -4
data/README.rdoc
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
= jenkins_api_client
|
2
|
+
|
3
|
+
Client libraries for communicating with a Jenkins CI server
|
4
|
+
|
5
|
+
== Sample Usage:
|
6
|
+
|
7
|
+
Install jenkins_api_client by <tt>sudo gem install jenkins_api_client</tt>
|
8
|
+
|
9
|
+
require 'jenkins_api_client'
|
10
|
+
|
11
|
+
client = JenkinsApi::Client.new(:server_ip => '0.0.0.0',
|
12
|
+
:username => 'somename', :password => 'secret password')
|
13
|
+
# The following call will return all jobs matching 'Testjob'
|
14
|
+
puts client.job.list("^Testjob")
|
@@ -12,11 +12,17 @@ require File.expand_path('../job', __FILE__)
|
|
12
12
|
module JenkinsApi
|
13
13
|
class Client
|
14
14
|
|
15
|
-
attr_accessor :server_ip, :server_port, :username, :password
|
16
15
|
DEFAULT_SERVER_PORT = 8080
|
17
16
|
VALID_PARAMS = %w(server_ip server_port username password)
|
18
17
|
|
18
|
+
# Initialize a Client object with Jenkins CI server information and credentials
|
19
|
+
#
|
19
20
|
# @param [Hash] args
|
21
|
+
# * the +:server_ip+ param is the IP address of the Jenkins CI server
|
22
|
+
# * the +:server_port+ param is the port on which the Jenkins server listens
|
23
|
+
# * the +:username+ param is the username used for connecting to the CI server
|
24
|
+
# * the +:password+ param is the password for connecting to the CI server
|
25
|
+
#
|
20
26
|
def initialize(args)
|
21
27
|
args.each { |key, value|
|
22
28
|
instance_variable_set("@#{key}", value) if value
|
@@ -26,14 +32,22 @@ module JenkinsApi
|
|
26
32
|
@server_port = DEFAULT_SERVER_PORT unless @server_port
|
27
33
|
end
|
28
34
|
|
35
|
+
# Creates an instance to the Job object by passing a reference to self
|
36
|
+
#
|
29
37
|
def job
|
30
38
|
JenkinsApi::Client::Job.new(self)
|
31
39
|
end
|
32
40
|
|
41
|
+
# Returns a string representing the class name
|
42
|
+
#
|
33
43
|
def to_s
|
34
44
|
"#<JenkinsApi::Client>"
|
35
45
|
end
|
36
46
|
|
47
|
+
# Sends a GET request to the Jenkins CI server with the specified URL
|
48
|
+
#
|
49
|
+
# @param [String] url_prefix
|
50
|
+
#
|
37
51
|
def api_get_request(url_prefix)
|
38
52
|
http = Net::HTTP.start(@server_ip, @server_port)
|
39
53
|
request = Net::HTTP::Get.new("#{url_prefix}/api/json")
|
@@ -42,6 +56,10 @@ module JenkinsApi
|
|
42
56
|
JSON.parse(response.body)
|
43
57
|
end
|
44
58
|
|
59
|
+
# Sends a POST message to the Jenkins CI server with the specified URL
|
60
|
+
#
|
61
|
+
# @param [String] url_prefix
|
62
|
+
#
|
45
63
|
def api_post_request(url_prefix)
|
46
64
|
http = Net::HTTP.start(@server_ip, @server_port)
|
47
65
|
request = Net::HTTP::Post.new("#{url_prefix}")
|
@@ -49,7 +67,10 @@ module JenkinsApi
|
|
49
67
|
response = http.request(request)
|
50
68
|
end
|
51
69
|
|
52
|
-
|
70
|
+
# Obtains the configuration of a component from the Jenkins CI server
|
71
|
+
#
|
72
|
+
# @param [String] url_prefix
|
73
|
+
#
|
53
74
|
def get_config(url_prefix)
|
54
75
|
http = Net::HTTP.start(@server_ip, @server_port)
|
55
76
|
request = Net::HTTP::Get.new("#{url_prefix}/config.xml")
|
@@ -58,6 +79,11 @@ module JenkinsApi
|
|
58
79
|
response.body
|
59
80
|
end
|
60
81
|
|
82
|
+
# Posts the given xml configuration to the url given
|
83
|
+
#
|
84
|
+
# @param [String] url_prefix
|
85
|
+
# @param [String] xml
|
86
|
+
#
|
61
87
|
def post_config(url_prefix, xml)
|
62
88
|
http = Net::HTTP.start(@server_ip, @server_port)
|
63
89
|
request = Net::HTTP::Post.new("#{url_prefix}/config.xml")
|
@@ -2,14 +2,14 @@ module JenkinsApi
|
|
2
2
|
class Client
|
3
3
|
class Job
|
4
4
|
|
5
|
+
# Initialize the Job object and store the reference to Client object
|
6
|
+
#
|
5
7
|
def initialize(client)
|
6
8
|
@client = client
|
7
9
|
end
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
end
|
12
|
-
|
11
|
+
# List all jobs on the Jenkins CI server
|
12
|
+
#
|
13
13
|
def list_all
|
14
14
|
response_json = @client.api_get_request("")
|
15
15
|
jobs = []
|
@@ -19,6 +19,10 @@ module JenkinsApi
|
|
19
19
|
jobs.sort!
|
20
20
|
end
|
21
21
|
|
22
|
+
# List all jobs that match the given regex
|
23
|
+
#
|
24
|
+
# @param [String] filter - a regex
|
25
|
+
#
|
22
26
|
def list(filter)
|
23
27
|
response_json = @client.api_get_request("")
|
24
28
|
jobs = []
|
@@ -28,52 +32,130 @@ module JenkinsApi
|
|
28
32
|
jobs
|
29
33
|
end
|
30
34
|
|
35
|
+
# List all jobs on the Jenkins CI server along with their details
|
36
|
+
#
|
31
37
|
def list_all_with_details
|
32
38
|
response_json = @client.api_get_request("")
|
33
39
|
response_json["jobs"]
|
34
40
|
end
|
35
41
|
|
42
|
+
# List details of a specific job
|
43
|
+
#
|
44
|
+
# @param [String] job_name
|
45
|
+
#
|
36
46
|
def list_details(job_name)
|
37
47
|
@client.api_get_request("/job/#{job_name}")
|
38
48
|
end
|
39
49
|
|
50
|
+
# List upstream projects of a specific job
|
51
|
+
#
|
52
|
+
# @param [String] job_name
|
53
|
+
#
|
40
54
|
def get_upstream_projects(job_name)
|
41
55
|
response_json = @client.api_get_request("/job/#{job_name}")
|
42
56
|
response_json["upstreamProjects"]
|
43
57
|
end
|
44
58
|
|
59
|
+
# List downstream projects of a specific job
|
60
|
+
#
|
61
|
+
# @param [String] job_name
|
62
|
+
#
|
45
63
|
def get_downstream_projects(job_name)
|
46
64
|
response_json = @client.api_get_request("/job/#{job_name}")
|
47
65
|
response_json["downstreamProjects"]
|
48
66
|
end
|
49
67
|
|
68
|
+
# Obtain build details of a specific job
|
69
|
+
#
|
70
|
+
# @param [String] job_name
|
71
|
+
#
|
50
72
|
def get_builds(job_name)
|
51
73
|
response_json = @client.api_get_request("/job/#{job_name}")
|
52
74
|
response_json["builds"]
|
53
75
|
end
|
54
76
|
|
77
|
+
# Obtain the current build status of the job
|
78
|
+
# By defaule Jenkins returns the color of the job status icon
|
79
|
+
# This function translates the color into a meaningful status
|
80
|
+
#
|
81
|
+
# @param [String] job_name
|
82
|
+
#
|
83
|
+
def get_current_build_status(job_name)
|
84
|
+
response_json = @client.api_get_request("/job/#{job_name}")
|
85
|
+
case response_json["color"]
|
86
|
+
when "blue"
|
87
|
+
"success"
|
88
|
+
when "red"
|
89
|
+
"failure"
|
90
|
+
when "yellow"
|
91
|
+
"unstable"
|
92
|
+
when "grey_anime", "blue_anime", "red_anime"
|
93
|
+
"running"
|
94
|
+
when "grey"
|
95
|
+
"not run"
|
96
|
+
when "aborted"
|
97
|
+
"aborted"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# This functions lists all jobs that are currently running on the Jenkins CI server
|
102
|
+
#
|
103
|
+
def list_running
|
104
|
+
jobs = list_all
|
105
|
+
running_jobs = []
|
106
|
+
jobs.each { |job|
|
107
|
+
running_jobs << job if get_current_build_status(job) == "running"
|
108
|
+
}
|
109
|
+
running_jobs
|
110
|
+
end
|
111
|
+
|
112
|
+
# Build a job given the name of the job
|
113
|
+
#
|
114
|
+
# @param [String] job_name
|
115
|
+
#
|
55
116
|
def build(job_name)
|
56
117
|
@client.api_post_request("/job/#{job_name}/build")
|
57
118
|
end
|
58
119
|
|
120
|
+
# Obtain the configuration stored in config.xml of a specific job
|
121
|
+
#
|
122
|
+
# @param [String] job_name
|
123
|
+
#
|
59
124
|
def get_config(job_name)
|
60
125
|
@client.get_config("/job/#{job_name}")
|
61
126
|
end
|
62
127
|
|
128
|
+
# Post the configuration of a job given the job name and the config.xml
|
129
|
+
#
|
130
|
+
# @param [String] job_name
|
131
|
+
# @param [String] xml
|
132
|
+
#
|
63
133
|
def post_config(job_name, xml)
|
64
134
|
@client.post_config("/job/#{job_name}", xml)
|
65
135
|
end
|
66
136
|
|
67
|
-
|
137
|
+
# Change the description of a specific job
|
138
|
+
#
|
139
|
+
# @param [String] job_name
|
140
|
+
# @param [String] description
|
141
|
+
#
|
142
|
+
def change_description(job_name, description)
|
68
143
|
xml = get_config(job_name)
|
69
144
|
n_xml = Nokogiri::XML(xml)
|
70
145
|
desc = n_xml.xpath("//description").first
|
71
|
-
desc.content = "
|
146
|
+
desc.content = "#{description}"
|
72
147
|
xml_modified = n_xml.to_xml
|
73
148
|
post_config(job_name, xml_modified)
|
74
149
|
end
|
75
150
|
|
76
|
-
|
151
|
+
# Add downstream projects to a specific job given the job name, projects to be
|
152
|
+
# added as downstream projects, and the threshold
|
153
|
+
#
|
154
|
+
# @param [String] job_name
|
155
|
+
# @param [String] downstream_projects
|
156
|
+
# @param [String] threshold - failure, success, or unstable
|
157
|
+
#
|
158
|
+
def add_downstream_projects(job_name, downstream_projects, threshold = 'success')
|
77
159
|
case threshold
|
78
160
|
when 'success'
|
79
161
|
name = 'SUCCESS'
|
@@ -92,11 +174,11 @@ module JenkinsApi
|
|
92
174
|
n_xml = Nokogiri::XML(xml)
|
93
175
|
child_projects_node = n_xml.xpath("//childProjects").first
|
94
176
|
if child_projects_node
|
95
|
-
child_projects_node.content = child_projects_node.content + ", #{
|
177
|
+
child_projects_node.content = child_projects_node.content + ", #{downstream_projects}"
|
96
178
|
else
|
97
179
|
publisher_node = n_xml.xpath("//publishers").first
|
98
180
|
build_trigger_node = publisher_node.add_child("<hudson.tasks.BuildTrigger/>")
|
99
|
-
child_project_node = build_trigger_node.first.add_child("<childProjects>#{
|
181
|
+
child_project_node = build_trigger_node.first.add_child("<childProjects>#{downstream_projects}</childProjects>")
|
100
182
|
threshold_node = child_project_node.first.add_next_sibling("<threshold/>")
|
101
183
|
threshold_node.first.add_child("<name>#{name}</name><ordinal>#{ordinal}</ordinal><color>#{color}</color>")
|
102
184
|
end
|
@@ -104,6 +186,10 @@ module JenkinsApi
|
|
104
186
|
post_config(job_name, xml_modified)
|
105
187
|
end
|
106
188
|
|
189
|
+
# Remove all downstream projects of a specific job
|
190
|
+
#
|
191
|
+
# @param [String] job_name
|
192
|
+
#
|
107
193
|
def remove_downstream_projects(job_name)
|
108
194
|
xml = get_config(job_name)
|
109
195
|
n_xml = Nokogiri::XML(xml)
|
@@ -131,6 +217,11 @@ module JenkinsApi
|
|
131
217
|
post_config(job_name, xml_modified)
|
132
218
|
end
|
133
219
|
|
220
|
+
# Resctrict the given job to a specific node
|
221
|
+
#
|
222
|
+
# @param [String] job_name
|
223
|
+
# @param [String] node_name
|
224
|
+
#
|
134
225
|
def restrict_to_node(job_name, node_name)
|
135
226
|
xml = get_config(job_name)
|
136
227
|
n_xml = Nokogiri::XML(xml)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jenkins_api_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -165,10 +165,10 @@ email:
|
|
165
165
|
executables: []
|
166
166
|
extensions: []
|
167
167
|
extra_rdoc_files:
|
168
|
-
- README.
|
168
|
+
- README.rdoc
|
169
169
|
files:
|
170
170
|
- Gemfile
|
171
|
-
- README.
|
171
|
+
- README.rdoc
|
172
172
|
- Rakefile
|
173
173
|
- lib/jenkins_api_client.rb
|
174
174
|
- lib/jenkins_api_client/client.rb
|
@@ -189,7 +189,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
189
189
|
version: '0'
|
190
190
|
segments:
|
191
191
|
- 0
|
192
|
-
hash: -
|
192
|
+
hash: -746284255980224518
|
193
193
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
194
194
|
none: false
|
195
195
|
requirements:
|
data/README.md
DELETED