escualo 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/commands/artifact.rb +114 -0
- data/lib/commands/bootstrap.rb +41 -0
- data/lib/commands/deploy.rb +17 -0
- data/lib/commands/env.rb +36 -0
- data/lib/commands/globals.rb +31 -0
- data/lib/commands/plugin.rb +42 -0
- data/lib/commands/rake.rb +13 -0
- data/lib/commands/remote.rb +32 -0
- data/lib/commands/script.rb +33 -0
- data/lib/commands/upload.rb +7 -0
- data/lib/escualo/artifact.rb +63 -0
- data/lib/escualo/bootstrap.rb +55 -0
- data/lib/escualo/env.rb +60 -0
- data/lib/escualo/plugin/docker.rb +11 -0
- data/lib/escualo/plugin/haskell.rb +11 -0
- data/lib/escualo/plugin/mongo.rb +17 -0
- data/lib/escualo/plugin/nginx.rb +19 -0
- data/lib/escualo/plugin/node.rb +15 -0
- data/lib/escualo/plugin/postgre.rb +20 -0
- data/lib/escualo/plugin/rabbit.rb +23 -0
- data/lib/escualo/plugin.rb +17 -0
- data/lib/escualo/remote.rb +30 -0
- data/lib/escualo/version.rb +4 -0
- data/lib/ssh/local_session.rb +27 -0
- data/lib/ssh/perform.rb +9 -0
- data/lib/ssh/session.rb +55 -0
- data/lib/ssh/upload.rb +9 -0
- data/lib/templates/codechange.sh.erb +44 -0
- data/lib/templates/init.sh.erb +59 -0
- data/lib/templates/monit.conf.erb +11 -0
- data/lib/templates/post-receive.sh.erb +24 -0
- data/lib/templates/upstart.conf.erb +14 -0
- metadata +46 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 747639e8ec926a1c4bbf9abc2811a38668716595
|
4
|
+
data.tar.gz: 481b31181d1341593b77c40202da33d7b7d4bbb5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dfffe1a982a76c7efb7ac80ba6d5d48aa17dd4f6f488fd78f52114eeabf01816bd5545d7d5e74c2213f1c3e69b5c127e8cfb754b361b187ffbb7ebcb9c1cd955
|
7
|
+
data.tar.gz: 0f0cd10a68520e1f7b559941b9d26dd7dfe3585e42b6c77ba3df6e73e1283f5ac4513a379117665b384a2348ee529b7a89c47b3ff8cedb8c08b08adc692022fd
|
@@ -0,0 +1,114 @@
|
|
1
|
+
command 'artifact list' do |c|
|
2
|
+
c.syntax = 'escualo artifact list'
|
3
|
+
c.description = 'Lists artifacts on host'
|
4
|
+
c.ssh_action do |args, options, ssh|
|
5
|
+
Escualo::Artifact.list(ssh).each do |artifact|
|
6
|
+
say artifact
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
command 'artifact destroy' do |c|
|
12
|
+
c.syntax = 'escualo artifact destroy <NAME>'
|
13
|
+
c.description = 'Destroys an artifact on host'
|
14
|
+
c.ssh_action do |args, options, ssh|
|
15
|
+
name = args.first
|
16
|
+
|
17
|
+
Escualo::Artifact.destroy(ssh, name)
|
18
|
+
say "#{name} destroyed successfully"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def say_created(kind, name)
|
23
|
+
say "#{kind.titleize} #{name} created successfully"
|
24
|
+
say "Now you can deploy this #{kind}"
|
25
|
+
end
|
26
|
+
|
27
|
+
command 'artifact create service' do |c|
|
28
|
+
c.syntax = 'escualo artifact create service <NAME> <PORT>'
|
29
|
+
c.description = 'Setup a micro-service deployment'
|
30
|
+
c.option '-f', '--force', TrueClass, 'Force creation even if already done'
|
31
|
+
|
32
|
+
c.ssh_action do |args, options, ssh|
|
33
|
+
name = args.first
|
34
|
+
port = args.second
|
35
|
+
|
36
|
+
do_unless Escualo::Artifact.present?(ssh, name),
|
37
|
+
"Service #{name} already created",
|
38
|
+
options do
|
39
|
+
launch_command = "exec bundle exec rackup -o 0.0.0.0 -p #{port} > rack.log"
|
40
|
+
install_command='bundle install --without development test'
|
41
|
+
|
42
|
+
step 'Creating init scripts...' do
|
43
|
+
Escualo::Artifact.create_scripts_dir ssh, name
|
44
|
+
Escualo::Artifact.create_init_script ssh,
|
45
|
+
name: name,
|
46
|
+
service: true,
|
47
|
+
install_command: install_command
|
48
|
+
Escualo::Artifact.create_codechange_script ssh, name
|
49
|
+
end
|
50
|
+
|
51
|
+
step 'Configuring upstart...' do
|
52
|
+
Escualo::Artifact.configure_upstart ssh, name: name, lanunch_comand: launch_command
|
53
|
+
end
|
54
|
+
|
55
|
+
step 'Configuring monit...' do
|
56
|
+
Escualo::Artifact.configure_monit ssh, name
|
57
|
+
end
|
58
|
+
|
59
|
+
step 'Creating push infrastructure' do
|
60
|
+
Escualo::Artifact.create_push_infra ssh, name: name, service: true
|
61
|
+
end
|
62
|
+
|
63
|
+
say_created 'service', name
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
command 'artifact create site' do |c|
|
69
|
+
c.syntax = 'escualo artifact create site <NAME>'
|
70
|
+
c.description = 'Setup an static site deployment'
|
71
|
+
c.option '-f', '--force', TrueClass, 'Force creation even if already done'
|
72
|
+
|
73
|
+
c.ssh_action do |args, options, ssh|
|
74
|
+
name = args.first
|
75
|
+
|
76
|
+
do_unless Escualo::Artifact.present?(ssh, name),
|
77
|
+
"Site #{name} already created",
|
78
|
+
options do
|
79
|
+
step 'Creating init scripts...' do
|
80
|
+
Escualo::Artifact.create_scripts_dir ssh, name
|
81
|
+
Escualo::Artifact.create_init_script ssh, name: name, static: true
|
82
|
+
end
|
83
|
+
|
84
|
+
step 'Creating push infrastructure' do
|
85
|
+
Escualo::Artifact.create_push_infra ssh, name: name, static: true
|
86
|
+
end
|
87
|
+
say_created 'site', name
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
command 'artifact create executable' do |c|
|
93
|
+
c.syntax = 'escualo artifact create executable <NAME>'
|
94
|
+
c.description = 'Setup an executable command deployment'
|
95
|
+
c.option '-f', '--force', TrueClass, 'Force creation even if already done'
|
96
|
+
|
97
|
+
c.ssh_action do |args, options, ssh|
|
98
|
+
name = args.first
|
99
|
+
|
100
|
+
do_unless Escualo::Artifact.present?(ssh, name),
|
101
|
+
"Executable #{name} already created",
|
102
|
+
options do
|
103
|
+
step 'Creating init scripts...' do
|
104
|
+
Escualo::Artifact.create_scripts_dir ssh, name
|
105
|
+
Escualo::Artifact.create_init_script ssh, name: name, executable: true
|
106
|
+
end
|
107
|
+
|
108
|
+
step 'Creating push infrastructure' do
|
109
|
+
Escualo::Artifact.create_push_infra ssh, name: name, executable: true
|
110
|
+
end
|
111
|
+
say_created 'executable', name
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
command 'bootstrap' do |c|
|
2
|
+
c.syntax = 'escualo bootstrap'
|
3
|
+
c.description = 'Prepare environment to be an escualo host'
|
4
|
+
c.option '--swap', TrueClass, 'Setup swap?'
|
5
|
+
c.option '--monit-version VERSION', String, 'Monit version'
|
6
|
+
c.option '--monit-password PASSWORD', String, 'Monit password. Will be prompted otherwise'
|
7
|
+
c.option '-f', '--force', TrueClass, 'Force bootstrap even if already done?'
|
8
|
+
|
9
|
+
c.ssh_action do |_args, options, ssh|
|
10
|
+
unless options.monit_password
|
11
|
+
password = ask('Monit Password: ') { |q| q.echo = '*' }
|
12
|
+
options.default monit_password: password
|
13
|
+
end
|
14
|
+
options.default monit_version: '5.16'
|
15
|
+
|
16
|
+
do_unless Escualo::Env.present?(ssh, :ESCUALO_BASE_VERSION),
|
17
|
+
'This host has already been bootstrapped',
|
18
|
+
options do
|
19
|
+
step 'Configuring variables...' do
|
20
|
+
Escualo::Env.setup ssh
|
21
|
+
Escualo::Env.set_builtins ssh
|
22
|
+
end
|
23
|
+
|
24
|
+
step 'Installing base software...' do
|
25
|
+
Escualo::Bootstrap.install_base ssh
|
26
|
+
end
|
27
|
+
|
28
|
+
step 'Installing and configuring monit...' do
|
29
|
+
Escualo::Bootstrap.setup_monit ssh, options
|
30
|
+
end
|
31
|
+
|
32
|
+
step 'Enabling swap...' do
|
33
|
+
Escualo::Bootstrap.enable_swap ssh
|
34
|
+
end if options.swap
|
35
|
+
|
36
|
+
step 'Installing gems...' do
|
37
|
+
Escualo::Bootstrap.install_gems ssh
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
command 'deploy' do |c|
|
2
|
+
c.syntax = 'escualo deploy <name> <repo>'
|
3
|
+
c.description = 'Deploys repository to the given executable, service or site'
|
4
|
+
c.option '--tag GIT_TAG', String, 'Github tag to deploy'
|
5
|
+
c.action do |args, options|
|
6
|
+
Dir.mktmpdir do |dir|
|
7
|
+
step 'Cloning repository...' do
|
8
|
+
Escualo::Remote.clone dir, args.second, options
|
9
|
+
Escualo::Remote.attach dir, args.first
|
10
|
+
end
|
11
|
+
|
12
|
+
step 'Pushing to remote...' do
|
13
|
+
Escualo::Remote.push dir
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/commands/env.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
command 'env list' do |c|
|
2
|
+
c.syntax = 'escualo env list'
|
3
|
+
c.description = 'List escualo variables on host'
|
4
|
+
c.ssh_action do |args, options, ssh|
|
5
|
+
say Escualo::Env.list ssh
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
def parse_args_variables(args)
|
11
|
+
args.map { |it| it.split('=') }.to_h
|
12
|
+
end
|
13
|
+
|
14
|
+
command 'env set' do |c|
|
15
|
+
c.syntax = 'escualo env set <NAME>=<VALUE> [<NAME>=<VALUE>,...<NAME>=<VALUE>]'
|
16
|
+
c.description = 'Sets one or more escualo variables on host'
|
17
|
+
c.ssh_action do |args, options, ssh|
|
18
|
+
Escualo::Env.set ssh, parse_args_variables(args)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
command 'env unset' do |c|
|
23
|
+
c.syntax = 'escualo env unset <NAME> [<NAME>,...<NAME>]'
|
24
|
+
c.description = 'Unset escualo variables on host'
|
25
|
+
c.ssh_action do |args, options, ssh|
|
26
|
+
Escualo::Env.unset ssh, args
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
command 'env clean' do |c|
|
31
|
+
c.syntax = 'escualo env clean'
|
32
|
+
c.description = 'Unset all escualo variables on host'
|
33
|
+
c.ssh_action do |args, options, ssh|
|
34
|
+
Escualo::Env.clean ssh
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
$hostname = 'localhost'
|
2
|
+
$username = 'root'
|
3
|
+
$ssh_options = {}
|
4
|
+
$ssh_remote = false
|
5
|
+
|
6
|
+
global_option '-h', '--hostname HOSTNAME', String, 'The host to connect. Defaults to "localhost"' do |hostname|
|
7
|
+
$hostname = hostname
|
8
|
+
$ssh_remote = true
|
9
|
+
end
|
10
|
+
|
11
|
+
global_option '-u', '--username USERNAME', String, 'The username to connect. Defaults to "root"' do |username|
|
12
|
+
$username = username
|
13
|
+
$ssh_remote = true
|
14
|
+
end
|
15
|
+
|
16
|
+
global_option '--password PASSWORD', String, 'An optional remote password' do |password|
|
17
|
+
$ssh_options[:password] = password
|
18
|
+
$ssh_remote = true
|
19
|
+
end
|
20
|
+
|
21
|
+
global_option '-i', '--ssh-key PRIVATE_KEY', String, 'An optional private key' do |private_key|
|
22
|
+
$ssh_options[:keys] = [private_key]
|
23
|
+
$ssh_remote = true
|
24
|
+
end
|
25
|
+
|
26
|
+
global_option '--ssh-port PORT', String, 'The ssh port to connect. Defaults to 22' do |port|
|
27
|
+
$ssh_options[:port] = port
|
28
|
+
$ssh_remote = true
|
29
|
+
end
|
30
|
+
|
31
|
+
global_option '--verbose', TrueClass, 'Dumps extra output'
|
@@ -0,0 +1,42 @@
|
|
1
|
+
command 'plugin install' do |c|
|
2
|
+
c.syntax = 'escualo plugin install <plugin>'
|
3
|
+
c.description = "Install plugin on host. Valid plugins are #{Escualo::Plugin::PLUGINS.join(', ')}"
|
4
|
+
c.option '--nginx-conf FILENAME', String, 'ningix config file, only for nginx plugin'
|
5
|
+
c.option '--rabbit-admin-password PASSWORD', String, 'rabbitmq admin password, only for rabbit plugin'
|
6
|
+
c.option '-f', '--force', TrueClass, 'Force reinstalling even if already done'
|
7
|
+
|
8
|
+
c.ssh_action do |args, options, ssh|
|
9
|
+
plugin = args.first
|
10
|
+
say "Installing #{plugin}"
|
11
|
+
|
12
|
+
installer = Escualo::Plugin.load plugin
|
13
|
+
|
14
|
+
do_unless installer.check(ssh),
|
15
|
+
"Plugin #{plugin} is already installed",
|
16
|
+
options do
|
17
|
+
|
18
|
+
step "Installing plugin #{plugin}" do
|
19
|
+
log = installer.run ssh, options
|
20
|
+
end
|
21
|
+
|
22
|
+
if installer.check ssh
|
23
|
+
say 'Installed successfully!'
|
24
|
+
else
|
25
|
+
say "Something went wrong. Last output was: \n#{log}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
command 'plugin list' do |c|
|
32
|
+
c.syntax = 'escualo plugin list'
|
33
|
+
c.description = 'List installed plugins on host'
|
34
|
+
|
35
|
+
c.ssh_action do |_args, _options, ssh|
|
36
|
+
Escualo::Plugin::PLUGINS.each do |plugin|
|
37
|
+
if Escualo::Plugin.load(plugin).check ssh
|
38
|
+
say plugin
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
command 'rake' do |c|
|
2
|
+
c.syntax = 'escualo rake <SERVICE_NAME> <TASK>'
|
3
|
+
c.description = 'Run rake task on host'
|
4
|
+
c.ssh_action do |args, options, ssh|
|
5
|
+
name = args.first
|
6
|
+
task = args.second
|
7
|
+
say ssh.shell.exec! %Q{
|
8
|
+
cd /var/www/#{name}
|
9
|
+
bundle exec rake #{task}
|
10
|
+
}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
command 'remote attach' do |c|
|
2
|
+
c.syntax = 'escualo remote attach <name>'
|
3
|
+
c.description = "Adds the given artifact to current's repository"
|
4
|
+
c.option '--repo-path PATH', String, 'Sets the git dir'
|
5
|
+
|
6
|
+
c.action do |args, options|
|
7
|
+
options.default repo_path: Dir.pwd
|
8
|
+
|
9
|
+
Escualo::Remote.attach options.repo_path, args.first
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
command 'remote show' do |c|
|
14
|
+
c.syntax = 'escualo remote show'
|
15
|
+
c.description = "Show attached artifacts to current's repository"
|
16
|
+
c.option '--repo-path PATH', String, 'Sets the git dir'
|
17
|
+
|
18
|
+
c.action do |_args, options|
|
19
|
+
options.default repo_path: Dir.pwd
|
20
|
+
|
21
|
+
Escualo::Remote.remotes(options.repo_path).each { |it| say it }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
command 'remote push' do |c|
|
26
|
+
c.syntax = 'escualo remote push'
|
27
|
+
c.description = 'Pushes artifact at current repository'
|
28
|
+
c.action do |_args, _options|
|
29
|
+
Escualo::Remote.push Dir.pwd
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
def run_commands_for!(script, extra='', ssh)
|
2
|
+
script.map { |it| "escualo #{it} #{extra}" }.each do |command|
|
3
|
+
puts command
|
4
|
+
puts ssh.exec! command
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
def ssh_options
|
9
|
+
[$hostname.try { |it| "--hostname #{it}" },
|
10
|
+
$username.try { |it| "--username #{it}" },
|
11
|
+
$password.try { |it| "--$password #{it}" },
|
12
|
+
$ssh_options[:keys].try { |it| "--ssh-key #{it}" },
|
13
|
+
$ssh_options[:port].try { |it| "--ssh-port #{it}" }
|
14
|
+
].compact.join(' ')
|
15
|
+
end
|
16
|
+
|
17
|
+
command 'script' do |c|
|
18
|
+
c.syntax = 'escualo script <FILE>'
|
19
|
+
c.description = 'Runs a escualo configuration'
|
20
|
+
c.action do |args, options|
|
21
|
+
file = YAML.load_file args.first
|
22
|
+
|
23
|
+
step 'Running local commands...' do
|
24
|
+
run_commands_for! file['local'], ssh_options, Net::SSH::Connection::LocalSession.new
|
25
|
+
end
|
26
|
+
|
27
|
+
step 'Running remote commands...' do
|
28
|
+
Net::SSH.start($hostname, $username, $ssh_options.compact) do |ssh|
|
29
|
+
run_commands_for! file['remote'], ssh
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Escualo
|
2
|
+
module Artifact
|
3
|
+
def self.destroy(ssh, name)
|
4
|
+
raise 'name must not be blank' if name.blank?
|
5
|
+
raise 'name must not contains wildcards' if name.include?('*')
|
6
|
+
|
7
|
+
ssh.exec! "rm -rf /var/scripts/#{name}"
|
8
|
+
ssh.exec! "rm -rf /var/repo/#{name}.git"
|
9
|
+
ssh.exec! "rm -f /etc/monit/conf.d/escualo-#{name}"
|
10
|
+
ssh.exec! "rm -f /etc/init/#{name}.conf"
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.present?(ssh, name)
|
14
|
+
list(ssh).include? name
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.create_scripts_dir(ssh, name)
|
18
|
+
ssh.exec! "mkdir -p /var/scripts/#{name}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.create_init_script(ssh, options)
|
22
|
+
ssh.upload_template! "/var/scripts/#{options[:name]}/init",
|
23
|
+
'init.sh',
|
24
|
+
options
|
25
|
+
ssh.exec! "chmod +x /var/scripts/#{options[:name]}/init"
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.list(ssh)
|
29
|
+
ssh.exec!('ls /var/repo/').captures(/(.*)\.git/).map { $1 }
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.create_push_infra(ssh, options)
|
33
|
+
name = options[:name]
|
34
|
+
ssh.exec! %Q{\
|
35
|
+
cd /var && \
|
36
|
+
mkdir -p www && \
|
37
|
+
mkdir -p repo && \
|
38
|
+
cd repo && \
|
39
|
+
rm -rf #{name}.git && \
|
40
|
+
mkdir #{name}.git && \
|
41
|
+
cd #{name}.git && \
|
42
|
+
git init --bare
|
43
|
+
}
|
44
|
+
ssh.upload_template! "/var/repo/#{name}.git/hooks/post-receive", 'post-receive.sh', options
|
45
|
+
ssh.exec! 'chmod +x post-receive'
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.configure_monit(ssh, name)
|
49
|
+
ssh.exec! 'mkdir -p /etc/monit/conf.d/'
|
50
|
+
ssh.upload_template! "/etc/monit/conf.d/escualo-#{name}", 'monit.conf', name: name
|
51
|
+
ssh.exec! 'monit reload'
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.create_codechange_script(ssh, name)
|
55
|
+
ssh.upload_template! "/var/scripts/#{name}/codechange", "codechange.sh", name: name
|
56
|
+
ssh.exec! "chmod +x /var/scripts/#{name}/codechange"
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.configure_upstart(ssh, options)
|
60
|
+
ssh.upload_template! "/etc/init/#{name}.conf", 'upstart.conf', options
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Escualo
|
2
|
+
module Bootstrap
|
3
|
+
def self.install_base(ssh)
|
4
|
+
ssh.exec! %Q{ \
|
5
|
+
apt-get install software-properties-common -y && \
|
6
|
+
apt-add-repository ppa:brightbox/ruby-ng && \
|
7
|
+
apt-get update && \
|
8
|
+
apt-get install -y \
|
9
|
+
autoconf \
|
10
|
+
bison \
|
11
|
+
build-essential \
|
12
|
+
libreadline6 \
|
13
|
+
libreadline6-dev \
|
14
|
+
curl \
|
15
|
+
git \
|
16
|
+
libssl-dev \
|
17
|
+
ruby2.0 \
|
18
|
+
ruby2.0-dev \
|
19
|
+
zlib1g \
|
20
|
+
zlib1g-dev \
|
21
|
+
libreadline-dev }
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.enable_swap(ssh)
|
25
|
+
ssh.exec! %Q{ \
|
26
|
+
test -e /swapfile ||
|
27
|
+
fallocate -l 4G /swapfile && \
|
28
|
+
chmod 600 /swapfile && \
|
29
|
+
mkswap /swapfile && \
|
30
|
+
swapon /swapfile && \
|
31
|
+
swapon -s && \
|
32
|
+
echo '/swapfile none swap sw 0 0' >> /etc/fstab}
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.setup_monit(ssh, options)
|
36
|
+
ssh.exec! %Q{
|
37
|
+
service monit stop && \
|
38
|
+
cd /tmp && \
|
39
|
+
wget https://mmonit.com/monit/dist/binary/5.16/monit-#{options.monit_version}-linux-x64.tar.gz && \
|
40
|
+
tar -xzf monit-#{options.monit_version}-linux-x64.tar.gz && \
|
41
|
+
cp monit-#{options.monit_version}/bin/monit /usr/bin/monit && \
|
42
|
+
ln -s /etc/monit/monitrc /etc/monitrc && \
|
43
|
+
service monit start && \
|
44
|
+
'set httpd port 2812 and' > /etc/monit/conf.d/web-server && \
|
45
|
+
' allow 0.0.0.0/0.0.0.0' >> /etc/monit/conf.d/web-server && \
|
46
|
+
' allow admin:#{options.monit_password}' >> /etc/monit/conf.d/web-server && \
|
47
|
+
monit reload}
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.install_gems(ssh)
|
51
|
+
ssh.exec! 'gem install bundler'
|
52
|
+
ssh.exec! 'gem install escualo'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/escualo/env.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
module Escualo
|
2
|
+
module Env
|
3
|
+
def self.setup(ssh)
|
4
|
+
source_escualorc = "'source ~/.escualorc'"
|
5
|
+
ssh.exec! %Q{
|
6
|
+
mkdir -p ~/.escualo/vars && \
|
7
|
+
echo 'for var in ~/.escualo/vars/*; do source $var; done' > ~/.escualorc && \
|
8
|
+
chmod u+x ~/.escualorc && \
|
9
|
+
grep -q #{source_escualorc} ~/.bashrc || echo #{source_escualorc} >> ~/.bashrc
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.set_builtins(ssh)
|
14
|
+
set ssh, ESCUALO_BASE_VERSION: Escualo::BASE_VERSION
|
15
|
+
set ssh, Escualo::Env.locale_variables
|
16
|
+
set ssh, Escualo::Env.production_variables
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.list(ssh)
|
20
|
+
ssh.exec!("cat ~/.escualo/vars/*").gsub("export ", '')
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.clean(ssh)
|
24
|
+
ssh.exec!("rm ~/.escualo/vars/*")
|
25
|
+
set_builtins ssh
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.present?(ssh, variable)
|
29
|
+
ssh.exec!("cat ~/.escualo/vars/#{variable}").present?
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.set(ssh, variables)
|
33
|
+
variables.each do |key, value|
|
34
|
+
ssh.exec!("echo 'export #{key}=#{value}' > ~/.escualo/vars/#{key}")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.unset(ssh, variable_names)
|
39
|
+
variable_names.each do |name|
|
40
|
+
ssh.exec!("rm ~/.escualo/vars/#{name}")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.locale_variables
|
45
|
+
%w{LANG LC_ALL LC_NAME LC_PAPER LC_ADDRESS LC_NUMERIC LC_MONETARY LC_TELEPHONE LC_MEASUREMENT}.map do |it|
|
46
|
+
[it, 'en_US.UTF-8']
|
47
|
+
end.to_h
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.production_variables
|
51
|
+
%w{RAILS_ENV NODE_ENV RACK_ENV}.map do |it|
|
52
|
+
[it, 'production']
|
53
|
+
end.to_h
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.locale_export
|
57
|
+
locale_variables.map { |key, value| "#{key}=#{value}" }.join(' ')
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Escualo::Plugin
|
2
|
+
class Mongo
|
3
|
+
def run(ssh, options)
|
4
|
+
ssh.shell.perform! %Q{
|
5
|
+
echo 'deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse' | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list && \
|
6
|
+
apt-get update && \
|
7
|
+
apt-get install -y --force-yes mongodb-org && \
|
8
|
+
echo '' >> /etc/init/mongodb && \
|
9
|
+
echo 'respawn' >> /etc/init/mongodb
|
10
|
+
}, options
|
11
|
+
end
|
12
|
+
|
13
|
+
def check(ssh)
|
14
|
+
ssh.shell.exec!('mongod --version').include? 'db version v3.2'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Escualo::Plugin
|
2
|
+
class Nginx
|
3
|
+
def run(ssh, options)
|
4
|
+
config = options.nginx_conf.try { |it| File.read it }
|
5
|
+
|
6
|
+
ssh.perform! %Q{
|
7
|
+
sudo add-apt-repository ppa:nginx/stable && \
|
8
|
+
sudo apt-get update && \
|
9
|
+
sudo apt-get install nginx -y && \
|
10
|
+
#{config ? "/etc/nginx/nginx.conf < cat #{config} && " : ''} \
|
11
|
+
service nginx restart
|
12
|
+
}, options
|
13
|
+
end
|
14
|
+
|
15
|
+
def check(ssh)
|
16
|
+
ssh.exec!('nginx -v').include? 'nginx version: nginx/1'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Escualo::Plugin
|
2
|
+
class Node
|
3
|
+
def run(ssh, options)
|
4
|
+
ssh.shell.perform! %Q{
|
5
|
+
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.30.2/install.sh | bash && \
|
6
|
+
source ~/.bashrc && \
|
7
|
+
nvm install 4.2.4
|
8
|
+
}, options
|
9
|
+
end
|
10
|
+
|
11
|
+
def check(ssh)
|
12
|
+
ssh.shell.exec!('nvm use node').include? 'Now using node v4.2.4'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Escualo::Plugin
|
2
|
+
class Postgre
|
3
|
+
def run(ssh, options)
|
4
|
+
pg_hba_conf = '/etc/postgresql/9.3/main/pg_hba.conf'
|
5
|
+
|
6
|
+
ssh.shell.perform! %Q{
|
7
|
+
apt-get install postgresql libpq-dev -y && \
|
8
|
+
\
|
9
|
+
echo 'local all postgres peer' > #{pg_hba_conf} && \
|
10
|
+
echo 'local all postgres peer' >> #{pg_hba_conf} && \
|
11
|
+
echo 'local all all password' >> #{pg_hba_conf} && \
|
12
|
+
echo 'host all all 127.0.0.1/32 md5' >> #{pg_hba_conf}
|
13
|
+
}, options
|
14
|
+
end
|
15
|
+
|
16
|
+
def check(ssh)
|
17
|
+
ssh.shell.exec!('psql --version').include? 'psql (PostgreSQL) 9.3'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Escualo::Plugin
|
2
|
+
class Rabbit
|
3
|
+
def run(ssh, options)
|
4
|
+
raise 'missing rabbit password' unless options.rabbit_admin_password
|
5
|
+
|
6
|
+
ssh.shell.perform! %Q{
|
7
|
+
echo "deb http://www.rabbitmq.com/debian testing main" >> /etc/apt/sources.list && \
|
8
|
+
wget https://www.rabbitmq.com/rabbitmq-signing-key-public.asc && \
|
9
|
+
apt-key add rabbitmq-signing-key-public.asc && \
|
10
|
+
apt-get update && \
|
11
|
+
apt-get install rabbitmq-server -y --force-yes && \
|
12
|
+
rabbitmq-plugins enable rabbitmq_management && \
|
13
|
+
rabbitmqctl add_user admin #{options.rabbit_admin_password} && \
|
14
|
+
rabbitmqctl set_user_tags admin administrator
|
15
|
+
}, options
|
16
|
+
end
|
17
|
+
|
18
|
+
def check(ssh)
|
19
|
+
ssh.exec!('rabbitmq-server').include? 'node with name "rabbit" already running'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Escualo
|
2
|
+
module Plugin
|
3
|
+
PLUGINS = %w(node haskell docker postgre nginx rabbit mongo)
|
4
|
+
|
5
|
+
def self.load(name)
|
6
|
+
"Escualo::Plugin::#{name.capitalize}".constantize.new
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
require_relative './plugin/docker'
|
12
|
+
require_relative './plugin/haskell'
|
13
|
+
require_relative './plugin/mongo'
|
14
|
+
require_relative './plugin/nginx'
|
15
|
+
require_relative './plugin/node'
|
16
|
+
require_relative './plugin/postgre'
|
17
|
+
require_relative './plugin/rabbit'
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Escualo
|
2
|
+
module Remote
|
3
|
+
def self.attach(dir, name)
|
4
|
+
remote_name = "escualo-#{name}-#{$hostname}"
|
5
|
+
remote_url = "ssh://#{$username}@#{$hostname}:#{$ssh_options[:port]}/var/repo/#{name}.git"
|
6
|
+
%x{cd #{dir} && git remote add #{remote_name} #{remote_url}}
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.clone(dir, repo, options)
|
10
|
+
repo_url = "https://github.com/#{repo}"
|
11
|
+
%x{git clone #{repo_url} #{dir}}
|
12
|
+
if options.tag
|
13
|
+
%x{cd #{dir} && git checkout #{options.tag}}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.remotes(dir)
|
18
|
+
%x{cd #{dir} && git remote show}
|
19
|
+
.split
|
20
|
+
.select {|it| it.start_with? 'escualo-'}
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.push(dir)
|
24
|
+
remotes(dir)
|
25
|
+
.each do |remote|
|
26
|
+
%x{cd #{dir} && git push #{remote} HEAD}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'open3'
|
3
|
+
|
4
|
+
class Net::SSH::Connection::LocalSession
|
5
|
+
include Net::SSH::Connection::Perform
|
6
|
+
include Net::SSH::Connection::Upload
|
7
|
+
|
8
|
+
def exec!(command)
|
9
|
+
%x{#{command}}
|
10
|
+
end
|
11
|
+
|
12
|
+
def upload_file!(file, destination)
|
13
|
+
FileUtils.cp file, destination
|
14
|
+
end
|
15
|
+
|
16
|
+
def tell!(command)
|
17
|
+
Open3.popen2e command do |_input, output|
|
18
|
+
output.each do |line|
|
19
|
+
$stdout.print line
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def shell
|
25
|
+
self
|
26
|
+
end
|
27
|
+
end
|
data/lib/ssh/perform.rb
ADDED
data/lib/ssh/session.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
class Net::SSH::Connection::Session
|
2
|
+
include Net::SSH::Connection::Perform
|
3
|
+
include Net::SSH::Connection::Upload
|
4
|
+
|
5
|
+
def upload_file!(file, destination)
|
6
|
+
scp.upload! file, destination
|
7
|
+
end
|
8
|
+
|
9
|
+
def tell!(command)
|
10
|
+
channel = self.open_channel do |ch|
|
11
|
+
ch.exec command do |ch, success|
|
12
|
+
raise 'could not execute command' unless success
|
13
|
+
ch.on_data do |c, data|
|
14
|
+
$stdout.print data
|
15
|
+
end
|
16
|
+
ch.on_extended_data do |c, type, data|
|
17
|
+
$stderr.print data
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
channel.wait
|
22
|
+
end
|
23
|
+
|
24
|
+
def shell
|
25
|
+
Shell.new self
|
26
|
+
end
|
27
|
+
|
28
|
+
class Shell
|
29
|
+
attr_reader :ssh
|
30
|
+
|
31
|
+
def initialize(ssh)
|
32
|
+
@ssh = ssh
|
33
|
+
end
|
34
|
+
|
35
|
+
def perform!(command, options)
|
36
|
+
ssh.perform! wrap(command), options
|
37
|
+
end
|
38
|
+
|
39
|
+
def exec!(command)
|
40
|
+
ssh.exec! wrap(command)
|
41
|
+
end
|
42
|
+
|
43
|
+
def tell!(command)
|
44
|
+
ssh.tell! wrap(command)
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def wrap(command)
|
50
|
+
"bash -i -s <<EOBASH
|
51
|
+
#{command}
|
52
|
+
EOBASH"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/ssh/upload.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
module Net::SSH::Connection::Upload
|
2
|
+
def upload_template!(destination, name, bindings)
|
3
|
+
Mumukit::Core::Template
|
4
|
+
.new(File.join(__dir__, '..', 'templates', "#{name}.erb"), bindings)
|
5
|
+
.with_tempfile!('template') do |file|
|
6
|
+
upload_file! file, destination
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
REVISION=$1
|
3
|
+
|
4
|
+
echo "[Escualo] Running codechange for revision $REVISION..."
|
5
|
+
|
6
|
+
cd /var/www/<%= @name %>
|
7
|
+
|
8
|
+
if [ -e .escualo/jobs ]; then
|
9
|
+
echo "[Escualo] [<%= @name %>] Found jobs, creating monitors..."
|
10
|
+
|
11
|
+
for job_path in .escualo/jobs/*; do
|
12
|
+
job=$(basename $job_path)
|
13
|
+
echo "[Escualo] [<%= @name %>] setting up Upstart service for job $job..."
|
14
|
+
cat > /etc/init/<%= @name %>-$job.conf <<EOJOB
|
15
|
+
description "<%= @name %>-$job configuration"
|
16
|
+
author "Escualo - via The Mumuki Project"
|
17
|
+
|
18
|
+
start on runlevel [2345]
|
19
|
+
stop on runlevel [!2345]
|
20
|
+
|
21
|
+
respawn
|
22
|
+
|
23
|
+
chdir /var/www/<%= @name %>
|
24
|
+
|
25
|
+
script
|
26
|
+
for var in /root/.escualo/vars/*; do . \\$var; done
|
27
|
+
chmod u+x .escualo/jobs/$job
|
28
|
+
echo \\$\\$ > $job.pid
|
29
|
+
$job_path
|
30
|
+
end script
|
31
|
+
EOJOB
|
32
|
+
|
33
|
+
echo "[Escualo] [<%= @name %>] setting up Monit for job $job..."
|
34
|
+
cat > /etc/monit/conf.d/escualo-<%= @name %>-$job <<EOMONIT
|
35
|
+
|
36
|
+
check process escualo-<%= @name %>-$job with pidfile /var/www/<%= @name %>/$job.pid
|
37
|
+
start "/sbin/start <%= @name %>-$job"
|
38
|
+
stop "/sbin/stop <%= @name %>-$job"
|
39
|
+
EOMONIT
|
40
|
+
|
41
|
+
done
|
42
|
+
|
43
|
+
monit reload
|
44
|
+
fi
|
@@ -0,0 +1,59 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
REVISION=$1
|
3
|
+
|
4
|
+
cd /var/www/<%= @name %>
|
5
|
+
|
6
|
+
if [ -e .escualo/install/before ]; then
|
7
|
+
echo "[Escualo] [<%= @name %>] .escualo/install/before found. Running it..."
|
8
|
+
chmod u+x .escualo/install/before
|
9
|
+
.escualo/install/before
|
10
|
+
fi
|
11
|
+
|
12
|
+
<% if @service %>
|
13
|
+
echo "[Escualo] [<%= @name %>] installing dependencies..."
|
14
|
+
<%= @install_command %>
|
15
|
+
|
16
|
+
monit unmonitor escualo-<%= @name %>
|
17
|
+
service <%= @name %> stop
|
18
|
+
|
19
|
+
if [ -e .escualo/jobs ]; then
|
20
|
+
echo "[Escualo] [<%= @name %>] Jobs detected, stopping jobs..."
|
21
|
+
|
22
|
+
for job_path in .escualo/jobs/*; do
|
23
|
+
job=$(basename $job_path)
|
24
|
+
echo "[Escualo] [<%= @name %>] Stopping job $job..."
|
25
|
+
|
26
|
+
monit unmonitor escualo-<%= @name %>-$job
|
27
|
+
service <%= @name %>-$job stop
|
28
|
+
done
|
29
|
+
fi
|
30
|
+
<% end %>
|
31
|
+
|
32
|
+
<% if @executable %>
|
33
|
+
echo '[Escualo] [<%= @name %>] adding executable to /usr/bin...'
|
34
|
+
rm -f /usr/bin/<%= @name %>
|
35
|
+
ln -s /var/bin/<%= @name %>/<%= @name %> /usr/bin
|
36
|
+
<% end %>
|
37
|
+
|
38
|
+
if [ -e .escualo/install/after ]; then
|
39
|
+
echo "[Escualo] [<%= @name %>] .escualo/install/after found. Running it..."
|
40
|
+
chmod u+x .escualo/install/after
|
41
|
+
.escualo/install/after $REVISION
|
42
|
+
fi
|
43
|
+
|
44
|
+
<% if @service %>
|
45
|
+
service <%= @name %> start
|
46
|
+
monit monitor escualo-<%= @name %>
|
47
|
+
|
48
|
+
if [ -e .escualo/jobs ]; then
|
49
|
+
echo "[Escualo] [<%= @name %>] Starting jobs..."
|
50
|
+
|
51
|
+
for job_path in .escualo/jobs/*; do
|
52
|
+
job=$(basename $job_path)
|
53
|
+
echo "[Escualo] [<%= @name %>] Starting job $job..."
|
54
|
+
|
55
|
+
service <%= @name %>-$job start
|
56
|
+
monit monitor escualo-<%= @name %>-$job
|
57
|
+
done
|
58
|
+
fi
|
59
|
+
<% end %>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
echo "[Escualo] [<%= @name %>] Loading environment..."
|
3
|
+
source ~/.escualorc
|
4
|
+
|
5
|
+
echo "[Escualo] [<%= @name %>] Running live hook..."
|
6
|
+
while read oldrev newrev refname
|
7
|
+
do
|
8
|
+
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
|
9
|
+
|
10
|
+
echo "[Escualo] [<%= @name %>] branch found: $branch"
|
11
|
+
if [ "master" == "$branch" ]; then
|
12
|
+
echo "[Escualo::LiveHook::Version] <%= Escualo::BASE_VERSION %>"
|
13
|
+
export ESCUALO_SERVICE_VERSION=<%= Escualo::BASE_VERSION %>
|
14
|
+
|
15
|
+
echo "[Escualo] [<%= @name %>] master branch detected, deploying..."
|
16
|
+
mkdir -p /var/www/<%= @name %>
|
17
|
+
git --work-tree=/var/www/<%= @name %> --git-dir=/var/repo/<%= @name %>.git checkout master -f
|
18
|
+
|
19
|
+
<% if @service %>
|
20
|
+
/var/scripts/<%= @name %>/codechange $newrev
|
21
|
+
<% end %>
|
22
|
+
/var/scripts/<%= @name %>/init $newrev
|
23
|
+
fi
|
24
|
+
done
|
@@ -0,0 +1,14 @@
|
|
1
|
+
description "<%= @name %> configuration"
|
2
|
+
author "Escualo - via The Mumuki Project"
|
3
|
+
|
4
|
+
start on runlevel [2345]
|
5
|
+
stop on runlevel [!2345]
|
6
|
+
|
7
|
+
respawn
|
8
|
+
|
9
|
+
chdir /var/www/<%= @name %>
|
10
|
+
|
11
|
+
script
|
12
|
+
for var in /root/.escualo/vars/*; do . \\$var; done
|
13
|
+
<%= @launch_command %>
|
14
|
+
end script
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: escualo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Franco Leonardo Bulgarelli
|
@@ -14,44 +14,44 @@ dependencies:
|
|
14
14
|
name: commander
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '4.4'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '4.4'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: net-ssh
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.9'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2.9'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: net-scp
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '1.2'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '1.2'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: mumukit-core
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -120,9 +120,41 @@ extra_rdoc_files: []
|
|
120
120
|
files:
|
121
121
|
- bin/escualo
|
122
122
|
- lib/command.rb
|
123
|
+
- lib/commands/artifact.rb
|
124
|
+
- lib/commands/bootstrap.rb
|
125
|
+
- lib/commands/deploy.rb
|
126
|
+
- lib/commands/env.rb
|
127
|
+
- lib/commands/globals.rb
|
128
|
+
- lib/commands/plugin.rb
|
129
|
+
- lib/commands/rake.rb
|
130
|
+
- lib/commands/remote.rb
|
131
|
+
- lib/commands/script.rb
|
132
|
+
- lib/commands/upload.rb
|
123
133
|
- lib/escualo.rb
|
134
|
+
- lib/escualo/artifact.rb
|
135
|
+
- lib/escualo/bootstrap.rb
|
136
|
+
- lib/escualo/env.rb
|
137
|
+
- lib/escualo/plugin.rb
|
138
|
+
- lib/escualo/plugin/docker.rb
|
139
|
+
- lib/escualo/plugin/haskell.rb
|
140
|
+
- lib/escualo/plugin/mongo.rb
|
141
|
+
- lib/escualo/plugin/nginx.rb
|
142
|
+
- lib/escualo/plugin/node.rb
|
143
|
+
- lib/escualo/plugin/postgre.rb
|
144
|
+
- lib/escualo/plugin/rabbit.rb
|
145
|
+
- lib/escualo/remote.rb
|
146
|
+
- lib/escualo/version.rb
|
124
147
|
- lib/ssh.rb
|
148
|
+
- lib/ssh/local_session.rb
|
149
|
+
- lib/ssh/perform.rb
|
150
|
+
- lib/ssh/session.rb
|
151
|
+
- lib/ssh/upload.rb
|
125
152
|
- lib/template.rb
|
153
|
+
- lib/templates/codechange.sh.erb
|
154
|
+
- lib/templates/init.sh.erb
|
155
|
+
- lib/templates/monit.conf.erb
|
156
|
+
- lib/templates/post-receive.sh.erb
|
157
|
+
- lib/templates/upstart.conf.erb
|
126
158
|
homepage: http://github.com/mumuki/escualo.rb
|
127
159
|
licenses:
|
128
160
|
- MIT
|
@@ -132,6 +164,7 @@ post_install_message:
|
|
132
164
|
rdoc_options: []
|
133
165
|
require_paths:
|
134
166
|
- lib
|
167
|
+
- bin
|
135
168
|
required_ruby_version: !ruby/object:Gem::Requirement
|
136
169
|
requirements:
|
137
170
|
- - ">="
|