volley 0.1.2 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +26 -0
- data/bin/volley +17 -13
- data/conf/common.volleyfile +35 -4
- data/lib/volley/dsl/action.rb +1 -1
- data/lib/volley/dsl/file.rb +2 -0
- data/lib/volley/dsl/plan.rb +3 -1
- data/lib/volley/exceptions.rb +4 -0
- data/lib/volley/log.rb +6 -0
- data/lib/volley/publisher/amazons3.rb +31 -16
- data/lib/volley/publisher/base.rb +33 -6
- data/lib/volley/publisher/local.rb +15 -1
- data/lib/volley/version.rb +1 -1
- data/lib/volley.rb +1 -1
- data/spec/publisher_spec.rb +1 -1
- metadata +5 -3
data/CHANGELOG.md
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## v0.1.5:
|
4
|
+
* action#stop should delegate to plan#stop
|
5
|
+
|
6
|
+
## v0.1.4:
|
7
|
+
* fix problem with expand path throwing errors when HOME environment variable is not set
|
8
|
+
* fix problem with volley:meta when the meta file doesn't exist
|
9
|
+
* add -q --quiet option to CLI (bumps log level to warn)
|
10
|
+
* add volley:published plan, show all published artifacts (used by jenkins for selecting version to deploy)
|
11
|
+
* add version_data method to publisher, primarily to have access to modified time for sorting
|
12
|
+
* bug fixes, meta and published plan work
|
13
|
+
|
14
|
+
## v0.1.3:
|
15
|
+
* bug fixes, meta and published plan work
|
16
|
+
|
17
|
+
## v0.1.2:
|
18
|
+
* add code to generate changelog
|
19
|
+
* attempting to publish a duplicate artifact shouldn't throw an error
|
20
|
+
* properly support force=true argument
|
21
|
+
* allow for stopping plan processing with plan#stop
|
22
|
+
|
23
|
+
## v0.1.1:
|
24
|
+
* add the ability to daemonize the process using Daemons gem.
|
25
|
+
* add Volley::Log#reset to forget previous log configuration in parent, before forking
|
26
|
+
|
data/bin/volley
CHANGED
@@ -3,15 +3,14 @@
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'docopt'
|
5
5
|
require 'volley'
|
6
|
-
require 'awesome_print'
|
7
6
|
require 'daemons'
|
8
7
|
|
9
8
|
DOC = <<-DOC
|
10
9
|
Usage: volley [options] <plan> <descriptor> [argument]...
|
11
10
|
|
12
11
|
<plan>
|
13
|
-
The plan to run.
|
14
|
-
reserved
|
12
|
+
The plan to run. This can be just the plan name or the project:plan.
|
13
|
+
(will check in the reserved volley project for plan first)
|
15
14
|
|
16
15
|
<descriptor>
|
17
16
|
A descriptor should conform to the following format:
|
@@ -31,7 +30,8 @@ Usage: volley [options] <plan> <descriptor> [argument]...
|
|
31
30
|
Options:
|
32
31
|
-h --help show this help message and exit
|
33
32
|
--version show version and exit
|
34
|
-
-d --debug
|
33
|
+
-d --debug change log level to debug
|
34
|
+
-q --quiet change log level to warn (generally this means no output)
|
35
35
|
-c --config FILE load additional Volleyfile [default: ~/.Volleyfile]
|
36
36
|
-p --primary FILE load primary Volleyfile [default: ./Volleyfile]
|
37
37
|
-F --force force operations (redeploy version, republish artifact)
|
@@ -50,6 +50,7 @@ module Volley
|
|
50
50
|
STDOUT.sync = true
|
51
51
|
options = Docopt(DOC, Volley::Version::STRING)
|
52
52
|
debug = options[:debug]
|
53
|
+
quiet = options[:quiet]
|
53
54
|
config = options[:config]
|
54
55
|
primary = options[:primary]
|
55
56
|
fork = options[:fork]
|
@@ -63,9 +64,15 @@ module Volley
|
|
63
64
|
Volley::Dsl::VolleyFile.load(config, :optional => true)
|
64
65
|
Volley::Dsl::VolleyFile.load(primary, :primary => true) if File.file?(primary)
|
65
66
|
|
66
|
-
Volley::Log.add(level.to_sym, log)
|
67
|
-
Volley::Log.console_debug if debug
|
68
67
|
Volley.config.debug = debug
|
68
|
+
Volley.config.quiet = quiet
|
69
|
+
|
70
|
+
Volley::Log.add(level.to_sym, log)
|
71
|
+
if debug
|
72
|
+
Volley::Log.console_debug
|
73
|
+
elsif quiet
|
74
|
+
Volley::Log.console_quiet
|
75
|
+
end
|
69
76
|
|
70
77
|
kvs = argv.select { |e| e.match(/(\w+)\=(\w+)/) }
|
71
78
|
pos = argv.reject { |e| e.match(/(\w+)\=(\w+)/) }
|
@@ -74,8 +81,9 @@ module Volley
|
|
74
81
|
desc = pos.shift
|
75
82
|
|
76
83
|
raise "must specify plan" unless plan
|
84
|
+
if plan =~ /\:/
|
77
85
|
|
78
|
-
|
86
|
+
elsif Volley::Dsl.project(:volley).plan?(plan)
|
79
87
|
# the plan is reserved
|
80
88
|
plan = "volley:#{plan}"
|
81
89
|
else
|
@@ -116,14 +124,10 @@ module Volley
|
|
116
124
|
rescue Interrupt
|
117
125
|
Volley::Log.info "interrupted"
|
118
126
|
rescue SystemExit
|
119
|
-
Volley::Log.
|
127
|
+
Volley::Log.debug "exited"
|
120
128
|
rescue => e
|
121
129
|
Volley::Log.error "error: #{e.message} at #{e.backtrace.first}"
|
122
|
-
|
123
|
-
Volley::Log.error e
|
124
|
-
#else
|
125
|
-
# Volley::Log.debug e
|
126
|
-
#end
|
130
|
+
Volley::Log.debug e
|
127
131
|
end
|
128
132
|
end
|
129
133
|
end
|
data/conf/common.volleyfile
CHANGED
@@ -8,6 +8,7 @@ project :volley do
|
|
8
8
|
puts "created: #{dest}"
|
9
9
|
end
|
10
10
|
end
|
11
|
+
|
11
12
|
plan :list, :remote => false do
|
12
13
|
default do
|
13
14
|
Volley::Dsl::Project.projects.each do |p, project|
|
@@ -18,15 +19,17 @@ project :volley do
|
|
18
19
|
end
|
19
20
|
end
|
20
21
|
end
|
22
|
+
|
21
23
|
plan :latest do
|
22
24
|
default do
|
23
|
-
(project,branch,_) = args.descriptor.get
|
25
|
+
(project, branch, _) = args.descriptor.get
|
24
26
|
raise "project and branch must be specified" unless project && branch
|
25
27
|
|
26
28
|
pub = Volley::Dsl.publisher
|
27
29
|
puts pub.latest(project, branch)
|
28
30
|
end
|
29
31
|
end
|
32
|
+
|
30
33
|
plan :versions, :remote => false do
|
31
34
|
argument :all, :convert => :boolean, :default => false
|
32
35
|
argument :output, :default => "list", :convert => :to_sym, :choices => ["json", "xml", "list"]
|
@@ -37,7 +40,7 @@ project :volley do
|
|
37
40
|
pub = Volley::Dsl.publisher
|
38
41
|
data = []
|
39
42
|
if args.all
|
40
|
-
data = pub.all.keys.reject {|e| e =~ /latest$/}
|
43
|
+
data = pub.all.keys.reject { |e| e =~ /latest$/ }
|
41
44
|
data.each { |k, v| puts "%2s %s" % [v, k] }
|
42
45
|
else
|
43
46
|
if project
|
@@ -65,10 +68,38 @@ project :volley do
|
|
65
68
|
end
|
66
69
|
end
|
67
70
|
end
|
71
|
+
|
68
72
|
plan :meta, :remote => false do
|
69
73
|
default do
|
70
|
-
Volley.meta.projects
|
71
|
-
|
74
|
+
list = Volley.meta.projects
|
75
|
+
unless list && list.count > 0
|
76
|
+
Volley::Log.info "no projects found"
|
77
|
+
stop
|
78
|
+
end
|
79
|
+
|
80
|
+
project = args.descriptor.get.first
|
81
|
+
if project
|
82
|
+
project = args.descriptor.get.first
|
83
|
+
Volley::Log.warn "#{list[project.to_sym]}"
|
84
|
+
else
|
85
|
+
list.each do |k, v|
|
86
|
+
Volley::Log.warn "#{k} => #{v}"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
plan :published, :remote => false do
|
93
|
+
default do
|
94
|
+
pub = Volley::Dsl.publisher
|
95
|
+
|
96
|
+
unless pub
|
97
|
+
Volley::Log.error "publisher must be configured"
|
98
|
+
stop
|
99
|
+
end
|
100
|
+
|
101
|
+
pub.list do |p, b, v, data|
|
102
|
+
Volley::Log.warn "#{p}@#{b}:#{v}"
|
72
103
|
end
|
73
104
|
end
|
74
105
|
end
|
data/lib/volley/dsl/action.rb
CHANGED
@@ -21,7 +21,7 @@ module Volley
|
|
21
21
|
self.instance_eval &@block if @block
|
22
22
|
end
|
23
23
|
|
24
|
-
delegate :project, :args, :files, :file, :attributes, :log, :arguments, :argv, :branch, :version, :action, :volley,
|
24
|
+
delegate :project, :args, :files, :file, :attributes, :log, :arguments, :argv, :branch, :version, :action, :volley, :stop,
|
25
25
|
:to => :plan
|
26
26
|
|
27
27
|
def command(cmd)
|
data/lib/volley/dsl/file.rb
CHANGED
data/lib/volley/dsl/plan.rb
CHANGED
@@ -61,9 +61,10 @@ module Volley
|
|
61
61
|
|
62
62
|
begin
|
63
63
|
run_actions
|
64
|
+
rescue ExecutionStopped => e
|
65
|
+
Volley::Log.debug "stopping execution at #{e.backtrace.first}"
|
64
66
|
rescue => e
|
65
67
|
puts "plan#call error: #{e.message} at #{e.backtrace.first}"
|
66
|
-
ap self
|
67
68
|
raise e
|
68
69
|
end
|
69
70
|
[branch, version].join(":")
|
@@ -94,6 +95,7 @@ module Volley
|
|
94
95
|
|
95
96
|
def stop
|
96
97
|
@stopped = true
|
98
|
+
raise ExecutionStopped, "stopped"
|
97
99
|
end
|
98
100
|
|
99
101
|
def stopped?
|
data/lib/volley/log.rb
CHANGED
@@ -32,6 +32,12 @@ module Volley
|
|
32
32
|
@loggers["STDERR"] = Yell.new(STDERR, :level => [:error, :fatal], :format => Yell::NoFormat)
|
33
33
|
end
|
34
34
|
|
35
|
+
def console_quiet
|
36
|
+
console_disable
|
37
|
+
@loggers["STDOUT"] = Yell.new(STDOUT, :level => [:warn], :format => Yell::NoFormat)
|
38
|
+
@loggers["STDERR"] = Yell.new(STDERR, :level => [:error, :fatal], :format => Yell::NoFormat)
|
39
|
+
end
|
40
|
+
|
35
41
|
%w{debug info warn error fatal}.each do |method_name|
|
36
42
|
class_eval(<<-METHOD_DEFN, __FILE__, __LINE__)
|
37
43
|
def #{method_name}(msg=nil, &block)
|
@@ -33,17 +33,31 @@ module Volley
|
|
33
33
|
br = branch.to_s
|
34
34
|
r = files[:desc][pr][br].keys || [] rescue []
|
35
35
|
Volley::Log.info "could not find #{pr}@#{br}" unless r.count > 0
|
36
|
-
r
|
36
|
+
r.reject { |e| e == "latest" || e == "" }
|
37
37
|
rescue => e
|
38
38
|
Volley::Log.warn "error getting version list from publisher: #{e.message}"
|
39
39
|
[]
|
40
40
|
end
|
41
41
|
|
42
|
+
def version_data(project, branch, version)
|
43
|
+
pr = project.to_s
|
44
|
+
br = branch.to_s
|
45
|
+
vr = version.to_s
|
46
|
+
list = files[:desc][pr][br][vr]
|
47
|
+
files = contents(project, branch, version)
|
48
|
+
time = list.map { |e| e.last_modified }.sort.uniq.last
|
49
|
+
{
|
50
|
+
:contents => files,
|
51
|
+
:timestamp => time,
|
52
|
+
:latest => (latest_version(project, branch) == vr)
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
42
56
|
def contents(project, branch, version)
|
43
57
|
pr = project.to_s
|
44
58
|
br = branch.to_s
|
45
59
|
vr = version.to_s
|
46
|
-
r = files[:desc][pr][br][vr].map {|e| e.gsub("#{pr}/#{br}/#{vr}/","")} || [] rescue []
|
60
|
+
r = files[:desc][pr][br][vr].map { |e| e.key.gsub("#{pr}/#{br}/#{vr}/", "") } || [] rescue []
|
47
61
|
Volley::Log.info "could not find #{pr}@#{br}:#{vr}" unless r.count > 0
|
48
62
|
r
|
49
63
|
rescue => e
|
@@ -123,21 +137,22 @@ module Volley
|
|
123
137
|
end
|
124
138
|
|
125
139
|
def files
|
126
|
-
|
127
|
-
|
128
|
-
(
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
140
|
+
@files ||= begin
|
141
|
+
hash = { :desc => { }, :all => { }, :latest => { } }
|
142
|
+
@connection.directories.get(@bucket).files.each do |e|
|
143
|
+
(pr, br, vr) = e.key.split(/\//)
|
144
|
+
hash[:desc][pr] ||= { }
|
145
|
+
hash[:desc][pr][br] ||= { }
|
146
|
+
hash[:desc][pr][br][vr] ||= []
|
147
|
+
hash[:desc][pr][br][vr] << e
|
148
|
+
hash[:all] ||= { }
|
149
|
+
hash[:latest] ||= { }
|
150
|
+
v = "#{pr}/#{br}/#{vr}"
|
151
|
+
#hash[:latest]["#{pr}/#{br}"] ||= latest(pr, br)
|
152
|
+
hash[:all][v] = hash["latest"] == v
|
153
|
+
end
|
154
|
+
hash
|
138
155
|
end
|
139
|
-
#ap hash
|
140
|
-
hash
|
141
156
|
end
|
142
157
|
end
|
143
158
|
end
|
@@ -12,12 +12,40 @@ module Volley
|
|
12
12
|
@encrypted = optional(:encrypted, false)
|
13
13
|
@local = optional(:local, Volley.config.directory)
|
14
14
|
@loglevel = @debug ? :info : :debug
|
15
|
-
@latest = {}
|
15
|
+
@latest = { }
|
16
16
|
@force = false
|
17
17
|
|
18
18
|
load_configuration
|
19
19
|
end
|
20
20
|
|
21
|
+
def list(&block)
|
22
|
+
hash = { }
|
23
|
+
unsorted = { }
|
24
|
+
plist = projects
|
25
|
+
plist.each do |p|
|
26
|
+
hash[p] = { }
|
27
|
+
blist = branches(p)
|
28
|
+
blist.each do |b|
|
29
|
+
hash[p][b] = { }
|
30
|
+
vlist = versions(p, b)
|
31
|
+
vlist.each do |v|
|
32
|
+
d = version_data(p, b, v)
|
33
|
+
hash[p][b][v] = d
|
34
|
+
unsorted["#{p}@#{b}:#{v}"] = d if d[:contents] && d[:contents].count > 0
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
sorted = unsorted.sort_by { |k, v| v[:timestamp] }.reverse
|
40
|
+
sorted.each do |k, v|
|
41
|
+
d = Volley::Descriptor.new(k)
|
42
|
+
next unless d
|
43
|
+
yield d.project, d.branch, d.version, v
|
44
|
+
end
|
45
|
+
|
46
|
+
hash
|
47
|
+
end
|
48
|
+
|
21
49
|
def projects
|
22
50
|
raise "not implemented"
|
23
51
|
end
|
@@ -43,7 +71,7 @@ module Volley
|
|
43
71
|
end
|
44
72
|
|
45
73
|
def latest(project, branch)
|
46
|
-
@latest["#{project}/#{branch}"] ||= pull_file(dir(project,branch), "latest")
|
74
|
+
@latest["#{project}/#{branch}"] ||= pull_file(dir(project, branch), "latest")
|
47
75
|
end
|
48
76
|
|
49
77
|
def latest_version(project, branch)
|
@@ -51,10 +79,10 @@ module Volley
|
|
51
79
|
end
|
52
80
|
|
53
81
|
def volleyfile(project, branch, version="latest")
|
54
|
-
d
|
82
|
+
d = dir(project, branch, version)
|
55
83
|
contents = pull_file(d, "Volleyfile")
|
56
84
|
|
57
|
-
dest
|
85
|
+
dest = "#@local/Volleyfile-#{Time.now.to_i}-#{$$}"
|
58
86
|
raise "File #{dest} already exists" if File.exists?(dest)
|
59
87
|
|
60
88
|
log "saving Volleyfile: #{dest}"
|
@@ -84,7 +112,7 @@ module Volley
|
|
84
112
|
end
|
85
113
|
|
86
114
|
def pull(project, branch, version="latest")
|
87
|
-
dir
|
115
|
+
dir = dir(project, branch, version)
|
88
116
|
file = remote_file(branch, version)
|
89
117
|
|
90
118
|
log "vv #{me}#pull"
|
@@ -122,7 +150,6 @@ module Volley
|
|
122
150
|
end
|
123
151
|
|
124
152
|
|
125
|
-
|
126
153
|
def push_file(dir, name, contents)
|
127
154
|
raise "not implemented"
|
128
155
|
end
|
@@ -18,7 +18,7 @@ module Volley
|
|
18
18
|
def versions(pr, br)
|
19
19
|
Dir["#@directory/#{pr}/#{br}/*"].map do |e|
|
20
20
|
e.gsub(/#@directory\/#{pr}\/#{br}\//,"")
|
21
|
-
end
|
21
|
+
end.reject {|e| e == "latest" || e == ""}
|
22
22
|
end
|
23
23
|
|
24
24
|
def exists?(project, branch, version)
|
@@ -33,6 +33,20 @@ module Volley
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
+
def version_data(project, branch, version)
|
37
|
+
pr = project.to_s
|
38
|
+
br = branch.to_s
|
39
|
+
vr = version.to_s
|
40
|
+
list = Dir["#@directory/#{project}/#{branch}/#{version}/*"]
|
41
|
+
files = contents(project, branch, version)
|
42
|
+
time = list.map { |e| File.mtime(e) }.sort.uniq.last
|
43
|
+
{
|
44
|
+
:contents => files,
|
45
|
+
:timestamp => time,
|
46
|
+
:latest => (latest_version(project, branch) == vr)
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
36
50
|
def delete_project(project)
|
37
51
|
FileUtils.rm_rf("#@directory/#{project}")
|
38
52
|
true
|
data/lib/volley/version.rb
CHANGED
data/lib/volley.rb
CHANGED
data/spec/publisher_spec.rb
CHANGED
@@ -45,7 +45,7 @@ shared_examples_for Volley::Publisher::Base do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
it "should be able to tell me the list of versions" do
|
48
|
-
expect(@pub.versions("spec", "trunk")).to match_array(%w{1 2
|
48
|
+
expect(@pub.versions("spec", "trunk")).to match_array(%w{1 2})
|
49
49
|
end
|
50
50
|
|
51
51
|
it "should be able to tell me the list of files" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: volley
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: clamp
|
@@ -133,6 +133,7 @@ extra_rdoc_files: []
|
|
133
133
|
files:
|
134
134
|
- .gitignore
|
135
135
|
- .rspec
|
136
|
+
- CHANGELOG.md
|
136
137
|
- Gemfile
|
137
138
|
- LICENSE
|
138
139
|
- README.md
|
@@ -157,6 +158,7 @@ files:
|
|
157
158
|
- lib/volley/dsl/push_action.rb
|
158
159
|
- lib/volley/dsl/stage.rb
|
159
160
|
- lib/volley/dsl/volley_action.rb
|
161
|
+
- lib/volley/exceptions.rb
|
160
162
|
- lib/volley/log.rb
|
161
163
|
- lib/volley/meta.rb
|
162
164
|
- lib/volley/publisher/amazons3.rb
|
@@ -203,7 +205,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
203
205
|
version: '0'
|
204
206
|
requirements: []
|
205
207
|
rubyforge_project:
|
206
|
-
rubygems_version: 1.8.
|
208
|
+
rubygems_version: 1.8.24
|
207
209
|
signing_key:
|
208
210
|
specification_version: 3
|
209
211
|
summary: PubSub Deployment tool
|