dply 0.2.19 → 0.3.0

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.
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