heroku_hatchet 7.3.4 → 7.4.0

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
2
  SHA256:
3
- metadata.gz: a45ee1ab2021838074b4f288d70aab769a71961cbae7cd12af67866e5558bb64
4
- data.tar.gz: 0c99b826bfc797632924e151b796590f1ddbd07ff50e9eea2dc816b9991fb69d
3
+ metadata.gz: 4e33ffcf73b42d412f81525fdce9b77baa34da4083a6662cb14ddb098a0535dc
4
+ data.tar.gz: 3d73f585c00dd74cd4733802af979ba75e2c04e4cb93118128fdaf6efe9bc53b
5
5
  SHA512:
6
- metadata.gz: 940afbe59938c35c5bee92ac43dabe66e0e68f7cefbc35b662667eaecec343f04cc83e93418e7302a47ce2f955b2d7269073e167614a475dc91d69e6bee94d82
7
- data.tar.gz: 204098d3744d64717141ca4d8f754324e761981b3d2d3bc9710e3b18e5532c97a1028813e1d7e2d295d35fb36e1b09ab78761a370af6490849de991ca50045ce
6
+ metadata.gz: f9ef93379dd21e7808f30d9a2ed6179a76aa12679d5a1129a1ed394682c3e046abcc6c8b87ae8d3112edc5ff77965f90d42550be6d09a49ed89b7ad7270fdf14
7
+ data.tar.gz: 6cd06944d64ca9ae96ed8b25744000de748a5235dc52fab838368b9afc75c28af6dc9c1432106a99f972b4044d94762ce573fcaef2fa91f062a68aad2000b05a
@@ -1,13 +1,22 @@
1
1
  name: Check Changelog
2
2
 
3
3
  on:
4
- pull_request:
5
- types: [opened, reopened, edited, synchronize]
4
+ pull_request:
5
+ types: [opened, reopened, edited, labeled, unlabeled, synchronize]
6
+
6
7
  jobs:
7
- build:
8
+ check-changelog:
8
9
  runs-on: ubuntu-latest
10
+ if: |
11
+ !contains(github.event.pull_request.body, '[skip changelog]') &&
12
+ !contains(github.event.pull_request.body, '[changelog skip]') &&
13
+ !contains(github.event.pull_request.body, '[skip ci]') &&
14
+ !contains(github.event.pull_request.labels.*.name, 'skip changelog') &&
15
+ !contains(github.event.pull_request.labels.*.name, 'dependencies') &&
16
+ !contains(github.event.pull_request.labels.*.name, 'automation')
9
17
  steps:
10
- - uses: actions/checkout@v1
11
- - name: Check that CHANGELOG is touched
12
- run: |
13
- cat $GITHUB_EVENT_PATH | jq .pull_request.title | grep -i '\[\(\(changelog skip\)\|\(ci skip\)\)\]' || git diff remotes/origin/${{ github.base_ref }} --name-only | grep CHANGELOG.md
18
+ - uses: actions/checkout@v3
19
+ - name: Check that CHANGELOG is touched
20
+ run: |
21
+ git fetch origin ${{ github.base_ref }} --depth 1 && \
22
+ git diff remotes/origin/${{ github.base_ref }} --name-only | grep CHANGELOG.md
@@ -0,0 +1,38 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ # Avoid duplicate builds on PRs.
5
+ branches:
6
+ - main
7
+ pull_request:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ test:
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ ruby-version: ["2.7", "3.0", "3.1"]
18
+ runs-on: ubuntu-22.04
19
+ env:
20
+ HATCHET_APP_LIMIT: 100
21
+ HATCHET_RETRIES: 3
22
+ HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}
23
+ HEROKU_API_USER: ${{ secrets.HEROKU_API_USER }}
24
+ IS_RUNNING_ON_CI: 1
25
+ HATCHET_EXPENSIVE_MODE: 1
26
+ PARALLEL_SPLIT_TEST_PROCESSES: 25
27
+ steps:
28
+ - name: Checkout
29
+ uses: actions/checkout@v3
30
+ - name: Set up Ruby ${{ matrix.ruby-version }} and dependencies
31
+ uses: ruby/setup-ruby@v1
32
+ with:
33
+ ruby-version: ${{ matrix.ruby-version }}
34
+ bundler-cache: true
35
+ - name: Hatchet setup
36
+ run: bundle exec hatchet ci:setup
37
+ - name: Run test suite
38
+ run: bundle exec parallel_split_test spec/
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## HEAD
2
2
 
