git-deploy 0.5.0 → 0.5.4
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/lib/git_deploy/configuration.rb +19 -19
- data/lib/git_deploy/ssh_methods.rb +1 -1
- data/lib/git_deploy/templates/before_restart.rb +18 -4
- data/lib/git_deploy.rb +8 -4
- data/lib/hooks/post-receive.sh +8 -6
- data/spec/configuration_spec.rb +48 -0
- metadata +11 -9
|
@@ -1,30 +1,23 @@
|
|
|
1
|
+
require 'uri'
|
|
2
|
+
require 'cgi'
|
|
3
|
+
require 'forwardable'
|
|
4
|
+
|
|
1
5
|
class GitDeploy
|
|
2
6
|
module Configuration
|
|
3
7
|
private
|
|
4
8
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
extend Forwardable
|
|
10
|
+
def_delegator :remote_url, :host
|
|
11
|
+
def_delegator :remote_url, :port, :remote_port
|
|
12
|
+
def_delegator :remote_url, :path, :deploy_to
|
|
9
13
|
|
|
10
14
|
def remote_user
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def extract_host_and_user
|
|
16
|
-
info = remote_url.split(':').first.split('@')
|
|
17
|
-
if info.size < 2
|
|
18
|
-
@user, @host = `whoami`.chomp, info.first
|
|
19
|
-
else
|
|
20
|
-
@user, @host = *info
|
|
15
|
+
@user ||= begin
|
|
16
|
+
user = remote_url.user
|
|
17
|
+
user ? CGI.unescape(user) : `whoami`.chomp
|
|
21
18
|
end
|
|
22
19
|
end
|
|
23
20
|
|
|
24
|
-
def deploy_to
|
|
25
|
-
@deploy_to ||= remote_url.split(':').last
|
|
26
|
-
end
|
|
27
|
-
|
|
28
21
|
def branch
|
|
29
22
|
'master'
|
|
30
23
|
end
|
|
@@ -50,8 +43,15 @@ class GitDeploy
|
|
|
50
43
|
url = remote_urls(remote).first
|
|
51
44
|
if url.nil?
|
|
52
45
|
abort "Error: Remote url not found for remote #{remote.inspect}"
|
|
53
|
-
elsif url =~
|
|
46
|
+
elsif url =~ /(^|@)github\.com\b/
|
|
54
47
|
abort "Error: Remote url for #{remote.inspect} points to GitHub. Can't deploy there!"
|
|
48
|
+
else
|
|
49
|
+
url = 'ssh://' + url.sub(%r{:/?}, '/') unless url =~ %r{^[\w-]+://}
|
|
50
|
+
begin
|
|
51
|
+
url = URI.parse url
|
|
52
|
+
rescue
|
|
53
|
+
abort "Error parsing remote url #{url}"
|
|
54
|
+
end
|
|
55
55
|
end
|
|
56
56
|
url
|
|
57
57
|
end
|
|
@@ -9,13 +9,27 @@ RAILS_ENV = ENV['RAILS_ENV'] || 'production'
|
|
|
9
9
|
use_bundler = File.file? 'Gemfile'
|
|
10
10
|
rake_cmd = use_bundler ? 'bundle exec rake' : 'rake'
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
if use_bundler
|
|
13
|
+
bundler_args = ['--deployment']
|
|
14
|
+
BUNDLE_WITHOUT = ENV['BUNDLE_WITHOUT'] || 'development:test'
|
|
15
|
+
bundler_args << '--without' << BUNDLE_WITHOUT unless BUNDLE_WITHOUT.empty?
|
|
16
|
+
|
|
17
|
+
# update gem bundle
|
|
18
|
+
run "bundle install #{bundler_args.join(' ')}"
|
|
19
|
+
end
|
|
14
20
|
|
|
15
21
|
if File.file? 'Rakefile'
|
|
16
|
-
|
|
22
|
+
tasks = []
|
|
23
|
+
|
|
24
|
+
num_migrations = `git diff #{oldrev} #{newrev} --diff-filter=A --name-only -z db/migrate`.split("\0").size
|
|
17
25
|
# run migrations if new ones have been added
|
|
18
|
-
|
|
26
|
+
tasks << "db:migrate" if num_migrations > 0
|
|
27
|
+
|
|
28
|
+
# precompile assets
|
|
29
|
+
changed_assets = `git diff #{oldrev} #{newrev} --name-only -z app/assets`.split("\0")
|
|
30
|
+
tasks << "assets:precompile" if changed_assets.size > 0
|
|
31
|
+
|
|
32
|
+
run "#{rake_cmd} #{tasks.join(' ')} RAILS_ENV=#{RAILS_ENV}" if tasks.any?
|
|
19
33
|
end
|
|
20
34
|
|
|
21
35
|
# clear cached assets (unversioned/ignored files)
|
data/lib/git_deploy.rb
CHANGED
|
@@ -25,9 +25,10 @@ class GitDeploy < Thor
|
|
|
25
25
|
def setup
|
|
26
26
|
sudo = options.sudo? ? "#{sudo_cmd} " : ''
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
unless run_test("test -x #{deploy_to}")
|
|
29
29
|
run ["#{sudo}mkdir -p #{deploy_to}"] do |cmd|
|
|
30
30
|
cmd << "#{sudo}chown $USER #{deploy_to}" if options.sudo?
|
|
31
|
+
cmd
|
|
31
32
|
end
|
|
32
33
|
end
|
|
33
34
|
|
|
@@ -63,9 +64,12 @@ class GitDeploy < Thor
|
|
|
63
64
|
invoke :restart
|
|
64
65
|
end
|
|
65
66
|
|
|
66
|
-
desc "log
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
desc "log", "Shows the last part of the deploy log on the server"
|
|
68
|
+
method_option :tail, :aliases => '-t', :type => :boolean, :default => false
|
|
69
|
+
method_option :lines, :aliases => '-l', :type => :numeric, :default => 20
|
|
70
|
+
def log(n = nil)
|
|
71
|
+
tail_args = options.tail? ? '-f' : "-n#{n || options.lines}"
|
|
72
|
+
run "tail #{tail_args} #{deploy_to}/log/deploy.log"
|
|
69
73
|
end
|
|
70
74
|
|
|
71
75
|
desc "upload <files>", "Copy local files to the remote app"
|
data/lib/hooks/post-receive.sh
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
#!/
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
2
4
|
if [ "$GIT_DIR" = "." ]; then
|
|
3
5
|
# The script has been called as a hook; chdir to the working copy
|
|
4
6
|
cd ..
|
|
5
|
-
GIT_DIR
|
|
6
|
-
export GIT_DIR
|
|
7
|
+
unset GIT_DIR
|
|
7
8
|
fi
|
|
8
9
|
|
|
9
10
|
# try to obtain the usual system PATH
|
|
@@ -14,16 +15,17 @@ fi
|
|
|
14
15
|
|
|
15
16
|
# get the current branch
|
|
16
17
|
head="$(git symbolic-ref HEAD)"
|
|
17
|
-
# abort if we're on a detached head
|
|
18
|
-
[ "$?" != "0" ] && exit 1
|
|
19
18
|
|
|
20
19
|
# read the STDIN to detect if this push changed the current branch
|
|
21
20
|
while read oldrev newrev refname
|
|
22
21
|
do
|
|
23
22
|
[ "$refname" = "$head" ] && break
|
|
24
23
|
done
|
|
24
|
+
|
|
25
25
|
# abort if there's no update, or in case the branch is deleted
|
|
26
|
-
[ -z "${newrev//0}" ]
|
|
26
|
+
if [ -z "${newrev//0}" ]; then
|
|
27
|
+
exit
|
|
28
|
+
fi
|
|
27
29
|
|
|
28
30
|
# check out the latest code into the working copy
|
|
29
31
|
umask 002
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'rspec'
|
|
2
|
+
require 'git_deploy/configuration'
|
|
3
|
+
|
|
4
|
+
describe GitDeploy::Configuration do
|
|
5
|
+
|
|
6
|
+
subject {
|
|
7
|
+
mod = described_class
|
|
8
|
+
obj = Object.new
|
|
9
|
+
opt = options
|
|
10
|
+
(class << obj; self; end).class_eval do
|
|
11
|
+
include mod
|
|
12
|
+
mod.private_instance_methods.each {|m| public m }
|
|
13
|
+
define_method(:options) { opt }
|
|
14
|
+
end
|
|
15
|
+
obj
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let(:options) { {:remote => 'production'} }
|
|
19
|
+
|
|
20
|
+
def stub_git_config(cmd, value)
|
|
21
|
+
subject.git_config[cmd] = value
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def stub_remote_url(url, remote = options[:remote])
|
|
25
|
+
stub_git_config("config --get-all remote.#{remote}.url", url)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe "extracting user/host from remote url" do
|
|
29
|
+
context "ssh url" do
|
|
30
|
+
before { stub_remote_url 'ssh://jon%20doe@example.com:88/path/to/app' }
|
|
31
|
+
|
|
32
|
+
its(:host) { should eq('example.com') }
|
|
33
|
+
its(:remote_port) { should eq(88) }
|
|
34
|
+
its(:remote_user) { should eq('jon doe') }
|
|
35
|
+
its(:deploy_to) { should eq('/path/to/app') }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
context "scp-style" do
|
|
39
|
+
before { stub_remote_url 'git@example.com:/path/to/app' }
|
|
40
|
+
|
|
41
|
+
its(:host) { should eq('example.com') }
|
|
42
|
+
its(:remote_port) { should be_nil }
|
|
43
|
+
its(:remote_user) { should eq('git') }
|
|
44
|
+
its(:deploy_to) { should eq('/path/to/app') }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: git-deploy
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.5.
|
|
4
|
+
version: 0.5.4
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,11 +9,11 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2012-04-03 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: thor
|
|
16
|
-
requirement: &
|
|
16
|
+
requirement: &70233531184120 !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
19
|
- - ! '>='
|
|
@@ -21,10 +21,10 @@ dependencies:
|
|
|
21
21
|
version: '0'
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
|
-
version_requirements: *
|
|
24
|
+
version_requirements: *70233531184120
|
|
25
25
|
- !ruby/object:Gem::Dependency
|
|
26
26
|
name: net-ssh
|
|
27
|
-
requirement: &
|
|
27
|
+
requirement: &70233531200000 !ruby/object:Gem::Requirement
|
|
28
28
|
none: false
|
|
29
29
|
requirements:
|
|
30
30
|
- - ! '>='
|
|
@@ -32,10 +32,10 @@ dependencies:
|
|
|
32
32
|
version: '0'
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
|
-
version_requirements: *
|
|
35
|
+
version_requirements: *70233531200000
|
|
36
36
|
- !ruby/object:Gem::Dependency
|
|
37
37
|
name: net-scp
|
|
38
|
-
requirement: &
|
|
38
|
+
requirement: &70233531199500 !ruby/object:Gem::Requirement
|
|
39
39
|
none: false
|
|
40
40
|
requirements:
|
|
41
41
|
- - ! '>='
|
|
@@ -43,7 +43,7 @@ dependencies:
|
|
|
43
43
|
version: '0'
|
|
44
44
|
type: :runtime
|
|
45
45
|
prerelease: false
|
|
46
|
-
version_requirements: *
|
|
46
|
+
version_requirements: *70233531199500
|
|
47
47
|
description: A tool to install useful git hooks on your remote repository to enable
|
|
48
48
|
push-based, Heroku-like deployment on your host.
|
|
49
49
|
email: mislav.marohnic@gmail.com
|
|
@@ -61,6 +61,7 @@ files:
|
|
|
61
61
|
- lib/git_deploy/templates/restart.sh
|
|
62
62
|
- lib/git_deploy.rb
|
|
63
63
|
- lib/hooks/post-receive.sh
|
|
64
|
+
- spec/configuration_spec.rb
|
|
64
65
|
- README.markdown
|
|
65
66
|
- LICENSE
|
|
66
67
|
homepage: https://github.com/mislav/git-deploy
|
|
@@ -83,8 +84,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
83
84
|
version: '0'
|
|
84
85
|
requirements: []
|
|
85
86
|
rubyforge_project:
|
|
86
|
-
rubygems_version: 1.8.
|
|
87
|
+
rubygems_version: 1.8.12
|
|
87
88
|
signing_key:
|
|
88
89
|
specification_version: 3
|
|
89
90
|
summary: Simple git push-based application deployment
|
|
90
91
|
test_files: []
|
|
92
|
+
has_rdoc:
|