heroku_hatchet 4.0.7 → 4.0.8

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,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 2d62240ccab36896f21d254213e96976f8efbcb9294dd79c9a614f6167926a0d
4
- data.tar.gz: 9b56fff4dc3217e079fb7e47ce43cd96c56632f72501a12cfbd476bda6be3acf
2
+ SHA1:
3
+ metadata.gz: 2757fc3e39814bfab066c368f2dd365e5252f4b9
4
+ data.tar.gz: 86bb1d5c5ed24462ccd99556420f327c8baceeac
5
5
  SHA512:
6
- metadata.gz: e31bbcca0a7e163acfe5c8ae66a0f7e9aa4296095bbf5e43e9fb53df852b6fc628bb428519c5939b566ed3fa047d9e8a670cba786cc3d97fd8191592f2432de2
7
- data.tar.gz: bd9f296e0f5b2f28728f09b7d4aca5795f22659ab738e49d6cc88a438b49fcd3bb7a3524da8389f81d73377322ef012551542fcdef45cfa34d42d029dc6a75e5
6
+ metadata.gz: bd74e5705b78273eb133189a1c807133a0840c1161ce478deb4a699a5641a69c81bd072f62b3531245780a421d0d127cd5f3643fe6e41aab38e7f8ea93e8ac38
7
+ data.tar.gz: de5f809bcd7b0f4ac6f121ebbb852057eb73b89e6370398e43635a5de6edee2cbffb05ece7b76d50751479152a7b1850fa54c765e787c004fb43067e1a57c670
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  ## HEAD
2
2
 
3
+ ## 4.0.8
4
+
5
+ - Fix `hatchet destroy` calling class from wrong module
6
+ - Fix `hatchet destroy` not passing rate limited API to Reaper
7
+ - Fix undeclared variable in `App#create_app` rescue block
8
+ - Fix race condition in `Reaper#cycle` triggering 403s in API, causing test failures
9
+ - Allow configurable app name prefix (default "hatchet-t-") via `HATCHET_APP_PREFIX` env var
10
+
3
11
  ## 4.0.7
4
12
 
