dpl 1.7.10.travis.700.4 → 1.7.10.travis.701.4

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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ODlhNjBkMzYyNmQyNTBlNGEwY2RhNDUyZjM5ZDRlMzlhMzY2NzYxMQ==
4
+ NWU1ZjI5ZjZlZTczYzEwMTBlMGI3NDk5NjRlZmRlMTk4MTM2MjUzNg==
5
5
  data.tar.gz: !binary |-
6
- NDI1YzVkZWQ0Yzg3NmYzZGE2NWUwYjYzNzY4ODdlNDIxYjI0NDUxMQ==
6
+ MWQ3ZDNjNzkwM2ExYzE1ZmE0NzZhNzdhNjNlYzJmZTBiOWFjMGVkNw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YTIxNWZmYzhiZDg0MDAyNzU0ZDZkZDFiMzI1MTkzNWVlNmE5NTdlNjA2M2Y2
10
- YmVmYWQ2MmE5YTI0YTdlYTU4ZDhmZTgyYTMyMThmMGY3ODdmYmVkMTc0M2E5
11
- ZmEzYzRmMjMxYzY5YmFlY2QyZTI3MDI4ZjAyZWYxZWVjMTk5OWM=
9
+ MTMxOGQzY2Y1Yzc1MWE3N2ZiY2Y4YWJkYWM4YWUwZWFiOWQ2ODMxNmQ2Y2Ux
10
+ YjNlMDVkOTQ1ZWMyYjZjYjIwYjY4MzI2MDVjYThhMDdhNjdlY2Y0MjUxYjUz
11
+ NDM3MGI4NDQwYWJjODhkZmM5ZjNmNTg1MGIwNGJhOGJhNmVlMmY=
12
12
  data.tar.gz: !binary |-
13
- YjIxNDNiYzZkOTFiNjI0MTg0NmE4M2M2Mjc4YjNiY2RlMGMxODVmMTYxM2U0
14
- ZGM0NzUwMGIxOWQ1OWU3ZDg3MGJhYjAyN2YxYjRhNTMxOGFjMjMwNTBlNzg1
15
- ZmQzMDYzZTJiY2RlOGQ0MWI3MjkxZTg0MGNmODQzYzk5OTY5Y2E=
13
+ ZjVjYThhMWVjMDM4MmRmMzU3ZjEwZTM0YTVmMmEzM2E2OWJiY2FkYzY5MzM2
14
+ MDBiOTAwZmNhMzRiMmZmYmVlMGI4MDdiNmM2NmJkODE0MmI4NjE3NzEwODky
15
+ MTIzMjNjZjJkY2MzNzZhMDRjZjBhNTdjODY3MjQ4MzMyYTA3OTY=
@@ -5,10 +5,13 @@ module DPL
5
5
  class Provider
6
6
  module Heroku
7
7
  class API < Generic
8
+ attr_reader :build_id
9
+
8
10
  def push_app
9
11
  pack_archive
10
12
  upload_archive
11
13
  trigger_build
14
+ verify_build
12
15
  end
13
16
 
14
17
  def archive_file
@@ -28,10 +31,27 @@ module DPL
28
31
  def trigger_build
29
32
  log "triggering new deployment"
30
33
  response = post(:builds, source_blob: { url: get_url, version: version })
34
+ @build_id = response.fetch('id')
31
35
  stream_url = response.fetch('stream_url')
32
36
  context.shell "curl #{Shellwords.escape(stream_url)}"
33
37
  end
34
38
 
39
+ def verify_build
40
+ loop do
41
+ response = get("builds/#{build_id}/result")
42
+ exit_code = response.fetch('exit_code')
43
+ if exit_code.nil?
44
+ log "heroku build still pending"
45
+ sleep 5
46
+ next
47
+ elsif exit_code == 0
48
+ break
49
+ else
50
+ error "deploy failed, build exited with code #{exit_code}"
51
+ end
52
+ end
53
+ end
54
+
35
55
  def get_url
36
56
  source_blob.fetch("get_url")
37
57
  end
@@ -48,6 +68,17 @@ module DPL
48
68
  @version ||= options[:version] || context.env['TRAVIS_COMMIT'] || `git rev-parse HEAD`.strip
49
69
  end
50
70
 
71
+ def get(subpath, options = {})
72
+ options = {
73
+ method: :get,
74
+ path: "/apps/#{option(:app)}/#{subpath}",
75
+ headers: { "Accept" => "application/vnd.heroku+json; version=edge" },
76
+ expects: [200]
77
+ }.merge(options)
78
+
79
+ api.request(options).body
80
+ end
81
+
51
82
  def post(subpath, body = nil, options = {})
52
83
  options = {
53
84
  method: :post,
@@ -31,4 +31,67 @@ describe DPL::Provider::Heroku do
31
31
  expect(provider.api).to eq(api)
32
32
  end
33
33
  end
34
+
35
+ describe "#trigger_build" do
36
+ let(:response_body) { {
37
+ "created_at" => "2012-01-01T12:00:00Z",
38
+ "id" => "abc",
39
+ "status" => "pending",
40
+ "stream_url" => "http://example.com/stream",
41
+ "updated_at" => "2012-01-01T12:00:00Z",
42
+ "user" => { "id" => "01234567-89ab-cdef-0123-456789abcdef", "email" => "username@example.com" }
43
+ } }
44
+ example do
45
+ expect(provider).to receive(:log).with('triggering new deployment')
46
+ expect(provider).to receive(:get_url).and_return 'http://example.com/source.tgz'
47
+ expect(provider).to receive(:version).and_return 'sha'
48
+ expect(provider).to receive(:post).with(
49
+ :builds, source_blob: {url: 'http://example.com/source.tgz', version: 'sha'}
50
+ ).and_return(response_body)
51
+ expect(provider.context).to receive(:shell).with('curl http://example.com/stream')
52
+ provider.trigger_build
53
+ expect(provider.build_id).to eq('abc')
54
+ end
55
+ end
56
+
57
+ describe "#verify_build" do
58
+ def response_body(status, exit_code)
59
+ {
60
+ "build" => {
61
+ "id" => "01234567-89ab-cdef-0123-456789abcdef",
62
+ "status" => status
63
+ },
64
+ "exit_code" => exit_code
65
+ }
66
+ end
67
+
68
+ before do
69
+ allow(provider).to receive(:build_id).and_return('abc')
70
+ end
71
+
72
+ context 'when build succeeds' do
73
+ example do
74
+ expect(provider).to receive(:get).with('builds/abc/result').and_return(response_body('succeeded', 0))
75
+ expect{ provider.verify_build }.not_to raise_error
76
+ end
77
+ end
78
+
79
+ context 'when build fails' do
80
+ example do
81
+ expect(provider).to receive(:get).with('builds/abc/result').and_return(response_body('failed', 1))
82
+ expect{ provider.verify_build }.to raise_error("deploy failed, build exited with code 1")
83
+ end
84
+ end
85
+
86
+ context 'when build is pending, then succeeds' do
87
+ example do
88
+ expect(provider).to receive(:get).with('builds/abc/result').and_return(response_body('pending', nil), response_body('succeeded', 0))
89
+ expect(provider).to receive(:log).with('heroku build still pending')
90
+ expect(provider).to receive(:sleep).with(5) # stub sleep
91
+ expect{ provider.verify_build }.not_to raise_error
92
+ end
93
+ end
94
+
95
+ end
96
+
34
97
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dpl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.10.travis.700.4
4
+ version: 1.7.10.travis.701.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Konstantin Haase
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-23 00:00:00.000000000 Z
11
+ date: 2015-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec