dapp 0.0.24 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +13 -5
- data/bin/dapp +17 -1
- data/config/en/common.yml +23 -0
- data/config/en/net_status.yml +24 -0
- data/lib/dapp.rb +68 -12
- data/lib/dapp/application.rb +57 -0
- data/lib/dapp/application/git_artifact.rb +26 -0
- data/lib/dapp/application/logging.rb +120 -0
- data/lib/dapp/application/path.rb +31 -0
- data/lib/dapp/application/tags.rb +65 -0
- data/lib/dapp/build/stage/app_install.rb +19 -0
- data/lib/dapp/build/stage/app_setup.rb +19 -0
- data/lib/dapp/build/stage/base.rb +106 -0
- data/lib/dapp/build/stage/from.rb +40 -0
- data/lib/dapp/build/stage/infra_install.rb +23 -0
- data/lib/dapp/build/stage/infra_setup.rb +19 -0
- data/lib/dapp/build/stage/source_1.rb +31 -0
- data/lib/dapp/build/stage/source_1_archive.rb +31 -0
- data/lib/dapp/build/stage/source_2.rb +20 -0
- data/lib/dapp/build/stage/source_3.rb +27 -0
- data/lib/dapp/build/stage/source_4.rb +31 -0
- data/lib/dapp/build/stage/source_5.rb +51 -0
- data/lib/dapp/build/stage/source_base.rb +109 -0
- data/lib/dapp/builder/base.rb +44 -0
- data/lib/dapp/builder/chef.rb +242 -0
- data/lib/dapp/builder/chef/berksfile.rb +54 -0
- data/lib/dapp/builder/shell.rb +16 -0
- data/lib/dapp/cli.rb +10 -44
- data/lib/dapp/cli/base.rb +55 -0
- data/lib/dapp/cli/build.rb +6 -140
- data/lib/dapp/cli/flush.rb +19 -0
- data/lib/dapp/cli/flush/build_cache.rb +26 -0
- data/lib/dapp/cli/flush/stage_cache.rb +23 -0
- data/lib/dapp/cli/list.rb +19 -0
- data/lib/dapp/cli/push.rb +59 -0
- data/lib/dapp/cli/smartpush.rb +19 -0
- data/lib/dapp/config/application.rb +98 -0
- data/lib/dapp/config/chef.rb +20 -0
- data/lib/dapp/config/docker.rb +39 -0
- data/lib/dapp/config/git_artifact.rb +78 -0
- data/lib/dapp/config/main.rb +23 -0
- data/lib/dapp/config/shell.rb +40 -0
- data/lib/dapp/controller.rb +103 -0
- data/lib/dapp/docker_image.rb +51 -0
- data/lib/dapp/error/application.rb +6 -0
- data/lib/dapp/error/base.rb +10 -0
- data/lib/dapp/error/build.rb +6 -0
- data/lib/dapp/error/config.rb +6 -0
- data/lib/dapp/error/controller.rb +6 -0
- data/lib/dapp/error/shellout.rb +6 -0
- data/lib/dapp/filelock.rb +1 -1
- data/lib/dapp/git_artifact.rb +43 -272
- data/lib/dapp/git_repo/base.rb +10 -12
- data/lib/dapp/git_repo/own.rb +7 -3
- data/lib/dapp/git_repo/remote.rb +14 -20
- data/lib/dapp/helper/cli.rb +66 -0
- data/lib/dapp/helper/i18n.rb +20 -0
- data/lib/dapp/helper/log.rb +72 -0
- data/lib/dapp/helper/paint.rb +27 -0
- data/lib/dapp/helper/sha256.rb +14 -0
- data/lib/dapp/helper/shellout.rb +41 -0
- data/lib/dapp/helper/streaming.rb +49 -0
- data/lib/dapp/helper/trivia.rb +27 -0
- data/lib/dapp/stage_image.rb +98 -0
- data/lib/dapp/version.rb +3 -1
- metadata +207 -51
- data/lib/dapp/atomizer.rb +0 -56
- data/lib/dapp/builder.rb +0 -230
- data/lib/dapp/builder/cascade_tagging.rb +0 -48
- data/lib/dapp/builder/centos7.rb +0 -47
- data/lib/dapp/builder/chefify.rb +0 -107
- data/lib/dapp/builder/ci_tagging.rb +0 -53
- data/lib/dapp/builder/git_tagging.rb +0 -21
- data/lib/dapp/builder/manual_tagging.rb +0 -22
- data/lib/dapp/builder/ubuntu1404.rb +0 -20
- data/lib/dapp/builder/ubuntu1604.rb +0 -20
- data/lib/dapp/docker.rb +0 -207
- data/lib/dapp/git_repo/chronicler.rb +0 -44
@@ -1,53 +0,0 @@
|
|
1
|
-
module Dapp
|
2
|
-
class Builder
|
3
|
-
# CI tagging strategy
|
4
|
-
module CiTagging
|
5
|
-
def tag_ci(image_id)
|
6
|
-
return unless opts[:tag_ci] || opts[:tag_build_id]
|
7
|
-
|
8
|
-
raise 'CI environment required (Travis or GitLab CI)' unless ENV['GITLAB_CI'] || ENV['TRAVIS']
|
9
|
-
|
10
|
-
spec = {
|
11
|
-
name: name,
|
12
|
-
repo: opts[:docker_repo]
|
13
|
-
}
|
14
|
-
|
15
|
-
tag_ci_branch_and_tag image_id, spec
|
16
|
-
tag_ci_build_id image_id, spec
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def tag_ci_branch_and_tag(image_id, spec)
|
22
|
-
return unless opts[:tag_ci]
|
23
|
-
|
24
|
-
log 'Applying CI tagging strategy'
|
25
|
-
|
26
|
-
if ENV['GITLAB_CI']
|
27
|
-
branch = ENV['CI_BUILD_REF_NAME']
|
28
|
-
tag = ENV['CI_BUILD_TAG']
|
29
|
-
elsif ENV['TRAVIS']
|
30
|
-
branch = ENV['TRAVIS_BRANCH']
|
31
|
-
tag = ENV['TRAVIS_TAG']
|
32
|
-
end
|
33
|
-
|
34
|
-
docker.tag image_id, spec.merge(tag: branch) if branch
|
35
|
-
[tag, 'latest'].each { |t| docker.tag image_id, spec.merge(tag: t) } if tag
|
36
|
-
end
|
37
|
-
|
38
|
-
def tag_ci_build_id(image_id, spec)
|
39
|
-
return unless opts[:tag_build_id]
|
40
|
-
|
41
|
-
log 'Applying CI build id tag'
|
42
|
-
|
43
|
-
if ENV['GITLAB_CI']
|
44
|
-
build_id = ENV['CI_BUILD_ID']
|
45
|
-
elsif ENV['TRAVIS']
|
46
|
-
build_id = ENV['TRAVIS_BUILD_NUMBER']
|
47
|
-
end
|
48
|
-
|
49
|
-
docker.tag image_id, spec.merge(tag: build_id) if build_id
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Dapp
|
2
|
-
class Builder
|
3
|
-
# Git tagging strategy
|
4
|
-
module GitTagging
|
5
|
-
def tag_git(image_id)
|
6
|
-
spec = {
|
7
|
-
name: name,
|
8
|
-
repo: opts[:docker_repo]
|
9
|
-
}
|
10
|
-
|
11
|
-
{ commit: 'rev-parse HEAD', branch: 'rev-parse --abbrev-ref HEAD' }.each do |tag_type, git_command|
|
12
|
-
next unless opts[:"tag_#{tag_type}"]
|
13
|
-
|
14
|
-
log "Applying git #{tag_type} tag"
|
15
|
-
|
16
|
-
docker.tag image_id, spec.merge(tag: shellout("git -C #{home_path} #{git_command}").stdout.strip)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Dapp
|
2
|
-
class Builder
|
3
|
-
# Manual tagging strategy
|
4
|
-
module ManualTagging
|
5
|
-
def tag_manual(image_id)
|
6
|
-
return unless opts[:tags]
|
7
|
-
|
8
|
-
log 'Applying manual tags'
|
9
|
-
|
10
|
-
opts[:tags].each do |tag|
|
11
|
-
spec = {
|
12
|
-
name: name,
|
13
|
-
tag: tag,
|
14
|
-
repo: opts[:docker_repo]
|
15
|
-
}
|
16
|
-
|
17
|
-
docker.tag image_id, spec
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Dapp
|
2
|
-
class Builder
|
3
|
-
# Ubuntu 16.04 support
|
4
|
-
module Ubuntu1404
|
5
|
-
def from_ubuntu1404
|
6
|
-
# use ubuntu 14.04
|
7
|
-
docker.from 'ubuntu:14.04'
|
8
|
-
docker.run(
|
9
|
-
'apt-get update',
|
10
|
-
'apt-get -y dist-upgrade',
|
11
|
-
'apt-get -y install apt-utils git curl apt-transport-https',
|
12
|
-
step: :begining
|
13
|
-
)
|
14
|
-
|
15
|
-
# TERM & utf8
|
16
|
-
docker.env TERM: 'xterm', LANG: 'C.UTF-8', step: :begining
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Dapp
|
2
|
-
class Builder
|
3
|
-
# Ubuntu 16.04 support
|
4
|
-
module Ubuntu1604
|
5
|
-
def from_ubuntu1604
|
6
|
-
# use ubuntu 16.04
|
7
|
-
docker.from 'ubuntu:16.04'
|
8
|
-
docker.run(
|
9
|
-
'apt-get update',
|
10
|
-
'apt-get -y dist-upgrade',
|
11
|
-
'apt-get -y install apt-utils git curl apt-transport-https',
|
12
|
-
step: :begining
|
13
|
-
)
|
14
|
-
|
15
|
-
# TERM & utf8
|
16
|
-
docker.env TERM: 'xterm', LANG: 'C.UTF-8', step: :begining
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/lib/dapp/docker.rb
DELETED
@@ -1,207 +0,0 @@
|
|
1
|
-
module Dapp
|
2
|
-
# Dockerfile builder and docker binary wrapper
|
3
|
-
class Docker
|
4
|
-
def initialize(builder)
|
5
|
-
@builder = builder
|
6
|
-
end
|
7
|
-
|
8
|
-
def name(name = nil)
|
9
|
-
@name = name || @name
|
10
|
-
end
|
11
|
-
|
12
|
-
def from(from = nil)
|
13
|
-
@from = from || @from
|
14
|
-
end
|
15
|
-
|
16
|
-
def build_path(*path)
|
17
|
-
builder.build_path(builder.home_branch, [name, 'docker'].compact.join('.'), *path)
|
18
|
-
end
|
19
|
-
|
20
|
-
def run(*command, step: :build)
|
21
|
-
add_instruction step, :run, command.join(' && ')
|
22
|
-
end
|
23
|
-
|
24
|
-
def workdir(directory, step: :build)
|
25
|
-
add_instruction step, :workdir, directory
|
26
|
-
end
|
27
|
-
|
28
|
-
def copy(what, where, step: :build)
|
29
|
-
add_instruction step, :copy, what, where
|
30
|
-
end
|
31
|
-
|
32
|
-
def add(what, where, step: :build)
|
33
|
-
add_instruction step, :add, what, where
|
34
|
-
end
|
35
|
-
|
36
|
-
def add_artifact(file_path, filename, where, step: :build)
|
37
|
-
add_instruction step, :add_artifact, file_path, filename, where
|
38
|
-
end
|
39
|
-
|
40
|
-
def expose(*ports, step: :build)
|
41
|
-
add_instruction step, :expose, ports
|
42
|
-
end
|
43
|
-
|
44
|
-
def env(step: :build, **env)
|
45
|
-
add_instruction step, :env, env
|
46
|
-
end
|
47
|
-
|
48
|
-
def volume(*paths, step: :build)
|
49
|
-
add_instruction step, :volume, paths
|
50
|
-
end
|
51
|
-
|
52
|
-
def cmd(*commands, step: :build)
|
53
|
-
add_instruction step, :cmd, commands
|
54
|
-
end
|
55
|
-
|
56
|
-
def initialize_dup(other)
|
57
|
-
super
|
58
|
-
|
59
|
-
@name = @name.dup if @name
|
60
|
-
@from = @from.dup if @from
|
61
|
-
|
62
|
-
@instructions = @instructions.dup
|
63
|
-
@instructions.each do |step, step_instructions|
|
64
|
-
@instructions[step] = step_instructions.dup
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def build
|
69
|
-
# prepare
|
70
|
-
generate_dockerfile
|
71
|
-
|
72
|
-
# build
|
73
|
-
res = docker("build --force-rm=true --rm=true #{build_path}", log_verbose: true)
|
74
|
-
|
75
|
-
# return image id
|
76
|
-
res.stdout.lines.grep(/^Successfully built ([0-9a-f]+)\n$/).first.strip.split.last
|
77
|
-
end
|
78
|
-
|
79
|
-
def image_exist?(**kwargs)
|
80
|
-
!image_id(**kwargs).nil?
|
81
|
-
end
|
82
|
-
|
83
|
-
def image_id(**kwargs)
|
84
|
-
image = images(**kwargs).first
|
85
|
-
image ? image[:id] : nil
|
86
|
-
end
|
87
|
-
|
88
|
-
def images(name:, tag: nil, repo: nil)
|
89
|
-
all_images.select { |i| i[:name] == pad_image_name(name: name, repo: repo) && (!tag || i[:tag] == tag) }
|
90
|
-
end
|
91
|
-
|
92
|
-
def all_images
|
93
|
-
docker('images').stdout.lines.drop(1).map(&:strip)
|
94
|
-
.map { |line| Hash[[:name, :tag, :id].zip(line.strip.split(/\s{2,}/)[0..3])] }
|
95
|
-
end
|
96
|
-
|
97
|
-
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
98
|
-
def tag(origin, new, force: true)
|
99
|
-
# FIXME -f flag was removed since docker v 1.10
|
100
|
-
# cmd = "tag#{' -f' if force} "
|
101
|
-
cmd = "tag "
|
102
|
-
|
103
|
-
if origin.is_a?(String)
|
104
|
-
origin_image_id = origin
|
105
|
-
cmd += origin
|
106
|
-
else
|
107
|
-
origin_image_id = image_id(origin)
|
108
|
-
cmd += pad_image_name(origin)
|
109
|
-
end
|
110
|
-
|
111
|
-
# auto rmi
|
112
|
-
if force && origin_image_id && (new_image_id = image_id(new))
|
113
|
-
rmi new if new_image_id != origin_image_id
|
114
|
-
end
|
115
|
-
|
116
|
-
docker cmd + ' ' + pad_image_name(**new)
|
117
|
-
end
|
118
|
-
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
119
|
-
|
120
|
-
def rmi(**kwargs)
|
121
|
-
docker "rmi #{pad_image_name(**kwargs)}"
|
122
|
-
end
|
123
|
-
|
124
|
-
def push(name:, tag: nil, repo: nil)
|
125
|
-
docker "push #{pad_image_name name: name, tag: tag, repo: repo}", log_verbose: true
|
126
|
-
end
|
127
|
-
|
128
|
-
protected
|
129
|
-
|
130
|
-
def pad_image_name(name:, tag: nil, repo: nil)
|
131
|
-
name = "#{repo}/#{name}" if repo
|
132
|
-
name = "#{name}:#{tag}" if tag
|
133
|
-
name
|
134
|
-
end
|
135
|
-
|
136
|
-
attr_reader :builder
|
137
|
-
|
138
|
-
def instructions(step)
|
139
|
-
(@instructions ||= {})[step] ||= []
|
140
|
-
end
|
141
|
-
|
142
|
-
def add_instruction(step, *args)
|
143
|
-
instructions(step) << args
|
144
|
-
end
|
145
|
-
|
146
|
-
def docker(command, **kwargs)
|
147
|
-
builder.shellout "docker #{command}", **kwargs
|
148
|
-
end
|
149
|
-
|
150
|
-
def dockerfile_path
|
151
|
-
build_path 'Dockerfile'
|
152
|
-
end
|
153
|
-
|
154
|
-
def generate_dockerfile_run(dockerfile, *params)
|
155
|
-
dockerfile.puts 'RUN ' + params[0]
|
156
|
-
end
|
157
|
-
|
158
|
-
def generate_dockerfile_copy(dockerfile, *params)
|
159
|
-
dockerfile.puts "COPY #{params[0]} #{params[1]}"
|
160
|
-
end
|
161
|
-
|
162
|
-
def generate_dockerfile_add(dockerfile, *params)
|
163
|
-
dockerfile.puts "ADD #{params[0]} #{params[1]}"
|
164
|
-
end
|
165
|
-
|
166
|
-
def generate_dockerfile_add_artifact(dockerfile, *params)
|
167
|
-
FileUtils.link params[0], build_path(params[1]), force: true
|
168
|
-
dockerfile.puts "ADD #{params[1]} #{params[2]}"
|
169
|
-
end
|
170
|
-
|
171
|
-
def generate_dockerfile_expose(dockerfile, *params)
|
172
|
-
dockerfile.puts 'EXPOSE ' + params[0].map(&:to_s).join(' ')
|
173
|
-
end
|
174
|
-
|
175
|
-
def generate_dockerfile_env(dockerfile, *params)
|
176
|
-
dockerfile.puts 'ENV ' + params[0].map { |k, v| %(#{k}="#{v}") }.join(' ')
|
177
|
-
end
|
178
|
-
|
179
|
-
def generate_dockerfile_volume(dockerfile, *params)
|
180
|
-
dockerfile.puts 'VOLUME ' + params[0].join(' ')
|
181
|
-
end
|
182
|
-
|
183
|
-
def generate_dockerfile_workdir(dockerfile, *params)
|
184
|
-
dockerfile.puts "WORKDIR #{params[0]}"
|
185
|
-
end
|
186
|
-
|
187
|
-
def generate_dockerfile_cmd(dockerfile, *params)
|
188
|
-
dockerfile.puts 'CMD ' + params[0].join(' ')
|
189
|
-
end
|
190
|
-
|
191
|
-
def generate_dockerfile_step(dockerfile, step)
|
192
|
-
instructions(step).each do |directive, *params|
|
193
|
-
send :"generate_dockerfile_#{directive}", dockerfile, *params
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
def generate_dockerfile
|
198
|
-
File.open dockerfile_path, 'w' do |dockerfile|
|
199
|
-
dockerfile.puts 'FROM ' + from
|
200
|
-
|
201
|
-
[:begining, :prepare, :build, :setup].each do |step|
|
202
|
-
generate_dockerfile_step(dockerfile, step)
|
203
|
-
end
|
204
|
-
end
|
205
|
-
end
|
206
|
-
end
|
207
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
module Dapp
|
2
|
-
module GitRepo
|
3
|
-
# Gitkeeper for autogenerated and external data
|
4
|
-
class Chronicler < Base
|
5
|
-
def initialize(builder, name, **kwargs)
|
6
|
-
super
|
7
|
-
|
8
|
-
lock do
|
9
|
-
unless File.directory? chronodir_path
|
10
|
-
git "init --separate-git-dir=#{dir_path} #{chronodir_path}"
|
11
|
-
git_chrono 'commit --allow-empty -m init'
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def chronodir_path(*path)
|
17
|
-
build_path name, *path
|
18
|
-
end
|
19
|
-
|
20
|
-
def commit!(comment = '+')
|
21
|
-
lock do
|
22
|
-
git_chrono 'add --all'
|
23
|
-
unless git_chrono('diff --cached --quiet', returns: [0, 1]).status.success?
|
24
|
-
git_chrono "commit -m #{comment}"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def cleanup!
|
30
|
-
lock do
|
31
|
-
super
|
32
|
-
FileUtils.rm_rf dir_path
|
33
|
-
FileUtils.rm_rf chronodir_path
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
protected
|
38
|
-
|
39
|
-
def git_chrono(command, **kwargs)
|
40
|
-
git "-C #{chronodir_path} #{command}", **kwargs
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|