caphub 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +98 -0
- data/Rakefile +1 -0
- data/bin/caphub +4 -0
- data/caphup.gemspec +20 -0
- data/lib/caphub/runner.rb +59 -0
- data/lib/caphub/version.rb +3 -0
- data/lib/caphub.rb +2 -0
- data/skeleton/.rvmrc +1 -0
- data/skeleton/Capfile +33 -0
- data/skeleton/Gemfile +10 -0
- data/skeleton/Gemfile.lock +0 -0
- data/skeleton/config/deploy/.gitkeep +0 -0
- data/skeleton/config/deploy.rb +39 -0
- data/skeleton/recipes/.gitkeep +0 -0
- metadata +79 -0
data/README.md
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
## Caphub
|
2
|
+
|
3
|
+
Generate centralized capistrano skeleton for multiple deployment.
|
4
|
+
|
5
|
+
## Caphub Concept
|
6
|
+
|
7
|
+
Main idea of caphub is separate deployment and application code. So instead of `capify` your each project create **one** caphub repository and put **all** configurations/recipes there.
|
8
|
+
|
9
|
+
Benefits:
|
10
|
+
|
11
|
+
* no deployment/application code mix.
|
12
|
+
* all deployment located in place.
|
13
|
+
* ability to deploy multiple projects
|
14
|
+
* deployment is not limited application deployment - deploy your system configurations too! (nginx/haproxy/etc configs)
|
15
|
+
* easy to share configurations/recipes among multiple deployment.
|
16
|
+
* uptodate synchronizing with remote repository (with capistrano-uptodate).
|
17
|
+
* generate layout with caphub or write it yourself from scratch with your own recipes
|
18
|
+
|
19
|
+
## Description
|
20
|
+
|
21
|
+
Caphub is simple generation tool that follows *caphub concept*.
|
22
|
+
|
23
|
+
Caphub generates similar layout that does usual `capify` command.
|
24
|
+
Core of caphub skeleton is [capistrano-multiconfig](https://github.com/railsware/capistrano-multiconfig) gem that allows to recursively build multiple configurations.
|
25
|
+
|
26
|
+
Another included gems are optional but might be useful:
|
27
|
+
|
28
|
+
* [capistrano_colors](https://github.com/stjernstrom/capistrano_colors)
|
29
|
+
* [capistrano-uptodate](https://github.com/railsware/capistrano-uptodate/README.md)
|
30
|
+
* [capistrano-patch](https://github.com/railsware/capistrano-patch/README.md)
|
31
|
+
* [capistrano-calendar](https://github.com/railsware/capistrano-calendar/README.md)
|
32
|
+
|
33
|
+
## Installation
|
34
|
+
|
35
|
+
$ gem install caphub
|
36
|
+
|
37
|
+
## Usage
|
38
|
+
|
39
|
+
Generate caphub layout:
|
40
|
+
|
41
|
+
$ cuphub my-deploy
|
42
|
+
|
43
|
+
Creating directory my-deploy
|
44
|
+
Creating capistrano skeleton in my-deploy
|
45
|
+
Initializating git repository in my-deploy
|
46
|
+
|
47
|
+
Layout example:
|
48
|
+
|
49
|
+
$ tree --dirsfirst my-deploy
|
50
|
+
my-deploy
|
51
|
+
├── config
|
52
|
+
│ ├── deploy
|
53
|
+
│ └── deploy.rb
|
54
|
+
├── recipes
|
55
|
+
├── Capfile
|
56
|
+
├── Gemfile
|
57
|
+
└── Gemfile.lock
|
58
|
+
|
59
|
+
Review gems into `Gemfile` and initialize gems:
|
60
|
+
|
61
|
+
$ bundle install
|
62
|
+
|
63
|
+
Push repository remote server:
|
64
|
+
|
65
|
+
git remote add origin your/remote/git/repo/url
|
66
|
+
git push -u origin master
|
67
|
+
|
68
|
+
### Configurations
|
69
|
+
|
70
|
+
Put own configuration in `config/deploy`.
|
71
|
+
|
72
|
+
E.g create `config/deploy/blog/production.rb` and it will be automatically available:
|
73
|
+
|
74
|
+
$ bundle exec cap -T
|
75
|
+
cap blog:production # Load blog:production configuration
|
76
|
+
|
77
|
+
Use any recipe with configuration task (similar to multistage extension). E.g:
|
78
|
+
|
79
|
+
$ bundle exec cap blog:production deploy:setup
|
80
|
+
|
81
|
+
### Recipes
|
82
|
+
|
83
|
+
Add gems that contains capistrano recipes to `Gemfile`.
|
84
|
+
|
85
|
+
Configure and require recipes into `Capfile`.
|
86
|
+
|
87
|
+
Put own recipes to `recipes` directory.
|
88
|
+
|
89
|
+
## References
|
90
|
+
|
91
|
+
* [capistrano](https://github.com/capistrano/capistrano)
|
92
|
+
* [capistrano-ext](https://github.com/capistrano/capistrano-ext)
|
93
|
+
* [capistrano_colors](https://github.com/stjernstrom/capistrano_colors)
|
94
|
+
* [capistrano-multiconfig](https://github.com/railsware/capistrano-multiconfig)
|
95
|
+
* [capistrano-uptodate](https://github.com/railsware/capistrano-uptodate/README.md)
|
96
|
+
* [capistrano-patch](https://github.com/railsware/capistrano-patch/README.md)
|
97
|
+
* [capistrano-calendar](https://github.com/railsware/capistrano-calendar/README.md)
|
98
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/caphub
ADDED
data/caphup.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "caphub/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "caphub"
|
7
|
+
s.version = Caphub::VERSION
|
8
|
+
s.authors = ["Andriy Yanko"]
|
9
|
+
s.email = ["andriy.yanko@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/railsware/caphub"
|
11
|
+
s.summary = %q{Generate centralized capistrano skeleton for multiple deployment}
|
12
|
+
s.description = %q{Generate centralized capistrano skeleton for multiple deployment}
|
13
|
+
|
14
|
+
s.rubyforge_project = "caphub"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Caphub
|
5
|
+
class Runner
|
6
|
+
class << self
|
7
|
+
def run
|
8
|
+
runner = new(ARGV)
|
9
|
+
runner.parse_options!
|
10
|
+
runner.run!
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(args)
|
15
|
+
@args = args.dup
|
16
|
+
@options = {}
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :options
|
20
|
+
|
21
|
+
def parse_options!
|
22
|
+
OptionParser.new do |opts|
|
23
|
+
opts.banner = "Usage: #{File.basename($0)} [path]"
|
24
|
+
opts.on_tail("-h", "--help", "Show this message") { puts opts; exit }
|
25
|
+
opts.on_tail('-v', '--version', "Show version") { puts Caphub::VERSION; exit }
|
26
|
+
|
27
|
+
begin
|
28
|
+
opts.parse!(ARGV)
|
29
|
+
rescue OptionParser::ParseError => e
|
30
|
+
warn e.message
|
31
|
+
puts opts
|
32
|
+
exit 1
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
abort "Please specify the directory for capistrano hub" if @args.empty?
|
37
|
+
abort "'#{@args.first}' exists." if File.exists?(@args.first)
|
38
|
+
|
39
|
+
@options[:target] = @args.first
|
40
|
+
end
|
41
|
+
|
42
|
+
def skeleton_dir
|
43
|
+
File.expand_path('../../../skeleton', __FILE__)
|
44
|
+
end
|
45
|
+
|
46
|
+
def run!
|
47
|
+
target = options[:target]
|
48
|
+
|
49
|
+
puts "Creating directory #{target}"
|
50
|
+
FileUtils.mkdir(target)
|
51
|
+
|
52
|
+
puts "Creating capistrano skeleton in #{target}"
|
53
|
+
FileUtils.cp_r("#{skeleton_dir}/.", target)
|
54
|
+
|
55
|
+
puts "Initializating git repository in #{target}"
|
56
|
+
Dir.chdir(target) { `git init`; `git add .` }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/lib/caphub.rb
ADDED
data/skeleton/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm ruby-1.8.7
|
data/skeleton/Capfile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
#
|
2
|
+
# Load deploy capistrano recipe
|
3
|
+
#
|
4
|
+
load 'deploy'
|
5
|
+
|
6
|
+
#
|
7
|
+
# Configure libraries/recipes from Gemfile
|
8
|
+
#
|
9
|
+
|
10
|
+
# https://github.com/stjernstrom/capistrano_colors/README.rdoc
|
11
|
+
require 'capistrano_colors'
|
12
|
+
|
13
|
+
# https://github.com/railsware/capistrano-multiconfig/README.md
|
14
|
+
require 'capistrano/multiconfig'
|
15
|
+
|
16
|
+
# https://github.com/railsware/capistrano-uptodate/README.md
|
17
|
+
require 'capistrano/uptodate'
|
18
|
+
|
19
|
+
# https://github.com/railsware/capistrano-patch/README.md
|
20
|
+
require 'capistrano/patch'
|
21
|
+
|
22
|
+
# https://github.com/railsware/capistrano-calendar/README.md
|
23
|
+
require 'capistrano/calendar'
|
24
|
+
|
25
|
+
#
|
26
|
+
# Load all custom recipes
|
27
|
+
#
|
28
|
+
Dir['recipes/**/*.rb'].each { |recipe| load(recipe) }
|
29
|
+
|
30
|
+
# Load main configuration
|
31
|
+
load 'config/deploy'
|
32
|
+
|
33
|
+
# vim syntax=ruby
|
data/skeleton/Gemfile
ADDED
File without changes
|
File without changes
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#
|
2
|
+
# Put here shared configuration shared among all children
|
3
|
+
#
|
4
|
+
# Read more about configurations:
|
5
|
+
# https://github.com/railsware/capistrano-multiconfig/README.md
|
6
|
+
|
7
|
+
# Configuration example for layout like:
|
8
|
+
# config/deploy/{NAMESPACE}/.../#{PROJECT_NAME}/{STAGE_NAME}.rb
|
9
|
+
|
10
|
+
set :scm, :git
|
11
|
+
|
12
|
+
set :git_shallow_clone, 1
|
13
|
+
|
14
|
+
set :deploy_via, :export
|
15
|
+
|
16
|
+
set :branch, lambda { Capistrano::CLI.ui.ask "SCM branch: " }
|
17
|
+
|
18
|
+
set(:application) { config_name.split(':').reverse[1] }
|
19
|
+
|
20
|
+
set(:stage) { config_name.split(':').last }
|
21
|
+
|
22
|
+
set(:rails_env) { stage }
|
23
|
+
|
24
|
+
set(:rake) { use_bundle ? "bundle exec rake" : "rake" }
|
25
|
+
|
26
|
+
set(:repository) { "git://scm.mycompany.com/#{application}.git" }
|
27
|
+
|
28
|
+
set(:deploy_to) { "/var/www/#{application}" }
|
29
|
+
|
30
|
+
set :calendar_username, 'vasya.pupkin@gmail.com'
|
31
|
+
|
32
|
+
set :calendar_password, 'qwery123456'
|
33
|
+
|
34
|
+
set(:calendar_name) { "mycompany-#{stage}" }
|
35
|
+
|
36
|
+
after 'deploy' do
|
37
|
+
set :calendar_event_title, "[DEPLOYED] #{application} #{branch}: #{real_revision}"
|
38
|
+
top.calendar.create_event
|
39
|
+
end
|
File without changes
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: caphub
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Andriy Yanko
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-11-04 00:00:00 Z
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: Generate centralized capistrano skeleton for multiple deployment
|
22
|
+
email:
|
23
|
+
- andriy.yanko@gmail.com
|
24
|
+
executables:
|
25
|
+
- caphub
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files: []
|
29
|
+
|
30
|
+
files:
|
31
|
+
- README.md
|
32
|
+
- Rakefile
|
33
|
+
- bin/caphub
|
34
|
+
- caphup.gemspec
|
35
|
+
- lib/caphub.rb
|
36
|
+
- lib/caphub/runner.rb
|
37
|
+
- lib/caphub/version.rb
|
38
|
+
- skeleton/.rvmrc
|
39
|
+
- skeleton/Capfile
|
40
|
+
- skeleton/Gemfile
|
41
|
+
- skeleton/Gemfile.lock
|
42
|
+
- skeleton/config/deploy.rb
|
43
|
+
- skeleton/config/deploy/.gitkeep
|
44
|
+
- skeleton/recipes/.gitkeep
|
45
|
+
homepage: https://github.com/railsware/caphub
|
46
|
+
licenses: []
|
47
|
+
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
|
51
|
+
require_paths:
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 3
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
hash: 3
|
68
|
+
segments:
|
69
|
+
- 0
|
70
|
+
version: "0"
|
71
|
+
requirements: []
|
72
|
+
|
73
|
+
rubyforge_project: caphub
|
74
|
+
rubygems_version: 1.8.6
|
75
|
+
signing_key:
|
76
|
+
specification_version: 3
|
77
|
+
summary: Generate centralized capistrano skeleton for multiple deployment
|
78
|
+
test_files: []
|
79
|
+
|