travis_dpl_test 2.0.3.beta.4.ror

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 (100) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +172 -0
  3. data/CODE_OF_CONDUCT.md +74 -0
  4. data/CONTRIBUTING.md +392 -0
  5. data/Gemfile +32 -0
  6. data/Gemfile.lock +611 -0
  7. data/LICENSE +19 -0
  8. data/README.md +2744 -0
  9. data/Rakefile +210 -0
  10. data/bin/dpl +11 -0
  11. data/config/transliterate.yml +733 -0
  12. data/dpl.gemspec +23 -0
  13. data/lib/dpl/assets/atlas/install +19 -0
  14. data/lib/dpl/assets/convox/install +11 -0
  15. data/lib/dpl/assets/dpl/README.erb.md +138 -0
  16. data/lib/dpl/assets/dpl/git_ssh +8 -0
  17. data/lib/dpl/assets/git/detect_private_key +8 -0
  18. data/lib/dpl/assets/hephy/filter_log +3 -0
  19. data/lib/dpl/assets/pypi/install +4 -0
  20. data/lib/dpl/assets/scalingo/install +6 -0
  21. data/lib/dpl/cli.rb +100 -0
  22. data/lib/dpl/ctx/bash.rb +549 -0
  23. data/lib/dpl/ctx/test.rb +255 -0
  24. data/lib/dpl/ctx.rb +4 -0
  25. data/lib/dpl/helper/assets.rb +38 -0
  26. data/lib/dpl/helper/cmd.rb +169 -0
  27. data/lib/dpl/helper/config_file.rb +49 -0
  28. data/lib/dpl/helper/cookbook_site_streaming_uploader.rb +249 -0
  29. data/lib/dpl/helper/env.rb +92 -0
  30. data/lib/dpl/helper/github.rb +22 -0
  31. data/lib/dpl/helper/interpolate.rb +160 -0
  32. data/lib/dpl/helper/memoize.rb +23 -0
  33. data/lib/dpl/helper/squiggle.rb +24 -0
  34. data/lib/dpl/helper/transliterate.rb +13 -0
  35. data/lib/dpl/helper/wrap.rb +11 -0
  36. data/lib/dpl/helper/zip.rb +71 -0
  37. data/lib/dpl/provider/dsl.rb +410 -0
  38. data/lib/dpl/provider/examples.rb +132 -0
  39. data/lib/dpl/provider/status.rb +61 -0
  40. data/lib/dpl/provider.rb +651 -0
  41. data/lib/dpl/providers/anynines.rb +71 -0
  42. data/lib/dpl/providers/azure_web_apps.rb +63 -0
  43. data/lib/dpl/providers/bintray.rb +324 -0
  44. data/lib/dpl/providers/bluemixcloudfoundry.rb +98 -0
  45. data/lib/dpl/providers/boxfuse.rb +52 -0
  46. data/lib/dpl/providers/cargo.rb +32 -0
  47. data/lib/dpl/providers/chef_supermarket.rb +132 -0
  48. data/lib/dpl/providers/cloud66.rb +46 -0
  49. data/lib/dpl/providers/cloudfiles.rb +62 -0
  50. data/lib/dpl/providers/cloudformation.rb +281 -0
  51. data/lib/dpl/providers/cloudfoundry.rb +89 -0
  52. data/lib/dpl/providers/codedeploy.rb +190 -0
  53. data/lib/dpl/providers/convox.rb +130 -0
  54. data/lib/dpl/providers/datica.rb +64 -0
  55. data/lib/dpl/providers/ecr.rb +129 -0
  56. data/lib/dpl/providers/elasticbeanstalk.rb +207 -0
  57. data/lib/dpl/providers/engineyard.rb +113 -0
  58. data/lib/dpl/providers/firebase.rb +45 -0
  59. data/lib/dpl/providers/flynn.rb +35 -0
  60. data/lib/dpl/providers/gae.rb +78 -0
  61. data/lib/dpl/providers/gcs.rb +132 -0
  62. data/lib/dpl/providers/git_push.rb +273 -0
  63. data/lib/dpl/providers/gleis.rb +74 -0
  64. data/lib/dpl/providers/hackage.rb +53 -0
  65. data/lib/dpl/providers/hephy.rb +107 -0
  66. data/lib/dpl/providers/heroku/api.rb +123 -0
  67. data/lib/dpl/providers/heroku/git.rb +54 -0
  68. data/lib/dpl/providers/heroku.rb +111 -0
  69. data/lib/dpl/providers/lambda.rb +211 -0
  70. data/lib/dpl/providers/launchpad.rb +80 -0
  71. data/lib/dpl/providers/netlify.rb +38 -0
  72. data/lib/dpl/providers/npm.rb +130 -0
  73. data/lib/dpl/providers/nuget.rb +41 -0
  74. data/lib/dpl/providers/openshift.rb +52 -0
  75. data/lib/dpl/providers/opsworks.rb +146 -0
  76. data/lib/dpl/providers/packagecloud.rb_ +194 -0
  77. data/lib/dpl/providers/pages/api.rb +106 -0
  78. data/lib/dpl/providers/pages/git.rb +262 -0
  79. data/lib/dpl/providers/pages.rb +18 -0
  80. data/lib/dpl/providers/puppetforge.rb +50 -0
  81. data/lib/dpl/providers/pypi.rb +125 -0
  82. data/lib/dpl/providers/releases.rb +234 -0
  83. data/lib/dpl/providers/rubygems.rb +97 -0
  84. data/lib/dpl/providers/s3.rb +251 -0
  85. data/lib/dpl/providers/scalingo.rb +69 -0
  86. data/lib/dpl/providers/script.rb +32 -0
  87. data/lib/dpl/providers/snap.rb +68 -0
  88. data/lib/dpl/providers/surge.rb +59 -0
  89. data/lib/dpl/providers/testfairy.rb +101 -0
  90. data/lib/dpl/providers/transifex.rb +72 -0
  91. data/lib/dpl/providers.rb +48 -0
  92. data/lib/dpl/string_ext.rb +23 -0
  93. data/lib/dpl/support/aws_sdk_patch.rb +26 -0
  94. data/lib/dpl/support/gems.rb +73 -0
  95. data/lib/dpl/support/gstore_patch.rb +8 -0
  96. data/lib/dpl/support/version.rb +84 -0
  97. data/lib/dpl/version.rb +5 -0
  98. data/lib/dpl.rb +23 -0
  99. data/status.json +237 -0
  100. metadata +161 -0
