dply 0.0.5 → 0.0.7
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.
- checksums.yaml +4 -4
- data/bin/drake +22 -24
- data/lib/dply/archive.rb +81 -0
- data/lib/dply/build.rb +112 -0
- data/lib/dply/build_config.rb +97 -0
- data/lib/dply/bundle.rb +78 -0
- data/lib/dply/cli/build.rb +68 -0
- data/lib/dply/cli/deploy.rb +16 -12
- data/lib/dply/cli/reload.rb +11 -28
- data/lib/dply/config.rb +46 -48
- data/lib/dply/config_downloader.rb +12 -7
- data/lib/dply/config_struct.rb +41 -0
- data/lib/dply/custom_logger.rb +13 -1
- data/lib/dply/git.rb +5 -0
- data/lib/dply/helper.rb +1 -11
- data/lib/dply/jenkins.rb +32 -0
- data/lib/dply/lock.rb +15 -11
- data/lib/dply/release.rb +58 -16
- data/lib/dply/setup.rb +47 -6
- data/lib/dply/shell.rb +5 -10
- data/lib/dply/stages_config.rb +2 -2
- data/lib/dply/strategy/archive.rb +124 -0
- data/lib/dply/strategy/git.rb +38 -41
- data/lib/dply/tasks.rb +28 -31
- data/lib/dply/version.rb +1 -1
- data/lib/dply/yum.rb +53 -0
- metadata +11 -8
- data/lib/dply/deploy.rb +0 -29
- data/lib/dply/reload.rb +0 -29
- data/lib/dply/setup/default.rb +0 -31
- data/lib/dply/setup/git.rb +0 -52
- data/lib/dply/setup/release.rb +0 -58
- data/lib/dply/strategy/default.rb +0 -57
data/lib/dply/git.rb
CHANGED
@@ -23,6 +23,11 @@ module Dply
|
|
23
23
|
cmd "git clone #{repo} #{dir}"
|
24
24
|
end
|
25
25
|
|
26
|
+
def self.clean
|
27
|
+
cmd "git reset --hard HEAD"
|
28
|
+
cmd "git clean -dxf "
|
29
|
+
end
|
30
|
+
|
26
31
|
def self.get_tracking_branch(branch)
|
27
32
|
command = "git for-each-ref --format='%(upstream:short)' refs/heads/#{branch} --count=1"
|
28
33
|
tracking_branch = `#{command}`
|
data/lib/dply/helper.rb
CHANGED
@@ -2,7 +2,6 @@ require 'dply/tasks'
|
|
2
2
|
require 'dply/shell'
|
3
3
|
require 'dply/git'
|
4
4
|
require 'dply/error'
|
5
|
-
require 'dply/logger'
|
6
5
|
|
7
6
|
|
8
7
|
module Dply
|
@@ -12,23 +11,14 @@ module Dply
|
|
12
11
|
Git
|
13
12
|
end
|
14
13
|
|
15
|
-
def self.tasks
|
16
|
-
@tasks ||= Tasks.new
|
17
|
-
end
|
18
|
-
|
19
14
|
include Shell
|
20
|
-
include Logger
|
21
15
|
|
22
16
|
def git
|
23
17
|
::Dply::Helper.git
|
24
18
|
end
|
25
19
|
|
26
|
-
def tasks
|
27
|
-
::Dply::Helper.tasks
|
28
|
-
end
|
29
|
-
|
30
20
|
def error(msg)
|
31
|
-
::Dply::Error
|
21
|
+
raise ::Dply::Error, msg
|
32
22
|
end
|
33
23
|
|
34
24
|
end
|
data/lib/dply/jenkins.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'json'
|
3
|
+
require 'dply/helper'
|
4
|
+
|
5
|
+
module Dply
|
6
|
+
class Jenkins
|
7
|
+
|
8
|
+
include Helper
|
9
|
+
|
10
|
+
def initialize(url, project)
|
11
|
+
@url = URI.parse(url)
|
12
|
+
@project = project
|
13
|
+
validate
|
14
|
+
end
|
15
|
+
|
16
|
+
def latest_successful_revision
|
17
|
+
api_url = "#{@url}/job/#{@project}/api/json"
|
18
|
+
logger.debug "using jenkins api \"#{api_url}\""
|
19
|
+
open(api_url) do |f|
|
20
|
+
json = JSON.parse(f.read)
|
21
|
+
revision = json["lastSuccessfulBuild"]["number"]
|
22
|
+
logger.debug "got revision #{revision}"
|
23
|
+
revision
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def validate
|
28
|
+
raise "invalid uri " if not ["http", "https"].include? @url.scheme
|
29
|
+
raise "project name not defined" if not @project
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/dply/lock.rb
CHANGED
@@ -1,23 +1,27 @@
|
|
1
|
-
require 'dply/
|
1
|
+
require 'dply/logger'
|
2
2
|
module Dply
|
3
3
|
class Lock
|
4
4
|
|
5
|
-
include
|
6
|
-
attr_accessor :deploy_dir
|
5
|
+
include Logger
|
7
6
|
|
8
|
-
def initialize(
|
9
|
-
@
|
7
|
+
def initialize(dir = nil)
|
8
|
+
@dir = dir
|
9
|
+
end
|
10
|
+
|
11
|
+
def acquire
|
12
|
+
logger.debug "acquiring lock"
|
13
|
+
lock_acquired = lock_file.flock(File::LOCK_NB | File::LOCK_EX)
|
14
|
+
raise "exclusive lock not available" if not lock_acquired
|
10
15
|
end
|
11
16
|
|
12
17
|
def lock_file
|
13
|
-
@lock_file ||=
|
14
|
-
File.open(".dply.lock", "w+")
|
15
|
-
end
|
18
|
+
@lock_file ||= File.open("#{dir}/.dply.lock", "a+")
|
16
19
|
end
|
17
20
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
+
private
|
22
|
+
|
23
|
+
def dir
|
24
|
+
@dir ||= Dir.pwd
|
21
25
|
end
|
22
26
|
|
23
27
|
end
|
data/lib/dply/release.rb
CHANGED
@@ -1,33 +1,75 @@
|
|
1
|
+
require 'dply/archive'
|
2
|
+
require 'dply/helper'
|
3
|
+
require 'tmpdir'
|
4
|
+
|
1
5
|
module Dply
|
2
6
|
class Release
|
3
7
|
|
4
|
-
|
8
|
+
include Helper
|
9
|
+
|
10
|
+
attr_accessor :url, :verify_checksum
|
11
|
+
attr_reader :name
|
12
|
+
|
13
|
+
def initialize(revision, app_name: nil, branch: nil, url: nil)
|
14
|
+
@revision = revision
|
15
|
+
@branch = branch
|
16
|
+
@app_name = app_name
|
17
|
+
@url = url
|
18
|
+
end
|
19
|
+
|
20
|
+
def make_current
|
21
|
+
raise "cannot make not installed release current" if not installed?
|
22
|
+
raise "release path #{path} doesn't exist" if not File.directory? path
|
23
|
+
symlink path, "current"
|
24
|
+
end
|
25
|
+
|
26
|
+
def install
|
27
|
+
return if installed?
|
28
|
+
@name = name_without_ts + timestamp
|
29
|
+
Dir.mktmpdir "tmp" do |d|
|
30
|
+
path = "#{d}/#{name}"
|
31
|
+
archive.extract_to path
|
32
|
+
FileUtils.mv path, "releases"
|
33
|
+
end
|
34
|
+
@installed = true
|
35
|
+
archive.clean
|
36
|
+
end
|
37
|
+
|
38
|
+
def path
|
39
|
+
@path ||= "releases/#{@name}"
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
5
43
|
|
6
|
-
def
|
7
|
-
|
44
|
+
def replace_dashes(str)
|
45
|
+
str.to_s.gsub(/-/, "_")
|
8
46
|
end
|
9
47
|
|
10
|
-
def
|
11
|
-
|
12
|
-
FileUtils.mkdir uncommited_release_dir
|
13
|
-
copy_source_code(repo_cache, branch)
|
48
|
+
def archive
|
49
|
+
@archive ||= Archive.new(url, verify_checksum: @verify_checksum)
|
14
50
|
end
|
15
51
|
|
16
|
-
def
|
17
|
-
|
52
|
+
def timestamp
|
53
|
+
Time.now.strftime "%Y%m%d%H%M%S"
|
18
54
|
end
|
19
55
|
|
20
|
-
def
|
21
|
-
|
56
|
+
def load_status
|
57
|
+
name = name_without_ts
|
58
|
+
latest = Dir["releases/#{name}*"].sort_by { |x, y| File.mtime(x) }.first
|
59
|
+
if latest
|
60
|
+
@installed = true
|
61
|
+
@name = File.basename latest
|
62
|
+
end
|
63
|
+
@status_loaded = true
|
22
64
|
end
|
23
65
|
|
24
|
-
def
|
25
|
-
|
66
|
+
def installed?
|
67
|
+
load_status if not @status_loaded
|
68
|
+
@installed
|
26
69
|
end
|
27
70
|
|
28
|
-
def
|
29
|
-
|
30
|
-
FileUtils.mv uncommited_release_dir, release_dir
|
71
|
+
def name_without_ts
|
72
|
+
@name_without_ts ||= "#{@revision}-#{replace_dashes(@app_name)}-#{replace_dashes(@branch)}-"
|
31
73
|
end
|
32
74
|
|
33
75
|
end
|
data/lib/dply/setup.rb
CHANGED
@@ -1,11 +1,52 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'dply/helper'
|
3
|
+
require 'dply/repo'
|
4
|
+
require 'dply/shared_dirs'
|
5
|
+
|
1
6
|
module Dply
|
2
|
-
|
7
|
+
class Setup
|
8
|
+
|
9
|
+
include Helper
|
10
|
+
|
11
|
+
def initialize(config)
|
12
|
+
@config = config
|
13
|
+
end
|
14
|
+
|
15
|
+
def build
|
16
|
+
dirs = ["config", "shared", "build"]
|
17
|
+
create_repo if @config.git
|
18
|
+
create_dirs dirs
|
19
|
+
create_shared_dirs
|
20
|
+
end
|
21
|
+
|
22
|
+
def git
|
23
|
+
dirs = ["config", "shared"]
|
24
|
+
create_repo
|
25
|
+
symlink "repo", "current"
|
26
|
+
create_dirs dirs
|
27
|
+
create_shared_dirs
|
28
|
+
end
|
29
|
+
|
30
|
+
def archive
|
31
|
+
dirs = ["config", "shared", "releases", "tmp/cache"]
|
32
|
+
create_dirs dirs
|
33
|
+
create_shared_dirs
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def create_repo
|
39
|
+
repo = ::Dply::Repo.new("repo", @config.repo)
|
40
|
+
repo.create
|
41
|
+
end
|
42
|
+
|
43
|
+
def create_dirs(dirs)
|
44
|
+
FileUtils.mkdir_p dirs
|
45
|
+
end
|
3
46
|
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
const = Module.const_get(const)
|
8
|
-
return const.new(config)
|
47
|
+
def create_shared_dirs
|
48
|
+
shared_dirs = SharedDirs.new(@config.shared_dirs)
|
49
|
+
shared_dirs.create_in "shared"
|
9
50
|
end
|
10
51
|
|
11
52
|
end
|
data/lib/dply/shell.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'dply/error'
|
2
|
+
require 'dply/logger'
|
2
3
|
|
3
4
|
module Dply
|
4
5
|
module Shell
|
@@ -12,11 +13,13 @@ module Dply
|
|
12
13
|
else
|
13
14
|
logger.debug command
|
14
15
|
end
|
16
|
+
command_arr = command.split
|
17
|
+
|
15
18
|
if return_output
|
16
|
-
output =
|
19
|
+
output = IO.popen(env, command_arr) { |f| f.read }
|
17
20
|
else
|
18
21
|
output = ""
|
19
|
-
system
|
22
|
+
system(env, *command_arr, 2 => 1)
|
20
23
|
end
|
21
24
|
return_value = $?.exitstatus
|
22
25
|
error_msg ||= "non zero exit for \"#{command}\""
|
@@ -44,14 +47,6 @@ module Dply
|
|
44
47
|
symlink src, dst
|
45
48
|
end
|
46
49
|
|
47
|
-
def env_str(env)
|
48
|
-
str = ""
|
49
|
-
env.each do |k,v|
|
50
|
-
str << %(#{k}="#{v.to_s}")
|
51
|
-
end
|
52
|
-
str
|
53
|
-
end
|
54
|
-
|
55
50
|
def stringify_values(hash)
|
56
51
|
hash.each do |k,v|
|
57
52
|
hash[k] = v.to_s
|
data/lib/dply/stages_config.rb
CHANGED
@@ -90,12 +90,12 @@ module Dply
|
|
90
90
|
|
91
91
|
def read_from_file
|
92
92
|
if not File.readable? config_file
|
93
|
-
|
93
|
+
error "#{config_file} not readable"
|
94
94
|
return
|
95
95
|
end
|
96
96
|
instance_eval(File.read(config_file), config_file)
|
97
97
|
rescue NoMethodError => e
|
98
|
-
|
98
|
+
error "invalid option used in config: #{e.name} #{e.message}"
|
99
99
|
end
|
100
100
|
|
101
101
|
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require 'dply/helper'
|
2
|
+
require 'dply/setup'
|
3
|
+
require 'dply/linker'
|
4
|
+
require 'dply/config_downloader'
|
5
|
+
require 'dply/yum'
|
6
|
+
require 'dply/release'
|
7
|
+
require 'forwardable'
|
8
|
+
|
9
|
+
|
10
|
+
module Dply
|
11
|
+
module Strategy
|
12
|
+
class Archive
|
13
|
+
|
14
|
+
extend Forwardable
|
15
|
+
include Helper
|
16
|
+
|
17
|
+
attr_reader :config, :options
|
18
|
+
def_delegators :config, :target, :branch, :revision, :name,
|
19
|
+
:config_map, :dir_map, :config_skip_download,
|
20
|
+
:config_download_url, :build_url
|
21
|
+
|
22
|
+
def initialize(config, options)
|
23
|
+
@config = config
|
24
|
+
@options = options || {}
|
25
|
+
end
|
26
|
+
|
27
|
+
def deploy
|
28
|
+
setup.archive
|
29
|
+
download_configs if config_download_url
|
30
|
+
install_release
|
31
|
+
release.make_current
|
32
|
+
previous_version = get_release
|
33
|
+
Dir.chdir current_dir do
|
34
|
+
tasks.deploy target
|
35
|
+
end
|
36
|
+
current_version = get_release
|
37
|
+
tasks.report_changes(previous_version, current_version)
|
38
|
+
end
|
39
|
+
|
40
|
+
def reload
|
41
|
+
download_configs if config_download_url
|
42
|
+
Dir.chdir current_dir do
|
43
|
+
link_dirs
|
44
|
+
link_config
|
45
|
+
tasks.reload target
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def current_dir
|
52
|
+
@current_dir ||= "#{config.dir}/current"
|
53
|
+
end
|
54
|
+
|
55
|
+
def get_release
|
56
|
+
File.basename (File.readlink current_dir)
|
57
|
+
end
|
58
|
+
|
59
|
+
def download_configs
|
60
|
+
files = config_map.values.uniq
|
61
|
+
downloader = ConfigDownloader.new(files, config_download_url)
|
62
|
+
downloader.skip_download = config_skip_download
|
63
|
+
downloader.download_all
|
64
|
+
end
|
65
|
+
|
66
|
+
def release
|
67
|
+
@release ||= Release.new(
|
68
|
+
revision, branch: branch,
|
69
|
+
app_name: config.name,
|
70
|
+
url: config.build_url
|
71
|
+
)
|
72
|
+
end
|
73
|
+
|
74
|
+
def install_release
|
75
|
+
release.verify_checksum = config.verify_checksum
|
76
|
+
release.install
|
77
|
+
Dir.chdir release.path do
|
78
|
+
link_dirs
|
79
|
+
link_config
|
80
|
+
yum_install
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def yum_install
|
85
|
+
Yum.new("pkgs.yml").install
|
86
|
+
end
|
87
|
+
|
88
|
+
def git_step
|
89
|
+
return if options[:skip_git]
|
90
|
+
if options[:no_pull]
|
91
|
+
git.checkout branch
|
92
|
+
else
|
93
|
+
git.pull branch
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def link_dirs
|
98
|
+
link "#{config.dir}/shared", dir_map
|
99
|
+
end
|
100
|
+
|
101
|
+
def link_config
|
102
|
+
link "#{config.dir}/config", config_map
|
103
|
+
end
|
104
|
+
|
105
|
+
def setup
|
106
|
+
@setup ||= Setup.new(@config)
|
107
|
+
end
|
108
|
+
|
109
|
+
def tasks
|
110
|
+
@tasks ||= Tasks.new(deployment: true)
|
111
|
+
end
|
112
|
+
|
113
|
+
def link(source, map)
|
114
|
+
return if not map
|
115
|
+
logger.bullet "symlinking #{source}"
|
116
|
+
dest = "#{config.dir}/#{release.path}"
|
117
|
+
linker = Linker.new(source, dest, map: map)
|
118
|
+
linker.create_symlinks
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|