fulmar 1.9.2 → 1.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -2
- data/fulmar.gemspec +0 -2
- data/lib/fulmar/domain/service/configuration_service.rb +3 -2
- data/lib/fulmar/domain/task/initialization/base.rake +0 -9
- data/lib/fulmar/infrastructure/service/database/database_service.rb +0 -70
- data/lib/fulmar/version.rb +1 -1
- metadata +2 -33
- data/lib/fulmar/domain/service/dependency_service.rb +0 -106
- data/lib/fulmar/domain/service/helper/dependencies_helper.rb +0 -16
- data/lib/fulmar/domain/task/optional/vhost.rb +0 -80
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 375aee75cd020abdfdefb0622dd2f90e547c31c0
|
4
|
+
data.tar.gz: 8b8ae5c411d00386e02ad4be9ef1d515d0f541b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44e7234acfce670e208e86ca23f299b31488049f0d9578e0ba252806d0a329c5c17b205b8a3c42f3567ed73519d9cf939f89c3270ffba1e651e3e313e84dbeda
|
7
|
+
data.tar.gz: 0d0c3b6b2e6501f5c2a2df70f017147622f420f0c6ea909903515aa36c2689fd2c9d17914aa482983352ef978afd1826767821f0ccc485a1e5267d02b31f4862
|
data/README.md
CHANGED
@@ -15,6 +15,14 @@ compatible (i.e. database).
|
|
15
15
|
It has (yet limited) support for MySQL / MariaDB and git. Remote databases can be accessed
|
16
16
|
through an ssh tunnel.
|
17
17
|
|
18
|
+
## Warning
|
19
|
+
|
20
|
+
Version 1.10.0 of Fulmar removes some features that we (CORE4) rarely used and which
|
21
|
+
caused the deployments to slow down the gems needed to be compiled against the
|
22
|
+
installed libraries. If you need support to query databases (more than just dumps)
|
23
|
+
or use dependencies, you will need to explicitly specify version `~> 1.9.0`.
|
24
|
+
Fulmar 2.0 will support these features via plugins.
|
25
|
+
|
18
26
|
## Prerequisites
|
19
27
|
|
20
28
|
Fulmar currently requires the [mysql2](https://github.com/brianmario/mysql2) gem which
|
@@ -24,7 +32,8 @@ libmariadbclient-dev/libmysqlclient-dev or similar.
|
|
24
32
|
You also need cmake and pkg-config to build the dependencies.
|
25
33
|
|
26
34
|
- OSX: brew install mariadb cmake pkg-config
|
27
|
-
- Ubuntu: apt-get install
|
35
|
+
- Ubuntu: apt-get install libmariadb-client-lgpl-dev build-essential cmake
|
36
|
+
- Ubuntu (pre-xenial): apt-get install libmariadbclient-dev build-essential cmake
|
28
37
|
|
29
38
|
## Installation
|
30
39
|
|
@@ -55,7 +64,7 @@ several files.
|
|
55
64
|
$ mkdir Fulmar
|
56
65
|
$ touch Fulmar/project.config.yml
|
57
66
|
|
58
|
-
You can now
|
67
|
+
You can now test your configuration.
|
59
68
|
|
60
69
|
$ fulmar test:config
|
61
70
|
|
data/fulmar.gemspec
CHANGED
@@ -21,8 +21,6 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency 'bundler', '~> 1.7'
|
22
22
|
|
23
23
|
spec.add_runtime_dependency 'rake', '~>10'
|
24
|
-
spec.add_runtime_dependency 'rugged', '~> 0.23.0'
|
25
|
-
spec.add_runtime_dependency 'mysql2', '~>0.3'
|
26
24
|
spec.add_runtime_dependency 'fulmar-shell', '~>1', '>=1.7.0'
|
27
25
|
spec.add_runtime_dependency 'ruby_wings', '~>0.1', '>=0.1.1'
|
28
26
|
spec.add_runtime_dependency 'colorize', '~>0'
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'pp'
|
3
3
|
require 'fulmar/domain/model/project'
|
4
|
+
require 'singleton'
|
4
5
|
|
5
6
|
module Fulmar
|
6
7
|
module Domain
|
@@ -22,7 +23,7 @@ module Fulmar
|
|
22
23
|
dependencies: { all: {} }
|
23
24
|
}
|
24
25
|
|
25
|
-
include Singleton
|
26
|
+
include ::Singleton
|
26
27
|
|
27
28
|
attr_reader :environment, :target
|
28
29
|
attr_accessor :load_user_config
|
@@ -216,7 +217,7 @@ module Fulmar
|
|
216
217
|
def check_version
|
217
218
|
return if @config[:project][:fulmar_version].nil?
|
218
219
|
unless Gem::Dependency.new('', @config[:project][:fulmar_version]).match?('', Fulmar::VERSION)
|
219
|
-
fail "Project requires
|
220
|
+
fail "Project requires another version of fulmar: #{@config[:project][:fulmar_version]}"
|
220
221
|
end
|
221
222
|
end
|
222
223
|
end
|
@@ -10,12 +10,3 @@ if configuration.feature? :flow
|
|
10
10
|
require 'fulmar/domain/service/helper/flow_helper'
|
11
11
|
include Fulmar::Domain::Service::Helper::FlowHelper
|
12
12
|
end
|
13
|
-
|
14
|
-
if full_configuration[:dependencies].any?
|
15
|
-
require 'fulmar/domain/service/helper/dependencies_helper'
|
16
|
-
include Fulmar::Domain::Service::Helper::DependenciesHelper
|
17
|
-
end
|
18
|
-
|
19
|
-
if configuration.feature?(:vhost) && configuration.any? { |data| !data[:vhost_template].blank? }
|
20
|
-
require 'fulmar/domain/task/optional/vhost'
|
21
|
-
end
|
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'mysql2'
|
2
|
-
require 'fulmar/infrastructure/service/tunnel_service'
|
3
|
-
|
4
1
|
module Fulmar
|
5
2
|
module Infrastructure
|
6
3
|
module Service
|
@@ -25,55 +22,14 @@ module Fulmar
|
|
25
22
|
def initialize(config)
|
26
23
|
@config = config
|
27
24
|
@config.merge DEFAULT_CONFIG
|
28
|
-
@tunnel = nil
|
29
|
-
@client = nil
|
30
25
|
initialize_shell
|
31
26
|
config_test
|
32
27
|
end
|
33
28
|
|
34
|
-
def connect
|
35
|
-
options = compile_options
|
36
|
-
|
37
|
-
unless local?
|
38
|
-
tunnel.open
|
39
|
-
options[:port] = tunnel.local_port
|
40
|
-
end
|
41
|
-
|
42
|
-
# Wait max 3 seconds for the tunnel to establish
|
43
|
-
6.times do |i|
|
44
|
-
break if try_connect(options, i)
|
45
|
-
end
|
46
|
-
|
47
|
-
@connected = true
|
48
|
-
query("USE #{@config[:maria][:database]}")
|
49
|
-
end
|
50
|
-
|
51
|
-
def disconnect
|
52
|
-
@connected = false
|
53
|
-
@client.close
|
54
|
-
@tunnel.close if @tunnel # using the variable directly avoids creating a tunnel instance when closing the database connection
|
55
|
-
end
|
56
|
-
|
57
29
|
def local?
|
58
30
|
@config[:hostname] == 'localhost'
|
59
31
|
end
|
60
32
|
|
61
|
-
def tunnel
|
62
|
-
@tunnel ||= Fulmar::Infrastructure::Service::TunnelService.new(@config.ssh_user_and_host, @config[:maria][:port], @config[:maria][:hostname])
|
63
|
-
end
|
64
|
-
|
65
|
-
# shortcut for DatabaseService.client.query
|
66
|
-
def query(*arguments)
|
67
|
-
@client.query(*arguments)
|
68
|
-
end
|
69
|
-
|
70
|
-
def create(name)
|
71
|
-
state_before = connected?
|
72
|
-
connect unless connected?
|
73
|
-
@client.query "CREATE DATABASE IF NOT EXISTS `#{name}`"
|
74
|
-
disconnect unless state_before
|
75
|
-
end
|
76
|
-
|
77
33
|
def command(binary)
|
78
34
|
command = binary
|
79
35
|
command << " -h #{@config[:maria][:host]}" unless @config[:maria][:host].blank?
|
@@ -106,34 +62,8 @@ module Fulmar
|
|
106
62
|
end
|
107
63
|
end
|
108
64
|
|
109
|
-
def clear
|
110
|
-
clear_statements = <<-EOD.gsub(/^\s+\|/, '')
|
111
|
-
|SET FOREIGN_KEY_CHECKS = 0;
|
112
|
-
|SET GROUP_CONCAT_MAX_LEN=32768;
|
113
|
-
|SET @tables = NULL;
|
114
|
-
|SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables
|
115
|
-
|FROM information_schema.tables
|
116
|
-
|WHERE table_schema = (SELECT DATABASE());
|
117
|
-
|SELECT IFNULL(@tables,'dummy') INTO @tables;
|
118
|
-
|
|
119
|
-
|SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
|
120
|
-
|PREPARE stmt FROM @tables;
|
121
|
-
|EXECUTE stmt;
|
122
|
-
|DEALLOCATE PREPARE stmt;
|
123
|
-
|SET FOREIGN_KEY_CHECKS = 1;
|
124
|
-
EOD
|
125
|
-
@client.query clear_statements
|
126
|
-
end
|
127
|
-
|
128
65
|
protected
|
129
66
|
|
130
|
-
def try_connect(options, i)
|
131
|
-
@client = Mysql2::Client.new options
|
132
|
-
rescue Mysql2::Error => e
|
133
|
-
sleep 1 if i < 5
|
134
|
-
raise e.message if i == 5
|
135
|
-
end
|
136
|
-
|
137
67
|
# Return mysql command line options to ignore specific tables
|
138
68
|
def ignore_tables
|
139
69
|
@config[:maria][:ignore_tables] = [*@config[:maria][:ignore_tables]]
|
data/lib/fulmar/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fulmar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonas Siegl
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-02-
|
12
|
+
date: 2017-02-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -39,34 +39,6 @@ dependencies:
|
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '10'
|
42
|
-
- !ruby/object:Gem::Dependency
|
43
|
-
name: rugged
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
45
|
-
requirements:
|
46
|
-
- - "~>"
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version: 0.23.0
|
49
|
-
type: :runtime
|
50
|
-
prerelease: false
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
52
|
-
requirements:
|
53
|
-
- - "~>"
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: 0.23.0
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
name: mysql2
|
58
|
-
requirement: !ruby/object:Gem::Requirement
|
59
|
-
requirements:
|
60
|
-
- - "~>"
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '0.3'
|
63
|
-
type: :runtime
|
64
|
-
prerelease: false
|
65
|
-
version_requirements: !ruby/object:Gem::Requirement
|
66
|
-
requirements:
|
67
|
-
- - "~>"
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: '0.3'
|
70
42
|
- !ruby/object:Gem::Dependency
|
71
43
|
name: fulmar-shell
|
72
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,11 +118,9 @@ files:
|
|
146
118
|
- lib/fulmar/domain/service/config_rendering_service.rb
|
147
119
|
- lib/fulmar/domain/service/config_test_service.rb
|
148
120
|
- lib/fulmar/domain/service/configuration_service.rb
|
149
|
-
- lib/fulmar/domain/service/dependency_service.rb
|
150
121
|
- lib/fulmar/domain/service/file_sync_service.rb
|
151
122
|
- lib/fulmar/domain/service/helper/common_helper.rb
|
152
123
|
- lib/fulmar/domain/service/helper/database_helper.rb
|
153
|
-
- lib/fulmar/domain/service/helper/dependencies_helper.rb
|
154
124
|
- lib/fulmar/domain/service/helper/flow_helper.rb
|
155
125
|
- lib/fulmar/domain/service/helper/vhost_helper.rb
|
156
126
|
- lib/fulmar/domain/service/initialization_service.rb
|
@@ -159,7 +129,6 @@ files:
|
|
159
129
|
- lib/fulmar/domain/task/database_sync.rake
|
160
130
|
- lib/fulmar/domain/task/environment.rake
|
161
131
|
- lib/fulmar/domain/task/initialization/base.rake
|
162
|
-
- lib/fulmar/domain/task/optional/vhost.rb
|
163
132
|
- lib/fulmar/domain/task/versions.rake
|
164
133
|
- lib/fulmar/infrastructure/service/composer_service.rb
|
165
134
|
- lib/fulmar/infrastructure/service/copy_service.rb
|
@@ -1,106 +0,0 @@
|
|
1
|
-
require 'rugged'
|
2
|
-
|
3
|
-
module Fulmar
|
4
|
-
module Domain
|
5
|
-
module Service
|
6
|
-
# Manages dependencies to subrepositories
|
7
|
-
class DependencyService
|
8
|
-
def initialize(config)
|
9
|
-
@config = config
|
10
|
-
end
|
11
|
-
|
12
|
-
def setup(env = @config.environment)
|
13
|
-
shell = Fulmar::Infrastructure::Service::ShellService.new(@config[:local_path])
|
14
|
-
@config.dependencies(env).each_pair do |_key, data|
|
15
|
-
next unless data[:type].blank? || data[:type] == 'git'
|
16
|
-
shell.quiet = true
|
17
|
-
|
18
|
-
if Dir.exist? "#{data[:path]}/.git"
|
19
|
-
shell.run 'git fetch -q', in: data[:path]
|
20
|
-
else
|
21
|
-
shell.run "git clone \"#{data[:source]}\" \"#{data[:path]}\" -q"
|
22
|
-
shell.last_error.each do |line|
|
23
|
-
puts line unless line.include? 'already exists and is not an empty directory'
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
git = Rugged::Repository.new(data[:path])
|
28
|
-
checkout(git, data)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def update(env = @config.environment)
|
33
|
-
@config.dependencies(env).each_pair do |_key, data|
|
34
|
-
next unless data[:type].blank? || data[:type] == 'git'
|
35
|
-
git = Rugged::Repository.new(data[:path])
|
36
|
-
|
37
|
-
handle_uncommitted_changes(git, data)
|
38
|
-
|
39
|
-
# Pull
|
40
|
-
shell = Fulmar::Infrastructure::Service::ShellService.new data[:path]
|
41
|
-
unless shell.run 'git pull --rebase -q'
|
42
|
-
fail "Cannot update repository #{data[:path]}. Please update manually."
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
protected
|
48
|
-
|
49
|
-
##
|
50
|
-
# Runs a defined update policy to avoid git conflicts
|
51
|
-
# @param git [Rugged::Repository]
|
52
|
-
# @param dependency [Hash]
|
53
|
-
def handle_uncommitted_changes(git, dependency)
|
54
|
-
policy = dependency[:update_policy] || ''
|
55
|
-
|
56
|
-
case policy
|
57
|
-
when 'reset'
|
58
|
-
reset(git)
|
59
|
-
when -> (p) { p.nil? || p.empty? }
|
60
|
-
puts 'No update policy configured' if @config[:debug]
|
61
|
-
else
|
62
|
-
puts "Unexpected update policy #{policy}"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
##
|
67
|
-
# Reset changes
|
68
|
-
# @param git [Rugged::Repository]
|
69
|
-
def reset(git)
|
70
|
-
head = git.head
|
71
|
-
git.reset(head.target_id, :hard) unless head.nil?
|
72
|
-
end
|
73
|
-
|
74
|
-
def checkout(git, dependency)
|
75
|
-
handle_uncommitted_changes(git, dependency)
|
76
|
-
|
77
|
-
# Switch to the configured branch/tag/commit
|
78
|
-
if git.branches.select { |b| b.name.split('/').last == dependency[:ref] }.any?
|
79
|
-
checkout_branch(git, dependency[:ref])
|
80
|
-
elsif git.tags.map(&:name).include?(dependency[:ref])
|
81
|
-
git.checkout("refs/tags/#{dependency[:ref]}")
|
82
|
-
elsif dependency[:ref].match(/^[a-zA-Z0-9]{40}$/) && git.exists?(dependency[:ref])
|
83
|
-
git.checkout(dependency[:ref])
|
84
|
-
else
|
85
|
-
fail "Cannot find ref #{dependency[:ref]} in repo #{dependency[:path]}"
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def checkout_branch(git, branch, remote = 'origin')
|
90
|
-
if git.branches.collect(&:name).include? branch
|
91
|
-
git.checkout(branch)
|
92
|
-
else
|
93
|
-
remote_branch = git.branches.find do |b|
|
94
|
-
b.name == "#{remote}/#{branch}"
|
95
|
-
end
|
96
|
-
|
97
|
-
new_branch = git.branches.create(branch, remote_branch.name)
|
98
|
-
new_branch.upstream=(remote_branch)
|
99
|
-
|
100
|
-
git.checkout(new_branch)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'fulmar/domain/service/dependency_service'
|
2
|
-
|
3
|
-
module Fulmar
|
4
|
-
module Domain
|
5
|
-
module Service
|
6
|
-
module Helper
|
7
|
-
# Provides access helper to the database service from within a task
|
8
|
-
module DependenciesHelper
|
9
|
-
def dependencies
|
10
|
-
storage['dependecies'] ||= Fulmar::Domain::Service::DependencyService.new configuration
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,80 +0,0 @@
|
|
1
|
-
require 'fulmar/domain/service/helper/vhost_helper'
|
2
|
-
include Fulmar::Domain::Service::Helper::VhostHelper
|
3
|
-
|
4
|
-
VHOST_DEFAULT_CONFIG = {
|
5
|
-
webserver: 'nginx',
|
6
|
-
sites_enabled_dir: '../sites-enabled'
|
7
|
-
}
|
8
|
-
|
9
|
-
vhost_count = 0
|
10
|
-
configuration.each { |_env, _target, data| vhost_count += 1 unless data[:vhost_template].blank? }
|
11
|
-
|
12
|
-
namespace :vhost do
|
13
|
-
configuration.each do |env, target, data|
|
14
|
-
next if data[:vhost_template].blank?
|
15
|
-
|
16
|
-
task_environment = vhost_count > 1 ? ":#{env}" : ''
|
17
|
-
|
18
|
-
desc "Create a vhost for #{env}"
|
19
|
-
task "create#{task_environment}" do
|
20
|
-
configuration.environment = env
|
21
|
-
configuration.target = target
|
22
|
-
configuration.merge(VHOST_DEFAULT_CONFIG)
|
23
|
-
|
24
|
-
# Store remote_path for recovery
|
25
|
-
remote_path = configuration[:remote_path]
|
26
|
-
|
27
|
-
# Set some default variables:
|
28
|
-
configuration[:sites_available_dir] ||= "/etc/#{configuration[:webserver]}/sites-available"
|
29
|
-
configuration[:remote_path] = configuration[:sites_available_dir]
|
30
|
-
configuration[:vhost_name] = vhost_name
|
31
|
-
|
32
|
-
render_templates
|
33
|
-
rendered_vhost_config = File.dirname(configuration[:local_path] + '/' + configuration[:vhost_template]) + \
|
34
|
-
'/' + File.basename(configuration[:vhost_template], '.erb')
|
35
|
-
config_file_name = "#{File.dirname(rendered_vhost_config)}/auto_vhost_#{configuration[:vhost_name]}.conf"
|
36
|
-
FileUtils.mv rendered_vhost_config, config_file_name
|
37
|
-
upload config_file_name
|
38
|
-
config_remote_path = configuration[:sites_available_dir] + '/' + File.basename(config_file_name)
|
39
|
-
remote_shell.run [
|
40
|
-
"rm -f #{configuration[:sites_enabled_dir]}/#{File.basename(config_file_name)}", # remove any existing link
|
41
|
-
"ln -s #{config_remote_path} #{configuration[:sites_enabled_dir]}/#{File.basename(config_file_name)}",
|
42
|
-
"service #{configuration[:webserver]} reload"
|
43
|
-
]
|
44
|
-
|
45
|
-
FileUtils.rm config_file_name
|
46
|
-
|
47
|
-
# recover remote path
|
48
|
-
configuration[:remote_path] = remote_path
|
49
|
-
end
|
50
|
-
|
51
|
-
desc "List existing vhosts for #{env}"
|
52
|
-
task "list#{task_environment}" do
|
53
|
-
configuration.environment = env
|
54
|
-
configuration.target = target
|
55
|
-
configuration.merge(VHOST_DEFAULT_CONFIG)
|
56
|
-
|
57
|
-
remote_shell.run 'ls -1'
|
58
|
-
remote_shell.last_output.each do |line|
|
59
|
-
match = line.match(/auto_vhost_(.*)\.conf/)
|
60
|
-
if match
|
61
|
-
name = match[1]
|
62
|
-
puts "- #{name}, delete via 'fulmar vhost:delete[#{name}]'"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
desc "Delete a vhost for #{env}"
|
68
|
-
task "delete#{task_environment}", [:name] do |_t, argv|
|
69
|
-
configuration.environment = env
|
70
|
-
configuration.target = target
|
71
|
-
configuration.merge(VHOST_DEFAULT_CONFIG)
|
72
|
-
|
73
|
-
remote_shell.run [
|
74
|
-
"rm auto_vhost_#{argv[:name]}.conf",
|
75
|
-
"rm #{configuration[:sites_enabled_dir]}/auto_vhost_#{argv[:name]}.conf",
|
76
|
-
"service #{configuration[:webserver] || 'nginx'} reload"
|
77
|
-
]
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|