baboon 1.0.8 → 1.0.9
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/baboon.rb +4 -17
- data/lib/baboon/cli.rb +61 -129
- data/lib/baboon/exception.rb +10 -0
- data/lib/baboon/instructions/rails.rb +7 -0
- data/lib/baboon/util.rb +33 -0
- data/lib/baboon/version.rb +1 -1
- data/lib/generators/baboon/install/install_generator.rb +4 -7
- data/lib/generators/baboon/install/templates/baboon.yml +52 -0
- data/spec/spec_helper.rb +0 -2
- metadata +8 -5
- data/lib/generators/baboon/install/templates/baboon.rb +0 -9
data/lib/baboon.rb
CHANGED
@@ -4,23 +4,10 @@
|
|
4
4
|
# are persisted throughout the entire Baboon configuration and as well
|
5
5
|
# as the config initializer baboon.rb file that is generated in the
|
6
6
|
# standing Rails application.
|
7
|
-
|
8
|
-
#
|
9
|
-
|
10
|
-
|
11
|
-
# option[:deploy_user] String/Symbol => The user baboon will be authenticating with on the server. Should have your key stored for optimal authentication.
|
12
|
-
# option[:branch] String/Symbol => The branch on your repository baboon will be pulling from.
|
13
|
-
# option[:rails_env] String/Symbol => For rake tasks to be run properly on your server, baboon needs to know what env it will be running on your server.
|
14
|
-
# option[:server] Array[String] => This will be an array of ip addresses of the servers baboon will deploy to.
|
15
|
-
BABOON_CONFIGURATION_OPTIONS = [
|
16
|
-
:application, # => This will be the name of the Application - not the directory
|
17
|
-
:repository, # => This will be the :scm of the repository the application will be cloning
|
18
|
-
:deploy_path, # => This will be the actual deploy path of the application, should have /home/#{user}/app
|
19
|
-
:deploy_user, # => This will be the user the system will authenticate with to do the deploy, should have sudo
|
20
|
-
:branch, # => Branch we will be cloning from on GIT
|
21
|
-
:rails_env, # => The rails environment the sever will be running
|
22
|
-
:servers # => An array of servers baboon will push to
|
23
|
-
]
|
7
|
+
|
8
|
+
# Nicely formatted output of the Baboon title
|
9
|
+
BABOON_TITLE = "\033[22;31mB\033[22;35ma\033[22;36mb\033[22;32mo\033[01;31mo\033[01;33mn\033[22;37m"
|
10
|
+
BABOON_ENVIRONMENT_SETTINGS = ['branch', 'deploy_path', 'deploy_user', 'rails_env', 'servers']
|
24
11
|
|
25
12
|
require 'baboon/configuration'
|
26
13
|
require 'baboon/cli'
|
data/lib/baboon/cli.rb
CHANGED
@@ -1,87 +1,18 @@
|
|
1
1
|
require 'baboon'
|
2
2
|
require 'baboon/configuration'
|
3
|
-
require 'baboon/
|
3
|
+
require 'baboon/util'
|
4
4
|
|
5
5
|
require 'find'
|
6
6
|
require 'net/ssh'
|
7
7
|
require 'thor'
|
8
|
+
require 'yaml'
|
8
9
|
|
9
|
-
module Baboon
|
10
|
-
class Error
|
11
|
-
class << self
|
12
|
-
# stop
|
13
|
-
# @param:
|
14
|
-
# @return: StandardError class, will halt execution of program
|
15
|
-
def stop reason
|
16
|
-
raise StandardError, reason
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class Util
|
22
|
-
class << self
|
23
|
-
# file_check!
|
24
|
-
# @param: String file path
|
25
|
-
# @return: Boolean || String depending on if file is found
|
26
|
-
def file_check! file
|
27
|
-
return false if file.nil? || !file
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
# locate_file
|
32
|
-
# Will try and locate the baboon.rb file it it does not exist. Great method
|
33
|
-
# used especially for testing Baboon.
|
34
|
-
# @param:
|
35
|
-
# @return: String[file path, used to locate and initialize the configuration file]
|
36
|
-
def locate_file
|
37
|
-
config_file = ''
|
38
|
-
default_baboon_file_path = "config/initializers/baboon.rb"
|
39
|
-
if File.exists?(default_baboon_file_path)
|
40
|
-
config_file = default_baboon_file_path
|
41
|
-
else
|
42
|
-
Find.find('.') do |path|
|
43
|
-
if path.include?('baboon.rb')
|
44
|
-
next unless File.open(path, &:readline).include?('Baboon.configure do |config|')
|
45
|
-
config_file = path
|
46
|
-
break
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
config_file
|
51
|
-
end
|
52
|
-
|
53
|
-
# read_configuration
|
54
|
-
# This will attempt to read the configuration file, only need until after the file
|
55
|
-
# is found in the application.
|
56
|
-
# @param: String[file path, relative to the directory of the configuration]
|
57
|
-
# @return: Hash[configuration options in the config file, use these to set Baboon.configuration]
|
58
|
-
def read_configuration(file)
|
59
|
-
configuration = []
|
60
|
-
line_number = 0
|
61
|
-
text = File.open(file).read
|
62
|
-
text.gsub!(/\r\n?/, '\n')
|
63
|
-
|
64
|
-
text.each_line do |line|
|
65
|
-
next if line.include?('Baboon.configure')
|
66
|
-
next if line.include?('end')
|
67
|
-
line.gsub!(/^(.*)\s=\s/, '')
|
68
|
-
line.gsub!('\'', '')
|
69
|
-
line.strip!
|
70
|
-
|
71
|
-
configuration << { BABOON_CONFIGURATION_OPTIONS[line_number] => line }
|
72
|
-
line_number += 1
|
73
|
-
end
|
74
|
-
|
75
|
-
return configuration.reduce({}, :merge)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
10
|
+
module Baboon
|
80
11
|
class Cli < Thor
|
81
12
|
# @logger: call an instance of the logger class, use throughout baboon
|
82
13
|
# @configuration: holds the default baboon configuration set in config file
|
83
14
|
# @configuration_file: the exact file location of baboon configuration
|
84
|
-
attr_accessor :
|
15
|
+
attr_accessor :configuration, :configuration_file, :stop
|
85
16
|
|
86
17
|
# initialize
|
87
18
|
# @param: Array
|
@@ -89,92 +20,93 @@ module Baboon
|
|
89
20
|
def initialize(*args)
|
90
21
|
super
|
91
22
|
$stdout.sync ||= true
|
92
|
-
|
23
|
+
|
24
|
+
# Set our yaml engine
|
25
|
+
YAML::ENGINE.yamler = 'syck'
|
93
26
|
|
94
27
|
# Attempt to locate the configuration file in the project if it was not set.
|
95
28
|
@configuration_file = Util.locate_file
|
96
29
|
|
97
30
|
# Return if file not found
|
98
31
|
if @configuration_file.nil? || @configuration_file == ''
|
99
|
-
printf "
|
100
|
-
printf " \033[22;31mError:\033[22;37m no configuration file is present anywhere in the application or at config/
|
32
|
+
printf "#{BABOON_TITLE}\n"
|
33
|
+
printf " \033[22;31mError:\033[22;37m no configuration file is present anywhere in the application or at config/baboon.yml\n"
|
101
34
|
printf " \033[01;32mUsage:\033[22;37m rails g baboon:install\n"
|
102
|
-
@
|
35
|
+
@stop = true
|
103
36
|
return
|
104
37
|
end
|
105
38
|
|
106
|
-
# Load the
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
@block = true
|
125
|
-
return
|
39
|
+
# Load the file now that we know its not nil
|
40
|
+
@configuration = YAML.load_file(@configuration_file)
|
41
|
+
|
42
|
+
# Double check that configuration is setup properly
|
43
|
+
if @configuration['baboon'].has_key?('environments')
|
44
|
+
@configuration['baboon']['environments'].map do |environment|
|
45
|
+
hash = Hash[*environment]
|
46
|
+
key = hash.keys.first
|
47
|
+
|
48
|
+
# Must have all defined keys filled out
|
49
|
+
unless BABOON_ENVIRONMENT_SETTINGS.collect { |k| hash[key].has_key?(k) }.all?
|
50
|
+
printf "#{BABOON_TITLE}\n"
|
51
|
+
printf " \033[22;31mError:\033[22;37m incorrect settings for the \"#{key}\" in config/baboon.yml\n"
|
52
|
+
printf " \033[01;32mUsage:\033[22;37m rails g baboon:install\n"
|
53
|
+
@stop = true
|
54
|
+
return
|
55
|
+
end
|
56
|
+
end
|
126
57
|
end
|
127
58
|
end
|
128
59
|
|
129
|
-
desc "deploy", "Deploys the application to the configured servers."
|
130
|
-
def deploy
|
131
|
-
return if @
|
132
|
-
printf @logger.format("== Baboon starting deploy", "32", 1)
|
60
|
+
desc "deploy ENVIRONMENT", "Deploys the application to the configured servers."
|
61
|
+
def deploy environment
|
62
|
+
return if @stop
|
133
63
|
|
134
|
-
#
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
printf
|
64
|
+
# Double checked the user typed the correct key
|
65
|
+
unless @configuration['baboon']['environments'].has_key?(environment)
|
66
|
+
printf "#{BABOON_TITLE}\n"
|
67
|
+
printf " \033[22;31mError:\033[22;37m looks like you typed an incorrect key for an environment you specified in your baboon.yml file\n"
|
68
|
+
printf " \033[01;32mUsage:\033[22;37m try one of these #{@configuration['baboon']['environments'].keys}\n"
|
69
|
+
@stop = true
|
70
|
+
return
|
71
|
+
end
|
72
|
+
|
73
|
+
# Get the current config for this environment
|
74
|
+
current_environment_configuration = @configuration['baboon']['environments'][environment]
|
75
|
+
|
76
|
+
# Loop through the servers
|
77
|
+
current_environment_configuration['servers'].each do |host|
|
78
|
+
printf "Deploying[#{host}]"
|
139
79
|
|
140
|
-
# Essentially these are the instructions we need run for the Ubuntu 11.04 for rails
|
141
80
|
# TODO: add lib of different instruction sets for Play framework, nodejs, etc
|
142
81
|
instructions = [
|
143
|
-
"cd '#{
|
144
|
-
"cd '#{
|
145
|
-
"cd '#{
|
146
|
-
"cd '#{
|
147
|
-
"cd '#{
|
82
|
+
"cd '#{current_environment_configuration['deploy_path']}' && git fetch",
|
83
|
+
"cd '#{current_environment_configuration['deploy_path']}' && git checkout #{current_environment_configuration['branch']}",
|
84
|
+
"cd '#{current_environment_configuration['deploy_path']}' && git merge origin/#{current_environment_configuration['branch']}",
|
85
|
+
"cd '#{current_environment_configuration['deploy_path']}' && bundle install --deployment",
|
86
|
+
"cd '#{current_environment_configuration['deploy_path']}' && touch tmp/restart.txt"
|
148
87
|
]
|
149
|
-
|
88
|
+
|
150
89
|
# Vars for connecting via ssh to the server
|
151
90
|
credentials = {
|
152
|
-
user:
|
153
|
-
host:
|
91
|
+
user: current_environment_configuration['deploy_user'],
|
92
|
+
host: host
|
154
93
|
}
|
155
|
-
|
94
|
+
|
95
|
+
# Start the connection and excute command
|
156
96
|
Net::SSH.start(credentials[:host], credentials[:user]) do |session|
|
157
97
|
instructions.each do |instruction|
|
158
|
-
printf "[#{
|
98
|
+
printf "[#{host}]: #{instruction}\n"
|
159
99
|
session.exec instruction
|
160
100
|
session.loop
|
161
101
|
end
|
162
102
|
end
|
163
|
-
end
|
164
|
-
|
165
|
-
printf @logger.format("== Baboon deploy Complete", "31", 1)
|
166
|
-
end
|
103
|
+
end
|
104
|
+
end # def deploy
|
167
105
|
|
168
106
|
desc "configuration", "Shows the current configuration for baboon."
|
169
107
|
def configuration
|
170
|
-
return if @
|
171
|
-
|
172
|
-
printf @logger.format("Baboon[Repository]: #{Baboon.configuration.repository}", "37", 1)
|
173
|
-
printf @logger.format("Baboon[Deploy_path]: #{Baboon.configuration.deploy_path}", "37", 1)
|
174
|
-
printf @logger.format("Baboon[Deploy_user]: #{Baboon.configuration.deploy_user}", "37", 1)
|
175
|
-
printf @logger.format("Baboon[Branch]: #{Baboon.configuration.branch}", "37", 1)
|
176
|
-
printf @logger.format("Baboon[Rails_env]: #{Baboon.configuration.rails_env}", "37", 1)
|
177
|
-
printf @logger.format("Baboon[Servers]: #{Baboon.configuration.servers}", "37", 1)
|
108
|
+
return if @stop
|
109
|
+
puts @configuration.inspect
|
178
110
|
end
|
179
111
|
end
|
180
112
|
end
|
data/lib/baboon/util.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module Baboon
|
2
|
+
class Util
|
3
|
+
class << self
|
4
|
+
# file_check!
|
5
|
+
# @param: String file path
|
6
|
+
# @return: Boolean || String depending on if file is found
|
7
|
+
def file_check! file
|
8
|
+
return false if file.nil? || !file
|
9
|
+
end
|
10
|
+
|
11
|
+
# locate_file
|
12
|
+
# Will try and locate the baboon.rb file it it does not exist. Great method
|
13
|
+
# used especially for testing Baboon.
|
14
|
+
# @param:
|
15
|
+
# @return: String[file path, used to locate and initialize the configuration file]
|
16
|
+
def locate_file
|
17
|
+
config_file = ''
|
18
|
+
default_baboon_file_path = "config/baboon.yml"
|
19
|
+
if File.exists?(default_baboon_file_path)
|
20
|
+
config_file = default_baboon_file_path
|
21
|
+
else
|
22
|
+
Find.find('.') do |path|
|
23
|
+
if path.include?('baboon.yml')
|
24
|
+
config_file = path
|
25
|
+
break
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
config_file
|
30
|
+
end
|
31
|
+
end # class << self
|
32
|
+
end # class Util
|
33
|
+
end # module Baboon
|
data/lib/baboon/version.rb
CHANGED
@@ -3,14 +3,11 @@ require 'rails/generators/base'
|
|
3
3
|
module Baboon
|
4
4
|
module Generators
|
5
5
|
class InstallGenerator < Rails::Generators::Base
|
6
|
-
desc 'Creates an initializer for Baboon at config/
|
7
|
-
|
8
|
-
|
9
|
-
@source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
10
|
-
end
|
11
|
-
|
6
|
+
desc 'Creates an initializer for Baboon at config/baboon.yml'
|
7
|
+
source_root File.expand_path('../templates', __FILE__)
|
8
|
+
|
12
9
|
def create_initializer_file
|
13
|
-
template
|
10
|
+
template 'baboon.yml', 'config/baboon.yml'
|
14
11
|
end
|
15
12
|
end
|
16
13
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
baboon:
|
2
|
+
# Give you application a descriptive name, has no effect on the actual
|
3
|
+
# running path or location of your application. Can be different then
|
4
|
+
# what is stored in your scm.
|
5
|
+
application: 'Vacuum HQ'
|
6
|
+
|
7
|
+
# For now, Baboon will determine what scm the remote code is stored in
|
8
|
+
# based on the scm path. For now, GIT and SVN are the two supported
|
9
|
+
# scm applications that are supported.
|
10
|
+
repository: 'git@github.com:amanelis/vacuum.git'
|
11
|
+
|
12
|
+
# Pass multiple environments in this section. When running a standard
|
13
|
+
# 'baboon deploy' all defined hosts here will be deployed to. You can
|
14
|
+
# specify which host you want to deploy to by typing that as a param
|
15
|
+
# in the command 'baboon deploy development'.
|
16
|
+
environments:
|
17
|
+
# Name each environment to your own standard. Baboon, will use the
|
18
|
+
# settings defined after the env to to the deploy.
|
19
|
+
staging:
|
20
|
+
# Branch that the baboon will merge code in from the remote scm
|
21
|
+
# baboon['repository'] url that is defined in this file.
|
22
|
+
branch: 'staging'
|
23
|
+
|
24
|
+
# This is the actual path on the server where the root of the
|
25
|
+
# application is stored, not where /public is in terms of a rails
|
26
|
+
# setup.
|
27
|
+
deploy_path: '/home/rails/vacuum'
|
28
|
+
|
29
|
+
# This is the actual user that baboon will use for SSH authentication
|
30
|
+
# into the servers that are defined here.
|
31
|
+
deploy_user: 'rails'
|
32
|
+
|
33
|
+
# Env that we will run all rake/bundler commands with.
|
34
|
+
rails_env: 'staging'
|
35
|
+
|
36
|
+
# These are the host machines that baboon will ssh into on each deploy.
|
37
|
+
# They can be defined as an ip address or a host name
|
38
|
+
servers:
|
39
|
+
- '127.0.0.1'
|
40
|
+
- '127.0.0.2'
|
41
|
+
|
42
|
+
# You can define as many different environments as needed to your application
|
43
|
+
production:
|
44
|
+
branch: 'production'
|
45
|
+
deploy_path: '/home/rails/vacuum'
|
46
|
+
deploy_user: 'rails'
|
47
|
+
rails_env: 'production'
|
48
|
+
servers:
|
49
|
+
- '10.0.0.1'
|
50
|
+
- '10.0.0.2'
|
51
|
+
- '10.0.0.3'
|
52
|
+
- 'production.node1.east.com'
|
data/spec/spec_helper.rb
CHANGED
@@ -11,8 +11,6 @@ Dir["spec/support/**/*.rb"].each { |f| require f }
|
|
11
11
|
PROJECT_ROOT = File.expand_path('../..', __FILE__)
|
12
12
|
$LOAD_PATH << File.join(PROJECT_ROOT, 'lib')
|
13
13
|
|
14
|
-
$:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
15
|
-
|
16
14
|
RSpec.configure do |config|
|
17
15
|
config.color_enabled = true
|
18
16
|
config.tty = true
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: baboon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-03-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
@@ -248,14 +248,17 @@ files:
|
|
248
248
|
- lib/baboon/cli/options.rb
|
249
249
|
- lib/baboon/cli.rb
|
250
250
|
- lib/baboon/configuration.rb
|
251
|
+
- lib/baboon/exception.rb
|
252
|
+
- lib/baboon/instructions/rails.rb
|
251
253
|
- lib/baboon/logger.rb
|
254
|
+
- lib/baboon/util.rb
|
252
255
|
- lib/baboon/version.rb
|
253
256
|
- lib/baboon.rb
|
254
257
|
- lib/core_ext/string.rb
|
255
258
|
- lib/generators/baboon/config/config_generator.rb
|
256
259
|
- lib/generators/baboon/config/templates/baboon.yml
|
257
260
|
- lib/generators/baboon/install/install_generator.rb
|
258
|
-
- lib/generators/baboon/install/templates/baboon.
|
261
|
+
- lib/generators/baboon/install/templates/baboon.yml
|
259
262
|
- spec/lib/baboon/cli_spec.rb
|
260
263
|
- spec/lib/baboon/configuration_spec.rb
|
261
264
|
- spec/lib/baboon_spec.rb
|
@@ -277,7 +280,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
277
280
|
version: '0'
|
278
281
|
segments:
|
279
282
|
- 0
|
280
|
-
hash:
|
283
|
+
hash: 1179810549053676199
|
281
284
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
282
285
|
none: false
|
283
286
|
requirements:
|
@@ -286,7 +289,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
286
289
|
version: '0'
|
287
290
|
segments:
|
288
291
|
- 0
|
289
|
-
hash:
|
292
|
+
hash: 1179810549053676199
|
290
293
|
requirements: []
|
291
294
|
rubyforge_project: baboon
|
292
295
|
rubygems_version: 1.8.24
|
@@ -1,9 +0,0 @@
|
|
1
|
-
Baboon.configure do |config|
|
2
|
-
config.application = 'NAME OF YOUR APPLICATION'
|
3
|
-
config.repository = 'git@github.com:{some-project}.git'
|
4
|
-
config.deploy_path = '{path_to_application_on_server}'
|
5
|
-
config.deploy_user = 'rails'
|
6
|
-
config.branch = 'master'
|
7
|
-
config.rails_env = 'production'
|
8
|
-
config.servers = ['server_1', 'server_2']
|
9
|
-
end
|