volley 0.1.0.alpha4 → 0.1.0.alpha5
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/.gitignore +3 -1
- data/.rspec +1 -0
- data/Gemfile +4 -1
- data/Rakefile +34 -0
- data/bin/volley +88 -40
- data/conf/common.volleyfile +12 -29
- data/features/publisher.feature +45 -0
- data/features/step_definitions/common_steps.rb +9 -0
- data/features/step_definitions/publisher_steps.rb +92 -0
- data/features/support/env.rb +19 -0
- data/init/Volleyfile +1 -104
- data/lib/volley/descriptor.rb +28 -0
- data/lib/volley/dsl/action.rb +31 -0
- data/lib/volley/dsl/argument.rb +96 -0
- data/lib/volley/dsl/file.rb +70 -0
- data/lib/volley/dsl/plan.rb +110 -235
- data/lib/volley/dsl/project.rb +10 -2
- data/lib/volley/dsl/pull_action.rb +50 -0
- data/lib/volley/dsl/push_action.rb +101 -0
- data/lib/volley/dsl/stage.rb +40 -0
- data/lib/volley/dsl.rb +7 -0
- data/lib/volley/log.rb +22 -8
- data/lib/volley/meta.rb +24 -0
- data/lib/volley/publisher/amazons3.rb +67 -66
- data/lib/volley/publisher/base.rb +81 -42
- data/lib/volley/publisher/exceptions.rb +7 -0
- data/lib/volley/publisher/local.rb +41 -27
- data/lib/volley/scm/base.rb +10 -0
- data/lib/volley.rb +38 -12
- data/spec/descriptor_spec.rb +39 -0
- data/spec/dsl_plan_spec.rb +103 -0
- data/spec/dsl_project_spec.rb +36 -0
- data/spec/dsl_volleyfile_spec.rb +21 -0
- data/spec/meta_spec.rb +26 -0
- data/spec/publisher_spec.rb +92 -0
- data/test/dsl/amazons3_publisher.volleyfile +6 -0
- data/test/dsl/local_publisher.volleyfile +4 -0
- data/test/dsl/log_console.volleyfile +2 -0
- data/test/dsl/log_file.volleyfile +2 -0
- data/test/dsl/simple.volleyfile +17 -0
- data/test/meta.yml +3 -0
- data/test/project/Rakefile +13 -0
- data/test/project/Volleyfile +18 -0
- data/test/trunk-1.tgz +0 -0
- data/volley.gemspec +2 -1
- metadata +67 -5
- data/lib/volley/config.rb +0 -8
- data/lib/volley/volley_file.rb +0 -45
data/.gitignore
CHANGED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--format s -c
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,2 +1,36 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
2
|
require "bundler/gem_tasks"
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
require 'cucumber/rake/task'
|
5
|
+
|
6
|
+
$:.unshift File.expand_path("lib/")
|
7
|
+
require 'volley'
|
8
|
+
|
9
|
+
desc 'Default: run specs.'
|
10
|
+
task :default => :test
|
11
|
+
|
12
|
+
desc "Run specs"
|
13
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
14
|
+
t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
|
15
|
+
# Put spec opts in a file named .rspec in root
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Run Cucumber"
|
19
|
+
Cucumber::Rake::Task.new do |t|
|
20
|
+
t.cucumber_opts = %w{--format pretty --no-snippets}
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Run RSpec and Cucumber tests"
|
24
|
+
task :test do
|
25
|
+
begin
|
26
|
+
Rake::Task["spec"].invoke
|
27
|
+
rescue => e
|
28
|
+
puts "#{e.message} at #{e.backtrace.first}"
|
29
|
+
end
|
30
|
+
|
31
|
+
begin
|
32
|
+
Rake::Task["cucumber"].invoke
|
33
|
+
rescue => e
|
34
|
+
puts "#{e.message} at #{e.backtrace.first}"
|
35
|
+
end
|
36
|
+
end
|
data/bin/volley
CHANGED
@@ -1,55 +1,103 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
|
+
require 'docopt'
|
4
5
|
require 'volley'
|
5
|
-
require '
|
6
|
+
require 'awesome_print'
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
DOC = <<-DOC
|
9
|
+
Usage: volley [options] <plan> <descriptor> [argument]...
|
10
|
+
|
11
|
+
<plan>
|
12
|
+
The plan to run.
|
13
|
+
reserved plan names: [versions, latest, list]
|
14
|
+
|
15
|
+
<descriptor>
|
16
|
+
A descriptor should conform to the following format:
|
17
|
+
<project>[@<branch>[:<version>]]
|
18
|
+
|
19
|
+
project: the project name.
|
20
|
+
branch: the branch name.
|
21
|
+
Defaults to the branch currently in use,
|
22
|
+
must be specified for remote mode.
|
23
|
+
version: the version (revision)
|
24
|
+
Defaults to the current revision
|
25
|
+
In remote mode, defaults to "latest"
|
26
|
+
|
27
|
+
<argument>
|
28
|
+
A list of key=value pairs
|
29
|
+
|
30
|
+
Options:
|
31
|
+
-h --help show this help message and exit
|
32
|
+
--version show version and exit
|
33
|
+
-d --debug show debug output, change log level to debug
|
34
|
+
-c --config FILE load additional Volleyfile [default: ~/.Volleyfile]
|
35
|
+
-p --primary FILE load primary Volleyfile [default: ./Volleyfile]
|
36
|
+
|
37
|
+
-f --fork fork process into background and exit
|
38
|
+
-l --log LOG log file [default: /opt/volley/volley.log]
|
39
|
+
-L --level LEVEL log level [default: debug]
|
40
|
+
DOC
|
9
41
|
|
10
42
|
module Volley
|
11
|
-
class Command
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
43
|
+
class Command
|
44
|
+
def initialize
|
45
|
+
end
|
46
|
+
|
47
|
+
def run(argv)
|
48
|
+
STDOUT.sync = true
|
49
|
+
options = Docopt(DOC, Volley::Version::STRING)
|
50
|
+
debug = options[:debug]
|
51
|
+
config = options[:config]
|
52
|
+
primary = options[:primary]
|
53
|
+
fork = options[:fork]
|
54
|
+
log = options[:log]
|
55
|
+
level = options[:level]
|
56
|
+
|
57
|
+
Volley::Dsl::VolleyFile.init
|
58
|
+
Volley::Dsl::VolleyFile.load(config, :optional => true)
|
59
|
+
Volley::Dsl::VolleyFile.load(primary, :primary => true) if File.file?(primary)
|
60
|
+
Volley::Log.add(level.to_sym, log)
|
61
|
+
Volley::Log.console_debug if debug
|
62
|
+
Volley.config.debug = debug
|
63
|
+
|
64
|
+
kvs = argv.select { |e| e.match(/(\w+)\=(\w+)/) }
|
65
|
+
pos = argv.reject { |e| e.match(/(\w+)\=(\w+)/) }
|
66
|
+
|
67
|
+
plan = pos.shift
|
68
|
+
desc = pos.shift
|
69
|
+
|
70
|
+
raise "must specify plan" unless plan
|
71
|
+
|
72
|
+
if Volley::Dsl.project(:volley).plan?(plan)
|
73
|
+
# the plan is reserved
|
74
|
+
plan = "volley:#{plan}"
|
75
|
+
else
|
76
|
+
# the plan isn't reserved
|
77
|
+
raise "must specify descriptor" unless desc
|
78
|
+
(project, branch, version) = Volley::Descriptor.new(desc).get
|
79
|
+
plan = "#{project}:#{plan}"
|
38
80
|
end
|
39
81
|
|
40
|
-
|
41
|
-
|
82
|
+
if debug
|
83
|
+
Volley::Log.debug "## OPTIONS ##"
|
84
|
+
Volley::Log.debug "plan: #{plan}"
|
85
|
+
Volley::Log.debug "descriptor: #{desc}"
|
86
|
+
Volley::Log.debug "positional: #{pos.join(",")}"
|
87
|
+
Volley::Log.debug "key:value: #{kvs.join(",")}"
|
88
|
+
end
|
42
89
|
|
43
|
-
Volley.
|
44
|
-
|
45
|
-
Volley::Log.warn "Cancelled..."
|
90
|
+
Volley::Log.info "processing '#{plan}' plan for '#{desc}'"
|
91
|
+
Volley.process(:plan => plan, :descriptor => desc, :args => kvs)
|
46
92
|
rescue => e
|
47
|
-
Volley::Log.error "
|
48
|
-
|
49
|
-
|
50
|
-
|
93
|
+
Volley::Log.error "exception: #{e.message} at #{e.backtrace.first}"
|
94
|
+
if debug
|
95
|
+
Volley::Log.error e
|
96
|
+
else
|
97
|
+
Volley::Log.debug e
|
98
|
+
end
|
51
99
|
end
|
52
100
|
end
|
53
101
|
end
|
54
102
|
|
55
|
-
Volley::Command.run
|
103
|
+
Volley::Command.new.run(ARGV)
|
data/conf/common.volleyfile
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
project :volley do
|
2
|
-
|
2
|
+
scm :base
|
3
|
+
plan :init, :remote => false do
|
3
4
|
default do
|
4
|
-
file = File.expand_path("
|
5
|
+
file = File.expand_path("../../init/Volleyfile", __FILE__)
|
5
6
|
dest = "#{Dir.pwd}/Volleyfile"
|
6
7
|
FileUtils.copy(file, dest)
|
7
8
|
puts "created: #{dest}"
|
8
9
|
end
|
9
10
|
end
|
10
|
-
plan :list do
|
11
|
+
plan :list, :remote => false do
|
11
12
|
default do
|
12
13
|
Volley::Dsl::Project.projects.each do |p, project|
|
13
14
|
Volley::Log.info "project: #{p}"
|
@@ -18,40 +19,24 @@ project :volley do
|
|
18
19
|
end
|
19
20
|
end
|
20
21
|
plan :latest do
|
21
|
-
argument :project #, :required => true
|
22
|
-
argument :branch #, :required => true
|
23
22
|
default do
|
24
|
-
|
25
|
-
branch
|
26
|
-
|
27
|
-
if project.nil? && rawargs
|
28
|
-
first = rawargs.first
|
29
|
-
(p, b) = first.split(/\//) if first
|
30
|
-
if p
|
31
|
-
project = p
|
32
|
-
branch = b
|
33
|
-
end
|
34
|
-
end
|
23
|
+
ap args
|
24
|
+
(project,branch,version) = args.descriptor.get
|
35
25
|
raise "project and branch must be specified" unless project && branch
|
36
26
|
|
37
27
|
pub = Volley::Dsl.publisher
|
38
28
|
puts pub.latest(project, branch)
|
39
29
|
end
|
40
30
|
end
|
41
|
-
plan :versions do
|
42
|
-
argument :project
|
43
|
-
argument :branch
|
44
|
-
argument :version
|
31
|
+
plan :versions, :remote => false do
|
45
32
|
argument :all, :convert => :boolean, :default => false
|
46
33
|
argument :output, :default => "list", :convert => :to_sym, :choices => ["json", "xml", "list"]
|
47
34
|
|
48
35
|
default do
|
49
|
-
project = args.
|
50
|
-
branch = args.branch
|
51
|
-
version = args.version
|
36
|
+
(project, branch, version) = args.descriptor.get
|
52
37
|
|
53
|
-
if project.nil? &&
|
54
|
-
first =
|
38
|
+
if project.nil? && argv.count
|
39
|
+
first = argv.first
|
55
40
|
(p, b, v) = first.split(/\//) if first
|
56
41
|
if p
|
57
42
|
project = p
|
@@ -68,7 +53,7 @@ project :volley do
|
|
68
53
|
else
|
69
54
|
if project
|
70
55
|
if branch
|
71
|
-
if version
|
56
|
+
if version != "latest"
|
72
57
|
data = pub.contents(project, branch, version)
|
73
58
|
else
|
74
59
|
data = pub.versions(project, branch)
|
@@ -92,11 +77,9 @@ project :volley do
|
|
92
77
|
end
|
93
78
|
end
|
94
79
|
plan :remote do
|
95
|
-
argument :version, :required => true
|
96
|
-
|
97
80
|
default do
|
98
81
|
pub = Volley::Dsl.publisher
|
99
|
-
(pr, br, vr) = args.
|
82
|
+
(pr, br, vr) = args.descriptor.get
|
100
83
|
vr ||= 'latest'
|
101
84
|
vf = pub.volleyfile(:project => pr, :branch => br, :version => vr)
|
102
85
|
load vf
|
@@ -0,0 +1,45 @@
|
|
1
|
+
|
2
|
+
# Built these tests as a starting point
|
3
|
+
# duplicates some of the tests in spec/publisher_spec
|
4
|
+
Feature: Publisher
|
5
|
+
In order to store artifacts
|
6
|
+
I want to be able to manage files with a publisher
|
7
|
+
|
8
|
+
Background:
|
9
|
+
Given I have a publisher with an empty repository
|
10
|
+
|
11
|
+
Scenario: Empty publisher
|
12
|
+
When I request a list of projects from the publisher
|
13
|
+
Then I should see an empty list
|
14
|
+
|
15
|
+
Scenario: Publish multiple artifacts
|
16
|
+
When I publish the artifact test/trunk/1
|
17
|
+
Then there should be 1 projects in the publisher
|
18
|
+
And the test project should have 1 branches
|
19
|
+
When I publish the artifact test/staging/2
|
20
|
+
Then there should be 1 projects in the publisher
|
21
|
+
And the test project should have 2 branches
|
22
|
+
|
23
|
+
Scenario: Publish and retrieve artifact
|
24
|
+
When I publish the artifact test/trunk/1
|
25
|
+
Then there should be 1 projects in the publisher
|
26
|
+
And the test project should have 1 branches
|
27
|
+
When I deploy the artifact test/trunk/1
|
28
|
+
Then I should not receive an exception
|
29
|
+
|
30
|
+
Scenario: Latest artifacts
|
31
|
+
Given I have a populated repository
|
32
|
+
Then the test project should have 3 branches
|
33
|
+
And the latest of test/trunk should be 7
|
34
|
+
And the latest of test/staging should be 5
|
35
|
+
|
36
|
+
Scenario: Duplicate Artifact
|
37
|
+
Given I have a populated repository
|
38
|
+
When I publish a duplicate artifact test/staging/12
|
39
|
+
Then I should receive an exception
|
40
|
+
|
41
|
+
# TODO: make this work
|
42
|
+
# Scenario: Duplicate Artifact force
|
43
|
+
# Given I have a populated repository
|
44
|
+
# When I force publish a duplicate artifact test/staging/12
|
45
|
+
# Then I should not receive an exception
|
@@ -0,0 +1,92 @@
|
|
1
|
+
def publish(desc)
|
2
|
+
pwd = Dir.pwd
|
3
|
+
Dir.chdir("test/project")
|
4
|
+
Volley::Dsl::VolleyFile.load("Volleyfile")
|
5
|
+
Volley.process(:plan => "publish", :descriptor => desc)
|
6
|
+
Dir.chdir(pwd)
|
7
|
+
end
|
8
|
+
|
9
|
+
def deploy(desc)
|
10
|
+
pwd = Dir.pwd
|
11
|
+
Volley.process(:plan => "deploy", :descriptor => desc)
|
12
|
+
Dir.chdir(pwd)
|
13
|
+
end
|
14
|
+
|
15
|
+
Given /^I have a publisher with an empty repository$/ do
|
16
|
+
@root ||= Volley.config.project_root
|
17
|
+
%w{local remote}.each { |d| FileUtils.rm_rf("#@root/test/publisher/#{d}") }
|
18
|
+
%w{local remote}.each { |d| FileUtils.mkdir_p("#@root/test/publisher/#{d}") }
|
19
|
+
Volley::Dsl::VolleyFile.load("#@root/test/dsl/local_publisher.volleyfile")
|
20
|
+
@pub = Volley::Dsl.publisher
|
21
|
+
end
|
22
|
+
|
23
|
+
Given /^I have a populated repository$/ do
|
24
|
+
steps %Q{
|
25
|
+
When I publish the artifact test/trunk/1
|
26
|
+
And I publish the artifact test/staging/2
|
27
|
+
And I publish the artifact test/trunk/3
|
28
|
+
And I publish the artifact test/master/4
|
29
|
+
And I publish the artifact test/staging/5
|
30
|
+
And I publish the artifact test/trunk/7
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
When /^I request a list of projects from the publisher$/ do
|
35
|
+
@emptylist = @pub.projects
|
36
|
+
end
|
37
|
+
|
38
|
+
Then /^I should see an empty list$/ do
|
39
|
+
fail unless @emptylist.count == 0
|
40
|
+
end
|
41
|
+
|
42
|
+
When /^I publish the artifact (.*)$/ do |desc|
|
43
|
+
publish(desc)
|
44
|
+
end
|
45
|
+
|
46
|
+
When /^I deploy the artifact (.*)$/ do |desc|
|
47
|
+
begin
|
48
|
+
deploy(desc)
|
49
|
+
rescue => e
|
50
|
+
@exception = e
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
When /^I publish a duplicate artifact (.*)$/ do |desc|
|
55
|
+
steps %Q{
|
56
|
+
When I publish the artifact #{desc}
|
57
|
+
}
|
58
|
+
begin
|
59
|
+
publish(desc)
|
60
|
+
rescue => e
|
61
|
+
@exception = e
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# TODO: make this work
|
66
|
+
When /^I force publish a duplicate artifact (.*)$/ do |desc|
|
67
|
+
steps %Q{
|
68
|
+
When I publish the artifact #{desc}
|
69
|
+
}
|
70
|
+
begin
|
71
|
+
publish(desc)
|
72
|
+
rescue => e
|
73
|
+
puts "EXCEPTION"
|
74
|
+
@exception = e
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
Then /^there should be (.*) projects in the publisher$/ do |count|
|
79
|
+
list = @pub.projects
|
80
|
+
#puts "LIST:#{list.inspect}"
|
81
|
+
fail unless list.count == count.to_i
|
82
|
+
end
|
83
|
+
|
84
|
+
Then /^the (.*) project should have (.*) branches$/ do |project, count|
|
85
|
+
list = @pub.branches(project)
|
86
|
+
fail unless list.count == count.to_i
|
87
|
+
end
|
88
|
+
|
89
|
+
Then /^the latest of (.*)\/(.*) should be (.*)$/ do |project, branch, version|
|
90
|
+
latest = @pub.latest(project, branch)
|
91
|
+
fail unless latest == "#{project}/#{branch}/#{version}"
|
92
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
$:.unshift File.expand_path("lib/")
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'volley'
|
5
|
+
|
6
|
+
root = Dir.pwd
|
7
|
+
|
8
|
+
Volley::Log.add(:debug, "#{Dir.pwd}/log/volley.log")
|
9
|
+
Volley::Log.console_disable
|
10
|
+
Volley.config.project_root = root
|
11
|
+
|
12
|
+
World do
|
13
|
+
@root = root
|
14
|
+
end
|
15
|
+
|
16
|
+
at_exit do
|
17
|
+
puts "cleaning up... #{root}"
|
18
|
+
%w{local remote}.each { |d| FileUtils.rm_rf("#{root}/test/publisher/#{d}") }
|
19
|
+
end
|
data/init/Volleyfile
CHANGED
@@ -1,104 +1 @@
|
|
1
|
-
# TODO:
|
2
|
-
# Source Control - access to source control information from within actions
|
3
|
-
# scm :svn
|
4
|
-
# or
|
5
|
-
# scm :git
|
6
|
-
#
|
7
|
-
# Configuring one of these, enables you to use source control
|
8
|
-
# information inside actions:
|
9
|
-
# action :name do
|
10
|
-
# args.branch = source.branch
|
11
|
-
# args.version = source.revision
|
12
|
-
# end
|
13
|
-
|
14
|
-
project :myproject do
|
15
|
-
plan :push do
|
16
|
-
# Encryption allows you to share artifact files on public data stores.
|
17
|
-
#
|
18
|
-
# encryption is turned off by default
|
19
|
-
# encrypt false
|
20
|
-
# to enable encryption you must supply a keyfile
|
21
|
-
# encrypt true, :key => "/path/to/keyfile"
|
22
|
-
# or supply a key directly
|
23
|
-
# encrypt true, :key => "this is the key"
|
24
|
-
|
25
|
-
# Command output is disabled by default
|
26
|
-
# output false
|
27
|
-
# setting this to true, will display output
|
28
|
-
# from all commands that are run as part
|
29
|
-
# of the plan
|
30
|
-
# output true
|
31
|
-
|
32
|
-
# Arguments are captured from the command line
|
33
|
-
# in key:value pairs.
|
34
|
-
#
|
35
|
-
# By specifying the following:
|
36
|
-
# argument :branch
|
37
|
-
# You will then have access to args.branch within your plan's actions
|
38
|
-
#
|
39
|
-
# Argument options
|
40
|
-
# :default set the default value for the argument
|
41
|
-
# :convert convert the value received from the command line (see below)
|
42
|
-
# :required raise an error if this argument is not specified
|
43
|
-
#
|
44
|
-
# Convert Option:
|
45
|
-
# :convert => :boolean
|
46
|
-
# :convert => :to_s
|
47
|
-
# :convert => :to_i
|
48
|
-
# Boolean is a custom conversion, all others are delegated to the string class
|
49
|
-
#
|
50
|
-
|
51
|
-
# Actions
|
52
|
-
# Actions are executed in order that they are defined in.
|
53
|
-
#
|
54
|
-
# Generally you will use action wrappers (like: build and push)
|
55
|
-
#
|
56
|
-
# The build action is a specialized action that *requires*
|
57
|
-
# the return value of the block to be the list of files to add
|
58
|
-
# to the artifact.
|
59
|
-
#
|
60
|
-
# build do |attr|
|
61
|
-
# # run build commands
|
62
|
-
# ["target/something.war"]
|
63
|
-
# end
|
64
|
-
#
|
65
|
-
# By default, the build action will also configure the 'pack' action
|
66
|
-
# (which handles creating the final combined artifact) and the 'encrypt'
|
67
|
-
# action, if encryption is enabled.
|
68
|
-
#
|
69
|
-
# The 'push' action is a shortcut to Publish the artifact to a data store.
|
70
|
-
# push :publisher
|
71
|
-
# Volley includes the Amazon S3 publisher.
|
72
|
-
# push :amazons3
|
73
|
-
#
|
74
|
-
# You also have the ability to add actions directly:
|
75
|
-
#
|
76
|
-
# action :name do
|
77
|
-
# # do something
|
78
|
-
# end
|
79
|
-
|
80
|
-
build do |attr|
|
81
|
-
clean = args.clean ? "clean" : ""
|
82
|
-
|
83
|
-
# to run commands inside of actions, use the shellout method
|
84
|
-
# this is a wrapper around Mixlib::Shellout
|
85
|
-
shellout("rake #{clean} build")
|
86
|
-
|
87
|
-
# the 'branch' argument is generally set to the branch name.
|
88
|
-
# by using the ||= operator here, we can also set the 'branch' argument on the command line.
|
89
|
-
args.branch ||= source.branch
|
90
|
-
# the 'version' argument is generally set to the source control revision number.
|
91
|
-
# by using the ||= operator here, we can also set the 'branch' argument on the command line.
|
92
|
-
args.version ||= source.revision
|
93
|
-
|
94
|
-
final = "target/awesome.war"
|
95
|
-
[final]
|
96
|
-
end
|
97
|
-
|
98
|
-
push :amazons3
|
99
|
-
end
|
100
|
-
|
101
|
-
plan :deploy do
|
102
|
-
pull :amazons3
|
103
|
-
end
|
104
|
-
end
|
1
|
+
# TODO: write this
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
module Volley
|
3
|
+
class Descriptor
|
4
|
+
attr_reader :project, :branch, :version
|
5
|
+
|
6
|
+
def initialize(desc="", options={})
|
7
|
+
@options = {
|
8
|
+
:partial => false,
|
9
|
+
}.merge(options)
|
10
|
+
|
11
|
+
if desc
|
12
|
+
list = desc.split(/[\@\:\.\/\\\-]/)
|
13
|
+
raise "error parsing descriptor: #{desc}" if (list.count < 2 || list.count > 3) && !@options[:partial]
|
14
|
+
(@project, @branch, @version) = list
|
15
|
+
@version ||= "latest"
|
16
|
+
raise "error parsing descriptor: #{desc}" unless (@project && @branch && @version) || @options[:partial]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def get
|
21
|
+
[@project, @branch, @version]
|
22
|
+
end
|
23
|
+
|
24
|
+
def ==(other)
|
25
|
+
@project == other.project && @branch == other.branch && @version == other.version
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
module Volley
|
3
|
+
module Dsl
|
4
|
+
class Action
|
5
|
+
attr_reader :plan
|
6
|
+
|
7
|
+
def initialize(name, options={}, &block)
|
8
|
+
@name = name.to_sym
|
9
|
+
@stage = options.delete(:stage)
|
10
|
+
@plan = options.delete(:plan)
|
11
|
+
@block = block
|
12
|
+
@options = {
|
13
|
+
}.merge(options)
|
14
|
+
raise "stage instance must be set" unless @stage
|
15
|
+
raise "plan instance must be set" unless @plan
|
16
|
+
end
|
17
|
+
|
18
|
+
def call
|
19
|
+
Volley::Log.debug ".. .. #@name"
|
20
|
+
self.instance_eval &@block if @block
|
21
|
+
end
|
22
|
+
|
23
|
+
delegate :project, :args, :files, :file, :attributes, :log, :arguments, :argv, :branch, :version, :action,
|
24
|
+
:to => :plan
|
25
|
+
|
26
|
+
def command(cmd)
|
27
|
+
@plan.shellout(cmd)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|