hudson 0.2.7 → 0.3.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,65 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ hudson (0.3.0.beta.1)
5
+ activesupport (~> 3.0.0)
6
+ builder (~> 2.1.2)
7
+ hpricot
8
+ httparty (~> 0.5.2)
9
+ term-ansicolor (>= 1.0.4)
10
+ thor (= 0.14.2)
11
+ yajl-ruby (>= 0.7.6)
12
+
13
+ GEM
14
+ remote: http://rubygems.org/
15
+ specs:
16
+ activesupport (3.0.0)
17
+ awesome_print (0.2.1)
18
+ builder (2.1.2)
19
+ crack (0.1.6)
20
+ cucumber (0.9.0)
21
+ builder (~> 2.1.2)
22
+ diff-lcs (~> 1.1.2)
23
+ gherkin (~> 2.2.2)
24
+ json (~> 1.4.6)
25
+ term-ansicolor (~> 1.0.5)
26
+ diff-lcs (1.1.2)
27
+ gherkin (2.2.8)
28
+ json (~> 1.4.6)
29
+ term-ansicolor (~> 1.0.5)
30
+ hpricot (0.8.2)
31
+ httparty (0.5.2)
32
+ crack (= 0.1.6)
33
+ json (1.4.6)
34
+ rake (0.8.7)
35
+ rspec (2.0.0.rc)
36
+ rspec-core (= 2.0.0.rc)
37
+ rspec-expectations (= 2.0.0.rc)
38
+ rspec-mocks (= 2.0.0.rc)
39
+ rspec-core (2.0.0.rc)
40
+ rspec-expectations (2.0.0.rc)
41
+ diff-lcs (>= 1.1.2)
42
+ rspec-mocks (2.0.0.rc)
43
+ rspec-core (= 2.0.0.rc)
44
+ rspec-expectations (= 2.0.0.rc)
45
+ term-ansicolor (1.0.5)
46
+ thor (0.14.2)
47
+ yajl-ruby (0.7.8)
48
+
49
+ PLATFORMS
50
+ ruby
51
+
52
+ DEPENDENCIES
53
+ activesupport (~> 3.0.0)
54
+ awesome_print
55
+ builder (~> 2.1.2)
56
+ cucumber (~> 0.9.0)
57
+ hpricot
58
+ httparty (~> 0.5.2)
59
+ hudson!
60
+ json (~> 1.4.0)
61
+ rake (~> 0.8.7)
62
+ rspec (~> 2.0.0.beta)
63
+ term-ansicolor (>= 1.0.4)
64
+ thor (= 0.14.2)
65
+ yajl-ruby (>= 0.7.6)
data/README.md CHANGED
@@ -1,10 +1,12 @@
1
1
  Hudson
2
2
  ======
3
3
 
