dpl 2.0.3.beta.4 → 2.0.3.beta.5
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/Gemfile +15 -3
- data/Gemfile.lock +444 -211
- data/Rakefile +36 -34
- data/bin/dpl +3 -1
- data/dpl.gemspec +25 -0
- data/lib/dpl/cli.rb +19 -14
- data/lib/dpl/ctx/bash.rb +18 -12
- data/lib/dpl/ctx/test.rb +21 -15
- data/lib/dpl/ctx.rb +2 -0
- data/lib/dpl/helper/assets.rb +4 -2
- data/lib/dpl/helper/cmd.rb +20 -18
- data/lib/dpl/helper/config_file.rb +5 -3
- data/lib/dpl/helper/cookbook_site_streaming_uploader.rb +249 -0
- data/lib/dpl/helper/env.rb +26 -22
- data/lib/dpl/helper/github.rb +2 -0
- data/lib/dpl/helper/interpolate.rb +8 -4
- data/lib/dpl/helper/memoize.rb +4 -1
- data/lib/dpl/helper/squiggle.rb +3 -1
- data/lib/dpl/helper/transliterate.rb +3 -1
- data/lib/dpl/helper/wrap.rb +3 -1
- data/lib/dpl/helper/zip.rb +3 -1
- data/lib/dpl/provider/dsl.rb +18 -4
- data/lib/dpl/provider/examples.rb +6 -2
- data/lib/dpl/provider/status.rb +26 -24
- data/lib/dpl/providers/anynines.rb +22 -20
- data/lib/dpl/providers/azure_web_apps.rb +21 -19
- data/lib/dpl/providers/bintray.rb +44 -37
- data/lib/dpl/providers/bluemixcloudfoundry.rb +38 -36
- data/lib/dpl/providers/boxfuse.rb +12 -10
- data/lib/dpl/providers/cargo.rb +7 -5
- data/lib/dpl/providers/chef_supermarket.rb +82 -80
- data/lib/dpl/providers/cloud66.rb +17 -15
- data/lib/dpl/providers/cloudfiles.rb +8 -6
- data/lib/dpl/providers/cloudformation.rb +191 -187
- data/lib/dpl/providers/cloudfoundry.rb +32 -30
- data/lib/dpl/providers/codedeploy.rb +35 -33
- data/lib/dpl/providers/convox.rb +32 -25
- data/lib/dpl/providers/datica.rb +30 -28
- data/lib/dpl/providers/ecr.rb +66 -64
- data/lib/dpl/providers/elasticbeanstalk.rb +14 -12
- data/lib/dpl/providers/engineyard.rb +60 -58
- data/lib/dpl/providers/firebase.rb +6 -4
- data/lib/dpl/providers/flynn.rb +8 -6
- data/lib/dpl/providers/gae.rb +28 -25
- data/lib/dpl/providers/gcs.rb +59 -57
- data/lib/dpl/providers/git_push.rb +199 -195
- data/lib/dpl/providers/gleis.rb +19 -17
- data/lib/dpl/providers/hackage.rb +15 -13
- data/lib/dpl/providers/hephy.rb +18 -16
- data/lib/dpl/providers/heroku/api.rb +72 -70
- data/lib/dpl/providers/heroku/git.rb +15 -13
- data/lib/dpl/providers/heroku.rb +40 -38
- data/lib/dpl/providers/lambda.rb +134 -134
- data/lib/dpl/providers/launchpad.rb +45 -43
- data/lib/dpl/providers/netlify.rb +7 -5
- data/lib/dpl/providers/npm.rb +61 -58
- data/lib/dpl/providers/nuget.rb +8 -6
- data/lib/dpl/providers/openshift.rb +8 -6
- data/lib/dpl/providers/opsworks.rb +23 -21
- data/lib/dpl/providers/pages/api.rb +14 -14
- data/lib/dpl/providers/pages/git.rb +53 -47
- data/lib/dpl/providers/pages.rb +3 -1
- data/lib/dpl/providers/puppetforge.rb +6 -4
- data/lib/dpl/providers/pypi.rb +55 -54
- data/lib/dpl/providers/releases.rb +30 -23
- data/lib/dpl/providers/rubygems.rb +35 -31
- data/lib/dpl/providers/s3.rb +148 -142
- data/lib/dpl/providers/scalingo.rb +18 -16
- data/lib/dpl/providers/script.rb +4 -2
- data/lib/dpl/providers/snap.rb +12 -9
- data/lib/dpl/providers/surge.rb +7 -5
- data/lib/dpl/providers/testfairy.rb +47 -43
- data/lib/dpl/providers/transifex.rb +20 -18
- data/lib/dpl/providers.rb +3 -1
- data/lib/dpl/string_ext.rb +3 -1
- data/lib/dpl/support/aws_sdk_patch.rb +4 -1
- data/lib/dpl/support/gems.rb +7 -3
- data/lib/dpl/support/gstore_patch.rb +3 -1
- data/lib/dpl/support/version.rb +13 -12
- data/lib/dpl/version.rb +3 -1
- data/lib/dpl.rb +2 -0
- data/status.json +237 -0
- metadata +32 -15
- /data/lib/dpl/providers/{packagecloud.rb → packagecloud.rb_} +0 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Dpl
|
|
2
4
|
module Providers
|
|
3
5
|
class Heroku
|
|
@@ -8,22 +10,22 @@ module Dpl
|
|
|
8
10
|
|
|
9
11
|
full_name 'Heroku API'
|
|
10
12
|
|
|
11
|
-
description sq(<<-
|
|
13
|
+
description sq(<<-STR)
|
|
12
14
|
tbd
|
|
13
|
-
|
|
15
|
+
STR
|
|
14
16
|
|
|
15
17
|
opt '--api_key KEY', 'Heroku API key', required: true, secret: true
|
|
16
18
|
opt '--version VERSION', internal: true # used in triggering a build, not sure this should be exposed?
|
|
17
19
|
|
|
18
|
-
msgs pack:
|
|
19
|
-
upload:
|
|
20
|
-
build:
|
|
20
|
+
msgs pack: 'Creating application archive',
|
|
21
|
+
upload: 'Uploading application archive',
|
|
22
|
+
build: 'Triggering Heroku build (deployment)',
|
|
21
23
|
pending: 'Heroku build still pending',
|
|
22
|
-
failed:
|
|
24
|
+
failed: 'Heroku build failed'
|
|
23
25
|
|
|
24
|
-
cmds pack:
|
|
25
|
-
upload:
|
|
26
|
-
log:
|
|
26
|
+
cmds pack: 'tar -zcf %{escaped_archive_file} --exclude .git .',
|
|
27
|
+
upload: 'curl %{curl_opts} %{escaped_put_url} -X PUT -H "Content-Type:" -H "Accept: application/vnd.heroku+json; version=3" -H "User-Agent: %{user_agent}" --data-binary @%{escaped_archive_file}',
|
|
28
|
+
log: 'curl %{curl_opts} %{escaped_output_stream_url} -H "Accept: application/vnd.heroku+json; version=3" -H "User-Agent: %{user_agent}"'
|
|
27
29
|
|
|
28
30
|
attr_reader :data
|
|
29
31
|
|
|
@@ -37,84 +39,84 @@ module Dpl
|
|
|
37
39
|
|
|
38
40
|
private
|
|
39
41
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
def pack
|
|
43
|
+
shell :pack
|
|
44
|
+
end
|
|
43
45
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
def upload
|
|
47
|
+
shell :upload, echo: false
|
|
48
|
+
end
|
|
47
49
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
end
|
|
54
|
-
handle_error(res) unless res.success?
|
|
55
|
-
@data = symbolize(JSON.parse(res.body))
|
|
50
|
+
def build
|
|
51
|
+
info :build
|
|
52
|
+
res = http.post("/apps/#{app}/builds") do |req|
|
|
53
|
+
req.headers['Content-Type'] = 'application/json'
|
|
54
|
+
req.body = JSON.dump(source_blob: { url: get_url, version: })
|
|
56
55
|
end
|
|
56
|
+
handle_error(res) unless res.success?
|
|
57
|
+
@data = symbolize(JSON.parse(res.body))
|
|
58
|
+
end
|
|
57
59
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
60
|
+
def log
|
|
61
|
+
shell :log, echo: false
|
|
62
|
+
end
|
|
61
63
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
end
|
|
64
|
+
def verify
|
|
65
|
+
loop do
|
|
66
|
+
case build_status
|
|
67
|
+
when 'pending'
|
|
68
|
+
info :pending
|
|
69
|
+
sleep 5
|
|
70
|
+
when 'succeeded'
|
|
71
|
+
break
|
|
72
|
+
else
|
|
73
|
+
error :failed
|
|
73
74
|
end
|
|
74
75
|
end
|
|
76
|
+
end
|
|
75
77
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
def build_status
|
|
79
|
+
res = http.get("/apps/#{app}/builds/#{build_id}")
|
|
80
|
+
JSON.parse(res.body)['status']
|
|
81
|
+
end
|
|
80
82
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
def archive_file
|
|
84
|
+
expand("~/.dpl.#{app}.tgz")
|
|
85
|
+
end
|
|
84
86
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
87
|
+
def get_url
|
|
88
|
+
source['get_url']
|
|
89
|
+
end
|
|
88
90
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
91
|
+
def put_url
|
|
92
|
+
source['put_url']
|
|
93
|
+
end
|
|
92
94
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
end
|
|
95
|
+
def source
|
|
96
|
+
# this says the endpoint /sources is deprecated: https://devcenter.heroku.com/articles/platform-api-reference#source
|
|
97
|
+
# this says to use /apps/example-app/sources: https://devcenter.heroku.com/articles/build-and-release-using-the-api#sources-endpoint
|
|
98
|
+
@source ||= begin
|
|
99
|
+
res = http.post('/sources')
|
|
100
|
+
handle_error(res) unless res.success?
|
|
101
|
+
JSON.parse(res.body)['source_blob']
|
|
101
102
|
end
|
|
103
|
+
end
|
|
102
104
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
def build_id
|
|
106
|
+
data[:id]
|
|
107
|
+
end
|
|
106
108
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
109
|
+
def output_stream_url
|
|
110
|
+
data[:output_stream_url]
|
|
111
|
+
end
|
|
110
112
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
113
|
+
def version
|
|
114
|
+
super || git_sha
|
|
115
|
+
end
|
|
114
116
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
117
|
+
def curl_opts
|
|
118
|
+
tty? ? '' : '-sS'
|
|
119
|
+
end
|
|
118
120
|
end
|
|
119
121
|
end
|
|
120
122
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Dpl
|
|
2
4
|
module Providers
|
|
3
5
|
class Heroku
|
|
@@ -8,11 +10,11 @@ module Dpl
|
|
|
8
10
|
|
|
9
11
|
full_name 'Heroku Git'
|
|
10
12
|
|
|
11
|
-
description sq(<<-
|
|
13
|
+
description sq(<<-STR)
|
|
12
14
|
tbd
|
|
13
|
-
|
|
15
|
+
STR
|
|
14
16
|
|
|
15
|
-
required :api_key, [
|
|
17
|
+
required :api_key, %i[username password]
|
|
16
18
|
|
|
17
19
|
opt '--api_key KEY', 'Heroku API key', secret: true
|
|
18
20
|
opt '--username USER', 'Heroku username', alias: :user
|
|
@@ -22,7 +24,7 @@ module Dpl
|
|
|
22
24
|
needs :git, :git_http_user_agent
|
|
23
25
|
|
|
24
26
|
cmds fetch: 'git fetch origin $TRAVIS_BRANCH --unshallow',
|
|
25
|
-
push:
|
|
27
|
+
push: 'git push %{remote} HEAD:refs/heads/master -f'
|
|
26
28
|
|
|
27
29
|
def prepare
|
|
28
30
|
write_netrc if write_netrc?
|
|
@@ -35,17 +37,17 @@ module Dpl
|
|
|
35
37
|
|
|
36
38
|
private
|
|
37
39
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
def remote
|
|
41
|
+
git || "https://git.heroku.com/#{app}.git"
|
|
42
|
+
end
|
|
41
43
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
def write_netrc?
|
|
45
|
+
remote.start_with?('https://')
|
|
46
|
+
end
|
|
45
47
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
def write_netrc
|
|
49
|
+
super('git.heroku.com', email, api_key || password)
|
|
50
|
+
end
|
|
49
51
|
end
|
|
50
52
|
end
|
|
51
53
|
end
|
data/lib/dpl/providers/heroku.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Dpl
|
|
2
4
|
module Providers
|
|
3
5
|
class Heroku < Provider
|
|
@@ -5,30 +7,29 @@ module Dpl
|
|
|
5
7
|
|
|
6
8
|
abstract
|
|
7
9
|
|
|
8
|
-
gem 'faraday', '~>
|
|
9
|
-
gem 'json'
|
|
10
|
+
gem 'faraday', '~> 1'
|
|
10
11
|
gem 'netrc', '~> 0.11.0'
|
|
11
12
|
gem 'rendezvous', '~> 0.1.3'
|
|
12
13
|
|
|
13
14
|
env :heroku
|
|
14
15
|
|
|
15
|
-
opt '--strategy NAME', 'Heroku deployment strategy', default: 'api', enum: %w
|
|
16
|
+
opt '--strategy NAME', 'Heroku deployment strategy', default: 'api', enum: %w[api git]
|
|
16
17
|
opt '--app APP', 'Heroku app name', default: :repo_name
|
|
17
18
|
opt '--log_level LEVEL', internal: true
|
|
18
19
|
|
|
19
|
-
msgs login:
|
|
20
|
-
restart:
|
|
21
|
-
validate:
|
|
22
|
-
run_cmd:
|
|
23
|
-
success:
|
|
20
|
+
msgs login: 'Authenticating ... ',
|
|
21
|
+
restart: 'Restarting dynos ... ',
|
|
22
|
+
validate: 'Checking for app %{app} ... ',
|
|
23
|
+
run_cmd: 'Running command %s ... ',
|
|
24
|
+
success: 'success.',
|
|
24
25
|
api_error: 'API request failed: %s (see %s)'
|
|
25
26
|
|
|
26
27
|
URL = 'https://api.heroku.com'
|
|
27
28
|
|
|
28
29
|
HEADERS = {
|
|
29
30
|
'Accept': 'application/vnd.heroku+json; version=3',
|
|
30
|
-
'User-Agent': user_agent
|
|
31
|
-
}
|
|
31
|
+
'User-Agent': user_agent
|
|
32
|
+
}.freeze
|
|
32
33
|
|
|
33
34
|
attr_reader :email
|
|
34
35
|
|
|
@@ -36,7 +37,7 @@ module Dpl
|
|
|
36
37
|
print :login
|
|
37
38
|
res = http.get('/account')
|
|
38
39
|
handle_error(res) unless res.success?
|
|
39
|
-
@email = JSON.parse(res.body)[
|
|
40
|
+
@email = JSON.parse(res.body)['email']
|
|
40
41
|
info :success
|
|
41
42
|
end
|
|
42
43
|
|
|
@@ -60,7 +61,7 @@ module Dpl
|
|
|
60
61
|
print :run_cmd, cmd
|
|
61
62
|
res = http.post "/apps/#{app}/dynos" do |req|
|
|
62
63
|
req.headers['Content-Type'] = 'application/json'
|
|
63
|
-
req.body = { command: cmd, attach: true}.to_json
|
|
64
|
+
req.body = { command: cmd, attach: true }.to_json
|
|
64
65
|
end
|
|
65
66
|
handle_error(res) unless res.success?
|
|
66
67
|
rendezvous(JSON.parse(res.body)['attach_url'])
|
|
@@ -68,39 +69,40 @@ module Dpl
|
|
|
68
69
|
|
|
69
70
|
private
|
|
70
71
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
end
|
|
72
|
+
def http
|
|
73
|
+
@http ||= Faraday.new(url: URL, headers:) do |http|
|
|
74
|
+
http.basic_auth(username, password) if username && password
|
|
75
|
+
http.response :logger, logger, &method(:filter) if log_level?
|
|
76
|
+
http.adapter Faraday.default_adapter
|
|
77
77
|
end
|
|
78
|
+
end
|
|
78
79
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
HEADERS.merge('Authorization': "Bearer #{api_key}")
|
|
82
|
-
end
|
|
80
|
+
def headers
|
|
81
|
+
return HEADERS.dup if username && password
|
|
83
82
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
end
|
|
83
|
+
HEADERS.merge('Authorization': "Bearer #{api_key}")
|
|
84
|
+
end
|
|
87
85
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
86
|
+
def filter(logger)
|
|
87
|
+
logger.filter(/(.*Authorization: ).*/, '\1[REDACTED]')
|
|
88
|
+
end
|
|
91
89
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
end
|
|
90
|
+
def logger
|
|
91
|
+
super(log_level)
|
|
92
|
+
end
|
|
96
93
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
94
|
+
def handle_error(response)
|
|
95
|
+
body = JSON.parse(response.body)
|
|
96
|
+
error :api_error, body['message'], body['url']
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def rendezvous(url)
|
|
100
|
+
Rendezvous.start(url:)
|
|
101
|
+
end
|
|
100
102
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
103
|
+
# overwritten in Git, meaningless in Api
|
|
104
|
+
def username; end
|
|
105
|
+
def password; end
|
|
104
106
|
end
|
|
105
107
|
end
|
|
106
108
|
end
|