dply 0.2.19 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rspec +4 -0
- data/Rakefile +0 -14
- data/TODO +0 -1
- data/code_dump/old_remote_task.rb +2 -0
- data/{dev_bin → dev_exe}/dplyr +0 -0
- data/{dev_bin → dev_exe}/drake +1 -1
- data/dply.gemspec +2 -2
- data/{bin → exe}/dplyr +0 -0
- data/{bin → exe}/drake +12 -14
- data/lib/dply/TEST_TODO +50 -0
- data/lib/dply/app_config.rb +108 -0
- data/lib/dply/base_config.rb +110 -0
- data/lib/dply/build.rb +17 -11
- data/lib/dply/build_config.rb +28 -96
- data/lib/dply/bundle.rb +7 -30
- data/lib/dply/cli/build.rb +5 -12
- data/lib/dply/cli/ctl.rb +7 -8
- data/lib/dply/cli/deploy.rb +6 -10
- data/lib/dply/cli/devbuild.rb +6 -10
- data/lib/dply/cli/install_pkgs.rb +2 -3
- data/lib/dply/cli/run.rb +27 -0
- data/lib/dply/cli/status.rb +1 -2
- data/lib/dply/cli/task.rb +6 -12
- data/lib/dply/code_archive.rb +123 -0
- data/lib/dply/command.rb +57 -0
- data/lib/dply/config_downloader.rb +3 -2
- data/lib/dply/curl.rb +1 -5
- data/lib/dply/custom_logger.rb +18 -1
- data/lib/dply/deplist.rb +16 -48
- data/lib/dply/deploy_config.rb +34 -0
- data/lib/dply/elf.rb +60 -0
- data/lib/dply/env.rb +9 -0
- data/lib/dply/git.rb +15 -8
- data/lib/dply/helper.rb +21 -33
- data/lib/dply/linker.rb +27 -27
- data/lib/dply/lock.rb +2 -9
- data/lib/dply/logger.rb +1 -1
- data/lib/dply/pkgs.rb +9 -11
- data/lib/dply/release.rb +2 -2
- data/lib/dply/{archive.rb → remote_archive.rb} +1 -1
- data/lib/dply/repo.rb +3 -3
- data/lib/dply/rpm.rb +12 -20
- data/lib/dply/scripts/depcheck.rb +4 -0
- data/lib/dply/shared_dirs.rb +1 -1
- data/lib/dply/strategy/archive.rb +15 -22
- data/lib/dply/strategy/base.rb +82 -0
- data/lib/dply/strategy/git.rb +18 -19
- data/lib/dply/task_dsl.rb +101 -0
- data/lib/dply/util.rb +75 -0
- data/lib/dply/venv.rb +53 -0
- data/lib/dply/version.rb +1 -1
- data/lib/dply/yum.rb +21 -31
- data/lib/dplyr/consul.rb +1 -1
- data/spec/dply/base_config_spec.rb +178 -0
- data/spec/dply/bundle_spec.rb +100 -0
- data/spec/dply/command_spec.rb +190 -0
- data/spec/dply/curl_spec.rb +41 -0
- data/spec/dply/deplist_spec.rb +48 -0
- data/spec/dply/elf_spec.rb +64 -0
- data/spec/dply/env_spec.rb +57 -0
- data/spec/dply/git_spec.rb +136 -0
- data/spec/dply/helper_spec.rb +168 -0
- data/spec/dply/linker_spec.rb +81 -0
- data/spec/dply/lock_spec.rb +24 -0
- data/spec/dply/pkgs_spec.rb +105 -0
- data/spec/dply/repo_spec.rb +58 -0
- data/spec/dply/rpm_spec.rb +32 -0
- data/spec/dply/yum_spec.rb +29 -0
- data/spec/integration/archive_flow_spec.rb +87 -0
- data/spec/integration/git_flow_spec.rb +63 -0
- data/spec/repo.rb +27 -0
- data/spec/spec_helper.rb +44 -0
- data/spec/test_data/build.tar.gz +0 -0
- data/spec/test_data/build.tar.gz.md5 +1 -0
- data/spec/test_data/bundle/gems_installed/Gemfile +1 -0
- data/spec/test_data/bundle/gems_not_installed/Gemfile +2 -0
- data/spec/test_data/bundle/no_gemfile/.gitkeep +0 -0
- data/spec/test_data/command/test.rb +7 -0
- data/spec/test_data/elf/elf +0 -0
- data/spec/test_data/elf/libpgtypes.so.3 +0 -0
- data/spec/test_data/elf/not_elf +1 -0
- data/spec/test_data/sample_repo/.dply.lock +0 -0
- data/spec/test_data/sample_repo/Gemfile +2 -0
- data/spec/test_data/sample_repo/Rakefile +3 -0
- data/spec/test_data/sample_repo/app.rb +1 -0
- data/spec/test_data/sample_repo/dply/app.rb +33 -0
- data/spec/test_data/sample_repo/lib/libacl.so.1 +0 -0
- data/spec/test_data/sample_repo/pkgs.yml +2 -0
- data/spec/webserver.rb +21 -0
- metadata +96 -28
- data/lib/dply/cli/app_task.rb +0 -38
- data/lib/dply/config.rb +0 -120
- data/lib/dply/config_struct.rb +0 -52
- data/lib/dply/rakelib/drake.rake +0 -33
- data/lib/dply/tasks.rb +0 -136
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'dply/helper'
|
2
|
+
require 'dply/tasks'
|
3
|
+
require 'dply/setup'
|
4
|
+
require 'dply/config_downloader'
|
5
|
+
require 'dply/yum'
|
6
|
+
require 'dply/release'
|
7
|
+
require 'dply/release_helper'
|
8
|
+
require 'forwardable'
|
9
|
+
|
10
|
+
|
11
|
+
module Dply
|
12
|
+
module Strategy
|
13
|
+
class Base
|
14
|
+
|
15
|
+
extend Forwardable
|
16
|
+
include Helper
|
17
|
+
|
18
|
+
attr_reader :config, :options
|
19
|
+
def_delegators :config, :target, :branch, :revision, :name,
|
20
|
+
:config_map, :dir_map, :config_skip_download,
|
21
|
+
:config_download_url, :build_url
|
22
|
+
|
23
|
+
def initialize(config, options)
|
24
|
+
@config = config
|
25
|
+
@options = options || {}
|
26
|
+
end
|
27
|
+
|
28
|
+
def deploy
|
29
|
+
raise NotImplementedError
|
30
|
+
end
|
31
|
+
|
32
|
+
def reload
|
33
|
+
raise NotImplementedError
|
34
|
+
end
|
35
|
+
|
36
|
+
def stop
|
37
|
+
raise NotImplementedError
|
38
|
+
end
|
39
|
+
|
40
|
+
def reopen_logs
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def current_dir
|
46
|
+
@current_dir ||= "#{config.dir}/current"
|
47
|
+
end
|
48
|
+
|
49
|
+
def download_configs
|
50
|
+
files = config_map.values.uniq
|
51
|
+
downloader = ConfigDownloader.new(files, config_download_url, dir: "config")
|
52
|
+
downloader.skip_download = config_skip_download if config_skip_download
|
53
|
+
downloader.download_all
|
54
|
+
end
|
55
|
+
|
56
|
+
def link_all
|
57
|
+
link "#{config.dir}/shared", dir_map
|
58
|
+
tasks.link "#{config.dir}/config", config_map
|
59
|
+
end
|
60
|
+
|
61
|
+
def link(source, map)
|
62
|
+
return if not map
|
63
|
+
logger.bullet "symlinking #{source}"
|
64
|
+
dest = Dir.pwd
|
65
|
+
linker = Linker.new(source, dest, map: map)
|
66
|
+
linker.create_symlinks
|
67
|
+
end
|
68
|
+
|
69
|
+
def setup
|
70
|
+
@setup ||= Setup.new(@config)
|
71
|
+
end
|
72
|
+
|
73
|
+
def tasks
|
74
|
+
@tasks ||= Tasks.new
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class NotImplementedError < StandardError
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
data/lib/dply/strategy/git.rb
CHANGED
@@ -2,14 +2,13 @@ require 'dply/helper'
|
|
2
2
|
require 'dply/setup'
|
3
3
|
require 'dply/config_downloader'
|
4
4
|
require 'dply/yum'
|
5
|
-
require 'dply/
|
5
|
+
require 'dply/util'
|
6
6
|
require 'forwardable'
|
7
7
|
|
8
|
-
|
9
8
|
module Dply
|
10
9
|
module Strategy
|
11
10
|
class Git
|
12
|
-
|
11
|
+
|
13
12
|
extend Forwardable
|
14
13
|
include Helper
|
15
14
|
|
@@ -17,7 +16,7 @@ module Dply
|
|
17
16
|
def_delegators :config, :target, :branch,
|
18
17
|
:config_map, :dir_map, :config_skip_download,
|
19
18
|
:config_download_url
|
20
|
-
|
19
|
+
|
21
20
|
def initialize(config, options)
|
22
21
|
@config = config
|
23
22
|
@options = options || {}
|
@@ -33,8 +32,10 @@ module Dply
|
|
33
32
|
current_version = git.commit_id
|
34
33
|
link_all
|
35
34
|
install_pkgs
|
36
|
-
|
37
|
-
|
35
|
+
bundle.install
|
36
|
+
bundle.clean
|
37
|
+
util.run "deploy:#{deploy_target}"
|
38
|
+
util.report_changes(previous_version, current_version)
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
@@ -42,13 +43,7 @@ module Dply
|
|
42
43
|
download_configs if config_download_url
|
43
44
|
Dir.chdir current_dir do
|
44
45
|
link_all
|
45
|
-
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def task(name)
|
50
|
-
Dir.chdir current_dir do
|
51
|
-
tasks.rake name
|
46
|
+
util.run :reload
|
52
47
|
end
|
53
48
|
end
|
54
49
|
|
@@ -61,7 +56,7 @@ module Dply
|
|
61
56
|
def download_configs
|
62
57
|
files = config_map.values.uniq
|
63
58
|
downloader = ConfigDownloader.new(files, config_download_url)
|
64
|
-
downloader.skip_download = config_skip_download if config_skip_download
|
59
|
+
downloader.skip_download = config_skip_download if config_skip_download
|
65
60
|
downloader.download_all
|
66
61
|
end
|
67
62
|
|
@@ -75,20 +70,24 @@ module Dply
|
|
75
70
|
end
|
76
71
|
|
77
72
|
def link_all
|
78
|
-
|
79
|
-
|
73
|
+
util.link "#{config.dir}/shared", dir_map
|
74
|
+
util.link "#{config.dir}/config", config_map
|
80
75
|
end
|
81
76
|
|
82
77
|
def install_pkgs
|
83
|
-
|
78
|
+
util.install_pkgs(build_mode: true)
|
84
79
|
end
|
85
80
|
|
86
81
|
def setup
|
87
82
|
@setup ||= Setup.new(@config)
|
88
83
|
end
|
89
84
|
|
90
|
-
def
|
91
|
-
@
|
85
|
+
def util
|
86
|
+
@util ||= Util.new
|
87
|
+
end
|
88
|
+
|
89
|
+
def bundle
|
90
|
+
@bundle ||= Bundle.new
|
92
91
|
end
|
93
92
|
|
94
93
|
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
module Dply
|
4
|
+
class TaskDsl
|
5
|
+
|
6
|
+
include Helper
|
7
|
+
|
8
|
+
def initialize(app_config)
|
9
|
+
@app_config = app_config
|
10
|
+
end
|
11
|
+
|
12
|
+
def run(name)
|
13
|
+
@app_config.run_task name
|
14
|
+
end
|
15
|
+
|
16
|
+
def sh(command, env: {}, bundled_env: false)
|
17
|
+
extra_env = base_env.merge env
|
18
|
+
super(command, env: extra_env, bundled_env: bundled_env, display: :arrow)
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_env(key, value)
|
22
|
+
ENV[key.to_s] = value.to_s
|
23
|
+
base_env[key.to_s] = value.to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
def rake(task, *args)
|
27
|
+
logger.arrow "rake #{task}"
|
28
|
+
rake_app[task].invoke(*args)
|
29
|
+
end
|
30
|
+
|
31
|
+
def archive(name, **opts, &block)
|
32
|
+
require_relative 'code_archive'
|
33
|
+
revision = ENV["BUILD_NUMBER"] || "unknown"
|
34
|
+
archive = CodeArchive.new(name, revision: revision)
|
35
|
+
archive.build(**opts, &block)
|
36
|
+
return archive
|
37
|
+
end
|
38
|
+
|
39
|
+
def role(*roles, &block)
|
40
|
+
roles << :all
|
41
|
+
if r = roles.find { |r| dply_roles.include? r }
|
42
|
+
yield r
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def role?(*roles)
|
47
|
+
roles << :all
|
48
|
+
roles.find { |r| dply_roles.include? r }
|
49
|
+
end
|
50
|
+
|
51
|
+
def venv
|
52
|
+
@venv ||= begin
|
53
|
+
require_relative 'venv'
|
54
|
+
Venv.new
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def base_env
|
61
|
+
@base_env ||= begin
|
62
|
+
env = {}
|
63
|
+
env.merge! env_from_yml(".env.yml")
|
64
|
+
env.merge! env_from_yml("config/env.yml")
|
65
|
+
env
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def env_from_yml(path)
|
70
|
+
if not File.readable? path
|
71
|
+
logger.debug "skipped loading env from #{path}"
|
72
|
+
return {}
|
73
|
+
end
|
74
|
+
require 'yaml'
|
75
|
+
YAML.load_file(path)
|
76
|
+
end
|
77
|
+
|
78
|
+
def rake_app
|
79
|
+
@rake_app ||= begin
|
80
|
+
require 'rake'
|
81
|
+
app = Rake.application
|
82
|
+
app.init
|
83
|
+
silence_warnings { app.load_rakefile }
|
84
|
+
app
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def dply_roles
|
89
|
+
@dply_roles ||= (ENV["DPLY_ROLES"] || "").strip.split(",").map { |r| r.to_sym }
|
90
|
+
end
|
91
|
+
|
92
|
+
def silence_warnings(&block)
|
93
|
+
warn_level = $VERBOSE
|
94
|
+
$VERBOSE = nil
|
95
|
+
yield
|
96
|
+
ensure
|
97
|
+
$VERBOSE = warn_level
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
data/lib/dply/util.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative 'app_config'
|
3
|
+
require_relative 'helper'
|
4
|
+
require_relative 'bundle'
|
5
|
+
require_relative 'linker'
|
6
|
+
require_relative 'pkgs'
|
7
|
+
require 'etc'
|
8
|
+
|
9
|
+
module Dply
|
10
|
+
class Util
|
11
|
+
|
12
|
+
include Helper
|
13
|
+
|
14
|
+
def rake(task, args)
|
15
|
+
cmd_arr = ["bundle", "exec", "rake", task, *args]
|
16
|
+
cmd cmd_arr
|
17
|
+
end
|
18
|
+
|
19
|
+
def report_changes(previous_version, current_version)
|
20
|
+
info = {}
|
21
|
+
info[:current] = current_version
|
22
|
+
info[:previous] = previous_version
|
23
|
+
logger.remote "#{previous_version} => #{current_version}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def install_pkgs(build_mode: false)
|
27
|
+
return if not File.exists? "pkgs.yml"
|
28
|
+
pkgs = Pkgs.new("pkgs.yml")
|
29
|
+
return if pkgs.installed?(build_mode: build_mode)
|
30
|
+
drake_install build_mode
|
31
|
+
end
|
32
|
+
|
33
|
+
def link(source, map)
|
34
|
+
return if not map
|
35
|
+
logger.bullet "symlinking #{source}"
|
36
|
+
dest = Dir.pwd
|
37
|
+
linker = Linker.new(source, dest, map: map)
|
38
|
+
linker.create_symlinks
|
39
|
+
end
|
40
|
+
|
41
|
+
def run(task, optional: false)
|
42
|
+
app_config = AppConfig.new
|
43
|
+
logger.arrow task
|
44
|
+
app_config.run_task task, optional: optional
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def drake_install(build_mode)
|
50
|
+
command = "#{drake_command} install-pkgs"
|
51
|
+
command << " -b" if build_mode
|
52
|
+
check_sudo_permission command
|
53
|
+
cmd "sudo -n #{command}"
|
54
|
+
end
|
55
|
+
|
56
|
+
def drake_command
|
57
|
+
@drake_command ||= (ENV["DRAKE_COMMAND"] || "/opt/ruby/bin/drake")
|
58
|
+
end
|
59
|
+
|
60
|
+
def check_sudo_permission(command)
|
61
|
+
output = `sudo -n -l #{command}`
|
62
|
+
if output.chomp.strip == command
|
63
|
+
return true
|
64
|
+
else
|
65
|
+
msg = []
|
66
|
+
user = Etc.getpwuid(Process.uid).name
|
67
|
+
msg << %{unable to run "#{command}" with sudo permissions}
|
68
|
+
msg << %{To resolve add the following line to sudoers: }
|
69
|
+
msg << %{#{user} ALL=(ALL) NOPASSWD: /opt/ruby/bin/drake install-pkgs *, /opt/ruby/bin/drake install-pkgs}.yellow
|
70
|
+
raise Error, msg.join("\n")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
data/lib/dply/venv.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require_relative 'helper'
|
3
|
+
|
4
|
+
module Dply
|
5
|
+
class Venv
|
6
|
+
|
7
|
+
include Helper
|
8
|
+
|
9
|
+
def install(system_site_packages: false, pip_version: "9.0.1", setuptools_version: "38.4.1", &block)
|
10
|
+
init(system_site_packages)
|
11
|
+
update_pip_setuptools(pip_version, setuptools_version)
|
12
|
+
yield if block_given?
|
13
|
+
pip_install
|
14
|
+
end
|
15
|
+
|
16
|
+
def build(system_site_packages: false, pip_version: "9.0.1", setuptools_version: "38.4.1", &block)
|
17
|
+
FileUtils.mkdir_p "tmp/venv"
|
18
|
+
symlink "tmp/venv", "venv"
|
19
|
+
init(system_site_packages)
|
20
|
+
update_pip_setuptools(pip_version, setuptools_version)
|
21
|
+
yield if block_given?
|
22
|
+
pip_install
|
23
|
+
sh "virtualenv-relocate -s venv"
|
24
|
+
end
|
25
|
+
|
26
|
+
def unpack
|
27
|
+
sh "virtualenv-relocate -d venv"
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def init(system_site_packages = false)
|
33
|
+
return if File.exist? "venv/.setup_done"
|
34
|
+
system_flag = system_site_packages ? "--system-site-packages" : ""
|
35
|
+
sh "virtualenv #{system_flag} venv"
|
36
|
+
FileUtils.touch "venv/.setup_done"
|
37
|
+
end
|
38
|
+
|
39
|
+
def pip_install
|
40
|
+
sh "venv/bin/pip install -r requirements.txt"
|
41
|
+
end
|
42
|
+
|
43
|
+
def python(command)
|
44
|
+
sh "venv/bin/python #{command}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def update_pip_setuptools(pip_version, setuptools_version)
|
48
|
+
sh "venv/bin/pip install pip==#{pip_version}"
|
49
|
+
sh "venv/bin/pip install setuptools==#{setuptools_version}"
|
50
|
+
# sh "venv/bin/pip install urllib3[secure]"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/dply/version.rb
CHANGED
data/lib/dply/yum.rb
CHANGED
@@ -1,46 +1,36 @@
|
|
1
|
-
|
1
|
+
require_relative 'helper'
|
2
2
|
|
3
3
|
module Dply
|
4
|
-
|
4
|
+
module Yum
|
5
|
+
extend Helper
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
@sudo = sudo
|
11
|
-
end
|
12
|
-
|
13
|
-
def install
|
14
|
-
return if installed?
|
15
|
-
command = ""
|
16
|
-
command << "sudo -n " if @sudo
|
17
|
-
command << "yum install -y #{not_installed_pkgs.join(' ')}"
|
18
|
-
cmd command
|
19
|
-
not_installed = query_not_installed
|
7
|
+
def self.install(pkgs)
|
8
|
+
return if installed?(pkgs)
|
9
|
+
cmd install_command(pkgs)
|
10
|
+
not_installed = not_installed(pkgs)
|
20
11
|
if not_installed.size != 0
|
21
12
|
error "following pkgs not installed: #{not_installed.join(" ")}"
|
22
13
|
end
|
23
14
|
end
|
24
15
|
|
25
|
-
def installed?
|
26
|
-
|
16
|
+
def self.installed?(pkgs)
|
17
|
+
not_installed(pkgs).size == 0
|
27
18
|
end
|
28
19
|
|
29
|
-
|
30
|
-
|
31
|
-
def pkgs_str
|
32
|
-
@pkgs.join " "
|
33
|
-
end
|
20
|
+
class << self
|
21
|
+
private
|
34
22
|
|
35
|
-
|
36
|
-
|
37
|
-
|
23
|
+
def not_installed(pkgs)
|
24
|
+
return [] if pkgs.empty?
|
25
|
+
command = %w(rpm -V --noscripts --nodeps --nofiles)
|
26
|
+
command.concat pkgs
|
27
|
+
out = IO.popen(command).read
|
28
|
+
out.scan(/^package (.*) is not installed$/).flatten
|
29
|
+
end
|
38
30
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
matches = `#{command}`.scan(/^package (.*) is not installed$/)
|
31
|
+
def install_command(pkgs)
|
32
|
+
%w(yum install -y).concat(not_installed pkgs)
|
33
|
+
end
|
43
34
|
end
|
44
|
-
|
45
35
|
end
|
46
36
|
end
|