4
- Hudson is a sweet CI server. Hudson.rb makes it easy
5
- to run ruby builds by bundling all the ruby-centric plugins
6
- (ruby, rake, git, github) and wrapping them in a super simple
7
- executeable.
4
+ Hudson is a sweet continuous integration platform. Hudson.rb makes it easy
5
+ to bundles all the things you need to easily run a hudson server from Ruby,
6
+ as well as talk to a running hudson servers from Ruby and the command line.
7
+
8
+ * Email: [http://groups.google.com/group/hudsonrb](http://groups.google.com/group/hudsonrb)
9
+ * IRC: [irc://irc.freenode.net/hudson.rb](irc://irc.freenode.net/hudson.rb)
8
10
 
9
11
  Install
10
12
  =======
@@ -58,6 +60,27 @@ To add Project (create a Job) on a Hudson server:
58
60
 
59
61
  For all commands, if flags for `host:port` are not provided, it will use `$HUDSON_HOST` and `$HUDSON_PORT` if available.
60
62
 
63
+ Developer Instructions
64
+ ======================
65
+
66
+ The dependencies for the gem and for developing the gem are managed by bundler.
67
+
68
+ gem install bundler
69
+ git clone http://github.com/cowboyd/hudson.rb.git
70
+ bundle install
71
+
72
+ The test suite is run with:
73
+
74
+ rake
75
+
76
+ This launches a Hudson server, runs cucumber features, and kills the Hudson server.
77
+
78
+ Alternately, manually launch the Hudson server, run features and close the Hudson server:
79
+
80
+ rake hudson:server:test
81
+ rake cucumber:ok
82
+ rake hudson:server:killtest
83
+
61
84
  License
62
85
  =======
63
86
 
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
1
4
  $:.unshift('lib')
2
5
  require 'hudson'
3
- require 'rubygems'
4
6
 
5
7
  Gem::Specification.new do |s|
6
8
  $gemspec = s
@@ -20,11 +22,14 @@ Gem::Specification.new do |s|
20
22
  s.add_dependency("yajl-ruby", [">= 0.7.6"])
21
23
  s.add_dependency("httparty", ["~> 0.5.2"])
22
24
  s.add_dependency("builder", ["~> 2.1.2"])
23
- s.add_dependency("thor", ["= 0.13.6"])
25
+ s.add_dependency("thor", ["= 0.14.2"])
26
+ s.add_dependency("activesupport", ["~> 3.0.0"])
24
27
  s.add_dependency("hpricot")
25
- s.add_development_dependency("cucumber", ["~> 0.7.3"])
26
- s.add_development_dependency("rspec", ["~> 1.3.0"])
28
+ s.add_development_dependency("rake", ["~> 0.8.7"])
29
+ s.add_development_dependency("cucumber", ["~> 0.9.0"])
30
+ s.add_development_dependency("rspec", ["~> 2.0.0.beta"])
27
31
  s.add_development_dependency("json", ["~>1.4.0"])
32
+ s.add_development_dependency("awesome_print")
28
33
  end
29
34
 
30
35
  desc "Build gem"
@@ -44,6 +49,9 @@ task :clean do
44
49
  sh "rm -rf *.gem"
45
50
  end
46
51
 
52
+ require "rspec/core/rake_task"
53
+ RSpec::Core::RakeTask.new(:spec)
54
+
47
55
  namespace :cucumber do
48
56
  require 'cucumber/rake/task'
49
57
  Cucumber::Rake::Task.new(:wip, 'Run features that are being worked on') do |t|
@@ -16,6 +16,17 @@ Feature: Create jobs
16
16
  When I run local executable "hudson" with arguments "list --host localhost --port 3010"
17
17
  Then I should see "ruby"
18
18
 
19
+ Scenario: Create job via $HUDSON_HOST and $HUDSON_PORT
20
+ Given I am in the "ruby" project folder
21
+ And the project uses "git" scm
22
+ And env variable $HUDSON_HOST set to "localhost"
23
+ And env variable $HUDSON_PORT set to "3010"
24
+ When I run local executable "hudson" with arguments "create ."
25
+ Then I should see "Added project 'ruby' to Hudson."
26
+ Then I should see "http://localhost:3010/job/ruby/build"
27
+ When I run local executable "hudson" with arguments "list"
28
+ Then I should see "ruby"
29
+
19
30
  Scenario: Attempt to create project without scm
20
31
  Given I am in the "ruby" project folder
21
32
  When I run local executable "hudson" with arguments "create . --host localhost --port 3010"
@@ -0,0 +1,29 @@
1
+ Feature: Listing jobs
2
+ I want to see the status of jobs on servers I'm interested in
3
+
4
+ Scenario: List jobs on a non-existent server
5
+ When I run local executable "hudson" with arguments "list test --host localhost --port 9999"
6
+ Then I should see "localhost:9999 - no connection"
7
+
8
+ Scenario: List jobs on a server with no jobs
9
+ Given I have a Hudson server running
10
+ And the Hudson server has no current jobs
11
+ When I run local executable "hudson" with arguments "list test --host localhost --port 3010"
12
+ Then I should see "localhost:3010 - no jobs"
13
+
14
+ Scenario: List jobs on a server with jobs
15
+ Given I have a Hudson server running
16
+ And the Hudson server has no current jobs
17
+ And I am in the "ruby" project folder
18
+ And the project uses "git" scm
19
+ When I run local executable "hudson" with arguments "create . --host localhost --port 3010"
20
+ When I run local executable "hudson" with arguments "list"
21
+ Then I should see "localhost:3010 -"
22
+ Then I should see "ruby"
23
+ When I run local executable "hudson" with arguments "list --host localhost --port 3010"
24
+ Then I should see "localhost:3010 -"
25
+ Then I should see "ruby"
26
+
27
+
28
+
29
+
@@ -13,19 +13,24 @@ Feature: Managing remote servers
13
13
  Then I should see "Either use --host or add remote servers."
14
14
 
15
15
  Scenario: Add a remote server
16
- When I run local executable "hudson" with arguments "remotes add --host localhost --port 3010"
17
- And I run local executable "hudson" with arguments "remotes add --host localhost --port 3011"
16
+ When I run local executable "hudson" with arguments "add_remote test --host localhost --port 3010"
18
17
  And I run local executable "hudson" with arguments "list"
19
18
  Then I should not see "Either use --host or add remote servers."
20
- And I should see "localhost:3010 -"
21
- And I should see "No jobs"
22
- And I should see "localhost:3011 - no connection"
19
+ And I should see "test [localhost:3010] - no jobs"
20
+
21
+ Scenario: Add a few remote servers
22
+ When I run local executable "hudson" with arguments "add_remote test --host localhost --port 3010"
23
+ And I run local executable "hudson" with arguments "add_remote another --host localhost --port 4000"
24
+ And I run local executable "hudson" with arguments "list"
25
+ Then I should not see "Either use --host or add remote servers."
26
+ And I should see "test [localhost:3010] - no jobs"
27
+ And I should see "another [localhost:3011] - no connection"
23
28
 
24
29
  Scenario: Add a remote server and access by abbreviation
25
- When I run local executable "hudson" with arguments "remotes add --host localhost --port 3010"
26
- When I run local executable "hudson" with arguments "remotes add --host another.server"
30
+ When I run local executable "hudson" with arguments "add_remote test --host localhost --port 3010"
31
+ And I run local executable "hudson" with arguments "add_remote another --host another.host"
27
32
  And I run local executable "hudson" with arguments "list --server local"
28
- And I should see "localhost:3010 -"
29
- And I should see "No jobs"
30
- And I should not see "another.server"
33
+ Then I should not see "Either use --host or add remote servers."
34
+ And I should see "test [localhost:3010] - no jobs"
35
+ And I should not see "another"
31
36
 
@@ -2,7 +2,7 @@ Given /^this project is active project folder/ do
2
2
  @active_project_folder = File.expand_path(File.dirname(__FILE__) + "/../..")
3
3
  end
4
4
 
5
- Given /^env variable \$([\w_]+) set to( project path |)"(.*)"/ do |env_var, path, value|
5
+ Given /^env variable \$([\w_]+) set to( project path|) "(.*)"/ do |env_var, path, value|
6
6
  in_project_folder {
7
7
  value = File.expand_path(value)
8
8
  } unless path.empty?
@@ -1,5 +1,5 @@
1
1
  Given /^I have a Hudson server running$/ do
2
- unless ENV['HUDSON_PORT']
2
+ unless @hudson_port
3
3
  port = 3010
4
4
  begin
5
5
  res = Net::HTTP.start("localhost", port) { |http| http.get('/api/json') }
@@ -7,22 +7,22 @@ Given /^I have a Hudson server running$/ do
7
7
  puts "\n\n\nERROR: To run tests, launch hudson in test mode: 'rake hudson:server:test'\n\n\n"
8
8
  exit
9
9
  end
10
- ENV['HUDSON_PORT'] = port.to_s
11
- ENV['HUDSON_HOST'] = 'localhost'
10
+ @hudson_port = port.to_s
11
+ @hudson_host = 'localhost'
12
12
  end
13
13
  end
14
14
 
15
15
  Given /^the Hudson server has no current jobs$/ do
16
- if port = ENV['HUDSON_PORT']
16
+ if port = @hudson_port
17
17
  require "open-uri"
18
18
  require "yajl"
19
- hudson_info = Yajl::Parser.new.parse(open("http://localhost:#{ENV['HUDSON_PORT']}/api/json"))
19
+ hudson_info = Yajl::Parser.new.parse(open("http://#{@hudson_host}:#{@hudson_port}/api/json"))
20
20
 
21
21
  hudson_info['jobs'].each do |job|
22
22
  job_url = job['url']
23
23
  res = Net::HTTP.start("localhost", port) { |http| http.post("#{job_url}doDelete/api/json", {}) }
24
24
  end
25
- hudson_info = Yajl::Parser.new.parse(open("http://localhost:#{ENV['HUDSON_PORT']}/api/json"))
25
+ hudson_info = Yajl::Parser.new.parse(open("http://#{@hudson_host}:#{@hudson_port}/api/json"))
26
26
  hudson_info['jobs'].should == []
27
27
  else
28
28
  puts "WARNING: Run 'I have a Hudson server running' step first."
@@ -1,10 +1,7 @@
1
1
  $:.unshift(File.expand_path(File.dirname(File.dirname(__FILE__) + "/../../lib/hudson.rb")))
2
2
  require File.dirname(__FILE__) + "/../../lib/hudson.rb"
3
3
 
4
- gem 'cucumber'
5
- require 'cucumber'
6
- gem 'rspec'
7
- require 'spec'
4
+ require 'bundler/setup'
8
5
 
9
6
  Before do
10
7
  @tmp_root = File.dirname(__FILE__) + "/../../tmp"
@@ -1,10 +1,8 @@
1
1
 
2
2
  module Matchers
3
- def contain(expected)
4
- Spec::Matchers::SimpleMatcher.new("contain #{expected.inspect}") do |given, matcher|
5
- matcher.failure_message = "expected #{given.inspect} to contain #{expected.inspect}"
6
- matcher.negative_failure_message = "expected #{given.inspect} not to contain #{expected.inspect}"
7
- given.index expected
3
+ RSpec::Matchers.define :contain do |expected_text|
4
+ match do |text|
5
+ text.index expected_text
8
6
  end
9
7
  end
10
8
  end
@@ -2,16 +2,16 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{hudson}
5
- s.version = "0.2.7"
5
+ s.version = "0.3.0.beta.1"
6
6
 
7
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
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-08-25}
9
+ s.date = %q{2010-10-11}
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/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", "hudson.gemspec", "lib", "lib/hudson", "lib/hudson/api.rb", "lib/hudson/cli", "lib/hudson/cli/formatting.rb", "lib/hudson/cli.rb", "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.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", "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"]
15
15
  s.homepage = %q{http://github.com/cowboyd/hudson.rb}
16
16
  s.require_paths = ["lib"]
17
17
  s.rubyforge_project = %q{hudson}
@@ -27,31 +27,40 @@ Gem::Specification.new do |s|
27
27
  s.add_runtime_dependency(%q<yajl-ruby>, [">= 0.7.6"])
28
28
  s.add_runtime_dependency(%q<httparty>, ["~> 0.5.2"])
29
29
  s.add_runtime_dependency(%q<builder>, ["~> 2.1.2"])
30
- s.add_runtime_dependency(%q<thor>, ["= 0.13.6"])
30
+ s.add_runtime_dependency(%q<thor>, ["= 0.14.2"])
31
+ s.add_runtime_dependency(%q<activesupport>, ["~> 3.0.0"])
31
32
  s.add_runtime_dependency(%q<hpricot>, [">= 0"])
32
- s.add_development_dependency(%q<cucumber>, ["~> 0.7.3"])
33
- s.add_development_dependency(%q<rspec>, ["~> 1.3.0"])
33
+ s.add_development_dependency(%q<rake>, ["~> 0.8.7"])
34
+ s.add_development_dependency(%q<cucumber>, ["~> 0.9.0"])
35
+ s.add_development_dependency(%q<rspec>, ["~> 2.0.0.beta"])
34
36
  s.add_development_dependency(%q<json>, ["~> 1.4.0"])
37
+ s.add_development_dependency(%q<awesome_print>, [">= 0"])
35
38
  else
36
39
  s.add_dependency(%q<term-ansicolor>, [">= 1.0.4"])
37
40
  s.add_dependency(%q<yajl-ruby>, [">= 0.7.6"])
38
41
  s.add_dependency(%q<httparty>, ["~> 0.5.2"])
39
42
  s.add_dependency(%q<builder>, ["~> 2.1.2"])
40
- s.add_dependency(%q<thor>, ["= 0.13.6"])
43
+ s.add_dependency(%q<thor>, ["= 0.14.2"])
44
+ s.add_dependency(%q<activesupport>, ["~> 3.0.0"])
41
45
  s.add_dependency(%q<hpricot>, [">= 0"])
42
- s.add_dependency(%q<cucumber>, ["~> 0.7.3"])
43
- s.add_dependency(%q<rspec>, ["~> 1.3.0"])
46
+ s.add_dependency(%q<rake>, ["~> 0.8.7"])
47
+ s.add_dependency(%q<cucumber>, ["~> 0.9.0"])
48
+ s.add_dependency(%q<rspec>, ["~> 2.0.0.beta"])
44
49
  s.add_dependency(%q<json>, ["~> 1.4.0"])
50
+ s.add_dependency(%q<awesome_print>, [">= 0"])
45
51
  end
46
52
  else
47
53
  s.add_dependency(%q<term-ansicolor>, [">= 1.0.4"])
48
54
  s.add_dependency(%q<yajl-ruby>, [">= 0.7.6"])
49
55
  s.add_dependency(%q<httparty>, ["~> 0.5.2"])
50
56
  s.add_dependency(%q<builder>, ["~> 2.1.2"])
51
- s.add_dependency(%q<thor>, ["= 0.13.6"])
57
+ s.add_dependency(%q<thor>, ["= 0.14.2"])
58
+ s.add_dependency(%q<activesupport>, ["~> 3.0.0"])
52
59
  s.add_dependency(%q<hpricot>, [">= 0"])
53
- s.add_dependency(%q<cucumber>, ["~> 0.7.3"])
54
- s.add_dependency(%q<rspec>, ["~> 1.3.0"])
60
+ s.add_dependency(%q<rake>, ["~> 0.8.7"])
61
+ s.add_dependency(%q<cucumber>, ["~> 0.9.0"])
62
+ s.add_dependency(%q<rspec>, ["~> 2.0.0.beta"])
55
63
  s.add_dependency(%q<json>, ["~> 1.4.0"])
64
+ s.add_dependency(%q<awesome_print>, [">= 0"])
56
65
  end
57
66
  end
@@ -1,6 +1,6 @@
1
1
  module Hudson
2
- VERSION = "0.2.7"
3
- HUDSON_VERSION = "1.373"
2
+ VERSION = "0.3.0.beta.1"
3
+ HUDSON_VERSION = "1.380"
4
4
  WAR = File.expand_path(File.dirname(__FILE__) + "/hudson/hudson.war")
5
5
  PLUGINS = File.expand_path(File.dirname(__FILE__) + "/hudson/plugins")
6
6
  end
@@ -1,5 +1,7 @@
1
1
  require 'httparty'
2
2
  require 'cgi'
3
+ require 'uri'
4
+ require 'json'
3
5
 
4
6
  module Hudson
5
7
  class Api
@@ -10,10 +12,14 @@ module Hudson
10
12
  # http_proxy 'localhost', '8888'
11
13
 
12
14
  def self.setup_base_url(options)
13
- server_name, host, port = options[:server], options[:host], options[:port]
14
- return false unless host || server_name
15
- p "http://#{host}:#{port}"
16
- base_uri "http://#{host}:#{port}"
15
+ # Thor's HashWithIndifferentAccess is based on string keys which URI::HTTP.build ignores
16
+ options = options.inject({}) { |mem, (key, val)| mem[key.to_sym] = val; mem }
17
+ options[:host] ||= ENV['HUDSON_HOST']
18
+ options[:port] ||= ENV['HUDSON_PORT']
19
+ return false unless options[:host] || Hudson::Config.config["base_uri"]
20
+ uri = options[:host] ? URI::HTTP.build(options) : Hudson::Config.config["base_uri"]
21
+ base_uri uri.to_s
22
+ uri
17
23
  end
18
24
 
19
25
  # returns true if successfully create a new job on Hudson
@@ -22,6 +28,7 @@ module Hudson
22
28
  :body => job_config.to_xml, :format => :xml, :headers => { 'content-type' => 'application/xml' }
23
29
  }
24
30
  if res.code == 200
31
+ cache_base_uri
25
32
  true
26
33
  else
27
34
  require "hpricot"
@@ -32,12 +39,26 @@ module Hudson
32
39
  end
33
40
 
34
41
  def self.summary
35
- get "/api/json"
42
+ begin
43
+ json = get "/api/json"
44
+ cache_base_uri
45
+ json
46
+ rescue Errno::ECONNREFUSED => e
47
+ false
48
+ end
36
49
  end
37
50
 
38
- # Return hash of job sta
51
+ # Return hash of job statuses
39
52
  def self.job(name)
40
- get "/job/#{name}/api/json"
53
+ json = get "/job/#{name}/api/json"
54
+ cache_base_uri
55
+ json
56
+ end
57
+
58
+ private
59
+ def self.cache_base_uri
60
+ Hudson::Config.config["base_uri"] = base_uri
61
+ Hudson::Config.store!
41
62
  end
42
63
  end
43
64
  end
@@ -1,5 +1,8 @@
1
1
  require 'thor'
2
+ require 'active_support/core_ext/object/blank'
2
3
  require 'hudson/cli/formatting'
4
+ require 'hudson/config'
5
+ require 'hudson/remote'
3
6
 
4
7
  module Hudson
5
8
  class CLI < Thor
@@ -58,7 +61,7 @@ module Hudson
58
61
  end
59
62
  name = options[:name] || File.basename(FileUtils.pwd)
60
63
  if Hudson::Api.create_job(name, job_config)
61
- build_url = "http://#{options[:host]}:#{options[:port]}/job/#{name.gsub(/\s/,'%20')}/build"
64
+ build_url = "#{@uri}/job/#{name.gsub(/\s/,'%20')}/build"
62
65
  puts "Added project '#{name}' to Hudson."
63
66
  puts "Trigger builds via: #{build_url}"
64
67
  else
@@ -67,33 +70,39 @@ module Hudson
67
70
  end
68
71
  end
69
72
 
70
- desc "list [project_path] [options]", "list builds on a hudson server"
73
+ desc "list [server] [options]", "list builds on a hudson server"
71
74
  common_options
72
- def list(project_path = ".")
75
+ def list(server = nil)
73
76
  select_hudson_server(options)
74
- FileUtils.chdir(project_path) do
75
- if summary = Hudson::Api.summary
76
- if summary["jobs"]
77
- summary["jobs"].each do |job|
78
- color = job['color']
79
- color = 'green' if color == 'blue'
80
- shell.say job['name'], color.to_sym, false
81
- shell.say " - #{job['url']}"
82
- end
83
- else
84
- display "No jobs found on #{options[:host]}:#{options[:port]}"
77
+ if summary = Hudson::Api.summary
78
+ unless summary["jobs"].blank?
79
+ shell.say "#{@uri} -"
80
+ summary["jobs"].each do |job|
81
+ color = job['color']
82
+ color = 'red' if color == 'red_anime'
83
+ color = 'green' if color == 'blue'
84
+ color = 'yellow' if color == 'grey'
85
+ shell.say job['name'], color.to_sym, false
85
86
  end
87
+ shell.say ""
86
88
  else
87
- error "Failed connection to #{options[:host]}:#{options[:port]}"
89
+ display "#{@uri} - no jobs"
88
90
  end
89
- end
90
- end
91
-
92
- desc "remote command [options]", "manage remote servers (comming sometime to a theater near you)"
93
- def remote(command)
94
- puts command
91
+ else
92
+ shell.say "#{@uri} - no connection", :red
93
+ end
95
94
  end
96
95
 
96
+ # desc "add_remote name [options]", "manage remote servers (comming sometime to a theater near you)"
97
+ # common_options
98
+ # def add_remote(name)
99
+ # select_hudson_server(options)
100
+ # if Hudson::Remote.add_server(name, @uri)
101
+ # display "Added remote server '#{name}' for #{@uri}"
102
+ # else
103
+ # error "Could not add remote server for '#{@uri}'"
104
+ # end
105
+ # end
97
106
 
98
107
  desc "help [command]", "show help for hudson or for a specific command"
99
108
  def help(*args)
@@ -124,17 +133,18 @@ USEAGE
124
133
  private
125
134
 
126
135
  def select_hudson_server(options)
127
- unless Hudson::Api.setup_base_url(options)
136
+ unless @uri = Hudson::Api.setup_base_url(options)
128
137
  error "Either use --host or add remote servers."
129
138
  end
130
139
  end
140
+
131
141
  def display(text)
132
142
  shell.say text
133
143
  exit
134
144
  end
135
145
 
136
146
  def error(text)
137
- shell.say "ERROR: #{text}"
147
+ shell.say "ERROR: #{text}", :red
138
148
  exit
139
149
  end
140
150
  end
@@ -22,7 +22,7 @@ module Hudson
22
22
  table = options.map do |option|
23
23
  prototype = if option.default
24
24
  " [#{option.default}]"
25
- elsif option.boolean
25
+ elsif option.boolean?
26
26
  ""
27
27
  elsif option.required?
28
28
  " #{option.banner}"
@@ -0,0 +1,27 @@
1
+ module Hudson
2
+ module Config
3
+ extend self
4
+
5
+ def [](key)
6
+ config[key]
7
+ end
8
+
9
+ def config
10
+ @config ||= if File.exist?(config_file)
11
+ JSON.parse(File.read(config_file))
12
+ else
13
+ {}
14
+ end
15
+ end
16
+
17
+ def store!
18
+ @config ||= {}
19
+ FileUtils.mkdir_p(File.dirname(config_file))
20
+ File.open(config_file, "w") { |file| file << @config.to_json }
21
+ end
22
+
23
+ def config_file
24
+ @config_file ||= "#{ENV['HOME']}/.hudson/hudsonrb-config.json"
25
+ end
26
+ end
27
+ end
Binary file
Binary file
@@ -0,0 +1,11 @@
1
+ module Hudson
2
+ class Remote
3
+ def self.add_server(name, uri)
4
+ remotes[name] = uri
5
+ end
6
+
7
+ def self.remotes
8
+ @remotes ||= {}
9
+ end
10
+ end
11
+ end
@@ -1,9 +1,9 @@
1
1
  begin
2
- require 'spec'
2
+ require 'rspec'
3
3
  rescue LoadError
4
4
  require 'rubygems' unless ENV['NO_RUBYGEMS']
5
5
  gem 'rspec'
6
- require 'spec'
6
+ require 'rspec'
7
7
  end
8
8
 
9
9
  $:.unshift(File.dirname(__FILE__) + '/../lib')
metadata CHANGED
@@ -1,13 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hudson
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
5
- prerelease: false
4
+ hash: 62196369
5
+ prerelease: true
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 7
10
- version: 0.2.7
8
+ - 3
9
+ - 0
10
+ - beta
11
+ - 1
12
+ version: 0.3.0.beta.1
11
13
  platform: ruby
12
14
  authors:
13
15
  - Charles Lowell
@@ -16,12 +18,10 @@ autorequire:
16
18
  bindir: bin
17
19
  cert_chain: []
18
20
 
19
- date: 2010-08-25 00:00:00 -05:00
21
+ date: 2010-10-11 00:00:00 -07:00
20
22
  default_executable:
21
23
  dependencies:
22
24
  - !ruby/object:Gem::Dependency
23
- name: term-ansicolor
24
- prerelease: false
25
25
  requirement: &id001 !ruby/object:Gem::Requirement
26
26
  none: false
27
27
  requirements:
@@ -34,10 +34,10 @@ dependencies:
34
34
  - 4
35
35
  version: 1.0.4
36
36
  type: :runtime
37
+ prerelease: false
38
+ name: term-ansicolor
37
39
  version_requirements: *id001
38
40
  - !ruby/object:Gem::Dependency
39
- name: yajl-ruby
40
- prerelease: false
41
41
  requirement: &id002 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
@@ -50,10 +50,10 @@ dependencies:
50
50
  - 6
51
51
  version: 0.7.6
52
52
  type: :runtime
53
+ prerelease: false
54
+ name: yajl-ruby
53
55
  version_requirements: *id002
54
56
  - !ruby/object:Gem::Dependency
55
- name: httparty
56
- prerelease: false
57
57
  requirement: &id003 !ruby/object:Gem::Requirement
58
58
  none: false
59
59
  requirements:
@@ -66,10 +66,10 @@ dependencies:
66
66
  - 2
67
67
  version: 0.5.2
68
68
  type: :runtime
69
+ prerelease: false
70
+ name: httparty
69
71
  version_requirements: *id003
70
72
  - !ruby/object:Gem::Dependency
71
- name: builder
72
- prerelease: false
73
73
  requirement: &id004 !ruby/object:Gem::Requirement
74
74
  none: false
75
75
  requirements:
@@ -82,27 +82,43 @@ dependencies:
82
82
  - 2
83
83
  version: 2.1.2
84
84
  type: :runtime
85
+ prerelease: false
86
+ name: builder
85
87
  version_requirements: *id004
86
88
  - !ruby/object:Gem::Dependency
87
- name: thor
88
- prerelease: false
89
89
  requirement: &id005 !ruby/object:Gem::Requirement
90
90
  none: false
91
91
  requirements:
92
92
  - - "="
93
93
  - !ruby/object:Gem::Version
94
- hash: 39
94
+ hash: 35
95
95
  segments:
96
96
  - 0
97
- - 13
98
- - 6
99
- version: 0.13.6
97
+ - 14
98
+ - 2
99
+ version: 0.14.2
100
100
  type: :runtime
101
+ prerelease: false
102
+ name: thor
101
103
  version_requirements: *id005
102
104
  - !ruby/object:Gem::Dependency
103
- name: hpricot
104
- prerelease: false
105
105
  requirement: &id006 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ hash: 7
111
+ segments:
112
+ - 3
113
+ - 0
114
+ - 0
115
+ version: 3.0.0
116
+ type: :runtime
117
+ prerelease: false
118
+ name: activesupport
119
+ version_requirements: *id006
120
+ - !ruby/object:Gem::Dependency
121
+ requirement: &id007 !ruby/object:Gem::Requirement
106
122
  none: false
107
123
  requirements:
108
124
  - - ">="
@@ -112,43 +128,60 @@ dependencies:
112
128
  - 0
113
129
  version: "0"
114
130
  type: :runtime
115
- version_requirements: *id006
116
- - !ruby/object:Gem::Dependency
117
- name: cucumber
118
131
  prerelease: false
119
- requirement: &id007 !ruby/object:Gem::Requirement
132
+ name: hpricot
133
+ version_requirements: *id007
134
+ - !ruby/object:Gem::Dependency
135
+ requirement: &id008 !ruby/object:Gem::Requirement
120
136
  none: false
121
137
  requirements:
122
138
  - - ~>
123
139
  - !ruby/object:Gem::Version
124
- hash: 5
140
+ hash: 49
125
141
  segments:
126
142
  - 0
143
+ - 8
127
144
  - 7
128
- - 3
129
- version: 0.7.3
145
+ version: 0.8.7
130
146
  type: :development
131
- version_requirements: *id007
132
- - !ruby/object:Gem::Dependency
133
- name: rspec
134
147
  prerelease: false
135
- requirement: &id008 !ruby/object:Gem::Requirement
148
+ name: rake
149
+ version_requirements: *id008
150
+ - !ruby/object:Gem::Dependency
151
+ requirement: &id009 !ruby/object:Gem::Requirement
136
152
  none: false
137
153
  requirements:
138
154
  - - ~>
139
155
  - !ruby/object:Gem::Version
140
- hash: 27
156
+ hash: 59
141
157
  segments:
142
- - 1
143
- - 3
144
158
  - 0
145
- version: 1.3.0
159
+ - 9
160
+ - 0
161
+ version: 0.9.0
146
162
  type: :development
147
- version_requirements: *id008
163
+ prerelease: false
164
+ name: cucumber
165
+ version_requirements: *id009
148
166
  - !ruby/object:Gem::Dependency
149
- name: json
167
+ requirement: &id010 !ruby/object:Gem::Requirement
168
+ none: false
169
+ requirements:
170
+ - - ~>
171
+ - !ruby/object:Gem::Version
172
+ hash: 31098209
173
+ segments:
174
+ - 2
175
+ - 0
176
+ - 0
177
+ - beta
178
+ version: 2.0.0.beta
179
+ type: :development
150
180
  prerelease: false
151
- requirement: &id009 !ruby/object:Gem::Requirement
181
+ name: rspec
182
+ version_requirements: *id010
183
+ - !ruby/object:Gem::Dependency
184
+ requirement: &id011 !ruby/object:Gem::Requirement
152
185
  none: false
153
186
  requirements:
154
187
  - - ~>
@@ -160,7 +193,23 @@ dependencies:
160
193
  - 0
161
194
  version: 1.4.0
162
195
  type: :development
163
- version_requirements: *id009
196
+ prerelease: false
197
+ name: json
198
+ version_requirements: *id011
199
+ - !ruby/object:Gem::Dependency
200
+ requirement: &id012 !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ hash: 3
206
+ segments:
207
+ - 0
208
+ version: "0"
209
+ type: :development
210
+ prerelease: false
211
+ name: awesome_print
212
+ version_requirements: *id012
164
213
  description: A suite of utilities for bringing continous integration to your projects (not the other way around) with hudson CI
165
214
  email:
166
215
  - cowboyd@thefrontside.net
@@ -176,6 +225,7 @@ files:
176
225
  - features/create_jobs.feature
177
226
  - features/development.feature
178
227
  - features/fixtures/projects/ruby/Rakefile
228
+ - features/listing_jobs.feature
179
229
  - features/managing_remote_servers.feature
180
230
  - features/server.feature
181
231
  - features/step_definitions/common_steps.rb
@@ -186,10 +236,14 @@ files:
186
236
  - features/support/env.rb
187
237
  - features/support/hooks.rb
188
238
  - features/support/matchers.rb
239
+ - Gemfile
240
+ - Gemfile.lock
189
241
  - hudson.gemspec
190
242
  - lib/hudson/api.rb
191
243
  - lib/hudson/cli/formatting.rb
192
244
  - lib/hudson/cli.rb
245
+ - lib/hudson/config.rb
246
+ - lib/hudson/hudson-cli.jar
193
247
  - lib/hudson/hudson.war
194
248
  - lib/hudson/job_config_builder.rb
195
249
  - lib/hudson/plugins/git.hpi
@@ -198,6 +252,7 @@ files:
198
252
  - lib/hudson/plugins/rake.hpi
199
253
  - lib/hudson/plugins/ruby.hpi
200
254
  - lib/hudson/project_scm.rb
255
+ - lib/hudson/remote.rb
201
256
  - lib/hudson.rb
202
257
  - Rakefile
203
258
  - README.md
@@ -229,12 +284,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
229
284
  required_rubygems_version: !ruby/object:Gem::Requirement
230
285
  none: false
231
286
  requirements:
232
- - - ">="
287
+ - - ">"
233
288
  - !ruby/object:Gem::Version
234
- hash: 3
289
+ hash: 25
235
290
  segments:
236
- - 0
237
- version: "0"
291
+ - 1
292
+ - 3
293
+ - 1
294
+ version: 1.3.1
238
295
  requirements: []
239
296
 
240
297
  rubyforge_project: hudson