teamcity 1.3.1
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 +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
|