teamcity 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.travis.yml +3 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +83 -0
- data/Gemfile +4 -0
- data/Guardfile +9 -0
- data/LICENSE.txt +22 -0
- data/README.md +194 -0
- data/Rakefile +1 -0
- data/lib/faraday/null_response_body.rb +17 -0
- data/lib/teamcity.rb +26 -0
- data/lib/teamcity/api.rb +19 -0
- data/lib/teamcity/client.rb +16 -0
- data/lib/teamcity/client/build_types.rb +305 -0
- data/lib/teamcity/client/builds.rb +92 -0
- data/lib/teamcity/client/common.rb +23 -0
- data/lib/teamcity/client/projects.rb +159 -0
- data/lib/teamcity/client/tests.rb +24 -0
- data/lib/teamcity/client/vcs_roots.rb +70 -0
- data/lib/teamcity/configuration.rb +51 -0
- data/lib/teamcity/connection.rb +28 -0
- data/lib/teamcity/element_builder.rb +27 -0
- data/lib/teamcity/headers.rb +47 -0
- data/lib/teamcity/request.rb +35 -0
- data/lib/teamcity/version.rb +3 -0
- data/spec/cassettes/BuildTypes/DELETE/_delete_agent_requirement/should_delete_the_agent_requirement.yml +83 -0
- data/spec/cassettes/BuildTypes/DELETE/_delete_buildtype/should_delete_a_buildtype.yml +40 -0
- data/spec/cassettes/BuildTypes/DELETE/_delete_buildtype_parameter/should_delete_a_buildtype_parameter.yml +81 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype/should_fetch_the_details_of_a_buildtype_by_id.yml +89 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype/should_raise_an_error_if_the_buildtype_does_not_exist.yml +52 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_agent_requirements/should_fetch_the_build_configuration_agent_requirements_for_a_buildtype.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_agent_requirements/should_return_an_array.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_agent_requirements/should_return_nil_if_there_are_no_agent_requirements_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_artifact_dependencies/should_fetch_the_build_configuration_artifact_dependencies_for_a_buildtype.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_artifact_dependencies/should_return_an_array.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_artifact_dependencies/should_return_nil_if_there_are_no_artifact_dependencies_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_branches/should_fetch_vcs_branches_the_vcs_root_is_configured_to_use.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_features/should_fetch_the_build_configuration_features_for_a_buildtype.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_features/should_return_an_array.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_features/should_return_nil_if_there_are_no_features_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_investigations/should_get_investigation_details.yml +48 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_investigations/should_return_nil_if_no_one_is_investigating.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_parameters/should_fetch_the_build_configuration_parameters_for_a_buildtype.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_parameters/should_return_an_array.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_parameters/should_return_nil_if_there_are_no_parameters_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_settings/should_fetch_the_settings_for_a_given_buildtype.yml +89 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_settings/should_return_an_array.yml +89 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_snapshot_dependencies/should_fetch_the_build_configuration_snapshot_dependencies_for_a_buildtype.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_snapshot_dependencies/should_return_an_array.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_snapshot_dependencies/should_return_nil_if_there_are_no_snapshot_dependencies_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_state/should_fetch_the_state_of_the_buildtype.yml +89 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_steps/should_fetch_the_build_configuration_steps_for_a_buildtype.yml +47 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_steps/should_return_an_array.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_steps/should_return_nil_if_there_are_no_steps_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_template/should_return_nil_if_the_buildtype_is_not_associated_with_a_template.yml +52 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_template/should_return_the_attributes_of_the_associated_template.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_triggers/should_fetch_the_build_configuration_triggers_for_a_buildtype.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_triggers/should_return_an_array.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_triggers/should_return_nil_if_there_are_no_triggers_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_vcs_root_entries/should_fetch_the_build_configuration_vcs_root_entries_for_a_buildtype.yml +47 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_vcs_root_entries/should_return_an_array.yml +47 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_vcs_root_entries/should_return_nil_if_there_are_no_vcs_root_entries_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtypes/should_fetch_all_the_buildtypes.yml +46 -0
- data/spec/cassettes/BuildTypes/POST/_attach_vcs_root/should_attach_a_vcs_root_to_a_buildtype.yml +47 -0
- data/spec/cassettes/BuildTypes/POST/_create_agent_requirement/should_create_an_agent_requirement_for_a_buildtype.yml +46 -0
- 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_build_step_field/should_disable_a_build_step.yml +44 -0
- data/spec/cassettes/BuildTypes/PUT/_set_build_step_field/should_enable_a_build_step.yml +48 -0
- data/spec/cassettes/BuildTypes/PUT/_set_buildtype_field/should_pause_a_project.yml +44 -0
- data/spec/cassettes/BuildTypes/PUT/_set_buildtype_field/should_set_a_projects_description.yml +44 -0
- data/spec/cassettes/BuildTypes/PUT/_set_buildtype_field/should_set_the_buildtype_name.yml +44 -0
- data/spec/cassettes/BuildTypes/PUT/_set_buildtype_parameter/should_set_a_buildtype_parameter.yml +44 -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/Builds/DELETE/_unpin_build/should_unpin_a_build.yml +83 -0
- data/spec/cassettes/Builds/GET/_build/should_fetch_the_build_details.yml +91 -0
- data/spec/cassettes/Builds/GET/_build/should_raise_an_error_if_the_build_does_not_exist.yml +53 -0
- data/spec/cassettes/Builds/GET/_build_artifacts/should_fetch_all_the_artifacts.yml +89 -0
- data/spec/cassettes/Builds/GET/_build_pinned_/should_return_false_when_a_build_is_not_pinned.yml +126 -0
- data/spec/cassettes/Builds/GET/_build_pinned_/should_return_true_when_a_build_is_pinned.yml +126 -0
- data/spec/cassettes/Builds/GET/_build_statistics/should_return_statistics_for_a_build.yml +89 -0
- data/spec/cassettes/Builds/GET/_build_tags/should_fetch_the_build_tags.yml +89 -0
- data/spec/cassettes/Builds/GET/_build_tags/should_return_an_empty_array_if_there_are_no_build_tags_defined_for_a_build.yml +89 -0
- data/spec/cassettes/Builds/GET/_builds/should_allow_you_to_filter_by_multiple_build_locators.yml +46 -0
- data/spec/cassettes/Builds/GET/_builds/should_allow_you_to_filter_results_by_build_locators.yml +46 -0
- data/spec/cassettes/Builds/GET/_builds/should_fetch_all_the_builds.yml +46 -0
- data/spec/cassettes/Builds/GET/_builds/should_return_an_empty_array_if_no_results_are_found.yml +46 -0
- data/spec/cassettes/Builds/PUT/_pin_build/should_pin_a_build.yml +83 -0
- data/spec/cassettes/Projects/DELETE/_delete_project/should_delete_a_project.yml +82 -0
- data/spec/cassettes/Projects/DELETE/_delete_project_parameter/should_delete_a_project_parameter.yml +123 -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/GET/_project/should_fetch_a_single_project_by_id.yml +47 -0
- data/spec/cassettes/Projects/GET/_project/should_raise_an_error_if_the_project_does_not_exist.yml +52 -0
- data/spec/cassettes/Projects/GET/_project_buildtypes/should_fetch_all_the_buildTypes_for_a_project.yml +46 -0
- data/spec/cassettes/Projects/GET/_project_buildtypes/should_return_nil_if_the_project_does_not_have_any_build_types.yml +46 -0
- data/spec/cassettes/Projects/GET/_project_parameters/should_fetch_all_the_paramters_for_a_given_project.yml +46 -0
- data/spec/cassettes/Projects/GET/_project_parameters/should_return_nil_if_there_are_no_parameters_defined_for_a_project.yml +46 -0
- data/spec/cassettes/Projects/GET/_projects/should_fetch_projects.yml +46 -0
- data/spec/cassettes/Projects/POST/_copy_project/should_copy_a_project.yml +135 -0
- data/spec/cassettes/Projects/POST/_create_project/should_create_a_project.yml +45 -0
- data/spec/cassettes/Projects/PUT/_set_parent_project/should_set_a_parent_project_for_a_given_project.yml +134 -0
- data/spec/cassettes/Projects/PUT/_set_project_field/should_archive_a_project.yml +86 -0
- data/spec/cassettes/Projects/PUT/_set_project_field/should_set_a_projects_description.yml +86 -0
- data/spec/cassettes/Projects/PUT/_set_project_field/should_set_a_projects_name.yml +86 -0
- data/spec/cassettes/Projects/PUT/_set_project_parameter/should_set_a_project_parameter.yml +86 -0
- data/spec/cassettes/Tests/GET/_tests/should_allow_you_to_filter_by_test_id.yml +49 -0
- data/spec/cassettes/Tests/GET/_tests/should_allow_you_to_filter_results_by_test_count_locator.yml +55 -0
- data/spec/cassettes/Tests/GET/_tests/should_fetch_all_the_tests.yml +60 -0
- data/spec/cassettes/Tests/GET/_tests/should_return_an_empty_array_if_no_build_is_found.yml +51 -0
- data/spec/cassettes/Tests/GET/_tests/should_return_an_empty_array_if_no_test_is_found.yml +51 -0
- data/spec/cassettes/Tests/GET/_tests/should_return_an_empty_array_if_not_build_is_given.yml +51 -0
- data/spec/cassettes/VCSRoots/GET/_vcs_root_details/should_fetch_the_vcs_root_details.yml +91 -0
- data/spec/cassettes/VCSRoots/GET/_vcs_roots/should_fetch_vcs_roots.yml +47 -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/cassettes/VCSRoots/PUT/_set_vcs_root_field/should_set_a_vcs_modification_check_interval.yml +179 -0
- data/spec/faraday/null_response_body_spec.rb +18 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/support/vcr_setup.rb +9 -0
- data/spec/teamcity/api_spec.rb +64 -0
- data/spec/teamcity/client/builds_spec.rb +113 -0
- data/spec/teamcity/client/buildtypes_spec.rb +308 -0
- data/spec/teamcity/client/projects_spec.rb +207 -0
- data/spec/teamcity/client/tests_spec.rb +47 -0
- data/spec/teamcity/client/vcs_roots_spec.rb +86 -0
- data/spec/teamcity/client_spec.rb +14 -0
- data/spec/teamcity/element_builder_spec.rb +30 -0
- data/spec/teamcity/headers_spec.rb +43 -0
- data/spec/teamcity/version_spec.rb +7 -0
- data/spec/teamcity_spec.rb +89 -0
- data/teamcity.gemspec +26 -0
- metadata +344 -0
@@ -0,0 +1,305 @@
|
|
1
|
+
module TeamCity
|
2
|
+
class Client
|
3
|
+
# Defines methods related to build types (or build configurations)
|
4
|
+
module BuildTypes
|
5
|
+
# HTTP GET
|
6
|
+
|
7
|
+
# List of build types
|
8
|
+
#
|
9
|
+
# @return [Array<Hashie::Mash>, nil] of buildtypes or nil if no buildtypes exist
|
10
|
+
def buildtypes
|
11
|
+
response = get('buildTypes')
|
12
|
+
response['buildType']
|
13
|
+
end
|
14
|
+
|
15
|
+
# Get build configuration details
|
16
|
+
#
|
17
|
+
# @param options [Hash] option keys, :id => buildtype_id
|
18
|
+
# @return [Hashie::Mash] of build configuration details
|
19
|
+
def buildtype(options={})
|
20
|
+
assert_options(options)
|
21
|
+
get("buildTypes/#{locator(options)}")
|
22
|
+
end
|
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
|
+
|
35
|
+
# Get a listing of vcs branches
|
36
|
+
#
|
37
|
+
# @param buildtype_id [String]
|
38
|
+
# @return [Array<Hashie::Mash>]
|
39
|
+
def buildtype_branches(buildtype_id)
|
40
|
+
path = "buildTypes/#{buildtype_id}/branches"
|
41
|
+
response = get(path, :accept => :json, :content_type => :json)
|
42
|
+
response.branch
|
43
|
+
end
|
44
|
+
|
45
|
+
# Get whether the build is paused or not
|
46
|
+
#
|
47
|
+
# @param options [Hash] option keys, :id => buildtype_id
|
48
|
+
# @return [String] 'true' or 'false' on whether the build is paused
|
49
|
+
def buildtype_state(options={})
|
50
|
+
assert_options(options)
|
51
|
+
path = "buildTypes/#{locator(options)}/paused"
|
52
|
+
get(path, :accept => :text, :content_type => :text)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Get build configuration settings
|
56
|
+
#
|
57
|
+
# @param (see #buildtype)
|
58
|
+
# @return [Array<Hashie::Mash>] of build configuration settings
|
59
|
+
def buildtype_settings(options={})
|
60
|
+
assert_options(options)
|
61
|
+
response = get("buildTypes/#{locator(options)}/settings")
|
62
|
+
response['property']
|
63
|
+
end
|
64
|
+
|
65
|
+
# Get build configuration parameters
|
66
|
+
#
|
67
|
+
# @param (see #buildtype)
|
68
|
+
# @return [Array<Hashie::Mash>] of build configuration parameters
|
69
|
+
def buildtype_parameters(options={})
|
70
|
+
assert_options(options)
|
71
|
+
response = get("buildTypes/#{locator(options)}/parameters")
|
72
|
+
response['property']
|
73
|
+
end
|
74
|
+
|
75
|
+
# Get investigation info for build configuration
|
76
|
+
#
|
77
|
+
# @param buildtype_id [String] the buildtype id
|
78
|
+
# @return [Array<Hashie::Mash>] of build investigation info
|
79
|
+
def buildtype_investigations(buildtype_id)
|
80
|
+
response = get("buildTypes/#{buildtype_id}/investigations")
|
81
|
+
response['investigation']
|
82
|
+
end
|
83
|
+
|
84
|
+
# Get template associated with build configuration
|
85
|
+
#
|
86
|
+
# @param (see #buildtype)
|
87
|
+
# @return [Hashie::Mash, nil] of build configuration parameters or nil if
|
88
|
+
def buildtype_template(options={})
|
89
|
+
assert_options(options)
|
90
|
+
begin
|
91
|
+
get("buildTypes/#{locator(options)}/template")
|
92
|
+
rescue StandardError => e
|
93
|
+
/No template associated/.match(e.to_s) ? nil : raise
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# @macro [attach] build configuration settings
|
98
|
+
# @method buildtype_$1(options = {})
|
99
|
+
# Get build configuration $1
|
100
|
+
# @param options [Hash] option keys, :id => buildtype_id
|
101
|
+
# @return [Array<Hashie::Mash>] of build configuration $1
|
102
|
+
def self.make_method(name)
|
103
|
+
define_method("buildtype_#{name}".to_sym) do |options|
|
104
|
+
name_has_dashes = name.to_s.gsub('_', '-')
|
105
|
+
assert_options(options)
|
106
|
+
response = get("buildTypes/#{locator(options)}/#{name_has_dashes}", accept: :json)
|
107
|
+
response[response.keys.first]
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
private_class_method :make_method
|
112
|
+
|
113
|
+
make_method :features
|
114
|
+
make_method :triggers
|
115
|
+
make_method :steps
|
116
|
+
make_method :agent_requirements
|
117
|
+
make_method :artifact_dependencies
|
118
|
+
make_method :snapshot_dependencies
|
119
|
+
make_method :vcs_root_entries
|
120
|
+
|
121
|
+
# Attach a vcs root to a build type (build configuration_)
|
122
|
+
#
|
123
|
+
#
|
124
|
+
# @param buildtype_id [String] the buildtype id
|
125
|
+
# @param vcs_root_id [String, Numeric] id of vcs root
|
126
|
+
# @return [Hashie::Mash] vcs root object that was attached
|
127
|
+
def attach_vcs_root(buildtype_id, vcs_root_id)
|
128
|
+
payload = { 'vcs-root' => { :id => vcs_root_id } }
|
129
|
+
|
130
|
+
post("buildTypes/#{buildtype_id}/vcs-root-entries", :content_type => :json) do |req|
|
131
|
+
req.body = payload.to_json
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
# Set a buildtype parameter (Create or Update)
|
136
|
+
#
|
137
|
+
#
|
138
|
+
# @param buildtype_id [String] the buildtype id
|
139
|
+
# @param parameter_name [String] name of the parameter to set
|
140
|
+
# @param parameter_value [String] value of the parameter
|
141
|
+
# @return parameter_value [String] that was set
|
142
|
+
def set_buildtype_parameter(buildtype_id, parameter_name, parameter_value)
|
143
|
+
path = "buildTypes/#{buildtype_id}/parameters/#{parameter_name}"
|
144
|
+
put(path, :accept => :text, :content_type => :text) do |req|
|
145
|
+
req.body = parameter_value
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# Delete a buildtype parameter
|
150
|
+
#
|
151
|
+
# @param buildtype_id [String] the buildtype id
|
152
|
+
# @param parameter_name [String] name of the parameter to delete
|
153
|
+
# @return [nil]
|
154
|
+
def delete_buildtype_parameter(buildtype_id, parameter_name)
|
155
|
+
path = "buildTypes/#{buildtype_id}/parameters/#{parameter_name}"
|
156
|
+
delete(path, :accept => :text, :content_type => :text)
|
157
|
+
return nil
|
158
|
+
end
|
159
|
+
|
160
|
+
# Create a buildtype agent requirement (Create)
|
161
|
+
#
|
162
|
+
# @param buildtype_id [String] the buildtype id
|
163
|
+
# @param parameter_name [String] name of the parameter to set
|
164
|
+
# @param parameter_value [String] value of the parameter
|
165
|
+
# @param condition [String] the condition for which to check against
|
166
|
+
# @return [Hashie::Mash]
|
167
|
+
#
|
168
|
+
# @example Create a condition where a system property equals something
|
169
|
+
# TeamCity.create_agent_requirement('bt1', 'system.os.name', 'Linux', 'equals')
|
170
|
+
#
|
171
|
+
# @note Check the TeamCity UI for supported conditions
|
172
|
+
def create_agent_requirement(buildtype_id, parameter_name, parameter_value, condition)
|
173
|
+
builder = TeamCity::ElementBuilder.new(:id => parameter_name, :type => condition) do |properties|
|
174
|
+
properties['property-name'] = parameter_name
|
175
|
+
properties['property-value'] = parameter_value
|
176
|
+
end
|
177
|
+
|
178
|
+
path = "buildTypes/#{buildtype_id}/agent-requirements"
|
179
|
+
post(path, :accept => :json, :content_type => :json) do |req|
|
180
|
+
req.body = builder.to_request_body
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
# Delete an agent requirement for a buildtype
|
185
|
+
#
|
186
|
+
# @param buildtype_id [String] the buildtype_id
|
187
|
+
# @param parameter_name [String] name of the requirement to delete
|
188
|
+
# @return [nil]
|
189
|
+
def delete_agent_requirement(buildtype_id, parameter_name)
|
190
|
+
delete("buildTypes/#{buildtype_id}/agent-requirements/#{parameter_name}")
|
191
|
+
end
|
192
|
+
|
193
|
+
# Set a buildtype field
|
194
|
+
#
|
195
|
+
# @example Change buildtype name
|
196
|
+
# TeamCity.set_buildtype_field('bt3', 'name', 'new-name')
|
197
|
+
# @example Set buildtype description
|
198
|
+
# TeamCity.set_buildtype_field('bt3', 'description', 'new-description')
|
199
|
+
# @example Pause/Unpause a buildtype
|
200
|
+
# Teamcity.set_buildtype_field('buildtype', 'paused', 'true|false')
|
201
|
+
#
|
202
|
+
# @param buidltype_id [String] the buildtype id
|
203
|
+
# @param field_name [String] the field name
|
204
|
+
# @param field_value [String] the value to set the field to
|
205
|
+
# @return field_value [String] value that was set
|
206
|
+
def set_buildtype_field(buildtype_id, field_name, field_value)
|
207
|
+
path = "buildTypes/#{buildtype_id}/#{field_name}"
|
208
|
+
put(path, :accept => :text, :content_type => :text) do |req|
|
209
|
+
req.body = field_value
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
# Set buildtype settings
|
214
|
+
#
|
215
|
+
# @example Cleaning all files between the builds
|
216
|
+
# TeamCity.set_buildtype_setting('bt3', 'cleanBuild', 'true')
|
217
|
+
# @example Checkout on the server
|
218
|
+
# TeamCity.set_buildtype_setting('bt3', 'checkoutMode', 'ON_SERVER')
|
219
|
+
# @example Fail the build after 10 Minutes
|
220
|
+
# Teamcity.set_buildtype_setting('bt3', 'executionTimeoutMin', '10')
|
221
|
+
#
|
222
|
+
# @param buidltype_id [String] the buildtype id
|
223
|
+
# @param setting_name [String] the settings name
|
224
|
+
# @param setting_value [String] the value to set the settings to
|
225
|
+
# @return setting_value [String] value that was set
|
226
|
+
def set_buildtype_setting(buildtype_id, setting_name, setting_value)
|
227
|
+
set_buildtype_field(buildtype_id, "settings/#{setting_name}", setting_value)
|
228
|
+
end
|
229
|
+
|
230
|
+
# Delete buildtype (build configuration)
|
231
|
+
#
|
232
|
+
# @param buildtype_id [String] the id of the buildtype
|
233
|
+
# @return [nil]
|
234
|
+
def delete_buildtype(buildtype_id)
|
235
|
+
delete("buildTypes/#{buildtype_id}")
|
236
|
+
end
|
237
|
+
|
238
|
+
# Set build step field
|
239
|
+
#
|
240
|
+
# @param buildtype_id [String] the id of the buildtype
|
241
|
+
# @param step_id [String] the id of the build step
|
242
|
+
# @param field_name [String] the name of the field to set
|
243
|
+
# @param field_value [String] the value to set the field name to
|
244
|
+
# @return [nil]
|
245
|
+
def set_build_step_field(buildtype_id, step_id, field_name, field_value)
|
246
|
+
path = "buildTypes/#{buildtype_id}/steps/#{step_id}/#{field_name}"
|
247
|
+
put(path, :accept => :text, :content_type => :text) do |req|
|
248
|
+
req.body = field_value
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
# Create Build Step
|
253
|
+
#
|
254
|
+
# @param buildtype_id [String] :buildtype_id to create the step under
|
255
|
+
# @option options [String] :name for the step definition (optional)
|
256
|
+
# @option options [String] :type Type of Build Step: 'Maven', 'Ant', etc
|
257
|
+
# @yield [Hash] properties to set on the step, view the official documentation for supported properties
|
258
|
+
# @return [Hashie::Mash] step object that was created
|
259
|
+
#
|
260
|
+
# @example Create a Maven2 step that executes the target verify
|
261
|
+
# TeamCity.create_build_step(:buildtype_id => 'my-build-type-id', :type => 'Maven', name: 'Unit Tests') do |properties|
|
262
|
+
# properties['goals'] = 'verify'
|
263
|
+
# properties['mavenSelection'] = 'mavenSelection:default'
|
264
|
+
# properties['pomLocation'] = 'pom.xml'
|
265
|
+
# end
|
266
|
+
def create_build_step(buildtype_id, options = {}, &block)
|
267
|
+
attributes = {
|
268
|
+
:type => options.fetch(:type),
|
269
|
+
:name => options.fetch(:name) { nil }
|
270
|
+
}
|
271
|
+
|
272
|
+
builder = TeamCity::ElementBuilder.new(attributes, &block)
|
273
|
+
|
274
|
+
post("buildTypes/#{buildtype_id}/steps", :content_type => :json) do |req|
|
275
|
+
req.body = builder.to_request_body
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
# Create Build Trigger
|
280
|
+
#
|
281
|
+
# @param buildtype_id [String] :buildtype_id to create the trigger under
|
282
|
+
# @option options [String] :type Type of Build Trigger: 'vcsTrigger', 'schedulingTrigger', etc
|
283
|
+
# @yield [Hash] properties to set on the trigger, view the official documentation for supported properties
|
284
|
+
# @return [Hashie::Mash] trigger object that was created
|
285
|
+
#
|
286
|
+
# @example Create a a VCS build trigger for checkins
|
287
|
+
# TeamCity.create_build_step(:buildtype_id => 'my-build-type-id', :type => 'vcsTrigger', name: 'Every Checkin') do |properties|
|
288
|
+
# properties['groupCheckkinsByCommitter'] = 'true'
|
289
|
+
# properties['perCheckinTriggering'] = 'true'
|
290
|
+
# properties['quietPeriodMode'] = 'DO_NOT_USE'
|
291
|
+
# end
|
292
|
+
def create_build_trigger(buildtype_id, options = {}, &block)
|
293
|
+
attributes = {
|
294
|
+
:type => options.fetch(:type),
|
295
|
+
}
|
296
|
+
|
297
|
+
builder = TeamCity::ElementBuilder.new(attributes, &block)
|
298
|
+
|
299
|
+
post("buildTypes/#{buildtype_id}/triggers", :content_type => :json) do |req|
|
300
|
+
req.body = builder.to_request_body
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module TeamCity
|
2
|
+
class Client
|
3
|
+
# Defines methods related to builds
|
4
|
+
module Builds
|
5
|
+
|
6
|
+
# HTTP GET
|
7
|
+
|
8
|
+
# List of builds
|
9
|
+
#
|
10
|
+
# @param options [Hash] list of build locators to filter build results on
|
11
|
+
# @return [Array<Hashie::Mash>] of builds (empty array if no builds exist)
|
12
|
+
def builds(options={})
|
13
|
+
url_params = options.empty? ? '' : "?locator=#{locator(options)}"
|
14
|
+
response = get("builds#{url_params}")
|
15
|
+
response.build
|
16
|
+
end
|
17
|
+
|
18
|
+
# Get build details
|
19
|
+
#
|
20
|
+
# @param options [Hash] option keys, :id => build_id
|
21
|
+
# @return [Hashie::Mash] of build details
|
22
|
+
def build(options={})
|
23
|
+
assert_options(options)
|
24
|
+
get("builds/#{locator(options)}")
|
25
|
+
end
|
26
|
+
|
27
|
+
# Get the build tags
|
28
|
+
#
|
29
|
+
# @param options [Hash] option keys, :id => build_id
|
30
|
+
# @return [Array<Hashie::Mash>] or empty array if no tags exist
|
31
|
+
def build_tags(options={})
|
32
|
+
assert_options(options)
|
33
|
+
response = get("builds/#{locator(options)}/tags")
|
34
|
+
response.fetch(:tag)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Get build statistics
|
38
|
+
#
|
39
|
+
# @param build_id [String]
|
40
|
+
# @return [Array<Hashie::Mash>]
|
41
|
+
def build_statistics(build_id)
|
42
|
+
response = get("builds/#{build_id}/statistics")
|
43
|
+
response['property']
|
44
|
+
end
|
45
|
+
|
46
|
+
# Tells you whether or not a build is pinned
|
47
|
+
#
|
48
|
+
# @param id [String] build to check if it is pinned
|
49
|
+
# @return [Boolean] whether the build is pinned or not
|
50
|
+
def build_pinned?(id)
|
51
|
+
path = "builds/#{id}/pin"
|
52
|
+
response = get(path, :accept => :text, :content_type => :text)
|
53
|
+
response == 'true'
|
54
|
+
end
|
55
|
+
|
56
|
+
# Get build artifacts
|
57
|
+
#
|
58
|
+
# @param build_id [String]
|
59
|
+
# @return [Array<Hashie::Mash>]
|
60
|
+
def build_artifacts(build_id)
|
61
|
+
response = get("builds/#{build_id}/artifacts")
|
62
|
+
response['files']
|
63
|
+
end
|
64
|
+
|
65
|
+
# HTTP PUT
|
66
|
+
|
67
|
+
# Pin a build
|
68
|
+
#
|
69
|
+
# @param id [String] build to pin
|
70
|
+
# @param comment [String] provide a comment to the pin
|
71
|
+
# @return [nil]
|
72
|
+
def pin_build(id, comment='')
|
73
|
+
path = "builds/#{id}/pin"
|
74
|
+
put(path, :accept => :text, :content_type => :text) do |req|
|
75
|
+
req.body = comment
|
76
|
+
end
|
77
|
+
return nil
|
78
|
+
end
|
79
|
+
|
80
|
+
# HTTP DELETE
|
81
|
+
|
82
|
+
# Unpin a build
|
83
|
+
#
|
84
|
+
# @param id [String] build to unpin
|
85
|
+
# @return [nil]
|
86
|
+
def unpin_build(id)
|
87
|
+
path = "builds/#{id}/pin"
|
88
|
+
delete(path, :content_type => :text)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module TeamCity
|
2
|
+
class Client
|
3
|
+
# Defines some common methods shared across the other
|
4
|
+
# teamcity api modules
|
5
|
+
module Common
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def assert_options(options)
|
10
|
+
!options[:id] and raise ArgumentError, "Must provide an id", caller
|
11
|
+
end
|
12
|
+
|
13
|
+
# Take a list of locators to search on multiple criterias
|
14
|
+
#
|
15
|
+
def locator(options={})
|
16
|
+
options.inject([]) do |locators, locator|
|
17
|
+
key, value = locator
|
18
|
+
locators << "#{key}:#{value}"
|
19
|
+
end.join(',')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
module TeamCity
|
2
|
+
class Client
|
3
|
+
# Defines methods related to projects
|
4
|
+
module Projects
|
5
|
+
|
6
|
+
# List of projects
|
7
|
+
#
|
8
|
+
# @return [Array<Hashie::Mash>, nil] of projects or nil if no projects exist
|
9
|
+
def projects
|
10
|
+
response = get('projects')
|
11
|
+
response['project']
|
12
|
+
end
|
13
|
+
|
14
|
+
# Get project details
|
15
|
+
#
|
16
|
+
# @param options [Hash] The options hash,
|
17
|
+
# @option options [String] :id the project id
|
18
|
+
# @return [Hashie::Mash] of project details
|
19
|
+
def project(options={})
|
20
|
+
assert_options(options)
|
21
|
+
get("projects/#{locator(options)}")
|
22
|
+
end
|
23
|
+
|
24
|
+
# List of Build Configurations of a project
|
25
|
+
#
|
26
|
+
# @param (see #project)
|
27
|
+
# @return [Array<Hashie::Mash> of build types (an empty array will be returne if none exist)
|
28
|
+
def project_buildtypes(options={})
|
29
|
+
assert_options(options)
|
30
|
+
response = get("projects/#{locator(options)}/buildTypes")
|
31
|
+
response['buildType']
|
32
|
+
end
|
33
|
+
|
34
|
+
# List of parameters defined on a project
|
35
|
+
#
|
36
|
+
# @param (see #project)
|
37
|
+
# @return [Array<Hashie::Mash>] of parameters (empty if none are defined)
|
38
|
+
def project_parameters(options={})
|
39
|
+
assert_options(options)
|
40
|
+
response = get("projects/#{locator(options)}/parameters")
|
41
|
+
response['property']
|
42
|
+
end
|
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
|
+
|
56
|
+
# Create an empty project
|
57
|
+
#
|
58
|
+
# @param name [String] Name of the project
|
59
|
+
# @return [Hashie::Mash] project details
|
60
|
+
def create_project(name)
|
61
|
+
post("projects", :content_type => :text) do |req|
|
62
|
+
req.body = name
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Copy another project
|
67
|
+
#
|
68
|
+
# @param source_project_id [String] id of the project you wish to copy
|
69
|
+
# @param target_project_name [String] name of the project you want to create
|
70
|
+
# @param options [Hash] copy project options
|
71
|
+
# @option options [Boolean] :copyAllAssociatedSettings copy all associated settings
|
72
|
+
# @options options [String] :parentProject used to define the parent project to create this project under (root will be use by default)
|
73
|
+
# @options options [String] :id to use for the new project
|
74
|
+
# @return [Hashie::Mash] project details
|
75
|
+
def copy_project(source_project_id, target_project_name, options={})
|
76
|
+
attributes = {
|
77
|
+
:name => target_project_name
|
78
|
+
}
|
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
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# Delete a project
|
88
|
+
#
|
89
|
+
# @param project_id [String] the id of the project
|
90
|
+
# @return [nil]
|
91
|
+
def delete_project(project_id)
|
92
|
+
delete("projects/#{project_id}")
|
93
|
+
end
|
94
|
+
|
95
|
+
# Delete a project parameter
|
96
|
+
#
|
97
|
+
# @param project_id [String] the project id
|
98
|
+
# @param parameter_name [String] name of the parameter to delete
|
99
|
+
# @return [nil]
|
100
|
+
def delete_project_parameter(project_id, parameter_name)
|
101
|
+
path = "projects/#{project_id}/parameters/#{parameter_name}"
|
102
|
+
delete(path, :accept => :text)
|
103
|
+
return nil
|
104
|
+
end
|
105
|
+
|
106
|
+
# Set a project parameter (Create or Update)
|
107
|
+
#
|
108
|
+
#
|
109
|
+
# @param project_id [String] the project id
|
110
|
+
# @param parameter_name [String] name of the parameter to set
|
111
|
+
# @param parameter_value [String] value of the parameter
|
112
|
+
# @return [String] parameter_value that was set
|
113
|
+
def set_project_parameter(project_id, parameter_name, parameter_value)
|
114
|
+
path = "projects/#{project_id}/parameters/#{parameter_name}"
|
115
|
+
put(path, :content_type => :text, :accept => :text) do |req|
|
116
|
+
req.body = parameter_value
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# Set a project field
|
121
|
+
#
|
122
|
+
# @example Set a projects name
|
123
|
+
# TeamCity.set_project_field('project1', 'name', 'new-name')
|
124
|
+
# @example Set a projects description
|
125
|
+
# TeamCity.set_project_field('project1', 'description', 'new-description')
|
126
|
+
# @example Archive/Unarchive a project
|
127
|
+
# Teamcity.set_project_field('project1', 'archived', 'true|false')
|
128
|
+
#
|
129
|
+
# @param project_id [String] the project id
|
130
|
+
# @param field_name [String] the field name: 'name', 'description', 'archived'
|
131
|
+
# @param field_value [String] the value to set the field to
|
132
|
+
# @return [String] project_field_value that was set
|
133
|
+
def set_project_field(project_id, field_name, field_value)
|
134
|
+
path = "projects/#{project_id}/#{field_name}"
|
135
|
+
put(path, :content_type => :text, :accept => :text) do |req|
|
136
|
+
req.body = field_value
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# Set a parent for a given project
|
141
|
+
#
|
142
|
+
# @example Set project1 as parent for project2
|
143
|
+
# TeamCity.set_parent_project('project2', 'project1')
|
144
|
+
#
|
145
|
+
# @param project_id [String] the project id
|
146
|
+
# @param parent_project_id [String] the parent project id
|
147
|
+
# @return [Hashie::Mash] of child project details
|
148
|
+
# @rest_api_version >= 8.0
|
149
|
+
def set_parent_project(project_id, parent_project_id)
|
150
|
+
path = "projects/#{project_id}/parentProject"
|
151
|
+
payload = { :id => parent_project_id }
|
152
|
+
|
153
|
+
put(path, :content_type => :json, :accept => :json) do |req|
|
154
|
+
req.body = payload.to_json
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|