dply 0.2.19 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +5 -5
  2. data/.rspec +4 -0
  3. data/Rakefile +0 -14
  4. data/TODO +0 -1
  5. data/code_dump/old_remote_task.rb +2 -0
  6. data/{dev_bin → dev_exe}/dplyr +0 -0
  7. data/{dev_bin → dev_exe}/drake +1 -1
  8. data/dply.gemspec +2 -2
  9. data/{bin → exe}/dplyr +0 -0
  10. data/{bin → exe}/drake +12 -14
  11. data/lib/dply/TEST_TODO +50 -0
  12. data/lib/dply/app_config.rb +108 -0
  13. data/lib/dply/base_config.rb +110 -0
  14. data/lib/dply/build.rb +17 -11
  15. data/lib/dply/build_config.rb +28 -96
  16. data/lib/dply/bundle.rb +7 -30
  17. data/lib/dply/cli/build.rb +5 -12
  18. data/lib/dply/cli/ctl.rb +7 -8
  19. data/lib/dply/cli/deploy.rb +6 -10
  20. data/lib/dply/cli/devbuild.rb +6 -10
  21. data/lib/dply/cli/install_pkgs.rb +2 -3
  22. data/lib/dply/cli/run.rb +27 -0
  23. data/lib/dply/cli/status.rb +1 -2
  24. data/lib/dply/cli/task.rb +6 -12
  25. data/lib/dply/code_archive.rb +123 -0
  26. data/lib/dply/command.rb +57 -0
  27. data/lib/dply/config_downloader.rb +3 -2
  28. data/lib/dply/curl.rb +1 -5
  29. data/lib/dply/custom_logger.rb +18 -1
  30. data/lib/dply/deplist.rb +16 -48
  31. data/lib/dply/deploy_config.rb +34 -0
  32. data/lib/dply/elf.rb +60 -0
  33. data/lib/dply/env.rb +9 -0
  34. data/lib/dply/git.rb +15 -8
  35. data/lib/dply/helper.rb +21 -33
  36. data/lib/dply/linker.rb +27 -27
  37. data/lib/dply/lock.rb +2 -9
  38. data/lib/dply/logger.rb +1 -1
  39. data/lib/dply/pkgs.rb +9 -11
  40. data/lib/dply/release.rb +2 -2
  41. data/lib/dply/{archive.rb → remote_archive.rb} +1 -1
  42. data/lib/dply/repo.rb +3 -3
  43. data/lib/dply/rpm.rb +12 -20
  44. data/lib/dply/scripts/depcheck.rb +4 -0
  45. data/lib/dply/shared_dirs.rb +1 -1
  46. data/lib/dply/strategy/archive.rb +15 -22
  47. data/lib/dply/strategy/base.rb +82 -0
  48. data/lib/dply/strategy/git.rb +18 -19
  49. data/lib/dply/task_dsl.rb +101 -0
  50. data/lib/dply/util.rb +75 -0
  51. data/lib/dply/venv.rb +53 -0
  52. data/lib/dply/version.rb +1 -1
  53. data/lib/dply/yum.rb +21 -31
  54. data/lib/dplyr/consul.rb +1 -1
  55. data/spec/dply/base_config_spec.rb +178 -0
  56. data/spec/dply/bundle_spec.rb +100 -0
  57. data/spec/dply/command_spec.rb +190 -0
  58. data/spec/dply/curl_spec.rb +41 -0
  59. data/spec/dply/deplist_spec.rb +48 -0
  60. data/spec/dply/elf_spec.rb +64 -0
  61. data/spec/dply/env_spec.rb +57 -0
  62. data/spec/dply/git_spec.rb +136 -0
  63. data/spec/dply/helper_spec.rb +168 -0
  64. data/spec/dply/linker_spec.rb +81 -0
  65. data/spec/dply/lock_spec.rb +24 -0
  66. data/spec/dply/pkgs_spec.rb +105 -0
  67. data/spec/dply/repo_spec.rb +58 -0
  68. data/spec/dply/rpm_spec.rb +32 -0
  69. data/spec/dply/yum_spec.rb +29 -0
  70. data/spec/integration/archive_flow_spec.rb +87 -0
  71. data/spec/integration/git_flow_spec.rb +63 -0
  72. data/spec/repo.rb +27 -0
  73. data/spec/spec_helper.rb +44 -0
  74. data/spec/test_data/build.tar.gz +0 -0
  75. data/spec/test_data/build.tar.gz.md5 +1 -0
  76. data/spec/test_data/bundle/gems_installed/Gemfile +1 -0
  77. data/spec/test_data/bundle/gems_not_installed/Gemfile +2 -0
  78. data/spec/test_data/bundle/no_gemfile/.gitkeep +0 -0
  79. data/spec/test_data/command/test.rb +7 -0
  80. data/spec/test_data/elf/elf +0 -0
  81. data/spec/test_data/elf/libpgtypes.so.3 +0 -0
  82. data/spec/test_data/elf/not_elf +1 -0
  83. data/spec/test_data/sample_repo/.dply.lock +0 -0
  84. data/spec/test_data/sample_repo/Gemfile +2 -0
  85. data/spec/test_data/sample_repo/Rakefile +3 -0
  86. data/spec/test_data/sample_repo/app.rb +1 -0
  87. data/spec/test_data/sample_repo/dply/app.rb +33 -0
  88. data/spec/test_data/sample_repo/lib/libacl.so.1 +0 -0
  89. data/spec/test_data/sample_repo/pkgs.yml +2 -0
  90. data/spec/webserver.rb +21 -0
  91. metadata +96 -28
  92. data/lib/dply/cli/app_task.rb +0 -38
  93. data/lib/dply/config.rb +0 -120
  94. data/lib/dply/config_struct.rb +0 -52
  95. data/lib/dply/rakelib/drake.rake +0 -33
  96. 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
@@ -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/tasks'
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
- tasks.deploy deploy_target
37
- tasks.report_changes(previous_version, current_version)
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
- tasks.reload
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
- tasks.link "#{config.dir}/shared", dir_map
79
- tasks.link "#{config.dir}/config", config_map
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
- tasks.install_pkgs(use_yum: options[:use_yum], build_mode: true)
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 tasks
91
- @tasks ||= Tasks.new
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
@@ -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
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Dply
2
- VERSION = "0.2.19"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -1,46 +1,36 @@
1
- require 'dply/helper'
1
+ require_relative 'helper'
2
2
 
3
3
  module Dply
4
- class Yum
4
+ module Yum
5
+ extend Helper
5
6
 
6
- include Helper
7
-
8
- def initialize(pkgs, sudo: false)
9
- @pkgs = pkgs
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
- not_installed_pkgs.size == 0
16
+ def self.installed?(pkgs)
17
+ not_installed(pkgs).size == 0
27
18
  end
28
19
 
29
- private
30
-
31
- def pkgs_str
32
- @pkgs.join " "
33
- end
20
+ class << self
21
+ private
34
22
 
35
- def not_installed_pkgs
36
- @not_installed_pkgs ||= query_not_installed
37
- end
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
- def query_not_installed
40
- return [] if pkgs_str.strip.empty?
41
- command = "rpm -V --noscripts --nodeps --nofiles #{pkgs_str}"
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