travis_dpl_test 2.0.3.beta.4.ror

Sign up to get free protection for your applications and to get access to all the features.
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,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dpl
4
+ module Providers
5
+ class Anynines < Provider
6
+ register :anynines
7
+
8
+ status :alpha
9
+
10
+ description sq(<<-STR)
11
+ tbd
12
+ STR
13
+
14
+ env :anynines
15
+
16
+ opt '--username USER', 'anynines username', required: true
17
+ opt '--password PASS', 'anynines password', required: true, secret: true
18
+ opt '--organization ORG', 'anynines organization', required: true
19
+ opt '--space SPACE', 'anynines space', required: true
20
+ opt '--app_name APP', 'Application name'
21
+ opt '--buildpack PACK', 'Buildpack name or Git URL'
22
+ opt '--manifest FILE', 'Path to the manifest'
23
+ opt '--logout', default: true, internal: true
24
+
25
+ API = 'https://api.de.a9s.eu'
26
+
27
+ cmds install: 'test $(uname) = "Linux" && rel="linux64-binary" || rel="macosx64"; wget "https://cli.run.pivotal.io/stable?release=${rel}&source=github" -qO cf.tgz && tar -zxvf cf.tgz && rm cf.tgz',
28
+ api: './cf api %{url}',
29
+ login: './cf login -u %{username} -p %{password} -o %{organization} -s %{space}',
30
+ push: './cf push %{args}',
31
+ logout: './cf logout'
32
+
33
+ errs install: 'Failed to install CLI tools',
34
+ api: 'Failed to set api',
35
+ login: 'Failed to login',
36
+ target: 'Failed to target organization %{organization}, space %{space}',
37
+ push: 'Failed to push app',
38
+ logout: 'Failed to logout'
39
+
40
+ def install
41
+ shell :install
42
+ end
43
+
44
+ def login
45
+ shell :api
46
+ shell :login
47
+ end
48
+
49
+ def deploy
50
+ shell :push
51
+ end
52
+
53
+ def finish
54
+ shell :logout if logout?
55
+ end
56
+
57
+ private
58
+
59
+ def url
60
+ API
61
+ end
62
+
63
+ def args
64
+ args = []
65
+ args << quote(app_name) if app_name?
66
+ args << "-f #{manifest}" if manifest?
67
+ args.join(' ')
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dpl
4
+ module Providers
5
+ class AzureWebApps < Provider
6
+ register :azure_web_apps
7
+
8
+ status :alpha
9
+
10
+ full_name 'Azure Web Apps'
11
+
12
+ description sq(<<-STR)
13
+ tbd
14
+ STR
15
+
16
+ env :AZURE_WA
17
+
18
+ opt '--username NAME', 'Web App Deployment Username', required: true
19
+ opt '--password PASS', 'Web App Deployment Password', required: true, secret: true
20
+ opt '--site SITE', 'Web App name (e.g. myapp in myapp.azurewebsites.net)', required: true
21
+ opt '--slot SLOT', 'Slot name (if your app uses staging deployment)'
22
+ opt '--verbose', 'Print deployment output from Azure. Warning: If authentication fails, Git prints credentials in clear text. Correct credentials remain hidden.'
23
+
24
+ needs :git
25
+
26
+ cmds checkout: 'git checkout HEAD',
27
+ add: 'git add . --all --force',
28
+ commit: 'git commit -m "Cleanup commit"',
29
+ deploy: 'git push --force --quiet %{url} HEAD:refs/heads/master'
30
+
31
+ msgs commit: 'Committing changes to git',
32
+ deploy: 'Deploying to Azure Web App: %{site}'
33
+
34
+ errs push: 'Failed pushing to Azure Web Apps'
35
+
36
+ URL = 'https://%s:%s@%s.scm.azurewebsites.net:443/%s.git'
37
+
38
+ def setup
39
+ commit if git_dirty? && !cleanup?
40
+ end
41
+
42
+ def deploy
43
+ shell :deploy, silence: !verbose?
44
+ end
45
+
46
+ private
47
+
48
+ def url
49
+ format(URL, username, password, target, site)
50
+ end
51
+
52
+ def target
53
+ slot || site
54
+ end
55
+
56
+ def commit
57
+ shell :checkout
58
+ shell :add
59
+ shell :commit
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,324 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/http'
4
+ require 'uri'
5
+ require 'find'
6
+
7
+ module Dpl
8
+ module Providers
9
+ class Bintray < Provider
10
+ register :bintray
11
+
12
+ status :stable
13
+
14
+ description sq(<<-STR)
15
+ tbd
16
+ STR
17
+
18
+ gem 'json'
19
+
20
+ env :bintray
21
+
22
+ opt '--user USER', 'Bintray user', required: true
23
+ opt '--key KEY', 'Bintray API key', required: true, secret: true
24
+ opt '--file FILE', 'Path to a descriptor file for the Bintray upload', required: true
25
+ opt '--passphrase PHRASE', 'Passphrase as configured on Bintray (if GPG signing is used)'
26
+ opt '--url URL', default: 'https://api.bintray.com', internal: true
27
+
28
+ msgs missing_file: 'Missing descriptor file: %{file}',
29
+ invalid_file: 'Failed to parse descriptor file %{file}',
30
+ create_package: 'Creating package %{package_name}',
31
+ package_attrs: 'Adding attributes for package %{package_name}',
32
+ create_version: 'Creating version %{version_name}',
33
+ version_attrs: 'Adding attributes for version %{version_name}',
34
+ upload_file: 'Uploading file %{source} to %{target}',
35
+ sign_version: 'Signing version %s passphrase',
36
+ publish_version: 'Publishing version %{version_name} of package %{package_name}',
37
+ missing_path: 'Path: %{path} does not exist.',
38
+ list_download: 'Listing %{path} in downloads',
39
+ retrying: '%{code} response from Bintray. It may take some time for a version to be published, retrying in %{pause} sec ... (%{count}/%{max})',
40
+ giveup_retries: 'Too many retries failed, giving up, something went wrong.',
41
+ unexpected_code: 'Unexpected HTTP response code %s while checking if the %s exists',
42
+ request_failed: '%s %s returned unexpected HTTP response code %s',
43
+ request_success: 'Bintray response: %s %s. %s'
44
+
45
+ PATHS = {
46
+ packages: '/packages/%{subject}/%{repo}',
47
+ package: '/packages/%{subject}/%{repo}/%{package_name}',
48
+ package_attrs: '/packages/%{subject}/%{repo}/%{package_name}/attributes',
49
+ versions: '/packages/%{subject}/%{repo}/%{package_name}/versions',
50
+ version: '/packages/%{subject}/%{repo}/%{package_name}/versions/%{version_name}',
51
+ version_attrs: '/packages/%{subject}/%{repo}/%{package_name}/versions/%{version_name}/attributes',
52
+ version_sign: '/gpg/%{subject}/%{repo}/%{package_name}/versions/%{version_name}',
53
+ version_publish: '/content/%{subject}/%{repo}/%{package_name}/%{version_name}/publish',
54
+ version_file: '/content/%{subject}/%{repo}/%{package_name}/%{version_name}/%{target}',
55
+ file_metadata: '/file_metadata/%{subject}/%{repo}/%{target}'
56
+ }.freeze
57
+
58
+ MAP = {
59
+ package: %i[name desc licenses labels vcs_url website_url
60
+ issue_tracker_url public_download_numbers public_stats],
61
+ version: %i[name desc released vcs_tag github_release_notes_file
62
+ github_use_tag_release_notes attributes]
63
+ }.freeze
64
+
65
+ def install
66
+ require 'json'
67
+ end
68
+
69
+ def validate
70
+ error :missing_file unless File.exist?(file)
71
+ # validate that the repo exists, and we have access
72
+ end
73
+
74
+ def deploy
75
+ create_package unless package_exists?
76
+ create_version unless version_exists?
77
+ upload_files
78
+ sign_version if sign_version?
79
+ publish_version && update_files if publish_version?
80
+ end
81
+
82
+ def package_exists?
83
+ exists?(:package)
84
+ end
85
+
86
+ def create_package
87
+ info :create_package
88
+ post(path(:packages), compact(only(package, *MAP[:package])))
89
+ return unless package_attrs
90
+
91
+ info :package_attrs
92
+ post(path(:package_attrs), package_attrs)
93
+ end
94
+
95
+ def version_exists?
96
+ exists?(:version)
97
+ end
98
+
99
+ def create_version
100
+ info :create_version
101
+ post(path(:versions), compact(only(version, *MAP[:version])))
102
+ return unless version_attrs
103
+
104
+ info :version_attrs
105
+ post(path(:version_attrs), version_attrs)
106
+ end
107
+
108
+ def upload_files
109
+ files.each do |file|
110
+ info :upload_file, source: file.source, target: file.target
111
+ put(path(:version_file, target: file.target), file.read, file.params)
112
+ end
113
+ end
114
+
115
+ def sign_version
116
+ body = compact(passphrase: passphrase)
117
+ info :sign_version, (passphrase? ? 'with' : 'without')
118
+ post(path(:version_sign), body)
119
+ end
120
+
121
+ def publish_version
122
+ info :publish_version
123
+ post(path(:version_publish))
124
+ end
125
+
126
+ def update_files
127
+ files.select(&:download).each do |file|
128
+ info :list_download, path: file.target
129
+ update_file(file)
130
+ end
131
+ end
132
+
133
+ def update_file(file)
134
+ retrying(max: 10, pause: 5) do
135
+ body = { list_in_downloads: file.download }.to_json
136
+ headers = { 'Content-Type': 'application/json' }
137
+ put(path(:file_metadata, target: file.target), body, {}, headers)
138
+ end
139
+ end
140
+
141
+ def retrying(opts)
142
+ 1.upto(opts[:max]) do |count|
143
+ code = yield
144
+ return if code < 400
145
+
146
+ info :retrying, opts.merge(count: count, code: code)
147
+ sleep opts[:pause]
148
+ end
149
+ error :giveup_retries
150
+ end
151
+
152
+ def files
153
+ return {} unless files = descriptor[:files]
154
+ return @files if @files
155
+
156
+ keys = %i[path includePattern excludePattern uploadPattern matrixParams listInDownloads]
157
+ files = files.map { |file| file if file[:path] = path_for(file[:includePattern]) }
158
+ @files = files.compact.map { |file| find(*file.values_at(*keys)) }.flatten
159
+ end
160
+
161
+ def find(path, includes, excludes, uploads, params, download)
162
+ paths = Find.find(path).select { |path| File.file?(path) }
163
+ paths = paths.reject { |path| excluded?(path, excludes) }
164
+ paths = paths.map { |path| [path, path.match(/#{includes}/)] }
165
+ paths = paths.select(&:last)
166
+ paths.map { |path, match| Upload.new(path, fmt(uploads, match.captures), params, download) }
167
+ end
168
+
169
+ def fmt(pattern, captures)
170
+ captures.each.with_index.inject(pattern) do |pattern, (capture, ix)|
171
+ pattern.gsub("$#{ix + 1}", capture)
172
+ end
173
+ end
174
+
175
+ def excluded?(path, pattern)
176
+ !pattern.to_s.empty? && path.match(/#{pattern}/)
177
+ end
178
+
179
+ def path_for(str)
180
+ ix = str.index('(')
181
+ path = ix.to_i.zero? ? str : str[0, ix]
182
+ return path if File.exist?(path)
183
+
184
+ warn(:missing_path, path: path)
185
+ nil
186
+ end
187
+
188
+ def exists?(type)
189
+ case code = head(path(type), raise: false, silent: true)
190
+ when 200, 201 then true
191
+ when 404 then false
192
+ else error :unexpected_code, code, type
193
+ end
194
+ end
195
+
196
+ def head(path, opts = {})
197
+ req = Net::HTTP::Head.new(path)
198
+ req.basic_auth(user, key)
199
+ request(req, opts)
200
+ end
201
+
202
+ def post(path, body = nil)
203
+ req = Net::HTTP::Post.new(path)
204
+ req.add_field('Content-Type', 'application/json')
205
+ req.basic_auth(user, key)
206
+ req.body = JSON.dump(body) if body
207
+ request(req)
208
+ end
209
+
210
+ def put(path, body, params = {}, headers = {})
211
+ req = Net::HTTP::Put.new(append_params(path, params))
212
+ headers.each { |key, value| req.add_field(key.to_s, value) }
213
+ req.basic_auth(user, key)
214
+ req.body = body
215
+ request(req)
216
+ end
217
+
218
+ def request(req, opts = {})
219
+ res = http.request(req)
220
+ handle(req, res, opts)
221
+ res.code.to_i
222
+ end
223
+
224
+ def http
225
+ http = Net::HTTP.new(url.host, url.port)
226
+ http.use_ssl = true
227
+ http
228
+ end
229
+
230
+ def append_params(path, params)
231
+ [path, *Array(params).map { |pair| pair.join('=') }].join(';')
232
+ end
233
+
234
+ def handle(req, res, opts = { raise: true })
235
+ error :request_failed, req.method, req.uri, res.code if opts[:raise] && !success?(res.code)
236
+ info :request_success, res.code, res.message, parse(res)['message'] unless opts[:silent]
237
+ res.code.to_i
238
+ end
239
+
240
+ def success?(code)
241
+ code.to_s[0].to_i == 2
242
+ end
243
+
244
+ def descriptor
245
+ @descriptor ||= symbolize(JSON.parse(File.read(file)))
246
+ rescue StandardError
247
+ error :invalid_file
248
+ end
249
+
250
+ def url
251
+ @url ||= URI.parse(super || URL)
252
+ end
253
+
254
+ def package
255
+ descriptor[:package]
256
+ end
257
+
258
+ def package_name
259
+ package[:name]
260
+ end
261
+
262
+ def package_attrs
263
+ package[:attributes]
264
+ end
265
+
266
+ def subject
267
+ package[:subject]
268
+ end
269
+
270
+ def repo
271
+ package[:repo]
272
+ end
273
+
274
+ def version
275
+ descriptor[:version]
276
+ end
277
+
278
+ def version_name
279
+ version[:name]
280
+ end
281
+
282
+ def version_attrs
283
+ version[:attributes]
284
+ end
285
+
286
+ def sign_version?
287
+ version[:gpgSign]
288
+ end
289
+
290
+ def publish_version?
291
+ descriptor[:publish]
292
+ end
293
+
294
+ def path(resource, args = {})
295
+ interpolate(PATHS[resource], args, secure: true)
296
+ end
297
+
298
+ def parse(json)
299
+ hash = JSON.parse(json)
300
+ hash.is_a?(Hash) ? hash : {}
301
+ rescue StandardError
302
+ {}
303
+ end
304
+
305
+ def compact(hash)
306
+ hash.reject { |_, value| value.nil? }
307
+ end
308
+
309
+ def only(hash, *keys)
310
+ hash.select { |key, _| keys.include?(key) }
311
+ end
312
+
313
+ class Upload < Struct.new(:source, :target, :params, :download)
314
+ def read
315
+ IO.read(source)
316
+ end
317
+
318
+ def eql?(other)
319
+ source == other.source
320
+ end
321
+ end
322
+ end
323
+ end
324
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dpl
4
+ module Providers
5
+ class Bluemixcloudfoundry < Provider
6
+ register :bluemixcloudfoundry
7
+
8
+ status :stable
9
+
10
+ full_name 'Bluemix Cloud Foundry'
11
+
12
+ description sq(<<-STR)
13
+ tbd
14
+ STR
15
+
16
+ env :cloudfoundry
17
+
18
+ opt '--username USER', 'Bluemix username', required: true
19
+ opt '--password PASS', 'Bluemix password', required: true, secret: true
20
+ opt '--organization ORG', 'Bluemix organization', required: true
21
+ opt '--space SPACE', 'Bluemix space', required: true
22
+ opt '--region REGION', 'Bluemix region', default: 'ng', enum: %w[ng eu-gb eu-de au-syd]
23
+ opt '--api URL', 'Bluemix api URL'
24
+ opt '--app_name APP', 'Application name'
25
+ opt '--buildpack PACK', 'Buildpack name or Git URL'
26
+ opt '--manifest FILE', 'Path to the manifest'
27
+ opt '--skip_ssl_validation', 'Skip SSL validation'
28
+ opt '--logout', default: true, internal: true
29
+
30
+ API = {
31
+ 'ng': 'api.ng.bluemix.net',
32
+ 'eu-gb': 'api.eu-gb.bluemix.net',
33
+ 'eu-de': 'api.eu-de.bluemix.net',
34
+ 'au-syd': 'api.au-syd.bluemix.net'
35
+ }.freeze
36
+
37
+ cmds install: 'test $(uname) = "Linux" && rel="linux64-binary" || rel="macosx64"; wget "https://cli.run.pivotal.io/stable?release=${rel}&source=github" -qO cf.tgz && tar -zxvf cf.tgz && rm cf.tgz',
38
+ api: './cf api %{api} %{skip_ssl_validation_opt}',
39
+ login: './cf login -u %{username} -p %{password}',
40
+ target: './cf target -o %{organization} -s %{space}',
41
+ push: './cf push %{push_args}',
42
+ logout: './cf logout'
43
+
44
+ errs install: 'Failed to install CLI tools',
45
+ api: 'Failed to set api %{api}',
46
+ login: 'Failed to login',
47
+ target: 'Failed to target organization %{organization}, space %{space}',
48
+ push: 'Failed to push app',
49
+ logout: 'Failed to logout'
50
+
51
+ msgs manifest_missing: 'Application must have a manifest.yml for unattended deployment'
52
+
53
+ def install
54
+ shell :install
55
+ end
56
+
57
+ def validate
58
+ error :manifest_missing if manifest? && manifest_missing?
59
+ end
60
+
61
+ def login
62
+ shell :api
63
+ shell :login
64
+ shell :target
65
+ end
66
+
67
+ def deploy
68
+ shell :push
69
+ end
70
+
71
+ def finish
72
+ shell :logout if logout?
73
+ end
74
+
75
+ private
76
+
77
+ def push_args
78
+ args = []
79
+ args << quote(app_name) if app_name?
80
+ args << "-f #{manifest}" if manifest?
81
+ args << "-b #{buildpack}" if buildpack?
82
+ args.join(' ')
83
+ end
84
+
85
+ def skip_ssl_validation_opt
86
+ '--skip-ssl-validation' if skip_ssl_validation?
87
+ end
88
+
89
+ def manifest_missing?
90
+ !File.exist?(manifest)
91
+ end
92
+
93
+ def api
94
+ super || API[region.to_sym]
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dpl
4
+ module Providers
5
+ class Boxfuse < Provider
6
+ register :boxfuse
7
+
8
+ status :alpha
9
+
10
+ description sq(<<-STR)
11
+ tbd
12
+ STR
13
+
14
+ env :boxfuse
15
+
16
+ opt '--user USER', required: true
17
+ opt '--secret SECRET', required: true, secret: true
18
+ opt '--payload PAYLOAD'
19
+ opt '--app APP'
20
+ opt '--version VERSION'
21
+ opt '--env ENV'
22
+ opt '--config_file FILE', alias: :configfile, deprecated: :configfile
23
+ opt '--extra_args ARGS'
24
+
25
+ URL = 'https://files.boxfuse.com/com/boxfuse/client/boxfuse-commandline/1.33.0.1460/boxfuse-commandline-1.33.0.1460-linux-x64.tar.gz'
26
+
27
+ cmds install: 'curl -L %{URL} | tar xz',
28
+ deploy: 'boxfuse/boxfuse run %{deploy_opts}'
29
+
30
+ def validate
31
+ # TODO: check if the config file exists (it seems `boxfuse` doesn't)
32
+ end
33
+
34
+ def install
35
+ shell :install
36
+ end
37
+
38
+ def deploy
39
+ shell :deploy
40
+ end
41
+
42
+ private
43
+
44
+ def deploy_opts
45
+ opts = [*opts_for(%i[user secret payload app env version], prefix: '-')]
46
+ opts << "-configfile=#{config_file}" if config_file?
47
+ opts << extra_args if extra_args?
48
+ opts.join(' ')
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dpl
4
+ module Providers
5
+ class Cargo < Provider
6
+ register :cargo
7
+
8
+ status :stable
9
+
10
+ description sq(<<-STR)
11
+ tbd
12
+ STR
13
+
14
+ env :cargo
15
+
16
+ opt '--token TOKEN', 'Cargo registry API token', required: true, secret: true
17
+ opt '--allow_dirty', 'Allow publishing from a dirty git working directory'
18
+
19
+ cmds publish: 'cargo publish %{publish_opts}'
20
+
21
+ def deploy
22
+ shell :publish
23
+ end
24
+
25
+ private
26
+
27
+ def publish_opts
28
+ opts_for(%i[token allow_dirty], dashed: true)
29
+ end
30
+ end
31
+ end
32
+ end