@@ -0,0 +1,255 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cl'
4
+ require 'stringio'
5
+ require 'dpl/helper/squiggle'
6
+
7
+ module Dpl
8
+ module Ctx
9
+ class Test < Cl::Ctx
10
+ include Squiggle
11
+
12
+ attr_reader :cmds, :stdout, :stderr, :last_out, :last_err
13
+
14
+ def initialize
15
+ @cmds = []
16
+ @stderr = StringIO.new
17
+ @stdout = {}
18
+ super('dpl')
19
+ end
20
+
21
+ def fold(name)
22
+ cmds << "[fold] #{name}"
23
+ yield.tap { cmds << "[unfold] #{name}" }
24
+ end
25
+
26
+ def validate_runtimes(runtimes)
27
+ runtimes.each do |name, requirements|
28
+ cmds << "[validate:runtime] #{name} (#{requirements.join(', ')})"
29
+ end
30
+ end
31
+
32
+ def apts_get(apts)
33
+ apts.each { |apt| apt_get(*apt) }
34
+ end
35
+
36
+ def apt_get(name, cmd = name)
37
+ cmds << "[apt:get] #{name} (#{cmd})"
38
+ end
39
+
40
+ def gems_require(gems)
41
+ gems.each { |gem| gem_require(*gem) }
42
+ end
43
+
44
+ def gem_require(name, version = nil, opts = {})
45
+ # not sure why this is needed. bundler should take care of this, but
46
+ # it does not for octokit for whatever reason
47
+ begin
48
+ require opts[:require] || name
49
+ rescue StandardError
50
+ nil
51
+ end
52
+ cmds << "[gem:require] #{name} (#{version}, #{opts})"
53
+ end
54
+
55
+ def npm_install(name, cmd = name)
56
+ cmds << "[npm:install] #{name} (#{cmd})"
57
+ end
58
+
59
+ def pip_install(name, cmd = name, version = nil)
60
+ cmds << "[pip:install] #{name} (#{cmd}, #{version})"
61
+ end
62
+
63
+ def ssh_keygen(_name, file)
64
+ File.open(file, 'w+') { |f| f.write('private-key') }
65
+ File.open("#{file}.pub", 'w+') { |f| f.write('ssh-rsa public-key') }
66
+ end
67
+
68
+ def shell(cmd, _opts = {})
69
+ info cmd.msg if cmd.msg?
70
+ info cmd.echo if cmd.echo?
71
+ cmds << cmd.cmd
72
+ return stdout[cmd.key] if stdout.key?(cmd.key)
73
+
74
+ cmd.capture? ? 'captured_stdout' : true
75
+ end
76
+
77
+ def success?
78
+ true
79
+ end
80
+
81
+ def info(msg)
82
+ cmds << "[info] #{msg}"
83
+ end
84
+
85
+ def print(chars)
86
+ cmds << "[print] #{chars}"
87
+ end
88
+
89
+ def warn(msg)
90
+ cmds << "[warn] #{msg}"
91
+ end
92
+
93
+ def error(message)
94
+ raise Error, message
95
+ end
96
+
97
+ def deprecate_opt(key, msg)
98
+ msg = "please use #{msg}" if msg.is_a?(Symbol)
99
+ warn "Deprecated option #{key} used (#{msg})."
100
+ end
101
+
102
+ def repo_name
103
+ 'dpl'
104
+ end
105
+
106
+ def repo_slug
107
+ 'travis-ci/dpl'
108
+ end
109
+
110
+ def build_dir
111
+ '.'
112
+ end
113
+
114
+ def build_number
115
+ 1
116
+ end
117
+
118
+ def git_branch
119
+ 'git branch'
120
+ end
121
+
122
+ def git_commit_msg
123
+ 'commit msg'
124
+ end
125
+
126
+ def git_author_name
127
+ 'author name'
128
+ end
129
+
130
+ def git_author_email
131
+ 'author email'
132
+ end
133
+
134
+ def git_dirty?
135
+ true
136
+ end
137
+
138
+ def git_log(_args)
139
+ 'commits'
140
+ end
141
+
142
+ def git_ls_files
143
+ %w[one two]
144
+ end
145
+
146
+ def git_ls_remote?(_url, _ref)
147
+ true
148
+ end
149
+
150
+ def git_remote_urls
151
+ ['git://origin.git']
152
+ end
153
+
154
+ def git_rev_parse(ref)
155
+ "ref: #{ref}"
156
+ end
157
+
158
+ def git_tag
159
+ 'tag'
160
+ end
161
+
162
+ def git_sha
163
+ 'sha'
164
+ end
165
+
166
+ def machine_name
167
+ 'machine_name'
168
+ end
169
+
170
+ def node_version
171
+ '11.0.0'
172
+ end
173
+
174
+ def npm_version
175
+ '1'
176
+ end
177
+
178
+ def which(_cmd)
179
+ false
180
+ end
181
+
182
+ def tmp_dir
183
+ FileUtils.mkdir_p('tmp')
184
+ 'tmp'
185
+ end
186
+
187
+ def sleep(*); end
188
+
189
+ def encoding(_path)
190
+ 'text'
191
+ end
192
+
193
+ def logger(level = :info)
194
+ logger = Logger.new(stderr)
195
+ logger.level = Logger.const_get(level.to_s.upcase)
196
+ logger
197
+ end
198
+
199
+ def test?
200
+ true
201
+ end
202
+
203
+ def file_size(path)
204
+ File.size(path.sub(File.expand_path('~').to_s, './home'))
205
+ end
206
+
207
+ def move_files(paths)
208
+ paths.each do |path|
209
+ mv(path, "/tmp/#{File.basename(path)}")
210
+ end
211
+ end
212
+
213
+ def unmove_files(paths)
214
+ paths.each do |path|
215
+ mv("/tmp/#{File.basename(path)}", path)
216
+ end
217
+ end
218
+
219
+ def mv(src, dest)
220
+ cmds << [:mv, src, dest].join(' ')
221
+ end
222
+
223
+ def rm_rf(path)
224
+ cmds << [:rm_rf, path].join(' ')
225
+ end
226
+
227
+ def chmod(perm, path)
228
+ cmds << [:chmod, perm, path].join(' ')
229
+ end
230
+
231
+ def write_file(path, content, _chmod = nil)
232
+ path = File.expand_path(path)
233
+ path = path.sub(File.expand_path('~').to_s, './home')
234
+ FileUtils.mkdir_p(File.dirname(path))
235
+ File.open(path, 'w+') { |f| f.write(content) }
236
+ end
237
+
238
+ def write_netrc(machine, login, password)
239
+ write_file('~/.netrc', sq(<<-RC))
240
+ machine #{machine}
241
+ login #{login}
242
+ password #{password}
243
+ RC
244
+ end
245
+
246
+ def tty?
247
+ false
248
+ end
249
+
250
+ def except(hash, *keys)
251
+ hash.reject { |key, _| keys.include?(key) }
252
+ end
253
+ end
254
+ end
255
+ end
data/lib/dpl/ctx.rb ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dpl/ctx/bash'
4
+ require 'dpl/ctx/test'
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+
5
+ module Dpl
6
+ module Assets
7
+ class Asset < Struct.new(:provider, :namespace, :name)
8
+ include FileUtils
9
+
10
+ DIR = File.expand_path('../assets', __dir__)
11
+
12
+ def copy(target)
13
+ cp path, File.expand_path(target)
14
+ end
15
+
16
+ def read
17
+ exists? ? provider.interpolate(File.read(path)) : unknown
18
+ end
19
+
20
+ def exists?
21
+ File.exist?(path)
22
+ end
23
+
24
+ def unknown
25
+ raise "Could not find asset #{path}"
26
+ end
27
+
28
+ def path
29
+ "#{DIR}/#{namespace}/#{name}"
30
+ end
31
+ end
32
+
33
+ def asset(*args)
34
+ name, namespace = args.reverse
35
+ Asset.new(self, namespace || registry_key, name)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,169 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dpl
4
+ # Represents a shell command
5
+ class Cmd < Struct.new(:provider, :key, :opts)
6
+ # Returns the shell command string
7
+ #
8
+ # If a Symbol was passed as a command then the command will be looked
9
+ # up from the provider class' `cmds` declaration.
10
+ #
11
+ # The command will be interpolated, and can include secrets. See
12
+ # `Dpl::Interpolate` for details on interpolating variables.
13
+ #
14
+ # If the option `silence` was passed then stdout and stderr will be
15
+ # redirected to `/dev/null`.
16
+ #
17
+ # If the option `python` was passed then the virtualenv with the given
18
+ # Python version will be activated before executing the command.
19
+ def cmd(secure = true)
20
+ cmd = lookup(:cmd, key) || missing(:cmd, key)
21
+ cmd = interpolate(cmd, opts, secure: secure).strip
22
+ cmd = silence(cmd) if silence?
23
+ cmd = python(cmd) if python?
24
+ cmd
25
+ end
26
+
27
+ # Returns a log message version of the command string
28
+ #
29
+ # This is the same as #cmd, except that included secrets will be
30
+ # obfuscated, and a prompt (dollar and space) will be prepended. See
31
+ # `Dpl::Interpolate` for details on interpolating variables.
32
+ def echo
33
+ "$ #{cmd(false)}"
34
+ end
35
+
36
+ # Returns the log message for announcing a command
37
+ #
38
+ # If the option `msg` was given as a String then it will be used. If the
39
+ # option `msg` was given as a Symbol then it will be looked up from the
40
+ # provider class' `msgs` declaration.
41
+ #
42
+ # The message string will be interpolated, but included secrets will be
43
+ # obfuscated. See `Dpl::Interpolate` for details on interpolating
44
+ # variables.
45
+ def msg
46
+ msg = lookup(:msg, opts[:msg], key.is_a?(Symbol) ? key : nil)
47
+ msg || missing(:msg, opts[:msg], key)
48
+ msg = interpolate(msg, opts, secure: false).strip
49
+ msg
50
+ end
51
+
52
+ def msg?
53
+ !!lookup(:msg, opts[:msg], key.is_a?(Symbol) ? key : nil)
54
+ end
55
+
56
+ # Returns the log message for a failed command
57
+ #
58
+ # The message string will be interpolated, but included secrets will be
59
+ # obfuscated. See `Dpl::Interpolate` for details on interpolating
60
+ # variables.
61
+ #
62
+ # If the option `assert` was given as a String then it will be used. If the
63
+ # option `assert` was given as a Symbol then it will be looked up from the
64
+ # provider class' `errs` declaration. If the command was given as a Symbol,
65
+ # and it can be found in `errs` then this String will be used.
66
+ def error
67
+ keys = [opts[:assert], key]
68
+ err = lookup(:err, *keys)
69
+ err ? interpolate(err, opts).strip : 'Failed'
70
+ end
71
+
72
+ # Whether or not to assert that the command has exited with 0
73
+ #
74
+ # Returns `true` if the option `assert` was given as `true` or not given at
75
+ # all. Returns `false` if the option `assert` was given as `false`.
76
+ def assert?
77
+ !opts[:assert].is_a?(FalseClass)
78
+ end
79
+
80
+ # Whether or not to announce the command with an info level log message
81
+ #
82
+ # Returns `true` if the option `assert` was given as `true` or not given at
83
+ # all. Returns `false` if the option `assert` was given as `false`.
84
+ def echo?
85
+ !opts[:echo].is_a?(FalseClass)
86
+ end
87
+
88
+ # Whether or not to capture the commands stdout and stderr
89
+ #
90
+ # Returns `true` if the option `capture` was given as `true`. Returns
91
+ # `false` if the option `capture` was given as `false` or not given.
92
+ def capture?
93
+ !!opts[:capture]
94
+ end
95
+
96
+ # Whether or not to output a log message before the command is run
97
+ #
98
+ # Returns `true` if the option `info` was given. Returns `false` if the
99
+ # option `info` was given as `false` or not given.
100
+ def info?
101
+ !!opts[:info]
102
+ end
103
+
104
+ # Returns the log message to output after the command has succeeded
105
+ def info
106
+ opts[:info]
107
+ end
108
+
109
+ # Whether or not to output a log message after the command has succeeded
110
+ #
111
+ # Returns `true` if the option `success` was given. Returns `false` if the
112
+ # option `success` was given as `false` or not given.
113
+ def success?
114
+ !!opts[:success]
115
+ end
116
+
117
+ # Returns the log message to output after the command has succeeded
118
+ def success
119
+ opts[:success]
120
+ end
121
+
122
+ # Whether or not to activate a Python virtualenv before executing the
123
+ # command
124
+ #
125
+ # Returns `true` if the option `python` was given. Returns `false` if the
126
+ # option `python` was given as `false` or not given.
127
+ def python?
128
+ !!opts[:python]
129
+ end
130
+
131
+ # Returns how often to retry the command
132
+ def retry
133
+ opts[:retry]
134
+ end
135
+
136
+ # Whether or not to redirect the command's stdout and stderr to `/dev/null`
137
+ #
138
+ # Returns `true` if the option `silence` was given. Returns `false` if the
139
+ # option `silence` was given as `false` or not given.
140
+ def silence?
141
+ !!opts[:silence]
142
+ end
143
+
144
+ private
145
+
146
+ def lookup(type, *keys)
147
+ str = provider.send(type, *keys) if provider
148
+ str || keys.detect { |key| key.is_a?(String) }
149
+ end
150
+
151
+ def missing(type, *keys)
152
+ raise("Could not find #{type}: #{keys.compact.map(&:inspect).join(', ')}")
153
+ end
154
+
155
+ def interpolate(str, args, opts = {})
156
+ provider ? provider.interpolate(str, args, opts) : str
157
+ end
158
+
159
+ def silence(str)
160
+ "#{str} > /dev/null 2>&1"
161
+ end
162
+
163
+ # Activates the Python virtualenv for the given Python version.
164
+ def python(cmd)
165
+ # "bash -c 'source $HOME/virtualenv/python#{opts[:python]}/bin/activate; #{cmd.gsub(/'/, "'\\\\''")}'"
166
+ "source $HOME/virtualenv/python#{opts[:python]}/bin/activate && #{cmd}"
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dpl
4
+ module ConfigFile
5
+ def self.included(base)
6
+ base.extend(ClassMethods)
7
+ end
8
+
9
+ # should this sit in Cl?
10
+ module ClassMethods
11
+ attr_reader :config_files
12
+
13
+ def config(*paths)
14
+ if paths.any?
15
+ @config_files = paths
16
+ elsif config_files
17
+ paths = config_files.dup
18
+ opts = paths.last.is_a?(Hash) ? paths.pop : {}
19
+ conf = ConfigFiles.new(paths, opts).config
20
+ known = self.opts.map(&:name).map(&:to_sym)
21
+ conf.select { |key, _| known.include?(key) }
22
+ else
23
+ {}
24
+ end
25
+ end
26
+ end
27
+
28
+ class ConfigFiles < Struct.new(:paths, :opts)
29
+ def config
30
+ paths.map { |path| parse(path) }.inject(&:merge) || {}
31
+ end
32
+
33
+ def parse(path)
34
+ str = File.exist?(path) ? File.read(path) : ''
35
+ opts = str.lines.select { |line| line.include?('=') }.map(&:strip)
36
+ opts = opts.map { |pair| pair.split('=', 2) }.to_h
37
+ opts.transform_keys { |key| strip_prefix(key).to_sym }
38
+ end
39
+
40
+ def strip_prefix(str)
41
+ opts[:prefix] ? str.sub(/^#{opts[:prefix]}[-_]?/, '') : str
42
+ end
43
+ end
44
+
45
+ def opts
46
+ @opts ||= self.class.config.merge(super)
47
+ end
48
+ end
49
+ end