heroku_hatchet 7.3.4 → 7.4.0

Sign up to get free protection for your applications and to get access to all the features.
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"