teamcity-ruby-client 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/.yardopts +1 -0
- data/CHANGELOG.md +15 -3
- data/Guardfile +9 -0
- data/lib/teamcity.rb +1 -0
- data/lib/teamcity/client.rb +1 -2
- data/lib/teamcity/client/build_types.rb +94 -23
- data/lib/teamcity/client/projects.rb +37 -8
- data/lib/teamcity/client/vcs_roots.rb +9 -16
- data/lib/teamcity/element_builder.rb +27 -0
- data/lib/teamcity/version.rb +1 -1
- data/spec/cassettes/BuildTypes/POST/_attach_vcs_root/should_attach_a_vcs_root_to_a_buildtype.yml +12 -10
- data/spec/cassettes/BuildTypes/POST/_create_agent_requirement/should_create_an_agent_requirement_for_a_buildtype.yml +11 -11
- data/spec/cassettes/BuildTypes/POST/_create_build_step/should_create_a_build_step_for_a_given_build_type.yml +46 -0
- data/spec/cassettes/BuildTypes/POST/_create_build_trigger/should_create_a_build_trigger_for_a_given_build_type.yml +46 -0
- data/spec/cassettes/BuildTypes/POST/_create_buildtype/should_create_a_build_type.yml +86 -0
- data/spec/cassettes/BuildTypes/PUT/_set_buildtype_setting/should_set_if_it_should_perform_clean_builds.yml +46 -0
- data/spec/cassettes/BuildTypes/PUT/_set_buildtype_setting/should_set_what_is_the_timeout_in_minutes_when_executing_builds.yml +46 -0
- data/spec/cassettes/BuildTypes/PUT/_set_buildtype_setting/should_set_where_the_checkout_happens_when_building.yml +46 -0
- data/spec/cassettes/Projects/GET/_parent_project/should_fetch_the_parent_project_for_a_given_project.yml +46 -0
- data/spec/cassettes/Projects/GET/_parent_project/should_return_nil_if_there_is_no_parent_project_for_a_given_project.yml +46 -0
- data/spec/cassettes/Projects/POST/_copy_project/should_copy_a_project.yml +27 -24
- data/spec/cassettes/Projects/PUT/_set_parent_project/should_set_a_parent_project_for_a_given_project.yml +134 -0
- data/spec/cassettes/VCSRoots/POST/_create_vcs_root/should_create_a_git_vcs_root_that_is_shared_with_the_project_and_sub-projects.yml +89 -0
- data/spec/cassettes/VCSRoots/POST/_create_vcs_root/should_create_a_subversion_vcs_root_that_is_shared_with_the_project_and_sub-projects.yml +89 -0
- data/spec/teamcity/api_spec.rb +1 -1
- data/spec/teamcity/client/buildtypes_spec.rb +58 -2
- data/spec/teamcity/client/projects_spec.rb +36 -2
- data/spec/teamcity/client/vcs_roots_spec.rb +17 -3
- data/spec/teamcity/client_spec.rb +2 -2
- data/spec/teamcity/element_builder_spec.rb +30 -0
- data/spec/teamcity/headers_spec.rb +2 -2
- data/teamcity-ruby-client.gemspec +2 -3
- metadata +44 -33
- data/spec/cassettes/VCSRoots/POST/_create_vcs_root/should_create_a_vcs_root_that_is_shared_with_the_project_and_sub-projects.yml +0 -90
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NTkyNmMwZWJmYjU4MWRhNzkwNjQwOWMzYjZlNmIxZmVhZWE0NTIyMw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NTkzYzA4NTNlZWQ5MjliYzU5ODkxYTMwOThmMmE5YTdhNzFjYjI0Yg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YWM1NWY4NDA2YzU3Y2U5NTNhNTA3ZGI0ZDNkYTkyOWQ5ZjdmMDQ3MTc4Njgx
|
10
|
+
NDMzODRhYzJiNWZjZWNlYjc3Njc4ZDQ1ZDQzZDRiYjViOGQxNDM5OGI5OGNh
|
11
|
+
YTJhOTZjMTk0NGQ5MGJlNmNjZTNiYzNlYzQwNjIzMWU4MGUxYzE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YjJiNmE0YzU4NTllYzdlOTIxOWI3NDc2ZjMyOTM0NWM3NjkyZTBmNGJmMTkz
|
14
|
+
MjM5NDljMGI3ODVmMjNhY2YxNzhmNmM5ZDU1MWUzZTFiMjc5ZWM2OTE0YWRl
|
15
|
+
NjYxNTBiNmUwMDJlMWQzNmE3MTFiNDIzNzgwN2FhMDg4YmE3OTk=
|
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--tag rest_api_version:"REST API VERSION"
|
data/CHANGELOG.md
CHANGED
@@ -1,12 +1,24 @@
|
|
1
|
+
## 1.2.0 (Dec 7, 2013)
|
2
|
+
|
3
|
+
* BuildType: Added ```.set_buildtype_setting```, provides the ability to set build configuration settings [@jeffersongirao]
|
4
|
+
* BuildType: Added ```.create_buildtype```, provides the ability to create a new build configuration [@jeffersongirao]
|
5
|
+
* BuildType: Added ```.create_build_trigger```, provides the ability to create build configuration trigger [@jeffersongirao], [@nskboy]
|
6
|
+
* BuildType: Added ```.set_buildtype_setting```, adds ability to set build configuration settings [@jeffersongirao]
|
7
|
+
* BuildType: Added ```.create_build_step```, provides the ability to create a build step in a build configuration [@jeffersongirao]
|
8
|
+
* Project: Added ```.set_parent_project``` and ```.parent_project``` for setting and getting parent project. (TeamCity8 only) [@jeffersongirao]
|
9
|
+
* Bug: Fix ```.create_vcs_root``` to work for svn [@jeffersongirao]
|
10
|
+
* Cleanup: Remove dependency on xmlbuilder and linguistics [@jeffersongirao]
|
11
|
+
* Testing: Upgrade to rspec 2.14.1 and added guard-rspec gem
|
12
|
+
* Documentation: Added *rest_api_version* tag for specify teamcity api compatibility
|
13
|
+
|
1
14
|
## 1.1.0 (Nov 1, 2013)
|
2
15
|
|
3
16
|
* Features:
|
4
17
|
* Added ```build_artifacts``` (Provides the ability to fetch the
|
5
|
-
contents of an aritfact)
|
18
|
+
contents of an aritfact) [@orikremer]
|
6
19
|
|
7
20
|
* Gem Updates
|
8
|
-
* Upgraded webmock to remove deprecation warning
|
9
|
-
[@akiellor](https://github.com/akiellor)
|
21
|
+
* Upgraded webmock to remove deprecation warning [@akiellor]
|
10
22
|
|
11
23
|
## 1.0.1 (Nov 1, 2013)
|
12
24
|
|
data/Guardfile
ADDED
data/lib/teamcity.rb
CHANGED
data/lib/teamcity/client.rb
CHANGED
@@ -1,12 +1,7 @@
|
|
1
|
-
require 'linguistics'
|
2
|
-
|
3
1
|
module TeamCity
|
4
2
|
class Client
|
5
3
|
# Defines methods related to build types (or build configurations)
|
6
4
|
module BuildTypes
|
7
|
-
|
8
|
-
Linguistics.use :en
|
9
|
-
|
10
5
|
# HTTP GET
|
11
6
|
|
12
7
|
# List of build types
|
@@ -26,6 +21,17 @@ module TeamCity
|
|
26
21
|
get("buildTypes/#{locator(options)}")
|
27
22
|
end
|
28
23
|
|
24
|
+
# Create a Build Configuration
|
25
|
+
#
|
26
|
+
# @param project_id [String] id of the project you are adding the build configuration
|
27
|
+
# @param name [String] name of the buildtype you wish to create
|
28
|
+
# @return [Hashie::Mash] of build configuration details
|
29
|
+
def create_buildtype(project_id, name)
|
30
|
+
post("projects/#{project_id}/buildTypes", :content_type => :text) do |req|
|
31
|
+
req.body = name
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
29
35
|
# Get whether the build is paused or not
|
30
36
|
#
|
31
37
|
# @param options [Hash] option keys, :id => buildtype_id
|
@@ -87,10 +93,11 @@ module TeamCity
|
|
87
93
|
define_method("buildtype_#{name}".to_sym) do |options|
|
88
94
|
name_has_dashes = name.to_s.gsub('_', '-')
|
89
95
|
assert_options(options)
|
90
|
-
response = get("buildTypes/#{locator(options)}/#{name_has_dashes}")
|
91
|
-
response[
|
96
|
+
response = get("buildTypes/#{locator(options)}/#{name_has_dashes}", accept: :json)
|
97
|
+
response[response.keys.first]
|
92
98
|
end
|
93
99
|
end
|
100
|
+
|
94
101
|
private_class_method :make_method
|
95
102
|
|
96
103
|
make_method :features
|
@@ -108,13 +115,10 @@ module TeamCity
|
|
108
115
|
# @param vcs_root_id [String, Numeric] id of vcs root
|
109
116
|
# @return [Hashie::Mash] vcs root object that was attached
|
110
117
|
def attach_vcs_root(buildtype_id, vcs_root_id)
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
post("buildTypes/#{buildtype_id}/vcs-root-entries") do |req|
|
116
|
-
req.headers['Content-Type'] = 'application/xml'
|
117
|
-
req.body = builder.target!
|
118
|
+
payload = { 'vcs-root' => { :id => vcs_root_id } }
|
119
|
+
|
120
|
+
post("buildTypes/#{buildtype_id}/vcs-root-entries", :content_type => :json) do |req|
|
121
|
+
req.body = payload.to_json
|
118
122
|
end
|
119
123
|
end
|
120
124
|
|
@@ -155,16 +159,14 @@ module TeamCity
|
|
155
159
|
#
|
156
160
|
# @note Check the TeamCity UI for supported conditions
|
157
161
|
def create_agent_requirement(buildtype_id, parameter_name, parameter_value, condition)
|
158
|
-
builder =
|
159
|
-
|
160
|
-
|
161
|
-
p.property(:name => 'property-name', :value => parameter_name)
|
162
|
-
p.property(:name => 'property-value', :value => parameter_value)
|
163
|
-
end
|
162
|
+
builder = TeamCity::ElementBuilder.new(:id => parameter_name, :type => condition) do |properties|
|
163
|
+
properties['property-name'] = parameter_name
|
164
|
+
properties['property-value'] = parameter_value
|
164
165
|
end
|
166
|
+
|
165
167
|
path = "buildTypes/#{buildtype_id}/agent-requirements"
|
166
|
-
post(path, :accept => :json, :content_type => :
|
167
|
-
req.body = builder.
|
168
|
+
post(path, :accept => :json, :content_type => :json) do |req|
|
169
|
+
req.body = builder.to_request_body
|
168
170
|
end
|
169
171
|
end
|
170
172
|
|
@@ -197,6 +199,23 @@ module TeamCity
|
|
197
199
|
end
|
198
200
|
end
|
199
201
|
|
202
|
+
# Set buildtype settings
|
203
|
+
#
|
204
|
+
# @example Cleaning all files between the builds
|
205
|
+
# TeamCity.set_buildtype_setting('bt3', 'cleanBuild', 'true')
|
206
|
+
# @example Checkout on the server
|
207
|
+
# TeamCity.set_buildtype_setting('bt3', 'checkoutMode', 'ON_SERVER')
|
208
|
+
# @example Fail the build after 10 Minutes
|
209
|
+
# Teamcity.set_buildtype_setting('bt3', 'executionTimeoutMin', '10')
|
210
|
+
#
|
211
|
+
# @param buidltype_id [String] the buildtype id
|
212
|
+
# @param setting_name [String] the settings name
|
213
|
+
# @param setting_value [String] the value to set the settings to
|
214
|
+
# @return setting_value [String] value that was set
|
215
|
+
def set_buildtype_setting(buildtype_id, setting_name, setting_value)
|
216
|
+
set_buildtype_field(buildtype_id, "settings/#{setting_name}", setting_value)
|
217
|
+
end
|
218
|
+
|
200
219
|
# Delete buildtype (build configuration)
|
201
220
|
#
|
202
221
|
# @param buildtype_id [String] the id of the buildtype
|
@@ -218,6 +237,58 @@ module TeamCity
|
|
218
237
|
req.body = field_value
|
219
238
|
end
|
220
239
|
end
|
240
|
+
|
241
|
+
# Create Build Step
|
242
|
+
#
|
243
|
+
# @param buildtype_id [String] :buildtype_id to create the step under
|
244
|
+
# @option options [String] :name for the step definition (optional)
|
245
|
+
# @option options [String] :type Type of Build Step: 'Maven', 'Ant', etc
|
246
|
+
# @yield [Hash] properties to set on the step, view the official documentation for supported properties
|
247
|
+
# @return [Hashie::Mash] step object that was created
|
248
|
+
#
|
249
|
+
# @example Create a Maven2 step that executes the target verify
|
250
|
+
# TeamCity.create_build_step(:buildtype_id => 'my-build-type-id', :type => 'Maven', name: 'Unit Tests') do |properties|
|
251
|
+
# properties['goals'] = 'verify'
|
252
|
+
# properties['mavenSelection'] = 'mavenSelection:default'
|
253
|
+
# properties['pomLocation'] = 'pom.xml'
|
254
|
+
# end
|
255
|
+
def create_build_step(buildtype_id, options = {}, &block)
|
256
|
+
attributes = {
|
257
|
+
:type => options.fetch(:type),
|
258
|
+
:name => options.fetch(:name) { nil }
|
259
|
+
}
|
260
|
+
|
261
|
+
builder = TeamCity::ElementBuilder.new(attributes, &block)
|
262
|
+
|
263
|
+
post("buildTypes/#{buildtype_id}/steps", :content_type => :json) do |req|
|
264
|
+
req.body = builder.to_request_body
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
# Create Build Trigger
|
269
|
+
#
|
270
|
+
# @param buildtype_id [String] :buildtype_id to create the trigger under
|
271
|
+
# @option options [String] :type Type of Build Trigger: 'vcsTrigger', 'schedulingTrigger', etc
|
272
|
+
# @yield [Hash] properties to set on the trigger, view the official documentation for supported properties
|
273
|
+
# @return [Hashie::Mash] trigger object that was created
|
274
|
+
#
|
275
|
+
# @example Create a a VCS build trigger for checkins
|
276
|
+
# TeamCity.create_build_step(:buildtype_id => 'my-build-type-id', :type => 'vcsTrigger', name: 'Every Checkin') do |properties|
|
277
|
+
# properties['groupCheckkinsByCommitter'] = 'true'
|
278
|
+
# properties['perCheckinTriggering'] = 'true'
|
279
|
+
# properties['quietPeriodMode'] = 'DO_NOT_USE'
|
280
|
+
# end
|
281
|
+
def create_build_trigger(buildtype_id, options = {}, &block)
|
282
|
+
attributes = {
|
283
|
+
:type => options.fetch(:type),
|
284
|
+
}
|
285
|
+
|
286
|
+
builder = TeamCity::ElementBuilder.new(attributes, &block)
|
287
|
+
|
288
|
+
post("buildTypes/#{buildtype_id}/triggers", :content_type => :json) do |req|
|
289
|
+
req.body = builder.to_request_body
|
290
|
+
end
|
291
|
+
end
|
221
292
|
end
|
222
293
|
end
|
223
|
-
end
|
294
|
+
end
|
@@ -41,6 +41,18 @@ module TeamCity
|
|
41
41
|
response['property']
|
42
42
|
end
|
43
43
|
|
44
|
+
# Get parent project
|
45
|
+
#
|
46
|
+
# @param (see #project)
|
47
|
+
# @return [Hashie::Mash] of the parent project details
|
48
|
+
# @rest_api_version >= 8.0
|
49
|
+
def parent_project(options={})
|
50
|
+
assert_options(options)
|
51
|
+
response = get("projects/#{locator(options)}/parentProject")
|
52
|
+
return nil if response['id'] == '_Root'
|
53
|
+
response
|
54
|
+
end
|
55
|
+
|
44
56
|
# Create an empty project
|
45
57
|
#
|
46
58
|
# @param name [String] Name of the project
|
@@ -64,12 +76,11 @@ module TeamCity
|
|
64
76
|
attributes = {
|
65
77
|
:name => target_project_name
|
66
78
|
}
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
req.body = builder.target!
|
79
|
+
|
80
|
+
payload = { 'sourceProject' => { locator: source_project_id } }.merge(attributes)
|
81
|
+
|
82
|
+
post("projects", :content_type => :json, :accept => :json) do |req|
|
83
|
+
req.body = payload.to_json
|
73
84
|
end
|
74
85
|
end
|
75
86
|
|
@@ -80,7 +91,7 @@ module TeamCity
|
|
80
91
|
def delete_project(project_id)
|
81
92
|
delete("projects/#{project_id}")
|
82
93
|
end
|
83
|
-
|
94
|
+
|
84
95
|
# Delete a project parameter
|
85
96
|
#
|
86
97
|
# @param project_id [String] the project id
|
@@ -124,6 +135,24 @@ module TeamCity
|
|
124
135
|
req.body = field_value
|
125
136
|
end
|
126
137
|
end
|
138
|
+
|
139
|
+
# Set a parent for a given project
|
140
|
+
#
|
141
|
+
# @example Set project1 as parent for project2
|
142
|
+
# TeamCity.set_parent_project('project2', 'project1')
|
143
|
+
#
|
144
|
+
# @param project_id [String] the project id
|
145
|
+
# @param parent_project_id [String] the parent project id
|
146
|
+
# @return [Hashie::Mash] of child project details
|
147
|
+
# @rest_api_version >= 8.0
|
148
|
+
def set_parent_project(project_id, parent_project_id)
|
149
|
+
path = "projects/#{project_id}/parentProject"
|
150
|
+
payload = { :id => parent_project_id }
|
151
|
+
|
152
|
+
put(path, :content_type => :json, :accept => :json) do |req|
|
153
|
+
req.body = payload.to_json
|
154
|
+
end
|
155
|
+
end
|
127
156
|
end
|
128
157
|
end
|
129
|
-
end
|
158
|
+
end
|
@@ -2,6 +2,8 @@ module TeamCity
|
|
2
2
|
class Client
|
3
3
|
module VCSRoots
|
4
4
|
|
5
|
+
VCS_TYPES = { 'git' => 'jetbrains.git' }
|
6
|
+
|
5
7
|
# List of VCS Roots
|
6
8
|
#
|
7
9
|
# @return [Array<Hashie::Mash>, nil] of vcs roots or nil if no vcs roots exist
|
@@ -36,25 +38,16 @@ module TeamCity
|
|
36
38
|
def create_vcs_root(options = {}, &block)
|
37
39
|
attributes = {
|
38
40
|
:name => options.fetch(:vcs_name),
|
39
|
-
:vcsName =>
|
41
|
+
:vcsName => VCS_TYPES[options.fetch(:vcs_type)] || options.fetch(:vcs_type),
|
40
42
|
:projectLocator => options.fetch(:project_id)
|
41
43
|
}
|
42
|
-
|
43
|
-
builder.
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
yield(properties)
|
48
|
-
properties.each do |name, value|
|
49
|
-
p.property(:name => name, :value => value)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
post("vcs-roots", :content_type => :xml) do |req|
|
55
|
-
req.body = builder.target!
|
44
|
+
|
45
|
+
builder = TeamCity::ElementBuilder.new(attributes, &block)
|
46
|
+
|
47
|
+
post("vcs-roots", :content_type => :json) do |req|
|
48
|
+
req.body = builder.to_request_body
|
56
49
|
end
|
57
50
|
end
|
58
51
|
end
|
59
52
|
end
|
60
|
-
end
|
53
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module TeamCity
|
2
|
+
class ElementBuilder
|
3
|
+
def initialize(attributes = {}, &block)
|
4
|
+
@payload = attributes
|
5
|
+
|
6
|
+
if block_given?
|
7
|
+
@payload['properties'] ||= {}
|
8
|
+
@payload['properties']['property'] ||= []
|
9
|
+
|
10
|
+
properties = {}
|
11
|
+
|
12
|
+
yield(properties)
|
13
|
+
|
14
|
+
properties.each do |name, value|
|
15
|
+
@payload['properties']['property'] << {
|
16
|
+
:name => name,
|
17
|
+
:value => value
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_request_body
|
24
|
+
@payload.to_json
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/teamcity/version.rb
CHANGED
data/spec/cassettes/BuildTypes/POST/_attach_vcs_root/should_attach_a_vcs_root_to_a_buildtype.yml
CHANGED
@@ -4,15 +4,17 @@ http_interactions:
|
|
4
4
|
method: post
|
5
5
|
uri: http://teamcity-ruby-client:teamcity@localhost:8111/httpAuth/app/rest/buildTypes/BuildTypeTests_PostBuildTypeTests/vcs-root-entries
|
6
6
|
body:
|
7
|
-
encoding:
|
8
|
-
string:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: '{"vcs-root":{"id":"teamcity_ruby_client"}}'
|
9
9
|
headers:
|
10
10
|
User-Agent:
|
11
|
-
- TeamCity Ruby Client
|
11
|
+
- TeamCity Ruby Client 1.1.0
|
12
12
|
Accept:
|
13
13
|
- application/json; charset=utf-8
|
14
14
|
Content-Type:
|
15
|
-
- application/
|
15
|
+
- application/json
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
16
18
|
response:
|
17
19
|
status:
|
18
20
|
code: 200
|
@@ -22,7 +24,7 @@ http_interactions:
|
|
22
24
|
- Apache-Coyote/1.1
|
23
25
|
Set-Cookie:
|
24
26
|
- RememberMe=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/; HttpOnly
|
25
|
-
- TCSESSIONID=
|
27
|
+
- TCSESSIONID=5762F45291C27BA5471781C5667AE23A; Path=/; HttpOnly
|
26
28
|
Pragma:
|
27
29
|
- no-cache
|
28
30
|
Expires:
|
@@ -35,11 +37,11 @@ http_interactions:
|
|
35
37
|
Transfer-Encoding:
|
36
38
|
- chunked
|
37
39
|
Date:
|
38
|
-
- Wed,
|
40
|
+
- Wed, 27 Nov 2013 19:01:47 GMT
|
39
41
|
body:
|
40
|
-
encoding:
|
41
|
-
string:
|
42
|
-
|
42
|
+
encoding: UTF-8
|
43
|
+
string: '{"id":"teamcity_ruby_client","vcs-root":{"id":"teamcity_ruby_client","name":"TeamCity
|
44
|
+
Ruby Client","href":"/httpAuth/app/rest/vcs-roots/id:teamcity_ruby_client"},"checkout-rules":""}'
|
43
45
|
http_version:
|
44
|
-
recorded_at: Wed,
|
46
|
+
recorded_at: Wed, 27 Nov 2013 19:01:47 GMT
|
45
47
|
recorded_with: VCR 2.4.0
|