3
+ ## 7.4.0
4
+
5
+ - Supports "basic" scaledown (https://github.com/heroku/hatchet/pull/193)
6
+ - Breaking: Support for Ruby 2.2 is soft removed going forward only Ruby versions on the currently released stack will be supported
7
+ - Bugfix: `heroku run` calls are now properly rate throttled and retried https://github.com/heroku/hatchet/pull/187
8
+
3
9
  ## 7.3.4
4
10
 
5
11
  - Memoize `Hatchet::App.default_buildpack` (https://github.com/heroku/hatchet/pull/183)
data/lib/hatchet/app.rb CHANGED
@@ -360,7 +360,7 @@ module Hatchet
360
360
 
361
361
  if @run_multi_is_setup
362
362
  @run_multi_array.map(&:join)
363
- platform_api.formation.update(name, "web", {"size" => "free"})
363
+ platform_api.formation.update(name, "web", {"size" => "basic"})
364
364
  end
365
365
 
366
366
  ensure
@@ -1,4 +1,39 @@
1
+ require 'open3'
2
+
1
3
  module Hatchet
4
+ class BashResult
5
+ attr_reader :stdout, :stderr, :status
6
+
7
+ def initialize(stdout:, stderr:, status:, set_global_status: false)
8
+ @stdout = stdout
9
+ @stderr = stderr
10
+ @status = status.respond_to?(:exitstatus) ? status.exitstatus : status.to_i
11
+ `exit #{@status}` if set_global_status
12
+ end
13
+
14
+ # @return [Boolean]
15
+ def success?
16
+ @status == 0
17
+ end
18
+
19
+ def failed?
20
+ !success?
21
+ end
22
+
23
+ # Testing helper methods
24
+ def include?(value)
25
+ stdout.include?(value)
26
+ end
27
+
28
+ def match?(value)
29
+ stdout.match?(value)
30
+ end
31
+
32
+ def match(value)
33
+ stdout.match(value)
34
+ end
35
+ end
36
+
2
37
  # Used for running Heroku commands
3
38
  #
4
39
  # Example:
@@ -28,18 +63,21 @@ module Hatchet
28
63
  @command = build_heroku_command(command, heroku || {})
29
64
  @retry_on_empty = retry_on_empty
30
65
  @stderr = stderr
31
- @output = ""
32
- @status = nil
66
+ @result = nil
33
67
  @empty_fail_count = 0
34
68
  end
35
69
 
70
+ def result
71
+ raise "You must run `call` on this object first" unless @result
72
+ @result
73
+ end
74
+
36
75
  def output
37
- raise "You must run `call` on this object first" unless @status
38
- @output
76
+ result.stdout
39
77
  end
40
78
 
41
79
  def status
42
- raise "You must run `call` on this object first" unless @status
80
+ result
43
81
  @status
44
82
  end
45
83
 
@@ -68,12 +106,13 @@ module Hatchet
68
106
  private def execute!
69
107
  ShellThrottle.new(platform_api: @app.platform_api).call do |throttle|
70
108
  run_shell!
71
- throw(:throttle) if output.match?(/reached the API rate limit/)
109
+ throw(:throttle) if @result.stderr.match?(/reached the API rate limit/)
72
110
  end
73
111
  end
74
112
 
75
113
  private def run_shell!
76
- @output = `#{@command}`
114
+ stdout, stderr, status = Open3.capture3(@command)
115
+ @result = BashResult.new(stdout: stdout, stderr: stderr, status: status, set_global_status: true)
77
116
  @status = $?
78
117
  end
79
118
 
@@ -1,13 +1,22 @@
1
1
  name: Check Changelog
2
2
 
3
3
  on:
4
- pull_request:
5
- types: [opened, reopened, edited, synchronize]
4
+ pull_request:
5
+ types: [opened, reopened, edited, labeled, unlabeled, synchronize]
6
+
6
7
  jobs:
7
- build:
8
+ check-changelog:
8
9
  runs-on: ubuntu-latest
10
+ if: |
11
+ !contains(github.event.pull_request.body, '[skip changelog]') &&
12
+ !contains(github.event.pull_request.body, '[changelog skip]') &&
13
+ !contains(github.event.pull_request.body, '[skip ci]') &&
14
+ !contains(github.event.pull_request.labels.*.name, 'skip changelog') &&
15
+ !contains(github.event.pull_request.labels.*.name, 'dependencies') &&
16
+ !contains(github.event.pull_request.labels.*.name, 'automation')
9
17
  steps:
10
- - uses: actions/checkout@v1
11
- - name: Check that CHANGELOG is touched
12
- run: |
13
- cat $GITHUB_EVENT_PATH | jq .pull_request.title | grep -i '\[\(\(changelog skip\)\|\(ci skip\)\)\]' || git diff remotes/origin/${{ github.base_ref }} --name-only | grep CHANGELOG.md
18
+ - uses: actions/checkout@v3
19
+ - name: Check that CHANGELOG is touched
20
+ run: |
21
+ git fetch origin ${{ github.base_ref }} --depth 1 && \
22
+ git diff remotes/origin/${{ github.base_ref }} --name-only | grep CHANGELOG.md
@@ -1,3 +1,3 @@
1
1
  module Hatchet
2
- VERSION = "7.3.4"
2
+ VERSION = "7.4.0"
3
3
  end
@@ -63,7 +63,7 @@ describe "AppTest" do
63
63
  end
64
64
 
65
65
  it "create app with stack" do
66
- stack = "heroku-16"
66
+ stack = "heroku-18"
67
67
  app = Hatchet::App.new("default_ruby", stack: stack)
68
68
  app.create_app
69
69
  expect(app.platform_api.app.info(app.name)["build_stack"]["name"]).to eq(stack)
@@ -27,6 +27,8 @@ describe "CIFourTest" do
27
27
  end
28
28
 
29
29
  it "error with bad app" do
30
+ pending("upgrade rails 5 app to newer")
31
+
30
32
  expect {
31
33
  Hatchet::GitApp.new("rails5_ci_fails_no_database", stack: "heroku-18").run_ci { }
32
34
  }.to raise_error(/PG::ConnectionBad: could not connect to server/)
@@ -51,6 +53,8 @@ describe "CIFourTest" do
51
53
  end
52
54
 
53
55
  it "ci create app with stack" do
56
+ pending("upgrade rails 5 app to newer")
57
+
54
58
  app = Hatchet::GitApp.new("rails5_ruby_schema_format")
55
59
  app.run_ci do |test_run|
56
60
  expect(test_run.output).to match("Ruby buildpack tests completed successfully")
@@ -50,7 +50,7 @@ describe "HerokuRun" do
50
50
  run_obj = Hatchet::HerokuRun.new("ruby -v", app: @app, stderr: stderr)
51
51
 
52
52
  def run_obj.run_shell!
53
- @output = ""
53
+ @result = Hatchet::BashResult.new(stdout: "", stderr: "", status: 1)
54
54
  @status = Object.new
55
55
  end
56
56
 
@@ -65,7 +65,7 @@ describe "HerokuRun" do
65
65
  run_obj = Hatchet::HerokuRun.new("ruby -v", app: @app, stderr: stderr)
66
66
 
67
67
  def run_obj.run_shell!
68
- @output = "not empty"
68
+ @result = Hatchet::BashResult.new(stdout: "not empty", stderr: "", status: 1)
69
69
  @status = Object.new
70
70
  end
71
71
 
@@ -80,7 +80,7 @@ describe "HerokuRun" do
80
80
  run_obj = Hatchet::HerokuRun.new("ruby -v", app: @app, stderr: stderr, retry_on_empty: false)
81
81
 
82
82
  def run_obj.run_shell!
83
- @output = ""
83
+ @result = Hatchet::BashResult.new(stdout: "", stderr: "", status: 1)
84
84
  @status = Object.new
85
85
  end
86
86
 
@@ -90,6 +90,24 @@ describe "HerokuRun" do
90
90
  expect(stderr.string).to_not include("retrying the command.")
91
91
  end
92
92
 
93
+ it "retries work when message is delivered via stderr" do
94
+ stderr = StringIO.new
95
+ run_obj = Hatchet::HerokuRun.new("ruby -v", app: @app, stderr: stderr, retry_on_empty: false)
96
+
97
+ def run_obj.run_shell!
98
+ @throttle_retry_count ||= 0
99
+ @throttle_retry_count += 1
100
+ @command = "echo 'lol'" if @throttle_retry_count > 1
101
+
102
+ super
103
+ end
104
+
105
+ run_obj.instance_variable_set(:@command, "ruby -e 'STDERR.puts %Q{reached the API rate limit}'")
106
+ run_obj.call
107
+
108
+ expect(run_obj.instance_variable_get(:@throttle_retry_count)).to eq(2)
109
+ end
110
+
93
111
  it "retries 0 times on empty result when disabled via ENV var" do
94
112
  begin
95
113
  original_env = ENV["HATCHET_DISABLE_EMPTY_RUN_RETRY"]
@@ -98,7 +116,7 @@ describe "HerokuRun" do
98
116
  run_obj = Hatchet::HerokuRun.new("ruby -v", app: @app, stderr: stderr)
99
117
 
100
118
  def run_obj.run_shell!
101
- @output = ""
119
+ @result = Hatchet::BashResult.new(stdout: "", stderr: "", status: 1)
102
120
  @status = Object.new
103
121
  end
104
122
 
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: 7.3.4
4
+ version: 7.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Schneeman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-12 00:00:00.000000000 Z
11
+ date: 2023-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: platform-api
@@ -158,8 +158,8 @@ executables:
158
158
  extensions: []
159
159
  extra_rdoc_files: []
160
160
  files:
161
- - ".circleci/config.yml"
162
161
  - ".github/workflows/check_changelog.yml"
162
+ - ".github/workflows/ci.yml"
163
163
  - ".gitignore"
164
164
  - CHANGELOG.md
165
165
  - Gemfile
@@ -230,7 +230,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
230
230
  - !ruby/object:Gem::Version
231
231
  version: '0'
232
232
  requirements: []
233
- rubygems_version: 3.2.3
233
+ rubygems_version: 3.3.26
234
234
  signing_key:
235
235
  specification_version: 4
236
236
  summary: Hatchet is a an integration testing library for developing Heroku buildpacks.
data/.circleci/config.yml DELETED
@@ -1,69 +0,0 @@
1
- version: 2
2
- references:
3
- unit: &unit
4
- run:
5
- name: Run test suite
6
- command: PARALLEL_SPLIT_TEST_PROCESSES=25 bundle exec parallel_split_test spec/
7
- environment:
8
- HATCHET_EXPENSIVE_MODE: 1 # !!!! WARNING !!!! ONLY RUN THIS IF YOU WORK FOR HEROKU !!!! WARNING !!!!
9
- restore: &restore
10
- restore_cache:
11
- keys:
12
- - v1_bundler_deps-{{ .Environment.CIRCLE_JOB }}
13
- save: &save
14
- save_cache:
15
- paths:
16
- - ./vendor/bundle
17
- key: v1_bundler_deps-{{ .Environment.CIRCLE_JOB }} # CIRCLE_JOB e.g. "ruby-2.5"
18
- hatchet_setup: &hatchet_setup
19
- run:
20
- name: Hatchet setup
21
- command: |
22
- bundle exec hatchet ci:setup
23
- bundle: &bundle
24
- run:
25
- name: install dependencies
26
- command: |
27
- bundle install --jobs=4 --retry=3 --path vendor/bundle
28
- bundle update
29
- bundle clean
30
-
31
- jobs:
32
- "ruby-2.2":
33
- docker:
34
- - image: circleci/ruby:2.2
35
- steps:
36
- - checkout
37
- - <<: *restore
38
- - <<: *bundle
39
- - <<: *hatchet_setup
40
- - <<: *unit
41
- - <<: *save
42
- "ruby-2.5":
43
- docker:
44
- - image: circleci/ruby:2.5
45
- steps:
46
- - checkout
47
- - <<: *restore
48
- - <<: *bundle
49
- - <<: *hatchet_setup
50
- - <<: *unit
51
- - <<: *save
52
- "ruby-2.7":
53
- docker:
54
- - image: circleci/ruby:2.7
55
- steps:
56
- - checkout
57
- - <<: *restore
58
- - <<: *bundle
59
- - <<: *hatchet_setup
60
- - <<: *unit
61
- - <<: *save
62
-
63
- workflows:
64
- version: 2
65
- build:
66
- jobs:
67
- - "ruby-2.2"
68
- - "ruby-2.5"
69
- - "ruby-2.7"