5
13
  - Exit code is now returned from `app.run` commands (https://github.com/heroku/hatchet/pull/58)
data/README.md CHANGED
@@ -130,6 +130,12 @@ Hatchet::Runner.new('no_lockfile')
130
130
 
131
131
  If you have conflicting names, use full paths.
132
132
 
133
+ If you woud like to test with fixtures that are checked in locally, that is also possible by passing in the path to the fixture directory and skipping the `hatchet install`:
134
+
135
+ ```
136
+ Hatchet::Runner.new("spec/fixtures/repos/node-10-metrics")
137
+ ```
138
+
133
139
  A word of warning on including repos inside of your test
134
140
  directory, if you're using a runner that looks for patterns such as
135
141
  `*_test.rb` to run your hatchet tests, it may incorrectly think you want
@@ -254,7 +260,46 @@ Hatchet::Runner.new("rails3_mri_193").deploy do |app|
254
260
  end
255
261
  ```
256
262
 
257
- Please read the docs on [repl_runner](http://github.com/schneems/repl_runner) for more info. The only interactive commands that are supported out of the box are `rails console`, `bash`, and `irb` it is fairly easy to add your own though:
263
+ Please read the docs on [repl_runner](http://github.com/schneems/repl_runner) for more info. The only interactive commands that are supported out of the box are `rails console`, `bash`, and `irb` it is fairly easy to add your own though.
264
+
265
+ ## Modify Application Files on Disk
266
+
267
+ While template apps provided from your `hatchet.json` can provide a wide array of different test cases, it's likely that you'll want to test minor varriations of an app. To do this you can use the `before_deploy` hook to modify files on disk inside of an app in a way that is threadsafe and will only affect the local instance of the app:
268
+
269
+ ```ruby
270
+ Hatchet::App.new("default_ruby", before_deploy: { FileUtils.touch("foo.txt")}).deploy do
271
+ # Assert stuff
272
+ end
273
+ ```
274
+
275
+ After the `before_deploy` block fires, the results will be committed to git automatically before the app deploys.
276
+
277
+ You can also manually call the `before_deploy` method:
278
+
279
+ ```ruby
280
+ app = Hatchet::App.new("default_ruby")
281
+ app.before_deploy do
282
+ FileUtils.touch("foo.txt")
283
+ end
284
+ app.deploy do
285
+ # Assert stuff
286
+ end
287
+ ```
288
+
289
+ Note: If you're going to shell out in this `before_deploy` section, you should check the success of your command, for example:
290
+
291
+ ```ruby
292
+ before_deploy = Proc.new do
293
+ cmd = "bundle update"
294
+ output = `#{cmd}`
295
+ raise "Command #{cmd.inspect} failed unexpectedly with output: #{output}"
296
+ end
297
+ Hatchet::App.new("default_ruby", before_deploy: before_deploy).deploy do
298
+ # Assert stuff
299
+ end
300
+ ```
301
+
302
+ It's helpful to make a helper function in your library if this pattern happens a lot in your app.
258
303
 
259
304
  ## Heroku CI
260
305
 
data/bin/hatchet CHANGED
@@ -98,7 +98,8 @@ class HatchetCLI < Thor
98
98
  def destroy(name=nil)
99
99
  api_key = ENV['HEROKU_API_KEY'] || bundle_exec {`heroku auth:token`.chomp }
100
100
  platform_api = PlatformAPI.connect_oauth(api_key, cache: Moneta.new(:Null))
101
- reaper = Reaper.new(platform_api: platform_api)
101
+ api_rate_limit = ApiRateLimit.new(platform_api)
102
+ reaper = Hatchet::Reaper.new(api_rate_limit: api_rate_limit)
102
103
 
103
104
  if options[:all]
104
105
  reaper.destroy_all
data/lib/hatchet.rb CHANGED
@@ -9,6 +9,7 @@ require 'stringio'
9
9
  require 'date'
10
10
 
11
11
  module Hatchet
12
+ APP_PREFIX = (ENV['HATCHET_APP_PREFIX'] || "hatchet-t-")
12
13
  end
13
14
 
14
15
  require 'hatchet/version'
data/lib/hatchet/app.rb CHANGED
@@ -148,7 +148,7 @@ module Hatchet
148
148
  hash = { name: name, stack: stack }
149
149
  hash.delete_if { |k,v| v.nil? }
150
150
  api_rate_limit.call.app.create(hash)
151
- rescue
151
+ rescue => e
152
152
  @reaper.cycle
153
153
  raise e
154
154
  end
@@ -347,7 +347,7 @@ module Hatchet
347
347
  end
348
348
 
349
349
  private def default_name
350
- "hatchet-t-#{SecureRandom.hex(10)}"
350
+ "#{Hatchet::APP_PREFIX}#{SecureRandom.hex(5)}"
351
351
  end
352
352
 
353
353
  private def call_before_deploy
@@ -1,3 +1,5 @@
1
+ require 'tmpdir'
2
+
1
3
  module Hatchet
2
4
  # Hatchet apps are useful after the tests run for debugging purposes
3
5
  # the reaper is designed to allow the most recent apps to stay alive
@@ -7,10 +9,9 @@ module Hatchet
7
9
  class Reaper
8
10
  HEROKU_APP_LIMIT = Integer(ENV["HEROKU_APP_LIMIT"] || 100) # the number of apps heroku allows you to keep
9
11
  HATCHET_APP_LIMT = Integer(ENV["HATCHET_APP_LIMIT"] || 20) # the number of apps hatchet keeps around
10
- DEFAULT_REGEX = /^hatchet-t-/
12
+ DEFAULT_REGEX = /^#{Regexp.escape(Hatchet::APP_PREFIX)}[a-f0-9]+/
11
13
  attr_accessor :apps
12
14
 
13
-
14
15
  def initialize(api_rate_limit: , regex: DEFAULT_REGEX)
15
16
  @api_rate_limit = api_rate_limit
16
17
  @regex = regex
@@ -24,16 +25,24 @@ module Hatchet
24
25
  end
25
26
 
26
27
  def cycle
28
+ # we don't want multiple Hatchet processes (e.g. when using rspec-parallel) to delete apps at the same time
29
+ # this could otherwise result in race conditions in API causing errors other than 404s, making tests fail
30
+ mutex = File.open("#{Dir.tmpdir()}/hatchet_reaper_mutex", File::CREAT)
31
+ mutex.flock(File::LOCK_EX)
32
+
33
+ # update list of apps once
27
34
  get_apps
28
- if over_limit?
35
+
36
+ return unless over_limit?
37
+
38
+ while over_limit?
29
39
  if @hatchet_apps.count > 1
40
+ # remove our own apps until we are below limit
30
41
  destroy_oldest
31
- cycle
32
42
  else
33
43
  puts "Warning: Reached Heroku app limit of #{HEROKU_APP_LIMIT}."
44
+ break
34
45
  end
35
- else
36
- # do nothing
37
46
  end
38
47
 
39
48
  # If the app is already deleted an exception
@@ -46,6 +55,9 @@ module Hatchet
46
55
  retry
47
56
  end
48
57
  raise e
58
+ ensure
59
+ # don't forget to close the mutex; this also releases our lock
60
+ mutex.close
49
61
  end
50
62
 
51
63
  def destroy_oldest
@@ -30,7 +30,7 @@ module Hatchet
30
30
  commit_message: "commit",
31
31
  organization: nil
32
32
  )
33
- @pipeline = pipeline || "hatchet-t-#{SecureRandom.hex(10)}"
33
+ @pipeline = pipeline || "#{Hatchet::APP_PREFIX}#{SecureRandom.hex(5)}"
34
34
  @timeout = timeout
35
35
  @pause = pause
36
36
  @organization = organization
@@ -1,3 +1,3 @@
1
1
  module Hatchet
2
- VERSION = "4.0.7"
2
+ VERSION = "4.0.8"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heroku_hatchet
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.7
4
+ version: 4.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Schneeman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-08 00:00:00.000000000 Z
11
+ date: 2019-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: platform-api
@@ -247,7 +247,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
247
247
  - !ruby/object:Gem::Version
248
248
  version: '0'
249
249
  requirements: []
250
- rubygems_version: 3.0.3
250
+ rubyforge_project:
251
+ rubygems_version: 2.6.14
251
252
  signing_key:
252
253
  specification_version: 4
253
254
  summary: Hatchet is a an integration testing library for developing Heroku buildpacks.