yads 0.0.3.pre2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Rakefile +8 -1
- data/bin/yads +14 -2
- data/examples/deploy.yml +2 -2
- data/lib/yads/deployer.rb +41 -0
- data/lib/yads/ssh.rb +26 -0
- data/lib/yads/version.rb +1 -1
- data/lib/yads.rb +2 -50
- data/test/fixtures/config/deploy.yml +3 -2
- data/test/test_helper.rb +6 -0
- data/test/yads/test_deployer.rb +54 -0
- data/test/yads/test_ssh.rb +46 -0
- data/yads.gemspec +1 -0
- metadata +29 -12
- data/test/test_yads.rb +0 -53
data/.gitignore
CHANGED
data/Rakefile
CHANGED
data/bin/yads
CHANGED
@@ -1,4 +1,16 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
require "slop"
|
2
3
|
|
3
|
-
|
4
|
-
|
4
|
+
opts = Slop.new(:strict => true)
|
5
|
+
opts.parse do |action|
|
6
|
+
require "yads"
|
7
|
+
deployer = Yads::Deployer.new(STDOUT)
|
8
|
+
|
9
|
+
action = action.to_sym
|
10
|
+
if !action.empty? && deployer.respond_to?(action)
|
11
|
+
deployer.send(action)
|
12
|
+
else
|
13
|
+
puts "Unknow command \"#{action}\""
|
14
|
+
puts "Usage: yads [setup|deploy]"
|
15
|
+
end
|
16
|
+
end
|
data/examples/deploy.yml
CHANGED
@@ -3,10 +3,10 @@ user: username
|
|
3
3
|
forward_agent: true/false
|
4
4
|
|
5
5
|
path: /path/on/remote/server
|
6
|
+
repository: git@repohost.com:myproject.git
|
6
7
|
commands:
|
7
|
-
clone: git clone --depth 1 git@repohost.com:myproject.git . # mandatory, other commands below are optional
|
8
8
|
reset: git reset --hard
|
9
9
|
pull: git pull origin master
|
10
10
|
bundle: bundle install --deployment --binstubs --without development test
|
11
|
-
migrate:
|
11
|
+
migrate: RAILS_ENV=production bin/rake db:migrate --silent
|
12
12
|
restart: touch tmp/restart.txt
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require "yaml"
|
2
|
+
|
3
|
+
module Yads
|
4
|
+
class Deployer
|
5
|
+
|
6
|
+
def initialize(logger = STDOUT)
|
7
|
+
@logger = logger
|
8
|
+
end
|
9
|
+
|
10
|
+
def setup
|
11
|
+
command = "mkdir -p #{config["path"]} && cd #{config["path"]} && git clone --depth 1 #{config['repository']} ."
|
12
|
+
@logger.puts("> #{command}")
|
13
|
+
@logger.puts(connection.execute(command))
|
14
|
+
end
|
15
|
+
|
16
|
+
def deploy
|
17
|
+
commands = config["commands"].values
|
18
|
+
commands.unshift("cd #{config["path"]}")
|
19
|
+
commands = commands.join(" && ")
|
20
|
+
|
21
|
+
@logger.puts("> #{commands}")
|
22
|
+
connection.execute(commands) do |output|
|
23
|
+
@logger.print(output)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def config
|
30
|
+
@config ||= begin
|
31
|
+
YAML.load(File.open("config/deploy.yml"))
|
32
|
+
rescue Errno::ENOENT
|
33
|
+
raise Yads::ConfigNotFound, "config/deploy.yml not found"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def connection
|
38
|
+
@connection ||= SSH.new(:host => config["host"], :user => config["user"], :forward_agent => config["forward_agent"])
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/yads/ssh.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require "net/ssh"
|
2
|
+
|
3
|
+
module Yads
|
4
|
+
|
5
|
+
class SSH
|
6
|
+
|
7
|
+
def initialize(config)
|
8
|
+
@ssh = Net::SSH.start(config[:host], config[:user], :forward_agent => config[:forward_agent])
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute(cmd)
|
12
|
+
if block_given?
|
13
|
+
@ssh.exec(cmd) do |ch, stream, data|
|
14
|
+
yield data
|
15
|
+
end
|
16
|
+
@ssh.loop
|
17
|
+
else
|
18
|
+
@ssh.exec!(cmd)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def close
|
23
|
+
@ssh.close
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/yads/version.rb
CHANGED
data/lib/yads.rb
CHANGED
@@ -1,54 +1,6 @@
|
|
1
|
-
require "net/ssh"
|
2
|
-
require "yaml"
|
3
|
-
|
4
1
|
module Yads
|
5
|
-
|
6
2
|
class ConfigNotFound < Errno::ENOENT; end
|
7
3
|
|
8
|
-
|
9
|
-
|
10
|
-
@logger = logger
|
11
|
-
end
|
12
|
-
|
13
|
-
def deploy
|
14
|
-
begin
|
15
|
-
config = YAML.load(File.open("config/deploy.yml"))
|
16
|
-
rescue Errno::ENOENT
|
17
|
-
raise Yads::ConfigNotFound, "config/deploy.yml not found"
|
18
|
-
end
|
19
|
-
|
20
|
-
Net::SSH.start(config["host"], config["user"], :forward_agent => config["forward_agent"]) do |ssh|
|
21
|
-
check_path(ssh, config["path"], config["commands"].delete("clone"))
|
22
|
-
|
23
|
-
commands = config["commands"].values.unshift("cd #{config['path']}").join(" && ")
|
24
|
-
@logger.puts "> #{commands}"
|
25
|
-
@logger.puts
|
26
|
-
|
27
|
-
ssh.exec(commands) do |ch, stream, data|
|
28
|
-
print data
|
29
|
-
end
|
30
|
-
|
31
|
-
ssh.loop
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def check_path(ssh, path, clone)
|
36
|
-
@logger.puts "> cd #{path}/.git"
|
37
|
-
ssh.exec("cd #{path}/.git") do |ch, stream, data|
|
38
|
-
if stream == :stderr
|
39
|
-
@logger.puts "> cd #{path}"
|
40
|
-
ssh.exec("mkdir -p #{path}; cd #{path}") do |ch1, stream1, data1|
|
41
|
-
@logger.puts "> #{clone}"
|
42
|
-
ssh.exec(clone) do |ch1, stream1, data1|
|
43
|
-
abort data1 if stream1 == :stderr
|
44
|
-
|
45
|
-
@logger.puts "> cd #{path}"
|
46
|
-
ssh.exec("cd #{path}")
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
ssh.loop
|
52
|
-
end
|
53
|
-
end
|
4
|
+
autoload :SSH, "yads/ssh"
|
5
|
+
autoload :Deployer, "yads/deployer"
|
54
6
|
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class TestYads < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@log_file = File.open("/dev/null", "w")
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_try_loading_not_found_config_file_on_setup
|
10
|
+
assert_raises(Yads::ConfigNotFound) do
|
11
|
+
Dir.chdir("/tmp") do
|
12
|
+
deployer = Yads::Deployer.new(@log_file)
|
13
|
+
deployer.setup
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_try_loading_not_found_config_file_on_deploy
|
19
|
+
assert_raises(Yads::ConfigNotFound) do
|
20
|
+
Dir.chdir("/tmp") do
|
21
|
+
deployer = Yads::Deployer.new(@log_file)
|
22
|
+
deployer.deploy
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_setup
|
28
|
+
inside_project_root do
|
29
|
+
ssh = mock
|
30
|
+
ssh.expects(:execute).with("mkdir -p /tmp/yads && cd /tmp/yads && git clone --depth 1 git@repohost.com:myrepo.git .")
|
31
|
+
Yads::SSH.expects(:new).with(:host => "rafaelss.com", :user => "deploy", :forward_agent => true).returns(ssh)
|
32
|
+
|
33
|
+
deployer = Yads::Deployer.new(@log_file)
|
34
|
+
deployer.setup
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_deploy
|
39
|
+
inside_project_root do
|
40
|
+
ssh = mock
|
41
|
+
ssh.expects(:execute).with("cd /tmp/yads && rake db:migrate && touch test")
|
42
|
+
Yads::SSH.expects(:new).with(:host => "rafaelss.com", :user => "deploy", :forward_agent => true).returns(ssh)
|
43
|
+
|
44
|
+
deployer = Yads::Deployer.new(@log_file)
|
45
|
+
deployer.deploy
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def inside_project_root(&block)
|
52
|
+
Dir.chdir(File.expand_path("../../fixtures", __FILE__), &block)
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class TestSSH < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def test_connect
|
6
|
+
connection_mock
|
7
|
+
|
8
|
+
Yads::SSH.new(:host => "example.org", :user => "deploy", :forward_agent => true)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_execute
|
12
|
+
session = mock
|
13
|
+
session.expects(:exec!).with("mkdir -p /tmp/yads")
|
14
|
+
connection_mock(session)
|
15
|
+
|
16
|
+
s = Yads::SSH.new(:host => "example.org", :user => "deploy", :forward_agent => true)
|
17
|
+
s.execute("mkdir -p /tmp/yads")
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_execute_with_block
|
21
|
+
session = mock
|
22
|
+
session.expects(:exec).with("echo $PATH").yields(nil, nil, "/usr/bin:/usr/local/bin")
|
23
|
+
session.expects(:loop)
|
24
|
+
connection_mock(session)
|
25
|
+
|
26
|
+
s = Yads::SSH.new(:host => "example.org", :user => "deploy", :forward_agent => true)
|
27
|
+
s.execute("echo $PATH") do |output|
|
28
|
+
assert_equal "/usr/bin:/usr/local/bin", output
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_close
|
33
|
+
session = mock
|
34
|
+
session.expects(:close)
|
35
|
+
connection_mock(session)
|
36
|
+
|
37
|
+
s = Yads::SSH.new(:host => "example.org", :user => "deploy", :forward_agent => true)
|
38
|
+
s.close
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def connection_mock(session = nil)
|
44
|
+
Net::SSH.expects(:start).with("example.org", "deploy", :forward_agent => true).returns(session)
|
45
|
+
end
|
46
|
+
end
|
data/yads.gemspec
CHANGED
@@ -13,6 +13,7 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.description = %q{Simple deployment tool that uses a single YAML file to put your code live}
|
14
14
|
|
15
15
|
s.add_runtime_dependency "net-ssh", "~> 2.1.0"
|
16
|
+
s.add_runtime_dependency "slop", "~> 1.5.2"
|
16
17
|
s.add_development_dependency "minitest", "~> 2.0.2"
|
17
18
|
s.add_development_dependency "mocha", "~> 0.9.10"
|
18
19
|
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yads
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
version: 0.0
|
4
|
+
prerelease:
|
5
|
+
version: 0.1.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Rafael Souza
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-04-21 00:00:00 -03:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -25,27 +25,38 @@ dependencies:
|
|
25
25
|
type: :runtime
|
26
26
|
version_requirements: *id001
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: slop
|
29
29
|
prerelease: false
|
30
30
|
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ~>
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 1.5.2
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id002
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: minitest
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
31
42
|
none: false
|
32
43
|
requirements:
|
33
44
|
- - ~>
|
34
45
|
- !ruby/object:Gem::Version
|
35
46
|
version: 2.0.2
|
36
47
|
type: :development
|
37
|
-
version_requirements: *
|
48
|
+
version_requirements: *id003
|
38
49
|
- !ruby/object:Gem::Dependency
|
39
50
|
name: mocha
|
40
51
|
prerelease: false
|
41
|
-
requirement: &
|
52
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
42
53
|
none: false
|
43
54
|
requirements:
|
44
55
|
- - ~>
|
45
56
|
- !ruby/object:Gem::Version
|
46
57
|
version: 0.9.10
|
47
58
|
type: :development
|
48
|
-
version_requirements: *
|
59
|
+
version_requirements: *id004
|
49
60
|
description: Simple deployment tool that uses a single YAML file to put your code live
|
50
61
|
email:
|
51
62
|
- me@rafaelss.com
|
@@ -63,9 +74,13 @@ files:
|
|
63
74
|
- bin/yads
|
64
75
|
- examples/deploy.yml
|
65
76
|
- lib/yads.rb
|
77
|
+
- lib/yads/deployer.rb
|
78
|
+
- lib/yads/ssh.rb
|
66
79
|
- lib/yads/version.rb
|
67
80
|
- test/fixtures/config/deploy.yml
|
68
|
-
- test/
|
81
|
+
- test/test_helper.rb
|
82
|
+
- test/yads/test_deployer.rb
|
83
|
+
- test/yads/test_ssh.rb
|
69
84
|
- yads.gemspec
|
70
85
|
has_rdoc: true
|
71
86
|
homepage: http://github.com/rafaelss/yads
|
@@ -85,16 +100,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
85
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
101
|
none: false
|
87
102
|
requirements:
|
88
|
-
- - "
|
103
|
+
- - ">="
|
89
104
|
- !ruby/object:Gem::Version
|
90
|
-
version:
|
105
|
+
version: "0"
|
91
106
|
requirements: []
|
92
107
|
|
93
108
|
rubyforge_project:
|
94
|
-
rubygems_version: 1.6.
|
109
|
+
rubygems_version: 1.6.2
|
95
110
|
signing_key:
|
96
111
|
specification_version: 3
|
97
112
|
summary: Deploy your code using a YAML file
|
98
113
|
test_files:
|
99
114
|
- test/fixtures/config/deploy.yml
|
100
|
-
- test/
|
115
|
+
- test/test_helper.rb
|
116
|
+
- test/yads/test_deployer.rb
|
117
|
+
- test/yads/test_ssh.rb
|
data/test/test_yads.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
require "bundler"
|
2
|
-
Bundler.require
|
3
|
-
|
4
|
-
require "minitest/autorun"
|
5
|
-
require "mocha"
|
6
|
-
|
7
|
-
class TestYads < MiniTest::Unit::TestCase
|
8
|
-
|
9
|
-
def setup
|
10
|
-
@deployer = Yads::Deployer.new(File.open("/dev/null", "w"))
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_check_path_abort
|
14
|
-
ssh = mock
|
15
|
-
ssh.expects(:exec).with("cd /tmp/yads/.git").yields("ch", :stderr, "data")
|
16
|
-
ssh.expects(:exec).with("git clone git@repohost.com:myrepo.git .").yields("ch1", :stderr, "data1")
|
17
|
-
|
18
|
-
assert_raises(SystemExit) do
|
19
|
-
@deployer.check_path(ssh, "/tmp/yads", "git clone git@repohost.com:myrepo.git .")
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_check_path
|
24
|
-
ssh = mock
|
25
|
-
ssh.expects(:exec).with("cd /tmp/yads/.git").yields("ch", :stderr, "data")
|
26
|
-
ssh.expects(:exec).with("git clone git@repohost.com:myrepo.git .").yields("ch1", :stdout, "data1")
|
27
|
-
ssh.expects(:exec).with("cd /tmp/yads")
|
28
|
-
ssh.expects(:loop)
|
29
|
-
|
30
|
-
@deployer.check_path(ssh, "/tmp/yads", "git clone git@repohost.com:myrepo.git .")
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_load_not_found_config_file
|
34
|
-
assert_raises(Yads::ConfigNotFound) do
|
35
|
-
Dir.chdir("/tmp") do
|
36
|
-
@deployer.deploy
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_load_config_file
|
42
|
-
Dir.chdir(File.expand_path("../fixtures", __FILE__)) do
|
43
|
-
ssh = mock
|
44
|
-
ssh.expects(:exec).with("cd /tmp/yads && touch test")
|
45
|
-
ssh.expects(:loop)
|
46
|
-
|
47
|
-
@deployer.expects(:check_path).with(ssh)
|
48
|
-
Net::SSH.expects(:start).with("rafaelss.com", "deploy", :forward_agent => true).yields(ssh)
|
49
|
-
|
50
|
-
@deployer.deploy
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|