hudson 0.3.0.beta.1 → 0.3.0.beta.2
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/bin/hudson +1 -1
- data/bin/hudson.compiled.rbc +197 -0
- data/features/adding_slave_nodes.feature +27 -0
- data/features/listing_jobs.feature +2 -2
- data/features/step_definitions/common_steps.rb +27 -17
- data/features/step_definitions/hudson_steps.rb +21 -1
- data/features/support/common.rb +8 -0
- data/hudson.gemspec +3 -3
- data/lib/hudson.rb +1 -1
- data/lib/hudson.rbc +296 -0
- data/lib/hudson/api.rb +76 -8
- data/lib/hudson/api.rbc +1540 -0
- data/lib/hudson/cli.rb +41 -18
- metadata +8 -4
data/bin/hudson
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'rubygems'
|
3
3
|
$:.unshift(File.expand_path(File.dirname(File.dirname(__FILE__) + "/../lib/hudson.rb")))
|
4
|
-
require File.dirname(__FILE__) + '/../lib/hudson'
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/hudson')
|
5
5
|
require 'hudson/cli'
|
6
6
|
|
7
7
|
Hudson::CLI.start
|
@@ -0,0 +1,197 @@
|
|
1
|
+
!RBIX
|
2
|
+
0
|
3
|
+
x
|
4
|
+
M
|
5
|
+
1
|
6
|
+
n
|
7
|
+
n
|
8
|
+
x
|
9
|
+
10
|
10
|
+
__script__
|
11
|
+
i
|
12
|
+
89
|
13
|
+
5
|
14
|
+
7
|
15
|
+
0
|
16
|
+
64
|
17
|
+
47
|
18
|
+
49
|
19
|
+
1
|
20
|
+
1
|
21
|
+
15
|
22
|
+
99
|
23
|
+
43
|
24
|
+
2
|
25
|
+
7
|
26
|
+
3
|
27
|
+
49
|
28
|
+
4
|
29
|
+
1
|
30
|
+
45
|
31
|
+
5
|
32
|
+
6
|
33
|
+
45
|
34
|
+
5
|
35
|
+
7
|
36
|
+
45
|
37
|
+
5
|
38
|
+
8
|
39
|
+
65
|
40
|
+
49
|
41
|
+
9
|
42
|
+
0
|
43
|
+
49
|
44
|
+
10
|
45
|
+
1
|
46
|
+
7
|
47
|
+
11
|
48
|
+
64
|
49
|
+
81
|
50
|
+
12
|
51
|
+
49
|
52
|
+
10
|
53
|
+
1
|
54
|
+
49
|
55
|
+
13
|
56
|
+
1
|
57
|
+
49
|
58
|
+
14
|
59
|
+
1
|
60
|
+
15
|
61
|
+
5
|
62
|
+
45
|
63
|
+
5
|
64
|
+
15
|
65
|
+
65
|
66
|
+
49
|
67
|
+
9
|
68
|
+
0
|
69
|
+
49
|
70
|
+
10
|
71
|
+
1
|
72
|
+
7
|
73
|
+
16
|
74
|
+
64
|
75
|
+
81
|
76
|
+
12
|
77
|
+
47
|
78
|
+
49
|
79
|
+
1
|
80
|
+
1
|
81
|
+
15
|
82
|
+
5
|
83
|
+
7
|
84
|
+
17
|
85
|
+
64
|
86
|
+
47
|
87
|
+
49
|
88
|
+
1
|
89
|
+
1
|
90
|
+
15
|
91
|
+
45
|
92
|
+
18
|
93
|
+
19
|
94
|
+
43
|
95
|
+
20
|
96
|
+
49
|
97
|
+
21
|
98
|
+
0
|
99
|
+
15
|
100
|
+
2
|
101
|
+
11
|
102
|
+
I
|
103
|
+
5
|
104
|
+
I
|
105
|
+
0
|
106
|
+
I
|
107
|
+
0
|
108
|
+
I
|
109
|
+
0
|
110
|
+
n
|
111
|
+
p
|
112
|
+
22
|
113
|
+
s
|
114
|
+
8
|
115
|
+
rubygems
|
116
|
+
x
|
117
|
+
7
|
118
|
+
require
|
119
|
+
x
|
120
|
+
7
|
121
|
+
Globals
|
122
|
+
x
|
123
|
+
2
|
124
|
+
$:
|
125
|
+
x
|
126
|
+
2
|
127
|
+
[]
|
128
|
+
x
|
129
|
+
4
|
130
|
+
File
|
131
|
+
n
|
132
|
+
n
|
133
|
+
n
|
134
|
+
x
|
135
|
+
11
|
136
|
+
active_path
|
137
|
+
x
|
138
|
+
7
|
139
|
+
dirname
|
140
|
+
s
|
141
|
+
17
|
142
|
+
/../lib/hudson.rb
|
143
|
+
x
|
144
|
+
1
|
145
|
+
+
|
146
|
+
x
|
147
|
+
11
|
148
|
+
expand_path
|
149
|
+
x
|
150
|
+
7
|
151
|
+
unshift
|
152
|
+
n
|
153
|
+
s
|
154
|
+
14
|
155
|
+
/../lib/hudson
|
156
|
+
s
|
157
|
+
10
|
158
|
+
hudson/cli
|
159
|
+
x
|
160
|
+
6
|
161
|
+
Hudson
|
162
|
+
n
|
163
|
+
x
|
164
|
+
3
|
165
|
+
CLI
|
166
|
+
x
|
167
|
+
5
|
168
|
+
start
|
169
|
+
p
|
170
|
+
11
|
171
|
+
I
|
172
|
+
0
|
173
|
+
I
|
174
|
+
2
|
175
|
+
I
|
176
|
+
9
|
177
|
+
I
|
178
|
+
3
|
179
|
+
I
|
180
|
+
30
|
181
|
+
I
|
182
|
+
4
|
183
|
+
I
|
184
|
+
45
|
185
|
+
I
|
186
|
+
5
|
187
|
+
I
|
188
|
+
4e
|
189
|
+
I
|
190
|
+
7
|
191
|
+
I
|
192
|
+
59
|
193
|
+
x
|
194
|
+
47
|
195
|
+
/Users/drnic/Projects/gems/hudson.rb/bin/hudson
|
196
|
+
p
|
197
|
+
0
|
@@ -0,0 +1,27 @@
|
|
1
|
+
Feature: Adding slave nodes
|
2
|
+
In order to have different environments for different projects
|
3
|
+
As a developer
|
4
|
+
I want to add new slave nodes to my Hudson instance
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given I have a Hudson server running
|
8
|
+
And the Hudson server has no slaves
|
9
|
+
|
10
|
+
Scenario: Add a slave with no authentication required
|
11
|
+
When I run local executable "hudson" with arguments "nodes --host localhost --port 3010"
|
12
|
+
Then I should see exactly
|
13
|
+
"""
|
14
|
+
master
|
15
|
+
"""
|
16
|
+
|
17
|
+
When I create a new node with the following options on "http://localhost:3010":
|
18
|
+
| name | Slave 1 |
|
19
|
+
| label | app1 app2 app3 |
|
20
|
+
| slave_host | foo1.bar.com |
|
21
|
+
| slave_user | hudson |
|
22
|
+
When I run local executable "hudson" with arguments "nodes --host localhost --port 3010"
|
23
|
+
Then I should see exactly
|
24
|
+
"""
|
25
|
+
master
|
26
|
+
Slave 1
|
27
|
+
"""
|
@@ -2,13 +2,13 @@ Feature: Listing jobs
|
|
2
2
|
I want to see the status of jobs on servers I'm interested in
|
3
3
|
|
4
4
|
Scenario: List jobs on a non-existent server
|
5
|
-
When I run local executable "hudson" with arguments "list
|
5
|
+
When I run local executable "hudson" with arguments "list --host localhost --port 9999"
|
6
6
|
Then I should see "localhost:9999 - no connection"
|
7
7
|
|
8
8
|
Scenario: List jobs on a server with no jobs
|
9
9
|
Given I have a Hudson server running
|
10
10
|
And the Hudson server has no current jobs
|
11
|
-
When I run local executable "hudson" with arguments "list
|
11
|
+
When I run local executable "hudson" with arguments "list --host localhost --port 3010"
|
12
12
|
Then I should see "localhost:3010 - no jobs"
|
13
13
|
|
14
14
|
Scenario: List jobs on a server with jobs
|
@@ -18,7 +18,7 @@ When /^I invoke "(.*)" generator with arguments "(.*)"$/ do |generator, argument
|
|
18
18
|
in_project_folder do
|
19
19
|
if Object.const_defined?("APP_ROOT")
|
20
20
|
APP_ROOT.replace(FileUtils.pwd)
|
21
|
-
else
|
21
|
+
else
|
22
22
|
APP_ROOT = FileUtils.pwd
|
23
23
|
end
|
24
24
|
run_generator(generator, arguments.split(' '), SOURCES, :stdout => @stdout)
|
@@ -32,14 +32,14 @@ end
|
|
32
32
|
When /^I run executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
33
33
|
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
34
34
|
in_project_folder do
|
35
|
-
system "#{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
35
|
+
system "#{executable.inspect} #{arguments} > #{@stdout.inspect} 2> #{@stdout.inspect}"
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
When /^I run project executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
40
40
|
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
41
41
|
in_project_folder do
|
42
|
-
system "ruby #{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
42
|
+
system "ruby #{executable.inspect} #{arguments} > #{@stdout.inspect} 2> #{@stdout.inspect}"
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
@@ -47,14 +47,14 @@ When /^I run local executable "(.*)" with arguments "(.*)"/ do |executable, argu
|
|
47
47
|
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
48
48
|
executable = File.expand_path(File.join(File.dirname(__FILE__), "/../../bin", executable))
|
49
49
|
in_project_folder do
|
50
|
-
system "ruby #{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
50
|
+
system "ruby #{executable.inspect} #{arguments} > #{@stdout.inspect} 2> #{@stdout.inspect}"
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
54
|
When /^I invoke task "rake (.*)"/ do |task|
|
55
55
|
@stdout = File.expand_path(File.join(@tmp_root, "tests.out"))
|
56
56
|
in_project_folder do
|
57
|
-
system "rake #{task} --trace > #{@stdout} 2> #{@stdout}"
|
57
|
+
system "rake #{task} --trace > #{@stdout.inspect} 2> #{@stdout.inspect}"
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -94,52 +94,52 @@ Then /gem file "(.*)" and generated file "(.*)" should be the same/ do |gem_file
|
|
94
94
|
end
|
95
95
|
|
96
96
|
Then /^(does|does not) invoke generator "(.*)"$/ do |does_invoke, generator|
|
97
|
-
actual_output =
|
97
|
+
actual_output = get_command_output
|
98
98
|
does_invoke == "does" ?
|
99
99
|
actual_output.should(match(/dependency\s+#{generator}/)) :
|
100
100
|
actual_output.should_not(match(/dependency\s+#{generator}/))
|
101
101
|
end
|
102
102
|
|
103
103
|
Then /help options "(.*)" and "(.*)" are displayed/ do |opt1, opt2|
|
104
|
-
actual_output =
|
104
|
+
actual_output = get_command_output
|
105
105
|
actual_output.should match(/#{opt1}/)
|
106
106
|
actual_output.should match(/#{opt2}/)
|
107
107
|
end
|
108
108
|
|
109
109
|
Then /^I should see "([^\"]*)"$/ do |text|
|
110
|
-
actual_output =
|
110
|
+
actual_output = get_command_output
|
111
111
|
actual_output.should contain(text)
|
112
112
|
end
|
113
113
|
|
114
114
|
Then /^I should not see "([^\"]*)"$/ do |text|
|
115
|
-
actual_output =
|
115
|
+
actual_output =
|
116
116
|
actual_output.should_not contain(text)
|
117
117
|
end
|
118
118
|
|
119
119
|
Then /^I should see$/ do |text|
|
120
|
-
actual_output =
|
120
|
+
actual_output = get_command_output
|
121
121
|
actual_output.should contain(text)
|
122
122
|
end
|
123
123
|
|
124
124
|
Then /^I should not see$/ do |text|
|
125
|
-
actual_output =
|
125
|
+
actual_output = get_command_output
|
126
126
|
actual_output.should_not contain(text)
|
127
127
|
end
|
128
128
|
|
129
129
|
Then /^I should see exactly$/ do |text|
|
130
|
-
actual_output =
|
130
|
+
actual_output = get_command_output
|
131
131
|
actual_output.should == text
|
132
132
|
end
|
133
133
|
|
134
134
|
Then /^I should see all (\d+) tests pass/ do |expected_test_count|
|
135
135
|
expected = %r{^#{expected_test_count} tests, \d+ assertions, 0 failures, 0 errors}
|
136
|
-
actual_output =
|
136
|
+
actual_output = get_command_output
|
137
137
|
actual_output.should match(expected)
|
138
138
|
end
|
139
139
|
|
140
140
|
Then /^I should see all (\d+) examples pass/ do |expected_test_count|
|
141
141
|
expected = %r{^#{expected_test_count} examples?, 0 failures}
|
142
|
-
actual_output =
|
142
|
+
actual_output = get_command_output
|
143
143
|
actual_output.should match(expected)
|
144
144
|
end
|
145
145
|
|
@@ -153,15 +153,15 @@ end
|
|
153
153
|
Then /^Rakefile can display tasks successfully/ do
|
154
154
|
@stdout = File.expand_path(File.join(@tmp_root, "rakefile.out"))
|
155
155
|
in_project_folder do
|
156
|
-
system "rake -T > #{@stdout} 2> #{@stdout}"
|
156
|
+
system "rake -T > #{@stdout.inspect} 2> #{@stdout.inspect}"
|
157
157
|
end
|
158
|
-
actual_output =
|
158
|
+
actual_output = get_command_output
|
159
159
|
actual_output.should match(/^rake\s+\w+\s+#\s.*/)
|
160
160
|
end
|
161
161
|
|
162
162
|
Then /^task "rake (.*)" is executed successfully/ do |task|
|
163
163
|
@stdout.should_not be_nil
|
164
|
-
actual_output =
|
164
|
+
actual_output = get_command_output
|
165
165
|
actual_output.should_not match(/^Don't know how to build task '#{task}'/)
|
166
166
|
actual_output.should_not match(/Error/i)
|
167
167
|
end
|
@@ -179,3 +179,13 @@ Then /^the file "([^\"]*)" is a valid gemspec$/ do |filename|
|
|
179
179
|
spec = eval(File.read(filename))
|
180
180
|
spec.validate
|
181
181
|
end
|
182
|
+
|
183
|
+
When /^I create a new node with the following options on "http:\/\/(.+?):(\d+)":$/ do |host, port, table|
|
184
|
+
options = table.raw.inject({}) do |options, (key, value)|
|
185
|
+
options[(key.to_sym rescue key) || key] = value
|
186
|
+
options
|
187
|
+
end
|
188
|
+
|
189
|
+
Hudson::Api.setup_base_url(:host => host, :port => port.to_i)
|
190
|
+
Hudson::Api.add_node(options)
|
191
|
+
end
|
@@ -29,6 +29,26 @@ Given /^the Hudson server has no current jobs$/ do
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
+
Given /^the Hudson server has no slaves$/ do
|
33
|
+
if port = @hudson_port
|
34
|
+
require "open-uri"
|
35
|
+
require "yajl"
|
36
|
+
base_url = "http://#{@hudson_host}:#{@hudson_port}"
|
37
|
+
hudson_info = Yajl::Parser.new.parse(open("#{base_url}/computer/api/json"))
|
38
|
+
|
39
|
+
hudson_info['computer'].each do |node|
|
40
|
+
name = node["displayName"]
|
41
|
+
next if name == "master"
|
42
|
+
job_url = "#{base_url}/computer/#{CGI::escape(name).gsub('+', '%20')}"
|
43
|
+
res = Net::HTTP.start("localhost", port) { |http| http.post("#{job_url}/doDelete/api/json", {}) }
|
44
|
+
end
|
45
|
+
hudson_info = Yajl::Parser.new.parse(open("http://#{@hudson_host}:#{@hudson_port}/api/json"))
|
46
|
+
hudson_info['jobs'].should == []
|
47
|
+
else
|
48
|
+
puts "WARNING: Run 'I have a Hudson server running' step first."
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
32
52
|
Given /^there is nothing listening on port (\d+)$/ do |port|
|
33
53
|
lambda {
|
34
54
|
TCPSocket.open("localhost", port) {}
|
@@ -56,7 +76,7 @@ When /^I run hudson server with arguments "(.*)"/ do |arguments|
|
|
56
76
|
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
57
77
|
executable = File.expand_path(File.join(File.dirname(__FILE__), "/../../bin","hudson"))
|
58
78
|
in_project_folder do
|
59
|
-
system "ruby #{executable} server #{arguments} > #{@stdout} 2
|
79
|
+
system "ruby #{executable.inspect} server #{arguments} > #{@stdout.inspect} 2> #{@stdout.inspect}"
|
60
80
|
end
|
61
81
|
end
|
62
82
|
|
data/features/support/common.rb
CHANGED
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.2"
|
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-10-
|
9
|
+
s.date = %q{2010-10-27}
|
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/create_jobs.feature", "features/development.feature", "features/fixtures", "features/fixtures/projects", "features/fixtures/projects/ruby", "features/fixtures/projects/ruby/Rakefile", "features/listing_jobs.feature", "features/managing_remote_servers.feature", "features/server.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", "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/hudson-cli.jar", "lib/hudson/hudson.war", "lib/hudson/job_config_builder.rb", "lib/hudson/plugins", "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.rb", "Rakefile", "README.md", "spec", "spec/fixtures", "spec/fixtures/ec2_global.config.xml", "spec/fixtures/rails.multi.config.xml", "spec/fixtures/rails.single.config.xml", "spec/fixtures/rubygem.config.xml", "spec/fixtures/therubyracer.config.xml", "spec/job_config_builder_spec.rb", "spec/spec_helper.rb"]
|
14
|
+
s.files = ["bin", "bin/hudson", "bin/hudson.compiled.rbc", "features", "features/adding_slave_nodes.feature", "features/create_jobs.feature", "features/development.feature", "features/fixtures", "features/fixtures/projects", "features/fixtures/projects/ruby", "features/fixtures/projects/ruby/Rakefile", "features/listing_jobs.feature", "features/managing_remote_servers.feature", "features/server.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", "Gemfile", "Gemfile.lock", "hudson.gemspec", "lib", "lib/hudson", "lib/hudson/api.rb", "lib/hudson/api.rbc", "lib/hudson/cli", "lib/hudson/cli/formatting.rb", "lib/hudson/cli.rb", "lib/hudson/config.rb", "lib/hudson/hudson-cli.jar", "lib/hudson/hudson.war", "lib/hudson/job_config_builder.rb", "lib/hudson/plugins", "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.rb", "lib/hudson.rbc", "Rakefile", "README.md", "spec", "spec/fixtures", "spec/fixtures/ec2_global.config.xml", "spec/fixtures/rails.multi.config.xml", "spec/fixtures/rails.single.config.xml", "spec/fixtures/rubygem.config.xml", "spec/fixtures/therubyracer.config.xml", "spec/job_config_builder_spec.rb", "spec/spec_helper.rb"]
|
15
15
|
s.homepage = %q{http://github.com/cowboyd/hudson.rb}
|
16
16
|
s.require_paths = ["lib"]
|
17
17
|
s.rubyforge_project = %q{hudson}
|