gitpusshuten 0.0.1
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/.bundle/config +2 -0
- data/.gitignore +4 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +53 -0
- data/README.md +7 -0
- data/bin/gitpusshuten +4 -0
- data/bin/heavenly +4 -0
- data/bin/ten +4 -0
- data/gitpusshuten.gemspec +26 -0
- data/lib/gitpusshuten/cli.rb +78 -0
- data/lib/gitpusshuten/command.rb +147 -0
- data/lib/gitpusshuten/commands/base.rb +246 -0
- data/lib/gitpusshuten/commands/delete.rb +27 -0
- data/lib/gitpusshuten/commands/help.rb +36 -0
- data/lib/gitpusshuten/commands/initialize.rb +61 -0
- data/lib/gitpusshuten/commands/push.rb +54 -0
- data/lib/gitpusshuten/commands/remote.rb +29 -0
- data/lib/gitpusshuten/commands/user.rb +252 -0
- data/lib/gitpusshuten/commands/version.rb +21 -0
- data/lib/gitpusshuten/configuration.rb +122 -0
- data/lib/gitpusshuten/environment.rb +70 -0
- data/lib/gitpusshuten/gem.rb +33 -0
- data/lib/gitpusshuten/git.rb +111 -0
- data/lib/gitpusshuten/helpers/environment/installers.rb +59 -0
- data/lib/gitpusshuten/helpers/environment/packages.rb +21 -0
- data/lib/gitpusshuten/helpers/environment/scp.rb +57 -0
- data/lib/gitpusshuten/helpers/environment/ssh.rb +77 -0
- data/lib/gitpusshuten/helpers/environment/ssh_key.rb +79 -0
- data/lib/gitpusshuten/helpers/environment/user.rb +70 -0
- data/lib/gitpusshuten/helpers/spinner.rb +98 -0
- data/lib/gitpusshuten/hook.rb +26 -0
- data/lib/gitpusshuten/hooks.rb +147 -0
- data/lib/gitpusshuten/initializer.rb +95 -0
- data/lib/gitpusshuten/local.rb +35 -0
- data/lib/gitpusshuten/log.rb +83 -0
- data/lib/gitpusshuten/modules/active_record/hooks.rb +19 -0
- data/lib/gitpusshuten/modules/apache/command.rb +354 -0
- data/lib/gitpusshuten/modules/bundler/command.rb +43 -0
- data/lib/gitpusshuten/modules/bundler/hooks.rb +8 -0
- data/lib/gitpusshuten/modules/mysql/command.rb +192 -0
- data/lib/gitpusshuten/modules/nanoc/hooks.rb +9 -0
- data/lib/gitpusshuten/modules/nginx/command.rb +447 -0
- data/lib/gitpusshuten/modules/passenger/command.rb +310 -0
- data/lib/gitpusshuten/modules/passenger/hooks.rb +4 -0
- data/lib/gitpusshuten/modules/rvm/command.rb +277 -0
- data/lib/gitpusshuten.rb +21 -0
- data/lib/templates/config.rb +37 -0
- data/lib/templates/hooks.rb +40 -0
- data/spec/cli_spec.rb +83 -0
- data/spec/command_spec.rb +76 -0
- data/spec/configuration_spec.rb +45 -0
- data/spec/environment_spec.rb +64 -0
- data/spec/fixtures/combined_hooks.rb +23 -0
- data/spec/fixtures/config.rb +23 -0
- data/spec/fixtures/hooks.rb +37 -0
- data/spec/fixtures/passenger.json +1 -0
- data/spec/gem_spec.rb +28 -0
- data/spec/git_spec.rb +59 -0
- data/spec/gitpusshuten_spec.rb +9 -0
- data/spec/hook_spec.rb +48 -0
- data/spec/hooks_spec.rb +150 -0
- data/spec/initializer_spec.rb +26 -0
- data/spec/log_spec.rb +20 -0
- data/spec/spec_helper.rb +43 -0
- metadata +220 -0
@@ -0,0 +1,61 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module GitPusshuTen
|
3
|
+
module Commands
|
4
|
+
class Initialize < GitPusshuTen::Commands::Base
|
5
|
+
description "Initializes Git Pusshu Ten (プッシュ点) with the working directory."
|
6
|
+
usage "initialize"
|
7
|
+
example "heavenly initialize # Initializes Git Pusshu Ten (プッシュ点) with the working directory."
|
8
|
+
|
9
|
+
##
|
10
|
+
# Initialize specific attributes/arguments
|
11
|
+
attr_accessor :working_directory
|
12
|
+
|
13
|
+
##
|
14
|
+
# Incase template files already exist
|
15
|
+
attr_accessor :confirm_perform
|
16
|
+
|
17
|
+
def initialize(*objects)
|
18
|
+
super
|
19
|
+
|
20
|
+
@working_directory = Dir.pwd
|
21
|
+
@confirm_perform = true
|
22
|
+
end
|
23
|
+
|
24
|
+
##
|
25
|
+
# Performs the Initialize command
|
26
|
+
def perform!
|
27
|
+
message "Would you like to initialize Git Pusshu Ten (プッシュ点) with #{working_directory}?"
|
28
|
+
if yes?
|
29
|
+
copy_templates!
|
30
|
+
if not git.initialized?
|
31
|
+
git.initialize!
|
32
|
+
end
|
33
|
+
git.ignore!
|
34
|
+
else
|
35
|
+
message "If you wish to initialize it elsewhere, please move into that directory and run #{y("heavenly initialize")} again."
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# Copies the "config.rb" and "hooks.rb" templates over
|
41
|
+
# to the .gitpusshuten inside the working directory
|
42
|
+
def copy_templates!
|
43
|
+
if File.directory?(File.join(working_directory, '.gitpusshuten'))
|
44
|
+
warning "Git Pusshu Ten (プッシュ点) is already initialized in #{y(working_directory)}."
|
45
|
+
warning "Re-initializing it will cause it to overwrite the current #{y("config.rb")} and #{y("hooks.rb")} files."
|
46
|
+
warning "Are you sure you wish to continue?"
|
47
|
+
@confirm_perform = yes?
|
48
|
+
end
|
49
|
+
|
50
|
+
if confirm_perform
|
51
|
+
local.execute("mkdir -p '#{working_directory}/.gitpusshuten'")
|
52
|
+
Dir[File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'templates', '*.rb'))].each do |template|
|
53
|
+
local.execute("cp '#{template}' '#{working_directory}/.gitpusshuten/#{template.split('/').last}'")
|
54
|
+
end
|
55
|
+
message "Git Pusshu Ten (プッシュ点) initialized in: #{y(working_directory)}!"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module GitPusshuTen
|
2
|
+
module Commands
|
3
|
+
class Push < GitPusshuTen::Commands::Base
|
4
|
+
description "Pushes a branch, tag or ref to the specified environment."
|
5
|
+
usage "push <command> <type> to <environment>"
|
6
|
+
example "heavenly push branch develop to staging # Pushes the specified branch to the staging environment."
|
7
|
+
example "heavenly push tag 1.0.3 to staging # Pushes the specified tag to the staging environment."
|
8
|
+
example "heavenly push ref 2dbec02aa0b8604b8512e2fcbb8aac582c7f6a73 to production # Pushes the specified ref to the production environment."
|
9
|
+
|
10
|
+
attr_accessor :type
|
11
|
+
|
12
|
+
def initialize(*objects)
|
13
|
+
super
|
14
|
+
perform_hooks!
|
15
|
+
|
16
|
+
@command = cli.arguments.shift
|
17
|
+
@type = cli.arguments.shift
|
18
|
+
|
19
|
+
help if type.nil? or e.name.nil?
|
20
|
+
|
21
|
+
set_remote!
|
22
|
+
end
|
23
|
+
|
24
|
+
##
|
25
|
+
# Pushes the specified branch to the remote environment.
|
26
|
+
def perform_branch!
|
27
|
+
message "Pushing branch #{y(type)} to the #{y(e.name)} environment."
|
28
|
+
git.push(:branch, type).to(e.name)
|
29
|
+
end
|
30
|
+
|
31
|
+
##
|
32
|
+
# Pushes the specified tag to the remote environment.
|
33
|
+
def perform_tag!
|
34
|
+
message "Pushing tag #{y(type)} to the #{y(e.name)} environment."
|
35
|
+
git.push(:tag, type).to(e.name)
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# Pushes the specified ref to the remote environment.
|
40
|
+
def perform_ref!
|
41
|
+
message "Pushing ref #{y(type)} to the #{y(e.name)} environment."
|
42
|
+
git.push(:ref, type).to(e.name)
|
43
|
+
end
|
44
|
+
|
45
|
+
##
|
46
|
+
# Adds the remote
|
47
|
+
def set_remote!
|
48
|
+
git.remove_remote(e.name) if git.has_remote?(e.name)
|
49
|
+
git.add_remote(e.name, "ssh://#{c.user}@#{c.ip}:#{c.port}/#{e.app_dir}")
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module GitPusshuTen
|
2
|
+
module Commands
|
3
|
+
class Remote < GitPusshuTen::Commands::Base
|
4
|
+
description "Performs a command on the remote server for the specified environment from the application root."
|
5
|
+
usage "remote command on <environment> '<command>'"
|
6
|
+
example "heavenly remote command on staging 'cat log/production.log' # Invokes 'cat log/production.log' in the staging environment."
|
7
|
+
example "heavenly remote command on production 'mkdir tmp; touch tmp/restart.txt' # Invokes 'mkdir tmp; touch tmp/restart.txt' in the production environment."
|
8
|
+
|
9
|
+
attr_accessor :command_to_execute
|
10
|
+
|
11
|
+
def initialize(*objects)
|
12
|
+
super
|
13
|
+
|
14
|
+
@command = cli.arguments.shift if cli.arguments.any?
|
15
|
+
@command_to_execute = cli.arguments.join(' ') if cli.arguments.any?
|
16
|
+
|
17
|
+
help if command.nil? or command_to_execute.nil? or e.name.nil?
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# Performs a unix command on the remote server
|
22
|
+
def perform_command!
|
23
|
+
message "Performing command on #{y(c.application)} (#{y(e.name)}) at #{y(c.ip)}!"
|
24
|
+
puts e.execute_as_user("cd #{e.app_dir}; #{command_to_execute}")
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,252 @@
|
|
1
|
+
module GitPusshuTen
|
2
|
+
module Commands
|
3
|
+
class User < GitPusshuTen::Commands::Base
|
4
|
+
description "Interacts with users, based on the <app_root>/.gitpusshuten/config.rb file."
|
5
|
+
usage "user <command> (to|for|from|on) <environment>"
|
6
|
+
example "heavenly user add to production # Sets up the user on the remote server for production."
|
7
|
+
example "heavenly user reconfigure for production # Reconfigures the user without removing applications."
|
8
|
+
example "heavenly user remove from production # Removes the user and all it's applications."
|
9
|
+
example "heavenly user install-ssh-key to staging # Installs your ssh key on the server for the user."
|
10
|
+
example "heavenly user install-root-ssh-key to staging # Installs your ssh key on the server for the root user."
|
11
|
+
example "$(heavenly user login to staging) # Logs the user in to the staging environment as user."
|
12
|
+
example "$(heavenly user login-root to production) # Logs the user in to the production environment as root."
|
13
|
+
|
14
|
+
def initialize(*objects)
|
15
|
+
super
|
16
|
+
|
17
|
+
@command = cli.arguments.shift
|
18
|
+
|
19
|
+
help if command.nil? or e.name.nil?
|
20
|
+
|
21
|
+
@command = command.underscore
|
22
|
+
end
|
23
|
+
|
24
|
+
##
|
25
|
+
# Sets up a new UNIX user and configures it based on the .gitpusshuten/config.rb
|
26
|
+
def perform_add!
|
27
|
+
if not e.user_exists? # prompts root
|
28
|
+
ensure_git_installed!
|
29
|
+
message "It looks like #{y(c.user)} does not yet exist."
|
30
|
+
message "Would you like to add #{y(c.user)} to #{y(c.application)} (#{y(c.ip)})?"
|
31
|
+
if yes?
|
32
|
+
message "Adding #{y(c.user)} to #{y(c.ip)}.."
|
33
|
+
if e.add_user!
|
34
|
+
message "Successfully added #{y(c.user)} to #{y(c.application)} (#{y(c.ip)})!"
|
35
|
+
else
|
36
|
+
error "Failed to add user #{y(c.user)} to #{y(c.application)} (#{y(c.ip)})."
|
37
|
+
error "An error occurred. Is your configuration file properly configured?"
|
38
|
+
exit
|
39
|
+
end
|
40
|
+
end
|
41
|
+
else
|
42
|
+
error "User #{y(c.user)} already exists."
|
43
|
+
error "If you want to remove this user, run the following command:"
|
44
|
+
standard "\n\s\s#{y("heavenly user remove from #{e.name}")}\n\n"
|
45
|
+
error "If you just want to reconfigure the user without removing it, run the following ommand:"
|
46
|
+
standard "\n\s\s#{(y("heavenly user reconfigure for #{e.name}"))}"
|
47
|
+
exit
|
48
|
+
end
|
49
|
+
|
50
|
+
##
|
51
|
+
# Configures the user
|
52
|
+
configure_user!
|
53
|
+
|
54
|
+
##
|
55
|
+
# Finished adding user!
|
56
|
+
message "Finished adding and configuring #{y(c.user)}!"
|
57
|
+
message "You should now be able to push your application to #{y(c.application)} at #{y(c.ip)}."
|
58
|
+
end
|
59
|
+
|
60
|
+
##
|
61
|
+
# Removes the user and home directory
|
62
|
+
def perform_remove!
|
63
|
+
if e.user_exists?
|
64
|
+
warning "Are you #{y('SURE')} you want to remove #{y(c.user)}?"
|
65
|
+
warning "Doing so will also remove #{y(e.home_dir)}, in which the #{y('applications')} of #{y(c.user)} are."
|
66
|
+
if yes?
|
67
|
+
warning "Are you #{y('REALLY')} sure?"
|
68
|
+
if yes?
|
69
|
+
message "Removing user #{y(c.user)} from #{y(c.ip)}."
|
70
|
+
if e.remove_user!
|
71
|
+
e.execute_as_root("rm -rf '#{e.home_dir}'")
|
72
|
+
message "User #{y(c.user)} has been removed from #{y(c.ip)}."
|
73
|
+
else
|
74
|
+
error "Failed to remove user #{y(c.user)} from #{y(c.ip)}."
|
75
|
+
error "An error occurred. Is your configuration file properly configured?"
|
76
|
+
exit
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
else
|
81
|
+
error "User #{y(c.user)} does not exist at #{y(c.ip)}."
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
##
|
86
|
+
# Reconfigures the user without removing it or any applications
|
87
|
+
def perform_reconfigure!
|
88
|
+
if e.user_exists? # prompts root
|
89
|
+
configure_user!
|
90
|
+
else
|
91
|
+
error "User #{y(c.user)} does not exist at #{y(c.ip)}."
|
92
|
+
error "If you want to add #{y(c.user)}, run the following command:"
|
93
|
+
standard "\n\s\s#{y("heavenly user add to #{e.name}")}"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
##
|
98
|
+
# Returns a string which can be used to login the user
|
99
|
+
def perform_login!
|
100
|
+
if not e.user_exists?
|
101
|
+
error "Cannot login, #{y(c.user)} does not exist."
|
102
|
+
exit
|
103
|
+
end
|
104
|
+
|
105
|
+
puts "ssh #{c.user}@#{c.ip} -p #{c.port}"
|
106
|
+
end
|
107
|
+
|
108
|
+
##
|
109
|
+
# Returns a string which can be used to login as root
|
110
|
+
def perform_login_root!
|
111
|
+
puts "ssh root@#{c.ip} -p #{c.port}"
|
112
|
+
end
|
113
|
+
|
114
|
+
##
|
115
|
+
# Installs the ssh key for the application user
|
116
|
+
def perform_install_ssh_key!
|
117
|
+
unless e.has_ssh_key?
|
118
|
+
error "Could not find ssh key in #{y(e.ssh_key_path)}"
|
119
|
+
error "To create one, run: #{y('ssh-keygen -t rsa')}"
|
120
|
+
exit
|
121
|
+
end
|
122
|
+
|
123
|
+
unless e.ssh_key_installed? # prompts root
|
124
|
+
Spinner.return :message => "Installing SSH Key.." do
|
125
|
+
e.install_ssh_key!
|
126
|
+
g("Done!")
|
127
|
+
end
|
128
|
+
else
|
129
|
+
message "Your ssh has already been installed for #{y(c.user)} at #{y(c.ip)}."
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
##
|
134
|
+
# Installs the ssh key for the root user
|
135
|
+
def perform_install_root_ssh_key!
|
136
|
+
unless e.has_ssh_key?
|
137
|
+
error "Could not find ssh key in #{y(e.ssh_key_path)}"
|
138
|
+
error "To create one, run: #{y('ssh-keygen -t rsa')}"
|
139
|
+
exit
|
140
|
+
end
|
141
|
+
|
142
|
+
unless e.root_ssh_key_installed? # prompts root
|
143
|
+
Spinner.return :message => "Installing SSH Key.." do
|
144
|
+
e.install_root_ssh_key!
|
145
|
+
g("Done!")
|
146
|
+
end
|
147
|
+
else
|
148
|
+
message "Your ssh has already been installed for #{y('root')} at #{y(c.ip)}."
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
##
|
153
|
+
# Ensures that Git is installed on the remote server
|
154
|
+
def ensure_git_installed!
|
155
|
+
if not e.installed?('git') #prompts root
|
156
|
+
warning "It is required that you have #{y('Git')} installed at #{y(c.ip)}."
|
157
|
+
warning "Could not find #{y('Git')}, would you like to install it?"
|
158
|
+
|
159
|
+
if yes?
|
160
|
+
Spinner.return :message => "Installing #{y('Git')}.." do
|
161
|
+
e.install!('git-core')
|
162
|
+
@git_installed = e.installed?('git')
|
163
|
+
if @git_installed
|
164
|
+
g("Done!")
|
165
|
+
else
|
166
|
+
r("Unable to install Git.")
|
167
|
+
end
|
168
|
+
end
|
169
|
+
exit unless @git_installed
|
170
|
+
else
|
171
|
+
exit
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
##
|
177
|
+
# Configures the user. Overwrites all current configurations (if any exist)
|
178
|
+
def configure_user!
|
179
|
+
message "Configuring #{y(c.user)}."
|
180
|
+
|
181
|
+
##
|
182
|
+
# If the user has an SSH key and it hasn't been installed
|
183
|
+
# on the server under the current user then it'll go ahead and install it
|
184
|
+
if e.has_ssh_key? and not e.ssh_key_installed?
|
185
|
+
perform_install_ssh_key!
|
186
|
+
end
|
187
|
+
|
188
|
+
##
|
189
|
+
# Configure .bashrc
|
190
|
+
Spinner.return :message => "Configuring #{y('.bashrc')}.." do
|
191
|
+
e.execute_as_root("echo -e \"export RAILS_ENV=production\nsource /etc/profile\" > '#{File.join(c.path, '.bashrc')}'")
|
192
|
+
g('Done!')
|
193
|
+
end
|
194
|
+
|
195
|
+
##
|
196
|
+
# Creating .gemrc
|
197
|
+
Spinner.return :message => "Configuring #{y('.gemrc')}.." do
|
198
|
+
e.download_packages!(e.home_dir)
|
199
|
+
e.execute_as_root("cd #{e.home_dir}; cat gitpusshuten-packages/modules/rvm/gemrc > .gemrc")
|
200
|
+
e.clean_up_packages!(e.home_dir)
|
201
|
+
g('Done!')
|
202
|
+
end
|
203
|
+
|
204
|
+
##
|
205
|
+
# Add user to sudoers file if not already in sudo'ers
|
206
|
+
if not e.user_in_sudoers?
|
207
|
+
Spinner.return :message => "Adding #{y(c.user)} to sudo-ers.." do
|
208
|
+
e.add_user_to_sudoers!
|
209
|
+
g('Done!')
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
##
|
214
|
+
# Checks to see if the RVM group exists.
|
215
|
+
# If it does exist, perform RVM specific tasks.
|
216
|
+
Spinner.return :message => "Searching for #{y('RVM')} (Ruby version Manager).." do
|
217
|
+
@rvm_found = e.directory?("/usr/local/rvm")
|
218
|
+
if @rvm_found
|
219
|
+
g("Found!")
|
220
|
+
else
|
221
|
+
y("Not found, skipping.")
|
222
|
+
end
|
223
|
+
end
|
224
|
+
if @rvm_found
|
225
|
+
Spinner.return :message => "Adding #{y(c.user)} to the #{y('RVM')} group.." do
|
226
|
+
e.execute_as_root("usermod -G rvm '#{c.user}'")
|
227
|
+
g('Done!')
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
##
|
232
|
+
# Installs the .gitconfig and minimum configuration
|
233
|
+
# if the configuration file does not exist.
|
234
|
+
Spinner.return :message => "Configuring #{y('Git')} for #{y(c.user)}." do
|
235
|
+
e.install_gitconfig!
|
236
|
+
e.install_pushand!
|
237
|
+
g('Done!')
|
238
|
+
end
|
239
|
+
|
240
|
+
##
|
241
|
+
# Ensure home directory ownership is set to the user
|
242
|
+
Spinner.return :message => "Setting permissions.." do
|
243
|
+
e.execute_as_root("chown -R #{c.user}:#{c.user} '#{e.home_dir}'")
|
244
|
+
g('Done!')
|
245
|
+
end
|
246
|
+
|
247
|
+
message "Finished configuring #{y(c.user)}."
|
248
|
+
end
|
249
|
+
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module GitPusshuTen
|
3
|
+
module Commands
|
4
|
+
class Version < GitPusshuTen::Commands::Base
|
5
|
+
description "Displays the current version of Git Pusshu Ten (プッシュ点)."
|
6
|
+
|
7
|
+
##
|
8
|
+
# Initializes the Version command
|
9
|
+
def initialize(*objects)
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
##
|
14
|
+
# Performs the Version command
|
15
|
+
def perform!
|
16
|
+
standard "Git Pusshu Ten (プッシュ点) version #{GitPusshuTen::VERSION}"
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
module GitPusshuTen
|
2
|
+
class Configuration
|
3
|
+
|
4
|
+
##
|
5
|
+
# Contains the Application's name which is extracted from
|
6
|
+
# the selected configuration in the configuration file
|
7
|
+
attr_accessor :application
|
8
|
+
|
9
|
+
##
|
10
|
+
# Contains the environment on the remote server name which
|
11
|
+
# is extracted from the selected configuration in the configuration file
|
12
|
+
attr_accessor :environment
|
13
|
+
|
14
|
+
##
|
15
|
+
# Returns true if the configuration has been found
|
16
|
+
attr_accessor :found
|
17
|
+
alias :found? :found
|
18
|
+
|
19
|
+
##
|
20
|
+
# Contains the user, password, passphrase, ip and port for connecting
|
21
|
+
# and authorizing the user to the remote server
|
22
|
+
attr_accessor :user, :password, :passphrase, :ip, :port
|
23
|
+
|
24
|
+
##
|
25
|
+
# Contains the path to where the application should be pushed
|
26
|
+
attr_accessor :path
|
27
|
+
|
28
|
+
##
|
29
|
+
# Contains a list of modules
|
30
|
+
attr_accessor :additional_modules
|
31
|
+
|
32
|
+
##
|
33
|
+
# A flag to force the parsing
|
34
|
+
attr_accessor :force_parse
|
35
|
+
|
36
|
+
##
|
37
|
+
# Configure
|
38
|
+
# helper method for the pusshuten configuration method
|
39
|
+
def configure
|
40
|
+
yield self
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# Modules
|
45
|
+
# Helper method for adding modules
|
46
|
+
def modules
|
47
|
+
yield self
|
48
|
+
end
|
49
|
+
|
50
|
+
##
|
51
|
+
# Modules - Add
|
52
|
+
# Helper method for the Modules helper to add modules to the array
|
53
|
+
def add(module_object)
|
54
|
+
@additional_modules << module_object
|
55
|
+
end
|
56
|
+
|
57
|
+
##
|
58
|
+
# Pusshuten
|
59
|
+
# Helper method used to configure the configuration file
|
60
|
+
def pusshuten(application, *environment, &block)
|
61
|
+
environment.flatten!
|
62
|
+
|
63
|
+
environment.each do |env|
|
64
|
+
unless env.is_a?(Symbol)
|
65
|
+
GitPusshuTen::Log.error 'Please use symbols as environment name.'
|
66
|
+
exit
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
if environment.include?(@environment) or force_parse
|
71
|
+
@application = application
|
72
|
+
@found = true
|
73
|
+
block.call
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
##
|
78
|
+
# Initializes a new configuration object
|
79
|
+
# takes the absolute path to the configuration file
|
80
|
+
def initialize(environment)
|
81
|
+
@environment = environment
|
82
|
+
@found = false
|
83
|
+
@force_parse = false
|
84
|
+
|
85
|
+
@additional_modules = []
|
86
|
+
end
|
87
|
+
|
88
|
+
##
|
89
|
+
# Parses the configuration file and loads all the
|
90
|
+
# configuration values into the GitPusshuTen::Configuration instance
|
91
|
+
def parse!(configuration_file)
|
92
|
+
instance_eval(File.read(configuration_file))
|
93
|
+
|
94
|
+
##
|
95
|
+
# If no configuration is found by environment then
|
96
|
+
# it will re-parse it in a forced manner, meaning it won't
|
97
|
+
# care about the environment and it will just parse everything it finds.
|
98
|
+
# This is done because we can then extract all set "modules" from the configuration
|
99
|
+
# file and display them in the "Help" screen so users can look up information/examples on them.
|
100
|
+
#
|
101
|
+
# This will only occur if no environment is found/specified. So when doing anything
|
102
|
+
# environment specific, it will never force the parsing.
|
103
|
+
if not found? and environment.nil?
|
104
|
+
@force_parse = true
|
105
|
+
instance_eval(File.read(configuration_file))
|
106
|
+
@additional_modules.uniq!
|
107
|
+
end
|
108
|
+
|
109
|
+
if not found? and not environment.nil?
|
110
|
+
GitPusshuTen::Log.error "Could not find any configuration for #{environment.to_s.color(:yellow)}."
|
111
|
+
exit
|
112
|
+
end
|
113
|
+
|
114
|
+
##
|
115
|
+
# Default to port 22 if no port is specified
|
116
|
+
@port ||= '22'
|
117
|
+
|
118
|
+
self
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
Dir[File.expand_path(File.dirname(__FILE__) + '/helpers/environment/*.rb')].each do |helper|
|
2
|
+
require helper
|
3
|
+
end
|
4
|
+
|
5
|
+
module GitPusshuTen
|
6
|
+
class Environment
|
7
|
+
|
8
|
+
include GitPusshuTen::Helpers::Environment::SCP
|
9
|
+
include GitPusshuTen::Helpers::Environment::SSH
|
10
|
+
include GitPusshuTen::Helpers::Environment::SSHKeys
|
11
|
+
include GitPusshuTen::Helpers::Environment::Packages
|
12
|
+
include GitPusshuTen::Helpers::Environment::User
|
13
|
+
include GitPusshuTen::Helpers::Environment::Installers
|
14
|
+
include GitPusshuTen::Helpers::Environment::SCP
|
15
|
+
|
16
|
+
##
|
17
|
+
# Stores the configuration
|
18
|
+
attr_accessor :configuration
|
19
|
+
|
20
|
+
##
|
21
|
+
# Initializes the environment with the provided configuration
|
22
|
+
def initialize(configuration)
|
23
|
+
@configuration = configuration
|
24
|
+
end
|
25
|
+
|
26
|
+
##
|
27
|
+
# Shorthand for the configuration object
|
28
|
+
def c
|
29
|
+
configuration
|
30
|
+
end
|
31
|
+
|
32
|
+
##
|
33
|
+
# Returns the name of the environment
|
34
|
+
def name
|
35
|
+
c.environment
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# Users home directory
|
40
|
+
def home_dir
|
41
|
+
c.path
|
42
|
+
end
|
43
|
+
|
44
|
+
##
|
45
|
+
# Returns the name of the application
|
46
|
+
def app_name
|
47
|
+
c.application
|
48
|
+
end
|
49
|
+
|
50
|
+
##
|
51
|
+
# Returns the root of the application
|
52
|
+
def app_dir
|
53
|
+
File.join(home_dir, "#{sanitized_app_name}.#{name}")
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# Takes the application name from the configuration and
|
58
|
+
# replaces spaces with underscores and downcases capitalized characters
|
59
|
+
def sanitized_app_name
|
60
|
+
app_name.gsub(' ', '_').downcase
|
61
|
+
end
|
62
|
+
|
63
|
+
##
|
64
|
+
# Deletes the current environment (application)
|
65
|
+
def delete!
|
66
|
+
execute_as_user("rm -rf #{app_dir}")
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module GitPusshuTen
|
2
|
+
class Gem
|
3
|
+
|
4
|
+
##
|
5
|
+
# Stores the JSON gem object from RubyGems.org
|
6
|
+
attr_accessor :gem
|
7
|
+
|
8
|
+
##
|
9
|
+
# Instantiages a new gem
|
10
|
+
def initialize(name)
|
11
|
+
@gem = JSON.parse(open(File.join(base_url, "#{name}.json")).read)
|
12
|
+
end
|
13
|
+
|
14
|
+
##
|
15
|
+
# Returns the latest version of the gem
|
16
|
+
def latest_version
|
17
|
+
gem['version']
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# Checks to see if the provided version number is outdated
|
22
|
+
def outdated?(version)
|
23
|
+
version < latest_version
|
24
|
+
end
|
25
|
+
|
26
|
+
##
|
27
|
+
# Returns the base url to the RubyGems API
|
28
|
+
def base_url
|
29
|
+
"http://rubygems.org/api/v1/gems/"
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|