hudson 0.3.0.beta.17 → 0.3.0.beta.18
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.
- data/Gemfile.lock +1 -1
- data/features/manage_slave_nodes.feature +20 -2
- data/hudson.gemspec +3 -3
- data/lib/hudson/api.rb +29 -9
- data/lib/hudson/cli.rb +22 -4
- data/lib/hudson/core_ext/hash.rb +9 -0
- data/lib/hudson/job_config_builder.rb +11 -3
- data/lib/hudson/version.rb +1 -1
- data/spec/fixtures/rails.single.config.xml +9 -1
- data/spec/hash_key_cleaner_spec.rb +25 -0
- data/spec/job_config_builder_spec.rb +5 -4
- metadata +6 -4
data/Gemfile.lock
CHANGED
|
@@ -6,14 +6,13 @@ Feature: Adding slave nodes
|
|
|
6
6
|
Background:
|
|
7
7
|
Given I have a Hudson server running
|
|
8
8
|
And the Hudson server has no slaves
|
|
9
|
-
|
|
10
|
-
Scenario: List available slaves (hudson nodes)
|
|
11
9
|
When I run local executable "hudson" with arguments "nodes --host localhost --port 3010"
|
|
12
10
|
Then I should see exactly
|
|
13
11
|
"""
|
|
14
12
|
master
|
|
15
13
|
"""
|
|
16
14
|
|
|
15
|
+
Scenario: Add slave via API (hudson nodes)
|
|
17
16
|
When I create a new node with the following options on "http://localhost:3010":
|
|
18
17
|
| name | Slave 1 |
|
|
19
18
|
| label | app1 app2 app3 |
|
|
@@ -24,4 +23,23 @@ Feature: Adding slave nodes
|
|
|
24
23
|
"""
|
|
25
24
|
master
|
|
26
25
|
Slave 1
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
Scenario: Add slave via CLI with name defaulted to URL (hudson add_node)
|
|
29
|
+
When I run local executable "hudson" with arguments "add_node foo1.bar.com --slave-user deploy --label 'app1 app2' --host localhost --port 3010"
|
|
30
|
+
Then I should see exactly
|
|
31
|
+
"""
|
|
32
|
+
Added slave node foo1.bar.com
|
|
33
|
+
"""
|
|
34
|
+
When I run local executable "hudson" with arguments "add_node foo1.bar.com --slave-user deploy --label 'app1 app2' --host localhost --port 3010"
|
|
35
|
+
Then I should see exactly
|
|
36
|
+
"""
|
|
37
|
+
Slave called 'foo1.bar.com' already exists
|
|
38
|
+
ERROR: Failed to add slave node foo1.bar.com
|
|
39
|
+
"""
|
|
40
|
+
When I run local executable "hudson" with arguments "nodes"
|
|
41
|
+
Then I should see exactly
|
|
42
|
+
"""
|
|
43
|
+
master
|
|
44
|
+
foo1.bar.com
|
|
27
45
|
"""
|
data/hudson.gemspec
CHANGED
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
Gem::Specification.new do |s|
|
|
4
4
|
s.name = %q{hudson}
|
|
5
|
-
s.version = "0.3.0.beta.
|
|
5
|
+
s.version = "0.3.0.beta.18"
|
|
6
6
|
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
|
8
8
|
s.authors = ["Charles Lowell", "Dr Nic Williams"]
|
|
9
|
-
s.date = %q{2010-11-
|
|
9
|
+
s.date = %q{2010-11-06}
|
|
10
10
|
s.default_executable = %q{hudson}
|
|
11
11
|
s.description = %q{A suite of utilities for bringing continous integration to your projects (not the other way around) with hudson CI}
|
|
12
12
|
s.email = ["cowboyd@thefrontside.net", "drnicwilliams@gmail.com"]
|
|
13
13
|
s.executables = ["hudson"]
|
|
14
|
-
s.files = ["bin", "bin/hudson", "features", "features/development.feature", "features/launch_server.feature", "features/listing_jobs.feature", "features/manage_jobs.feature", "features/manage_slave_nodes.feature", "features/step_definitions", "features/step_definitions/common_steps.rb", "features/step_definitions/fixture_project_steps.rb", "features/step_definitions/hudson_steps.rb", "features/step_definitions/scm_steps.rb", "features/support", "features/support/common.rb", "features/support/env.rb", "features/support/hooks.rb", "features/support/matchers.rb", "fixtures", "fixtures/projects", "fixtures/projects/non-bundler", "fixtures/projects/non-bundler/Rakefile", "fixtures/projects/rails-3", "fixtures/projects/rails-3/app", "fixtures/projects/rails-3/app/controllers", "fixtures/projects/rails-3/app/controllers/application_controller.rb", "fixtures/projects/rails-3/app/helpers", "fixtures/projects/rails-3/app/helpers/application_helper.rb", "fixtures/projects/rails-3/app/mailers", "fixtures/projects/rails-3/app/models", "fixtures/projects/rails-3/app/views", "fixtures/projects/rails-3/app/views/layouts", "fixtures/projects/rails-3/app/views/layouts/application.html.erb", "fixtures/projects/rails-3/config", "fixtures/projects/rails-3/config/application.rb", "fixtures/projects/rails-3/config/boot.rb", "fixtures/projects/rails-3/config/database.yml", "fixtures/projects/rails-3/config/environment.rb", "fixtures/projects/rails-3/config/environments", "fixtures/projects/rails-3/config/environments/development.rb", "fixtures/projects/rails-3/config/environments/production.rb", "fixtures/projects/rails-3/config/environments/test.rb", "fixtures/projects/rails-3/config/initializers", "fixtures/projects/rails-3/config/initializers/backtrace_silencers.rb", "fixtures/projects/rails-3/config/initializers/inflections.rb", "fixtures/projects/rails-3/config/initializers/mime_types.rb", "fixtures/projects/rails-3/config/initializers/secret_token.rb", "fixtures/projects/rails-3/config/initializers/session_store.rb", "fixtures/projects/rails-3/config/locales", "fixtures/projects/rails-3/config/locales/en.yml", "fixtures/projects/rails-3/config/routes.rb", "fixtures/projects/rails-3/config.ru", "fixtures/projects/rails-3/db", "fixtures/projects/rails-3/db/seeds.rb", "fixtures/projects/rails-3/doc", "fixtures/projects/rails-3/doc/README_FOR_APP", "fixtures/projects/rails-3/Gemfile", "fixtures/projects/rails-3/Gemfile.lock", "fixtures/projects/rails-3/lib", "fixtures/projects/rails-3/lib/tasks", "fixtures/projects/rails-3/log", "fixtures/projects/rails-3/log/development.log", "fixtures/projects/rails-3/log/production.log", "fixtures/projects/rails-3/log/server.log", "fixtures/projects/rails-3/log/test.log", "fixtures/projects/rails-3/public", "fixtures/projects/rails-3/public/404.html", "fixtures/projects/rails-3/public/422.html", "fixtures/projects/rails-3/public/500.html", "fixtures/projects/rails-3/public/favicon.ico", "fixtures/projects/rails-3/public/images", "fixtures/projects/rails-3/public/images/rails.png", "fixtures/projects/rails-3/public/index.html", "fixtures/projects/rails-3/public/javascripts", "fixtures/projects/rails-3/public/javascripts/application.js", "fixtures/projects/rails-3/public/javascripts/controls.js", "fixtures/projects/rails-3/public/javascripts/dragdrop.js", "fixtures/projects/rails-3/public/javascripts/effects.js", "fixtures/projects/rails-3/public/javascripts/prototype.js", "fixtures/projects/rails-3/public/javascripts/rails.js", "fixtures/projects/rails-3/public/robots.txt", "fixtures/projects/rails-3/public/stylesheets", "fixtures/projects/rails-3/Rakefile", "fixtures/projects/rails-3/README", "fixtures/projects/rails-3/script", "fixtures/projects/rails-3/script/rails", "fixtures/projects/rails-3/test", "fixtures/projects/rails-3/test/fixtures", "fixtures/projects/rails-3/test/functional", "fixtures/projects/rails-3/test/integration", "fixtures/projects/rails-3/test/performance", "fixtures/projects/rails-3/test/performance/browsing_test.rb", "fixtures/projects/rails-3/test/test_helper.rb", "fixtures/projects/rails-3/test/unit", "fixtures/projects/rails-3/vendor", "fixtures/projects/rails-3/vendor/plugins", "fixtures/projects/ruby", "fixtures/projects/ruby/Gemfile", "fixtures/projects/ruby/Gemfile.lock", "fixtures/projects/ruby/Rakefile", "Gemfile", "Gemfile.lock", "hudson.gemspec", "lib", "lib/hudson", "lib/hudson/api.rb", "lib/hudson/cli", "lib/hudson/cli/formatting.rb", "lib/hudson/cli.rb", "lib/hudson/config.rb", "lib/hudson/core_ext", "lib/hudson/core_ext/object", "lib/hudson/core_ext/object/blank.rb", "lib/hudson/hudson-cli.jar", "lib/hudson/hudson.war", "lib/hudson/hudson_version.rb", "lib/hudson/job_config_builder.rb", "lib/hudson/plugins", "lib/hudson/plugins/envfile.hpi", "lib/hudson/plugins/git.hpi", "lib/hudson/plugins/github.hpi", "lib/hudson/plugins/greenballs.hpi", "lib/hudson/plugins/rake.hpi", "lib/hudson/plugins/ruby.hpi", "lib/hudson/project_scm.rb", "lib/hudson/remote.rb", "lib/hudson/version.rb", "lib/hudson.rb", "Rakefile", "README.md", "spec", "spec/fixtures", "spec/fixtures/ec2_global.config.xml", "spec/fixtures/rails.multi.config.xml", "spec/fixtures/rails.single.config.triggers.xml", "spec/fixtures/rails.single.config.xml", "spec/fixtures/ruby.single.config.xml", "spec/fixtures/rubygem.config.xml", "spec/fixtures/therubyracer.config.xml", "spec/job_config_builder_spec.rb", "spec/spec_helper.rb", "tasks", "tasks/upgrade.rake"]
|
|
14
|
+
s.files = ["bin", "bin/hudson", "features", "features/development.feature", "features/launch_server.feature", "features/listing_jobs.feature", "features/manage_jobs.feature", "features/manage_slave_nodes.feature", "features/step_definitions", "features/step_definitions/common_steps.rb", "features/step_definitions/fixture_project_steps.rb", "features/step_definitions/hudson_steps.rb", "features/step_definitions/scm_steps.rb", "features/support", "features/support/common.rb", "features/support/env.rb", "features/support/hooks.rb", "features/support/matchers.rb", "fixtures", "fixtures/projects", "fixtures/projects/non-bundler", "fixtures/projects/non-bundler/Rakefile", "fixtures/projects/rails-3", "fixtures/projects/rails-3/app", "fixtures/projects/rails-3/app/controllers", "fixtures/projects/rails-3/app/controllers/application_controller.rb", "fixtures/projects/rails-3/app/helpers", "fixtures/projects/rails-3/app/helpers/application_helper.rb", "fixtures/projects/rails-3/app/mailers", "fixtures/projects/rails-3/app/models", "fixtures/projects/rails-3/app/views", "fixtures/projects/rails-3/app/views/layouts", "fixtures/projects/rails-3/app/views/layouts/application.html.erb", "fixtures/projects/rails-3/config", "fixtures/projects/rails-3/config/application.rb", "fixtures/projects/rails-3/config/boot.rb", "fixtures/projects/rails-3/config/database.yml", "fixtures/projects/rails-3/config/environment.rb", "fixtures/projects/rails-3/config/environments", "fixtures/projects/rails-3/config/environments/development.rb", "fixtures/projects/rails-3/config/environments/production.rb", "fixtures/projects/rails-3/config/environments/test.rb", "fixtures/projects/rails-3/config/initializers", "fixtures/projects/rails-3/config/initializers/backtrace_silencers.rb", "fixtures/projects/rails-3/config/initializers/inflections.rb", "fixtures/projects/rails-3/config/initializers/mime_types.rb", "fixtures/projects/rails-3/config/initializers/secret_token.rb", "fixtures/projects/rails-3/config/initializers/session_store.rb", "fixtures/projects/rails-3/config/locales", "fixtures/projects/rails-3/config/locales/en.yml", "fixtures/projects/rails-3/config/routes.rb", "fixtures/projects/rails-3/config.ru", "fixtures/projects/rails-3/db", "fixtures/projects/rails-3/db/seeds.rb", "fixtures/projects/rails-3/doc", "fixtures/projects/rails-3/doc/README_FOR_APP", "fixtures/projects/rails-3/Gemfile", "fixtures/projects/rails-3/Gemfile.lock", "fixtures/projects/rails-3/lib", "fixtures/projects/rails-3/lib/tasks", "fixtures/projects/rails-3/log", "fixtures/projects/rails-3/log/development.log", "fixtures/projects/rails-3/log/production.log", "fixtures/projects/rails-3/log/server.log", "fixtures/projects/rails-3/log/test.log", "fixtures/projects/rails-3/public", "fixtures/projects/rails-3/public/404.html", "fixtures/projects/rails-3/public/422.html", "fixtures/projects/rails-3/public/500.html", "fixtures/projects/rails-3/public/favicon.ico", "fixtures/projects/rails-3/public/images", "fixtures/projects/rails-3/public/images/rails.png", "fixtures/projects/rails-3/public/index.html", "fixtures/projects/rails-3/public/javascripts", "fixtures/projects/rails-3/public/javascripts/application.js", "fixtures/projects/rails-3/public/javascripts/controls.js", "fixtures/projects/rails-3/public/javascripts/dragdrop.js", "fixtures/projects/rails-3/public/javascripts/effects.js", "fixtures/projects/rails-3/public/javascripts/prototype.js", "fixtures/projects/rails-3/public/javascripts/rails.js", "fixtures/projects/rails-3/public/robots.txt", "fixtures/projects/rails-3/public/stylesheets", "fixtures/projects/rails-3/Rakefile", "fixtures/projects/rails-3/README", "fixtures/projects/rails-3/script", "fixtures/projects/rails-3/script/rails", "fixtures/projects/rails-3/test", "fixtures/projects/rails-3/test/fixtures", "fixtures/projects/rails-3/test/functional", "fixtures/projects/rails-3/test/integration", "fixtures/projects/rails-3/test/performance", "fixtures/projects/rails-3/test/performance/browsing_test.rb", "fixtures/projects/rails-3/test/test_helper.rb", "fixtures/projects/rails-3/test/unit", "fixtures/projects/rails-3/vendor", "fixtures/projects/rails-3/vendor/plugins", "fixtures/projects/ruby", "fixtures/projects/ruby/Gemfile", "fixtures/projects/ruby/Gemfile.lock", "fixtures/projects/ruby/Rakefile", "Gemfile", "Gemfile.lock", "hudson.gemspec", "lib", "lib/hudson", "lib/hudson/api.rb", "lib/hudson/cli", "lib/hudson/cli/formatting.rb", "lib/hudson/cli.rb", "lib/hudson/config.rb", "lib/hudson/core_ext", "lib/hudson/core_ext/hash.rb", "lib/hudson/core_ext/object", "lib/hudson/core_ext/object/blank.rb", "lib/hudson/hudson-cli.jar", "lib/hudson/hudson.war", "lib/hudson/hudson_version.rb", "lib/hudson/job_config_builder.rb", "lib/hudson/plugins", "lib/hudson/plugins/envfile.hpi", "lib/hudson/plugins/git.hpi", "lib/hudson/plugins/github.hpi", "lib/hudson/plugins/greenballs.hpi", "lib/hudson/plugins/rake.hpi", "lib/hudson/plugins/ruby.hpi", "lib/hudson/project_scm.rb", "lib/hudson/remote.rb", "lib/hudson/version.rb", "lib/hudson.rb", "Rakefile", "README.md", "spec", "spec/fixtures", "spec/fixtures/ec2_global.config.xml", "spec/fixtures/rails.multi.config.xml", "spec/fixtures/rails.single.config.triggers.xml", "spec/fixtures/rails.single.config.xml", "spec/fixtures/ruby.single.config.xml", "spec/fixtures/rubygem.config.xml", "spec/fixtures/therubyracer.config.xml", "spec/hash_key_cleaner_spec.rb", "spec/job_config_builder_spec.rb", "spec/spec_helper.rb", "tasks", "tasks/upgrade.rake"]
|
|
15
15
|
s.homepage = %q{http://github.com/cowboyd/hudson.rb}
|
|
16
16
|
s.require_paths = ["lib"]
|
|
17
17
|
s.rubyforge_project = %q{hudson}
|
data/lib/hudson/api.rb
CHANGED
|
@@ -3,6 +3,7 @@ require 'cgi'
|
|
|
3
3
|
require 'uri'
|
|
4
4
|
require 'json'
|
|
5
5
|
|
|
6
|
+
require 'hudson/core_ext/hash'
|
|
6
7
|
require 'hudson/config'
|
|
7
8
|
|
|
8
9
|
module Hudson
|
|
@@ -16,6 +17,7 @@ module Hudson
|
|
|
16
17
|
JobAlreadyExistsError = Class.new(Exception)
|
|
17
18
|
|
|
18
19
|
def self.setup_base_url(options)
|
|
20
|
+
options = options.with_clean_keys
|
|
19
21
|
# Thor's HashWithIndifferentAccess is based on string keys which URI::HTTP.build ignores
|
|
20
22
|
options = options.inject({}) { |mem, (key, val)| mem[key.to_sym] = val; mem }
|
|
21
23
|
options[:host] ||= ENV['HUDSON_HOST']
|
|
@@ -36,6 +38,7 @@ module Hudson
|
|
|
36
38
|
#
|
|
37
39
|
# TODO Exceptions?
|
|
38
40
|
def self.create_job(name, job_config, options = {})
|
|
41
|
+
options = options.with_clean_keys
|
|
39
42
|
delete_job(name) if options[:override]
|
|
40
43
|
begin
|
|
41
44
|
res = post "/createItem/api/xml?name=#{CGI.escape(name)}", {
|
|
@@ -103,19 +106,22 @@ module Hudson
|
|
|
103
106
|
|
|
104
107
|
# Adds SSH nodes only, for now
|
|
105
108
|
def self.add_node(options = {})
|
|
106
|
-
|
|
109
|
+
options = options.with_clean_keys
|
|
110
|
+
default_options = Hash.new
|
|
107
111
|
default_options.merge!(
|
|
108
112
|
:slave_port => 22,
|
|
109
|
-
:master_key => "/home/
|
|
110
|
-
:
|
|
113
|
+
:master_key => "/home/deploy/.ssh/id_rsa", # FIXME - hardcoded master username assumption
|
|
114
|
+
:slave_fs => "/data/hudson-slave/",
|
|
111
115
|
:description => "Automatically created by Hudson.rb",
|
|
112
116
|
:executors => 2,
|
|
113
117
|
:exclusive => true
|
|
114
118
|
)
|
|
115
119
|
|
|
116
|
-
|
|
120
|
+
slave_host = options[:slave_host]
|
|
121
|
+
name = options[:name] || slave_host
|
|
117
122
|
|
|
118
|
-
|
|
123
|
+
options = default_options.merge(options)
|
|
124
|
+
|
|
119
125
|
type = "hudson.slaves.DumbSlave$DescriptorImpl"
|
|
120
126
|
|
|
121
127
|
fields = {
|
|
@@ -126,7 +132,7 @@ module Hudson
|
|
|
126
132
|
"name" => name,
|
|
127
133
|
"nodeDescription" => options[:description],
|
|
128
134
|
"numExecutors" => options[:executors],
|
|
129
|
-
"remoteFS" => options[:
|
|
135
|
+
"remoteFS" => options[:slave_fs],
|
|
130
136
|
"labelString" => options[:label],
|
|
131
137
|
"mode" => options[:exclusive] ? "EXCLUSIVE" : "NORMAL",
|
|
132
138
|
"type" => type,
|
|
@@ -134,24 +140,36 @@ module Hudson
|
|
|
134
140
|
"nodeProperties" => { "stapler-class-bag" => "true" },
|
|
135
141
|
"launcher" => {
|
|
136
142
|
"stapler-class" => "hudson.plugins.sshslaves.SSHLauncher",
|
|
137
|
-
"host" =>
|
|
143
|
+
"host" => slave_host,
|
|
144
|
+
"port" => options[:slave_port],
|
|
138
145
|
"username" => options[:slave_user],
|
|
139
146
|
"privatekey" => options[:master_key],
|
|
140
|
-
"port" => options[:slave_port]
|
|
141
147
|
}
|
|
142
148
|
}.to_json
|
|
143
149
|
}
|
|
144
150
|
|
|
145
151
|
url = URI.parse("#{base_uri}/computer/doCreateItem")
|
|
152
|
+
|
|
146
153
|
req = Net::HTTP::Post.new(url.path)
|
|
147
154
|
req.set_form_data(fields)
|
|
148
155
|
|
|
149
156
|
http = Net::HTTP.new(url.host, url.port)
|
|
150
157
|
|
|
151
|
-
|
|
158
|
+
response = http.request(req)
|
|
159
|
+
case response
|
|
152
160
|
when Net::HTTPFound
|
|
153
161
|
true
|
|
154
162
|
else
|
|
163
|
+
# error message looks like:
|
|
164
|
+
# <td id="main-panel">
|
|
165
|
+
# <h1>Error</h1><p>Slave called 'localhost' already exists</p>
|
|
166
|
+
require "hpricot"
|
|
167
|
+
error = Hpricot(response.body).search("td#main-panel p").text
|
|
168
|
+
unless error.blank?
|
|
169
|
+
puts error
|
|
170
|
+
else
|
|
171
|
+
puts response.body # so we can find other errors
|
|
172
|
+
end
|
|
155
173
|
false
|
|
156
174
|
end
|
|
157
175
|
end
|
|
@@ -162,12 +180,14 @@ module Hudson
|
|
|
162
180
|
|
|
163
181
|
# Helper for POST that don't barf at Hudson's crappy API responses
|
|
164
182
|
def self.post_plain(path, options = {})
|
|
183
|
+
options = options.with_clean_keys
|
|
165
184
|
uri = URI.parse base_uri
|
|
166
185
|
res = Net::HTTP.start(uri.host, uri.port) { |http| http.post(path, options) }
|
|
167
186
|
end
|
|
168
187
|
|
|
169
188
|
# Helper for GET that don't barf at Hudson's crappy API responses
|
|
170
189
|
def self.get_plain(path, options = {})
|
|
190
|
+
options = options.with_clean_keys
|
|
171
191
|
uri = URI.parse base_uri
|
|
172
192
|
res = Net::HTTP.start(uri.host, uri.port) { |http| http.get(path, options) }
|
|
173
193
|
end
|
data/lib/hudson/cli.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
require 'thor'
|
|
2
2
|
require 'hudson/core_ext/object/blank'
|
|
3
|
+
require 'hudson/core_ext/hash'
|
|
3
4
|
require 'hudson/cli/formatting'
|
|
4
5
|
require 'hudson/remote'
|
|
5
6
|
|
|
@@ -50,8 +51,8 @@ module Hudson
|
|
|
50
51
|
common_options
|
|
51
52
|
method_option :"no-build", :desc => "create job without initial build", :type => :boolean, :default => false
|
|
52
53
|
method_option :override, :desc => "override if job exists", :type => :boolean, :default => false
|
|
53
|
-
method_option :
|
|
54
|
-
method_option :
|
|
54
|
+
method_option :"public-scm", :desc => "use public scm URL", :type => :boolean, :default => false
|
|
55
|
+
method_option :"assigned-node", :desc => "only use slave nodes with this label"
|
|
55
56
|
method_option :template, :desc => "template of job steps (available: #{JobConfigBuilder::VALID_JOB_TEMPLATES.join ','})", :default => 'ruby'
|
|
56
57
|
def create(project_path)
|
|
57
58
|
select_hudson_server(options)
|
|
@@ -66,8 +67,8 @@ module Hudson
|
|
|
66
67
|
template = options[:template]
|
|
67
68
|
job_config = Hudson::JobConfigBuilder.new(template) do |c|
|
|
68
69
|
c.scm = scm.url
|
|
69
|
-
c.assigned_node = options[:
|
|
70
|
-
c.public_scm = options[:
|
|
70
|
+
c.assigned_node = options[:"assigned-node"] if options[:"assigned-node"]
|
|
71
|
+
c.public_scm = options[:"public-scm"]
|
|
71
72
|
end
|
|
72
73
|
name = File.basename(FileUtils.pwd)
|
|
73
74
|
if Hudson::Api.create_job(name, job_config, options)
|
|
@@ -152,6 +153,23 @@ module Hudson
|
|
|
152
153
|
shell.say node["displayName"], color
|
|
153
154
|
end
|
|
154
155
|
end
|
|
156
|
+
|
|
157
|
+
desc "add_node SLAVE_HOST", "add a URI (user@host:port) server as a slave node"
|
|
158
|
+
method_option :label, :desc => 'Labels for a job --assigned_node to match against to select a slave. Space separated list.'
|
|
159
|
+
method_option :"slave-user", :desc => 'SSH user for Hudson to connect to slave node', :default => "deploy"
|
|
160
|
+
method_option :"slave-port", :desc => 'SSH port for Hudson to connect to slave node', :default => 22
|
|
161
|
+
method_option :"master-key", :desc => 'Location of master public key or identity file'
|
|
162
|
+
method_option :"slave-fs", :desc => 'Location of file system on slave for Hudson to use'
|
|
163
|
+
method_option :name, :desc => 'Name of slave node (default SLAVE_HOST)'
|
|
164
|
+
common_options
|
|
165
|
+
def add_node(slave_host)
|
|
166
|
+
select_hudson_server(options)
|
|
167
|
+
if Hudson::Api.add_node({:slave_host => slave_host}.merge(options))
|
|
168
|
+
shell.say "Added slave node #{slave_host}", :green
|
|
169
|
+
else
|
|
170
|
+
error "Failed to add slave node #{slave_host}"
|
|
171
|
+
end
|
|
172
|
+
end
|
|
155
173
|
|
|
156
174
|
desc "help [command]", "show help for hudson or for a specific command"
|
|
157
175
|
def help(*args)
|
|
@@ -138,8 +138,9 @@ module Hudson
|
|
|
138
138
|
end
|
|
139
139
|
end
|
|
140
140
|
|
|
141
|
-
#
|
|
142
|
-
#
|
|
141
|
+
# The important sequence of steps that are run to process a job build.
|
|
142
|
+
# Can be defaulted by the +job_type+ using +default_steps(job_type)+,
|
|
143
|
+
# or customized via +steps+ array.
|
|
143
144
|
def build_steps(b)
|
|
144
145
|
b.builders do
|
|
145
146
|
self.steps ||= default_steps(job_type)
|
|
@@ -163,7 +164,14 @@ module Hudson
|
|
|
163
164
|
FileUtils.cp example, "config/database.yml"
|
|
164
165
|
end
|
|
165
166
|
RUBY
|
|
166
|
-
[:build_shell_step, "bundle exec rake db:
|
|
167
|
+
[:build_shell_step, "bundle exec rake db:create:all"],
|
|
168
|
+
[:build_shell_step, <<-RUBY.gsub(/^ /, '')],
|
|
169
|
+
if [ -f db/schema.rb ]; then
|
|
170
|
+
bundle exec rake db:migrate
|
|
171
|
+
else
|
|
172
|
+
bundle exec rake db:schema:load
|
|
173
|
+
fi
|
|
174
|
+
RUBY
|
|
167
175
|
[:build_shell_step, "bundle exec rake"]
|
|
168
176
|
]
|
|
169
177
|
else
|
data/lib/hudson/version.rb
CHANGED
|
@@ -60,7 +60,15 @@ end
|
|
|
60
60
|
</command>
|
|
61
61
|
</hudson.plugins.ruby.Ruby>
|
|
62
62
|
<hudson.tasks.Shell>
|
|
63
|
-
<command>bundle exec rake db:
|
|
63
|
+
<command>bundle exec rake db:create:all</command>
|
|
64
|
+
</hudson.tasks.Shell>
|
|
65
|
+
<hudson.tasks.Shell>
|
|
66
|
+
<command>if [ -f db/schema.rb ]; then
|
|
67
|
+
bundle exec rake db:migrate
|
|
68
|
+
else
|
|
69
|
+
bundle exec rake db:schema:load
|
|
70
|
+
fi
|
|
71
|
+
</command>
|
|
64
72
|
</hudson.tasks.Shell>
|
|
65
73
|
<hudson.tasks.Shell>
|
|
66
74
|
<command>bundle exec rake</command>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + "/spec_helper"
|
|
2
|
+
|
|
3
|
+
require "hudson/core_ext/hash"
|
|
4
|
+
|
|
5
|
+
describe Hash do
|
|
6
|
+
subject do
|
|
7
|
+
{
|
|
8
|
+
:simple => "simple",
|
|
9
|
+
:under_score => "under_score",
|
|
10
|
+
:"hyp-hen" => "hyphen",
|
|
11
|
+
"str_under_score" => "str_under_score",
|
|
12
|
+
"str-hyp-hen" => "str-hyp-hen"
|
|
13
|
+
}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it do
|
|
17
|
+
subject.with_clean_keys.should == {
|
|
18
|
+
:simple => "simple",
|
|
19
|
+
:under_score => "under_score",
|
|
20
|
+
:hyp_hen => "hyphen",
|
|
21
|
+
:str_under_score => "str_under_score",
|
|
22
|
+
:str_hyp_hen => "str-hyp-hen"
|
|
23
|
+
}
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -5,16 +5,17 @@ describe Hudson::JobConfigBuilder do
|
|
|
5
5
|
|
|
6
6
|
describe "explicit steps to match a ruby job" do
|
|
7
7
|
before do
|
|
8
|
-
@config = Hudson::JobConfigBuilder.new do |c|
|
|
8
|
+
@config = Hudson::JobConfigBuilder.new(:rails) do |c|
|
|
9
9
|
c.scm = "git://codebasehq.com/mocra/misc/mocra-web.git"
|
|
10
10
|
c.steps = [
|
|
11
|
-
[:build_shell_step, "
|
|
12
|
-
[:build_shell_step, "
|
|
11
|
+
[:build_shell_step, "step 1"],
|
|
12
|
+
[:build_shell_step, "step 2"]
|
|
13
13
|
]
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
16
|
it "builds config.xml" do
|
|
17
|
-
|
|
17
|
+
steps = Hpricot.XML(@config.to_xml).search("command")
|
|
18
|
+
steps.map(&:inner_text).should == ["step 1", "step 2"]
|
|
18
19
|
end
|
|
19
20
|
end
|
|
20
21
|
|
metadata
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: hudson
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 62196407
|
|
5
5
|
prerelease: true
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
8
|
- 3
|
|
9
9
|
- 0
|
|
10
10
|
- beta
|
|
11
|
-
-
|
|
12
|
-
version: 0.3.0.beta.
|
|
11
|
+
- 18
|
|
12
|
+
version: 0.3.0.beta.18
|
|
13
13
|
platform: ruby
|
|
14
14
|
authors:
|
|
15
15
|
- Charles Lowell
|
|
@@ -18,7 +18,7 @@ autorequire:
|
|
|
18
18
|
bindir: bin
|
|
19
19
|
cert_chain: []
|
|
20
20
|
|
|
21
|
-
date: 2010-11-
|
|
21
|
+
date: 2010-11-06 00:00:00 -07:00
|
|
22
22
|
default_executable:
|
|
23
23
|
dependencies:
|
|
24
24
|
- !ruby/object:Gem::Dependency
|
|
@@ -273,6 +273,7 @@ files:
|
|
|
273
273
|
- lib/hudson/cli/formatting.rb
|
|
274
274
|
- lib/hudson/cli.rb
|
|
275
275
|
- lib/hudson/config.rb
|
|
276
|
+
- lib/hudson/core_ext/hash.rb
|
|
276
277
|
- lib/hudson/core_ext/object/blank.rb
|
|
277
278
|
- lib/hudson/hudson-cli.jar
|
|
278
279
|
- lib/hudson/hudson.war
|
|
@@ -297,6 +298,7 @@ files:
|
|
|
297
298
|
- spec/fixtures/ruby.single.config.xml
|
|
298
299
|
- spec/fixtures/rubygem.config.xml
|
|
299
300
|
- spec/fixtures/therubyracer.config.xml
|
|
301
|
+
- spec/hash_key_cleaner_spec.rb
|
|
300
302
|
- spec/job_config_builder_spec.rb
|
|
301
303
|
- spec/spec_helper.rb
|
|
302
304
|
- tasks/upgrade.rake
|