cap-git-deploy 0.0.2 → 0.0.3
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/README.md +64 -2
- data/lib/cap-git-deploy.rb +2 -0
- data/lib/cap-git-deploy/version.rb +1 -1
- data/lib/recipes/fast-git-deploy.rb +31 -69
- data/lib/recipes/git-revisioning.rb +32 -0
- metadata +7 -6
data/README.md
CHANGED
@@ -1,2 +1,64 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# Installation
|
2
|
+
|
3
|
+
```bash
|
4
|
+
gem install cap-git-deploy
|
5
|
+
```
|
6
|
+
|
7
|
+
or inside your Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
group :development do
|
11
|
+
gem 'cap-git-deploy'
|
12
|
+
end
|
13
|
+
```
|
14
|
+
|
15
|
+
# How to use
|
16
|
+
|
17
|
+
cap-git-deploy disables the use of the symlinks for version control in favor of a tag-style mechanism with git: every deploy is marked with a git tag. A rollback is a checkout to a tag.
|
18
|
+
|
19
|
+
The following is a sample recipe that uses git-deploy as deployment procedure:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
require 'cap-git-deploy'
|
23
|
+
|
24
|
+
set :repository, 'git@my-host.com:my-app.git'
|
25
|
+
set :deploy_to, '/var/apps/my-app'
|
26
|
+
role :app, 'my-host.com'
|
27
|
+
role :web, 'my-host.com'
|
28
|
+
role :db, 'my-host.com'
|
29
|
+
```
|
30
|
+
|
31
|
+
In addition, cap-git-deploy stores some deploy info inside a revision file (called REVISION by default) on the remote host.
|
32
|
+
After each deploy the commit sha, the branch name, the user name and the current date are stored inside this file.
|
33
|
+
To show the deploy infos you can launch the revision:get task:
|
34
|
+
|
35
|
+
```bash
|
36
|
+
cap revision:get
|
37
|
+
```
|
38
|
+
|
39
|
+
## Note: Current Branch
|
40
|
+
|
41
|
+
By default, your current branch will be deployed.
|
42
|
+
However, when working with staging environments, usually you want to deploy a particular branch unless specified. In this case insert the following in your deploy.rb file:
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
set :branch, ENV['branch'] || 'master'
|
46
|
+
```
|
47
|
+
|
48
|
+
In this way, 'cap deploy' will deploy the 'master' branch, instead 'cap deploy branch=foo' will deploy the branch 'foo'.
|
49
|
+
|
50
|
+
For production environments **you should** use something like the following code:
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
set :branch, 'master'
|
54
|
+
```
|
55
|
+
|
56
|
+
## Note: Setup
|
57
|
+
|
58
|
+
To setup your environment, when your recipes are ready, type the following command from your rails app:
|
59
|
+
|
60
|
+
```bash
|
61
|
+
cap deploy:setup
|
62
|
+
```
|
63
|
+
|
64
|
+
This will setup your git repository on the remote host.
|
data/lib/cap-git-deploy.rb
CHANGED
@@ -9,6 +9,7 @@ module Cap
|
|
9
9
|
module Deploy
|
10
10
|
# utility functions
|
11
11
|
|
12
|
+
# The name of the branch we are deploying
|
12
13
|
def self.current_branch
|
13
14
|
repo = Grit::Repo.new '.'
|
14
15
|
branch = repo.head
|
@@ -16,6 +17,7 @@ module Cap
|
|
16
17
|
branch && branch.name || 'master'
|
17
18
|
end
|
18
19
|
|
20
|
+
# The name of the current logged user
|
19
21
|
def self.current_user
|
20
22
|
"#{Etc.getlogin}@#{Socket.gethostname}"
|
21
23
|
end
|
@@ -1,15 +1,13 @@
|
|
1
1
|
set :rolling_back, false
|
2
2
|
set :scm, :git
|
3
3
|
set :logged_user, Cap::Git::Deploy.current_user
|
4
|
-
|
4
|
+
unless exists? :branch
|
5
|
+
set :branch, ENV['branch'] || Cap::Git::Deploy.current_branch
|
6
|
+
end
|
7
|
+
set(:latest_release) { fetch :current_path }
|
8
|
+
set(:current_release) { fetch :current_path }
|
5
9
|
|
6
10
|
namespace :deploy do
|
7
|
-
task :default do
|
8
|
-
update
|
9
|
-
update_revision
|
10
|
-
restart
|
11
|
-
end
|
12
|
-
|
13
11
|
desc "Setup a GitHub-style deployment"
|
14
12
|
task :setup, :except => { :no_release => true } do
|
15
13
|
dirs = [deploy_to, shared_path]
|
@@ -22,17 +20,11 @@ namespace :deploy do
|
|
22
20
|
# This is where the log files will go
|
23
21
|
run "mkdir -p #{current_path}/log" rescue 'no problem if log already exist'
|
24
22
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
task :update_code, :except => { :no_release => true } do
|
31
|
-
# If we are rolling back branch is a commit
|
32
|
-
branch_name = rolling_back && branch || "origin/#{branch}"
|
33
|
-
|
34
|
-
run "cd #{current_path} && git fetch" unless rolling_back
|
35
|
-
run "cd #{current_path} && git reset --hard #{branch_name}"
|
23
|
+
branch = fetch :branch, 'master'
|
24
|
+
if branch != 'master'
|
25
|
+
# This is to make sure we are on the correct branch
|
26
|
+
run "cd #{current_path} && git checkout -b #{branch} --track origin/#{branch}"
|
27
|
+
end
|
36
28
|
end
|
37
29
|
|
38
30
|
namespace :rollback do
|
@@ -53,63 +45,33 @@ namespace :deploy do
|
|
53
45
|
end
|
54
46
|
end
|
55
47
|
|
56
|
-
task :
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
task :create_symlink, :except => { :no_release => true } do
|
61
|
-
# This empty task is needed to override the default :symlink task
|
62
|
-
end
|
63
|
-
|
64
|
-
task :migrate, :roles => :db, :only => { :primary => true } do
|
65
|
-
rake = fetch :rake, "rake"
|
66
|
-
bundler = fetch :bundler, "bundler"
|
67
|
-
rails_env = fetch :rails_env, "production"
|
68
|
-
migrate_env = fetch :migrate_env, ""
|
69
|
-
|
70
|
-
run "cd #{current_path}; RAILS_ENV=#{rails_env} #{bundler} exec #{rake} db:migrate #{migrate_env}"
|
71
|
-
end
|
72
|
-
|
73
|
-
desc "Create a REVISION file containing the SHA of the deployed commit"
|
74
|
-
task :update_revision, :except => { :no_release => true } do
|
75
|
-
# If for some reason we cannot find the commit sha, then we'll use the branch name
|
76
|
-
sha = "origin/#{branch}"
|
77
|
-
run "cd #{current_path}; git rev-parse origin/#{branch}" do |channel, stream, data|
|
78
|
-
sha = data.strip
|
48
|
+
task :update, :except => { :no_release => true } do
|
49
|
+
transaction do
|
50
|
+
update_code
|
51
|
+
insert_tag
|
79
52
|
end
|
80
|
-
|
81
|
-
commands = []
|
82
|
-
commands << "cd #{current_path}"
|
83
|
-
commands << "echo '#{sha}' > REVISION"
|
84
|
-
commands << "echo '#{branch}' >> REVISION"
|
85
|
-
commands << "echo '#{logged_user}' >> REVISION"
|
86
|
-
commands << "echo '#{Time.now}' >> REVISION"
|
87
|
-
run commands.join ' && '
|
88
53
|
end
|
89
54
|
|
90
|
-
|
91
|
-
task :
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
55
|
+
desc "Update the deployed code"
|
56
|
+
task :update_code, :except => { :no_release => true } do
|
57
|
+
# If we are rolling back branch, then this is a commit
|
58
|
+
if rolling_back
|
59
|
+
branch_name = branch
|
60
|
+
else
|
61
|
+
branch_name = "origin/#{fetch :branch, 'master'}"
|
62
|
+
end
|
96
63
|
|
97
|
-
|
98
|
-
|
99
|
-
bundler = fetch :bundler, "bundler"
|
100
|
-
run "cd #{current_path}; #{bundler} install --deployment --without mac development test"
|
64
|
+
run "cd #{current_path} && git fetch" unless rolling_back
|
65
|
+
run "cd #{current_path} && git reset --hard #{branch_name}"
|
101
66
|
end
|
102
|
-
end
|
103
67
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
run "cat #{current_path}/REVISION" do |c, s, data|
|
108
|
-
data.strip.lines.each do |line|
|
109
|
-
puts "#{keys.pop}: #{line.strip}" if keys.any?
|
110
|
-
end
|
68
|
+
task :insert_tag, :except => { :no_release => true } do
|
69
|
+
timestamp = Time.now.strftime '%Y%m%d%H%M%S'
|
70
|
+
run "cd #{current_path}; git tag deploy_#{timestamp}" unless rolling_back
|
111
71
|
end
|
112
72
|
end
|
113
73
|
|
114
|
-
|
115
|
-
|
74
|
+
# launch bundle:install after update task if it's detected
|
75
|
+
# because it will not run with his standard behavior (before deploy:finalize_update)
|
76
|
+
# as we are using this custom git-style deployment procedure
|
77
|
+
after 'deploy:update', 'bundle:install' if find_task 'bundle:install'
|
@@ -0,0 +1,32 @@
|
|
1
|
+
set :revision_file, 'REVISION'
|
2
|
+
|
3
|
+
namespace :revision do
|
4
|
+
desc "Create a REVISION file containing the SHA of the deployed commit"
|
5
|
+
task :set, :except => { :no_release => true } do
|
6
|
+
# If for some reason we cannot find the commit sha, then we'll use the branch name
|
7
|
+
sha = "origin/#{branch}"
|
8
|
+
run "cd #{current_path}; git rev-parse origin/#{branch}" do |channel, stream, data|
|
9
|
+
sha = data.strip
|
10
|
+
end
|
11
|
+
|
12
|
+
commands = []
|
13
|
+
commands << "cd #{current_path}"
|
14
|
+
commands << "echo '#{sha}' > #{revision_file}"
|
15
|
+
commands << "echo '#{branch}' >> #{revision_file}"
|
16
|
+
commands << "echo '#{logged_user}' >> #{revision_file}"
|
17
|
+
commands << "echo '#{Time.now}' >> #{revision_file}"
|
18
|
+
run commands.join ' && '
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Get info about last deploy"
|
22
|
+
task :get do
|
23
|
+
keys = %w(SHA Branch Author Date).reverse
|
24
|
+
run "cat #{current_path}/#{revision_file}" do |c, s, data|
|
25
|
+
data.strip.lines.each do |line|
|
26
|
+
puts "#{keys.pop}: #{line.strip}" if keys.any?
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
after 'deploy:update_code', 'revision:set'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cap-git-deploy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
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: 2012-05-
|
12
|
+
date: 2012-05-31 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: capistrano
|
16
|
-
requirement: &
|
16
|
+
requirement: &70216834563020 !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: *70216834563020
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: grit
|
27
|
-
requirement: &
|
27
|
+
requirement: &70216834562600 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70216834562600
|
36
36
|
description: Mikamai-style deploy strategy
|
37
37
|
email:
|
38
38
|
- projects@mikamai.com
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- lib/cap-git-deploy.rb
|
48
48
|
- lib/cap-git-deploy/version.rb
|
49
49
|
- lib/recipes/fast-git-deploy.rb
|
50
|
+
- lib/recipes/git-revisioning.rb
|
50
51
|
homepage: http://www.mikamai.com
|
51
52
|
licenses: []
|
52
53
|
post_install_message:
|