heroku_hatchet 8.0.1 → 8.0.3
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/.github/CODEOWNERS +1 -0
- data/.github/workflows/ci.yml +1 -1
- data/.github/workflows/hatchet_app_cleaner.yml +31 -0
- data/CHANGELOG.md +8 -0
- data/etc/ci_setup.rb +1 -1
- data/lib/hatchet/app.rb +4 -2
- data/lib/hatchet/version.rb +1 -1
- data/spec/hatchet/app_spec.rb +1 -54
- data/spec/hatchet/ci_spec.rb +2 -45
- data/spec/unit/app_spec.rb +65 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55e330ebf3f600cecc72f6d26e2b213548af020bf5865d073a52445198d15ab8
|
4
|
+
data.tar.gz: b77b96b88f4601c5fc419f0e3418373a162e6037ad63bad1b969a1169bfc58f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48530f31d678cea882ba4e383bee510daccdd048632c8fc900f6633ff88feef46c12c676a8dca41bc2cbf641dc27854cafbfd09e6ace0ece1efc9bb55cc7db1c
|
7
|
+
data.tar.gz: aaaf6b0ababd386ed3f27f9679714bc53859d76da5ec902da16d026fa2e41c04621e61d5233f622f04a5c8e67bdcada1b4c4e3394012af3ad510105dc9801533
|
data/.github/CODEOWNERS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
* @heroku/languages
|
data/.github/workflows/ci.yml
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
name: Hatchet app cleaner
|
2
|
+
|
3
|
+
on:
|
4
|
+
schedule:
|
5
|
+
# Daily at 6am UTC.
|
6
|
+
- cron: "0 6 * * *"
|
7
|
+
# Allow the workflow to be manually triggered too.
|
8
|
+
workflow_dispatch:
|
9
|
+
|
10
|
+
permissions:
|
11
|
+
contents: read
|
12
|
+
|
13
|
+
jobs:
|
14
|
+
hatchet-app-cleaner:
|
15
|
+
runs-on: ubuntu-latest
|
16
|
+
env:
|
17
|
+
HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}
|
18
|
+
HEROKU_API_USER: ${{ secrets.HEROKU_API_USER }}
|
19
|
+
HEROKU_DISABLE_AUTOUPDATE: 1
|
20
|
+
steps:
|
21
|
+
- name: Checkout
|
22
|
+
uses: actions/checkout@v3
|
23
|
+
- name: Install Ruby and dependencies
|
24
|
+
uses: ruby/setup-ruby@v1
|
25
|
+
with:
|
26
|
+
bundler-cache: true
|
27
|
+
ruby-version: "3.1"
|
28
|
+
- name: Run Hatchet destroy
|
29
|
+
# Only apps older than 10 minutes are destroyed, to ensure that any
|
30
|
+
# in progress CI runs are not interrupted.
|
31
|
+
run: bundle exec hatchet destroy --older-than 10
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
## HEAD
|
2
2
|
|
3
|
+
## 8.0.3
|
4
|
+
|
5
|
+
- Add support for Ruby 3.2 and 3.3 (https://github.com/heroku/hatchet/pull/203 and https://github.com/heroku/hatchet/pull/208)
|
6
|
+
|
7
|
+
## 8.0.2
|
8
|
+
|
9
|
+
- Bugfix: Allow nested deploy blocks with new teardown logic (https://github.com/heroku/hatchet/pull/201)
|
10
|
+
|
3
11
|
## 8.0.1
|
4
12
|
|
5
13
|
- Bugfix: Lock and sleep and refresh API when duplicate app deletion detected (https://github.com/heroku/hatchet/pull/198)
|
data/etc/ci_setup.rb
CHANGED
data/lib/hatchet/app.rb
CHANGED
@@ -77,6 +77,7 @@ module Hatchet
|
|
77
77
|
@buildpacks.map! {|b| b == :default ? self.class.default_buildpack : b}
|
78
78
|
@run_multi = run_multi
|
79
79
|
@max_retries_count = retries
|
80
|
+
@outer_deploy_block = nil
|
80
81
|
|
81
82
|
if run_multi && !ENV["HATCHET_EXPENSIVE_MODE"]
|
82
83
|
raise "You're attempting to enable `run_multi: true` mode, but have not enabled `HATCHET_EXPENSIVE_MODE=1` env var to verify you understand the risks"
|
@@ -424,13 +425,14 @@ module Hatchet
|
|
424
425
|
def deploy(&block)
|
425
426
|
in_directory do
|
426
427
|
annotate_failures do
|
428
|
+
@outer_deploy_block ||= block # deploy! can be called multiple times. Only teardown once
|
427
429
|
in_dir_setup!
|
428
|
-
|
430
|
+
push_with_retry!
|
429
431
|
block.call(self, api_rate_limit.call, output) if block_given?
|
430
432
|
end
|
431
433
|
end
|
432
434
|
ensure
|
433
|
-
self.teardown! if block_given?
|
435
|
+
self.teardown! if block_given? && @outer_deploy_block == block
|
434
436
|
end
|
435
437
|
|
436
438
|
def push
|
data/lib/hatchet/version.rb
CHANGED
data/spec/hatchet/app_spec.rb
CHANGED
@@ -1,20 +1,6 @@
|
|
1
1
|
require("spec_helper")
|
2
2
|
|
3
3
|
describe "AppTest" do
|
4
|
-
it "annotates rspec expectation failures" do
|
5
|
-
app = Hatchet::Runner.new("default_ruby")
|
6
|
-
error = nil
|
7
|
-
begin
|
8
|
-
app.annotate_failures do
|
9
|
-
expect(true).to eq(false)
|
10
|
-
end
|
11
|
-
rescue RSpec::Expectations::ExpectationNotMetError => e
|
12
|
-
error = e
|
13
|
-
end
|
14
|
-
|
15
|
-
expect(error.message).to include(app.name)
|
16
|
-
end
|
17
|
-
|
18
4
|
it "does not modify local files by mistake" do
|
19
5
|
Dir.mktmpdir do |dir_1|
|
20
6
|
app = Hatchet::Runner.new(dir_1)
|
@@ -29,7 +15,6 @@ describe "AppTest" do
|
|
29
15
|
entries_array -= ["..", ".", "foo.txt"]
|
30
16
|
expect(entries_array).to be_empty
|
31
17
|
|
32
|
-
|
33
18
|
entries_array = Dir.entries(dir_1)
|
34
19
|
entries_array -= ["..", ".", "foo.txt"]
|
35
20
|
expect(entries_array).to be_empty
|
@@ -37,51 +22,13 @@ describe "AppTest" do
|
|
37
22
|
end
|
38
23
|
end
|
39
24
|
|
40
|
-
it "calls reaper if cannot create an app" do
|
41
|
-
app = Hatchet::App.new("default_ruby", buildpacks: [:default])
|
42
|
-
def app.heroku_api_create_app(*args); raise StandardError.new("made you look"); end
|
43
|
-
|
44
|
-
reaper = app.reaper
|
45
|
-
|
46
|
-
def reaper.destroy_older_apps(*args, **kwargs, &block); @app_exception_message = true; end
|
47
|
-
def reaper.clean_old_was_called?; @app_exception_message; end
|
48
|
-
|
49
|
-
expect {
|
50
|
-
app.create_app
|
51
|
-
}.to raise_error("made you look")
|
52
|
-
|
53
|
-
expect(reaper.clean_old_was_called?).to be_truthy
|
54
|
-
end
|
55
|
-
|
56
|
-
it "app with default" do
|
57
|
-
app = Hatchet::App.new("default_ruby", buildpacks: [:default])
|
58
|
-
expect(app.buildpacks.first).to match("https://github.com/heroku/heroku-buildpack-ruby")
|
59
|
-
end
|
60
|
-
|
61
|
-
it "default_buildpack is only computed once" do
|
62
|
-
expect(Hatchet::App.default_buildpack.object_id).to eq(Hatchet::App.default_buildpack.object_id)
|
63
|
-
end
|
64
|
-
|
65
25
|
it "create app with stack" do
|
66
|
-
stack = "heroku-
|
26
|
+
stack = "heroku-20"
|
67
27
|
app = Hatchet::App.new("default_ruby", stack: stack)
|
68
28
|
app.create_app
|
69
29
|
expect(app.platform_api.app.info(app.name)["build_stack"]["name"]).to eq(stack)
|
70
30
|
end
|
71
31
|
|
72
|
-
it "create app with HATCHET_DEFAULT_STACK set" do
|
73
|
-
begin
|
74
|
-
original_default_stack = ENV["HATCHET_DEFAULT_STACK"]
|
75
|
-
default_stack = "heroku-18"
|
76
|
-
ENV["HATCHET_DEFAULT_STACK"] = default_stack
|
77
|
-
app = Hatchet::App.new("default_ruby")
|
78
|
-
app.create_app
|
79
|
-
expect(app.platform_api.app.info(app.name)["build_stack"]["name"]).to eq(default_stack)
|
80
|
-
ensure
|
81
|
-
ENV["HATCHET_DEFAULT_STACK"] = original_default_stack
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
32
|
describe "before deploy" do
|
86
33
|
it "dir" do
|
87
34
|
@called = false
|
data/spec/hatchet/ci_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe "
|
4
|
-
it "
|
3
|
+
describe "CI" do
|
4
|
+
it "runs rakefile contents" do
|
5
5
|
string = SecureRandom.hex
|
6
6
|
|
7
7
|
app = Hatchet::GitApp.new("default_ruby")
|
@@ -17,47 +17,4 @@ describe "CIFourTest" do
|
|
17
17
|
expect(test_run.output).to_not match("Installing rake")
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
21
|
-
it "error with bad app" do
|
22
|
-
pending("upgrade rails 5 app to newer")
|
23
|
-
|
24
|
-
expect {
|
25
|
-
Hatchet::GitApp.new("rails5_ci_fails_no_database", stack: "heroku-18").run_ci { }
|
26
|
-
}.to raise_error(/PG::ConnectionBad: could not connect to server/)
|
27
|
-
end
|
28
|
-
|
29
|
-
it "error with bad app" do
|
30
|
-
@before_deploy_called = false
|
31
|
-
@before_deploy_dir_pwd = nil
|
32
|
-
|
33
|
-
before_deploy = -> do
|
34
|
-
@before_deploy_called = true
|
35
|
-
@before_deploy_dir_pwd = Dir.pwd
|
36
|
-
end
|
37
|
-
|
38
|
-
Hatchet::GitApp.new("rails5_ci_fails_no_database", stack: "heroku-18", allow_failure: true, before_deploy: before_deploy).run_ci do |test_run|
|
39
|
-
expect(test_run.status).to eq(:errored)
|
40
|
-
expect(@before_deploy_dir_pwd).to eq(Dir.pwd)
|
41
|
-
expect(@before_deploy_called).to be_truthy
|
42
|
-
end
|
43
|
-
|
44
|
-
expect(@before_deploy_dir_pwd).to_not eq(Dir.pwd)
|
45
|
-
end
|
46
|
-
|
47
|
-
it "ci create app with stack" do
|
48
|
-
pending("upgrade rails 5 app to newer")
|
49
|
-
|
50
|
-
app = Hatchet::GitApp.new("rails5_ruby_schema_format")
|
51
|
-
app.run_ci do |test_run|
|
52
|
-
expect(test_run.output).to match("Ruby buildpack tests completed successfully")
|
53
|
-
expect(test_run.status).to eq(:succeeded)
|
54
|
-
expect(app.pipeline_id).to_not be_nil
|
55
|
-
|
56
|
-
api_rate_limit = app.api_rate_limit.call
|
57
|
-
couplings = api_rate_limit.pipeline_coupling.list_by_pipeline(app.pipeline_id)
|
58
|
-
coupled_app = api_rate_limit.app.info(couplings.first["app"]["id"])
|
59
|
-
expect(coupled_app["name"]).to eq(app.name)
|
60
|
-
end
|
61
|
-
expect(app.pipeline_id).to be_nil
|
62
|
-
end
|
63
20
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
# Tests in this file do not deploy to Heroku
|
4
|
+
describe "App unit tests" do
|
5
|
+
it "annotates rspec expectation failures" do
|
6
|
+
app = Hatchet::Runner.new("default_ruby")
|
7
|
+
error = nil
|
8
|
+
begin
|
9
|
+
app.annotate_failures do
|
10
|
+
expect(true).to eq(false)
|
11
|
+
end
|
12
|
+
rescue RSpec::Expectations::ExpectationNotMetError => e
|
13
|
+
error = e
|
14
|
+
end
|
15
|
+
|
16
|
+
expect(error.message).to include(app.name)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "calls reaper if cannot create an app" do
|
20
|
+
app = Hatchet::App.new("default_ruby", buildpacks: [:default])
|
21
|
+
def app.heroku_api_create_app(*args); raise StandardError.new("made you look"); end
|
22
|
+
|
23
|
+
reaper = app.reaper
|
24
|
+
|
25
|
+
def reaper.destroy_older_apps(*args, **kwargs, &block); @app_exception_message = true; end
|
26
|
+
def reaper.clean_old_was_called?; @app_exception_message; end
|
27
|
+
|
28
|
+
expect {
|
29
|
+
app.create_app
|
30
|
+
}.to raise_error("made you look")
|
31
|
+
|
32
|
+
expect(reaper.clean_old_was_called?).to be_truthy
|
33
|
+
end
|
34
|
+
|
35
|
+
it "app with default" do
|
36
|
+
app = Hatchet::App.new("default_ruby", buildpacks: [:default])
|
37
|
+
expect(app.buildpacks.first).to match("https://github.com/heroku/heroku-buildpack-ruby")
|
38
|
+
end
|
39
|
+
|
40
|
+
it "default_buildpack is only computed once" do
|
41
|
+
expect(Hatchet::App.default_buildpack.object_id).to eq(Hatchet::App.default_buildpack.object_id)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "nested deploy block only calls teardown once" do
|
45
|
+
@deploy = 0
|
46
|
+
app = Hatchet::App.new("default_ruby", buildpacks: [:default])
|
47
|
+
def app.in_dir_setup!; ;end # Don't create an app
|
48
|
+
def app.push_with_retry!; end # Don't try pushing to it
|
49
|
+
def app.teardown!; @teardown ||=0; @teardown += 1 end
|
50
|
+
def app.get_teardown_count; @teardown; end
|
51
|
+
|
52
|
+
app.deploy do |app|
|
53
|
+
@deploy += 1
|
54
|
+
app.deploy do |app|
|
55
|
+
@deploy += 1
|
56
|
+
end
|
57
|
+
app.deploy do |app|
|
58
|
+
@deploy += 1
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
expect(app.get_teardown_count).to eq(1)
|
63
|
+
expect(@deploy).to eq(3)
|
64
|
+
end
|
65
|
+
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: 8.0.
|
4
|
+
version: 8.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Schneeman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: platform-api
|
@@ -158,8 +158,10 @@ executables:
|
|
158
158
|
extensions: []
|
159
159
|
extra_rdoc_files: []
|
160
160
|
files:
|
161
|
+
- ".github/CODEOWNERS"
|
161
162
|
- ".github/workflows/check_changelog.yml"
|
162
163
|
- ".github/workflows/ci.yml"
|
164
|
+
- ".github/workflows/hatchet_app_cleaner.yml"
|
163
165
|
- ".gitignore"
|
164
166
|
- CHANGELOG.md
|
165
167
|
- Gemfile
|
@@ -206,6 +208,7 @@ files:
|
|
206
208
|
- spec/hatchet/local_repo_spec.rb
|
207
209
|
- spec/hatchet/lock_spec.rb
|
208
210
|
- spec/spec_helper.rb
|
211
|
+
- spec/unit/app_spec.rb
|
209
212
|
- spec/unit/default_ci_branch_spec.rb
|
210
213
|
- spec/unit/heroku_run_spec.rb
|
211
214
|
- spec/unit/init_spec.rb
|
@@ -231,7 +234,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
231
234
|
- !ruby/object:Gem::Version
|
232
235
|
version: '0'
|
233
236
|
requirements: []
|
234
|
-
rubygems_version: 3.
|
237
|
+
rubygems_version: 3.5.6
|
235
238
|
signing_key:
|
236
239
|
specification_version: 4
|
237
240
|
summary: Hatchet is a an integration testing library for developing Heroku buildpacks.
|
@@ -246,6 +249,7 @@ test_files:
|
|
246
249
|
- spec/hatchet/local_repo_spec.rb
|
247
250
|
- spec/hatchet/lock_spec.rb
|
248
251
|
- spec/spec_helper.rb
|
252
|
+
- spec/unit/app_spec.rb
|
249
253
|
- spec/unit/default_ci_branch_spec.rb
|
250
254
|
- spec/unit/heroku_run_spec.rb
|
251
255
|
- spec/unit/init_spec.rb
|