kettle-jem 7.1.28 → 7.1.30

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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +220 -1
  4. data/README.md +2 -114
  5. data/lib/kettle/jem/maintenance_changelog.rb +1 -1
  6. data/lib/kettle/jem/relative_paths.rb +61 -0
  7. data/lib/kettle/jem/tasks/install_task.rb +9 -5
  8. data/lib/kettle/jem/tasks/prepare_task.rb +29 -10
  9. data/lib/kettle/jem/tasks/template_task.rb +18 -3
  10. data/lib/kettle/jem/templates/.devcontainer/devcontainer.json.example +1 -1
  11. data/lib/kettle/jem/templates/.git-hooks/prepare-commit-msg.example +3 -4
  12. data/lib/kettle/jem/templates/.github/workflows/coverage.yml.example +24 -2
  13. data/lib/kettle/jem/templates/.github/workflows/current.yml.example +13 -14
  14. data/lib/kettle/jem/templates/.github/workflows/dep-heads.yml.example +8 -5
  15. data/lib/kettle/jem/templates/.github/workflows/framework-ci.yml.example +4 -1
  16. data/lib/kettle/jem/templates/.github/workflows/heads.yml.example +16 -66
  17. data/lib/kettle/jem/templates/.github/workflows/jruby-10.0.yml.example +16 -3
  18. data/lib/kettle/jem/templates/.github/workflows/jruby-9.1.yml.example +16 -3
  19. data/lib/kettle/jem/templates/.github/workflows/jruby-9.2.yml.example +16 -3
  20. data/lib/kettle/jem/templates/.github/workflows/jruby-9.3.yml.example +16 -3
  21. data/lib/kettle/jem/templates/.github/workflows/jruby-9.4.yml.example +16 -3
  22. data/lib/kettle/jem/templates/.github/workflows/jruby.yml.example +16 -3
  23. data/lib/kettle/jem/templates/.github/workflows/license-eye.yml.example +22 -1
  24. data/lib/kettle/jem/templates/.github/workflows/locked_deps.yml.example +2 -1
  25. data/lib/kettle/jem/templates/.github/workflows/opencollective.yml.example +1 -1
  26. data/lib/kettle/jem/templates/.github/workflows/ruby-2.3.yml.example +8 -2
  27. data/lib/kettle/jem/templates/.github/workflows/ruby-2.4.yml.example +8 -2
  28. data/lib/kettle/jem/templates/.github/workflows/ruby-2.5.yml.example +8 -2
  29. data/lib/kettle/jem/templates/.github/workflows/ruby-2.6.yml.example +8 -2
  30. data/lib/kettle/jem/templates/.github/workflows/ruby-2.7.yml.example +8 -2
  31. data/lib/kettle/jem/templates/.github/workflows/ruby-3.0.yml.example +9 -3
  32. data/lib/kettle/jem/templates/.github/workflows/ruby-3.1.yml.example +8 -2
  33. data/lib/kettle/jem/templates/.github/workflows/ruby-3.2.yml.example +8 -2
  34. data/lib/kettle/jem/templates/.github/workflows/ruby-3.3.yml.example +8 -2
  35. data/lib/kettle/jem/templates/.github/workflows/ruby-3.4.yml.example +8 -2
  36. data/lib/kettle/jem/templates/.github/workflows/style.yml.example +5 -2
  37. data/lib/kettle/jem/templates/.github/workflows/templating.yml.example +18 -2
  38. data/lib/kettle/jem/templates/.github/workflows/truffle.yml.example +16 -3
  39. data/lib/kettle/jem/templates/.github/workflows/truffleruby-22.3.yml.example +16 -3
  40. data/lib/kettle/jem/templates/.github/workflows/truffleruby-23.1.yml.example +12 -2
  41. data/lib/kettle/jem/templates/.github/workflows/truffleruby-24.2.yml.example +16 -3
  42. data/lib/kettle/jem/templates/.github/workflows/truffleruby-25.0.yml.example +16 -3
  43. data/lib/kettle/jem/templates/.github/workflows/truffleruby-33.0.yml.example +16 -3
  44. data/lib/kettle/jem/templates/.github/workflows/unlocked_deps.yml.example +6 -2
  45. data/lib/kettle/jem/templates/.structuredmerge/kettle-jem.yml.example +19 -0
  46. data/lib/kettle/jem/templates/Appraisal.root.gemfile.example +2 -1
  47. data/lib/kettle/jem/templates/Appraisals.example +4 -1
  48. data/lib/kettle/jem/templates/CHANGELOG.transfer.md +6 -0
  49. data/lib/kettle/jem/templates/Gemfile.example +12 -3
  50. data/lib/kettle/jem/templates/README.md.example +5 -5
  51. data/lib/kettle/jem/templates/Rakefile.example +2 -0
  52. data/lib/kettle/jem/templates/bin/turbo_tests2.example +14 -0
  53. data/lib/kettle/jem/templates/gem.gemspec.example +6 -6
  54. data/lib/kettle/jem/templates/gemfiles/modular/coverage.gemfile.example +1 -1
  55. data/lib/kettle/jem/templates/gemfiles/modular/coverage_local.gemfile.example +10 -12
  56. data/lib/kettle/jem/templates/gemfiles/modular/documentation.gemfile.example +5 -5
  57. data/lib/kettle/jem/templates/gemfiles/modular/ostruct/r4/v0.6.gemfile.example +2 -0
  58. data/lib/kettle/jem/templates/gemfiles/modular/style.gemfile.example +15 -8
  59. data/lib/kettle/jem/templates/gemfiles/modular/style_local.gemfile.example +7 -1
  60. data/lib/kettle/jem/templates/gemfiles/modular/templating.gemfile.example +3 -2
  61. data/lib/kettle/jem/templates/gemfiles/modular/templating_local.gemfile.example +18 -19
  62. data/lib/kettle/jem/templates/gemfiles/modular/x_std_libs/r4/libs.gemfile.example +1 -0
  63. data/lib/kettle/jem/templates/mise.toml.example +1 -1
  64. data/lib/kettle/jem/templates/mise.toml.no-osc.example +1 -1
  65. data/lib/kettle/jem/templates/readme/partials/configuration.md.example +4 -3
  66. data/lib/kettle/jem/templates/shim/Gemfile.example +9 -3
  67. data/lib/kettle/jem/templates/shim/gem.gemspec.example +3 -3
  68. data/lib/kettle/jem/version.rb +1 -1
  69. data/lib/kettle/jem.rb +1214 -723
  70. data.tar.gz.sig +0 -0
  71. metadata +28 -67
  72. metadata.gz.sig +0 -0
  73. data/lib/kettle/jem/templates/.github/workflows/truffleruby-23.0.yml.example +0 -92
  74. data/lib/kettle/jem/templates/gemfiles/modular/json/truffleruby_23_0.gemfile.example +0 -6
@@ -18,7 +18,7 @@ module Kettle
18
18
  recipe_reports: []
19
19
  }
20
20
  else
21
- Kettle::Jem.apply_project(project_root, env: env, run_options: effective_run_options)
21
+ Kettle::Jem.apply_project(project_root, env: env, run_options: effective_run_options.merge(defer_drift_check: true))
22
22
  end
23
23
  setup_env = Kettle::Jem::Tasks::InstallTask.setup_command_env(project_root, env)
24
24
  hook_step = Kettle::Jem::Tasks::InstallTask.hook_templates_step(project_root, effective_run_options)
@@ -33,7 +33,22 @@ module Kettle
33
33
  command_runner: command_runner,
34
34
  event_phase: "template"
35
35
  )
36
- final_report = report.merge(mode: "template", template_steps: template_steps)
36
+ orchestration_changed_files = template_steps.flat_map do |step|
37
+ Array(step[:changed_files] || step["changed_files"])
38
+ end
39
+ changed_files = (Array(report[:changed_files]) + orchestration_changed_files).map(&:to_s).uniq.sort
40
+ final_report = report.merge(
41
+ mode: "template",
42
+ template_steps: template_steps,
43
+ changed_files: changed_files
44
+ )
45
+ if report.key?(:duplicate_drift)
46
+ final_report = Kettle::Jem.finalize_duplicate_drift(
47
+ project_root: project_root,
48
+ report: final_report,
49
+ run_options: effective_run_options
50
+ )
51
+ end
37
52
  Kettle::Jem.emit_summary_event(Kettle::Jem.event_stream_from_options(effective_run_options), final_report)
38
53
  final_report
39
54
  end
@@ -90,7 +105,7 @@ module Kettle
90
105
  return standalone_limit unless wave_jobs
91
106
 
92
107
  available_per_member = (cpu_count - wave_jobs) / wave_jobs
93
- [standalone_limit, [available_per_member, 1].max].min
108
+ available_per_member.clamp(1, standalone_limit)
94
109
  end
95
110
 
96
111
  def family_wave_jobs(env)
@@ -14,7 +14,7 @@
14
14
  // Use 'postCreateCommand' to run commands after the container is created.
15
15
  // First setup tree-sitter (auto-detects sudo requirement), then run bundle as the regular user
16
16
  // Use ${containerWorkspaceFolder} to get the actual workspace path in the container
17
- "postCreateCommand": "bash ${containerWorkspaceFolder}/.devcontainer/scripts/setup-tree-sitter.sh --workspace=${containerWorkspaceFolder} && bundle update --bundler",
17
+ "postCreateCommand": "bash ${containerWorkspaceFolder}/.devcontainer/scripts/setup-tree-sitter.sh --workspace=${containerWorkspaceFolder} && bundle update --bundler=$(bundle exec ruby -e 'print Gem.loaded_specs.fetch(\"bundler\").version')",
18
18
  // Configure tool-specific properties.
19
19
  "customizations": {
20
20
  "jetbrains": {
@@ -3,7 +3,6 @@
3
3
  # Fail on error and unset variables
4
4
  set -eu
5
5
 
6
- # Run the generated wrapper directly so hook execution does not depend on shell activation.
7
- # We are not using direnv exec here because mise and direnv can result in conflicting PATH settings:
8
- # See: https://mise.jdx.dev/direnv.html
9
- exec "kettle-commit-msg" "$@"
6
+ # Resolve the installed gem executable through RubyGems, not a repository-local
7
+ # Bundler binstub that may select a temporarily inconsistent project lockfile.
8
+ exec env RUBYOPT= ruby -e 'require "rubygems"; load Gem.bin_path("kettle-dev", "kettle-commit-msg")' "$@"
@@ -6,6 +6,8 @@ permissions:
6
6
  id-token: write
7
7
 
8
8
  env:
9
+ # Kill stalled test workers instead of hanging until the CI job timeout.
10
+ TURBO_TESTS2_WATCHDOG_SECONDS: 900
9
11
  K_SOUP_COV_MIN_BRANCH: 100
10
12
  K_SOUP_COV_MIN_LINE: 100
11
13
  K_SOUP_COV_MIN_HARD: true
@@ -38,6 +40,7 @@ jobs:
38
40
  if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
39
41
  name: Code Coverage on ${{ matrix.ruby }}@current
40
42
  runs-on: ubuntu-latest
43
+ timeout-minutes: 30
41
44
  continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
42
45
  env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps
43
46
  BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
@@ -59,7 +62,7 @@ jobs:
59
62
  persist-credentials: false
60
63
 
61
64
  - name: Setup Ruby & RubyGems
62
- uses: appraisal-rb/setup-ruby-flash@925395edf973d2dc0a629919f407f3547a03d4b5 # v2.1 compatibility bundle installation
65
+ uses: appraisal-rb/setup-ruby-flash@6f8ad36ba7488db591541483afb5464d01e8861b # v2.14 compatibility bundle installation
63
66
  with:
64
67
  ruby-version: "${{ matrix.ruby }}"
65
68
  rubygems: "${{ matrix.rubygems }}"
@@ -79,7 +82,10 @@ jobs:
79
82
  id: bundleAppraisalAttempt2
80
83
  # If bundleAppraisalAttempt1 failed, try again here; Otherwise skip.
81
84
  if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' }}
82
- run: bundle exec appraisal ${{ matrix.appraisal }} install
85
+ run: |
86
+ rm -f gemfiles/${{ matrix.appraisal }}.gemfile.lock
87
+ rm -rf vendor/bundle "$HOME/.bundle/cache"
88
+ bundle exec appraisal ${{ matrix.appraisal }} install
83
89
 
84
90
  - name: Restore RSpec status log
85
91
  if: "${{!env.ACT}}"
@@ -99,4 +105,20 @@ jobs:
99
105
  test -s coverage/lcov.info
100
106
  test -s coverage/coverage.xml
101
107
 
108
+ # Preserve per-worker SimpleCov resultsets when the coverage gate fails.
109
+ # turbo_tests2 workers write coverage/turbo_tests/<TEST_ENV_NUMBER>/.resultset.json;
110
+ # if a worker's recorded hits are lost before collation the failure is otherwise
111
+ # invisible (examples all pass; only the merged total drops).
112
+ - name: Upload per-worker coverage resultsets on coverage failure
113
+ if: ${{ failure() }}
114
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
115
+ with:
116
+ name: coverage-resultsets-${{ matrix.ruby }}-${{ github.run_id }}-${{ github.run_attempt }}
117
+ path: |
118
+ coverage/turbo_tests/**/.resultset.json
119
+ coverage/.resultset.json
120
+ coverage/resultset.json
121
+ if-no-files-found: warn
122
+ retention-days: 14
123
+
102
124
  {KJ|GITHUB_ACTIONS:COVERAGE_UPLOAD_STEPS}
@@ -29,19 +29,16 @@ concurrency:
29
29
  jobs:
30
30
  test:
31
31
  if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
32
- name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
33
- runs-on: ubuntu-latest
32
+ name: Specs ${{ matrix.os }} ${{ matrix.ruby }}@${{ matrix.appraisal }}
33
+ runs-on: ${{ matrix.os }}
34
+ timeout-minutes: 30
34
35
  env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps
35
36
  BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
36
37
  strategy:
37
38
  matrix:
38
39
  include:
39
40
  # Ruby 4.0
40
- - ruby: "ruby"
41
- appraisal: "current"
42
- exec_cmd: "{KJ|CI:EXEC_CMD}"
43
- rubygems: latest
44
- bundler: latest
41
+ {KJ|CI:OS_MATRIX_ENTRIES}
45
42
 
46
43
  steps:
47
44
  - name: Checkout
@@ -50,7 +47,7 @@ jobs:
50
47
  persist-credentials: false
51
48
 
52
49
  - name: Setup Ruby & RubyGems
53
- uses: appraisal-rb/setup-ruby-flash@925395edf973d2dc0a629919f407f3547a03d4b5 # v2.1 compatibility bundle installation
50
+ uses: appraisal-rb/setup-ruby-flash@6f8ad36ba7488db591541483afb5464d01e8861b # v2.14 bundle validation and compatibility installation
54
51
  with:
55
52
  ruby-version: ${{ matrix.ruby }}
56
53
  rubygems: ${{ matrix.rubygems }}
@@ -70,17 +67,19 @@ jobs:
70
67
  id: bundleAppraisalAttempt2
71
68
  # If bundleAppraisalAttempt1 failed, try again here; Otherwise skip.
72
69
  if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' }}
73
- run: bundle exec appraisal ${{ matrix.appraisal }} install
70
+ run: |
71
+ rm -f gemfiles/${{ matrix.appraisal }}.gemfile.lock
72
+ rm -rf vendor/bundle "$HOME/.bundle/cache"
73
+ bundle exec appraisal ${{ matrix.appraisal }} install
74
74
 
75
75
  - name: Restore RSpec status log
76
76
  if: "${{!env.ACT}}"
77
77
  uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
78
78
  with:
79
79
  path: .rspec_status
80
- key: rspec-status-current-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
80
+ key: rspec-status-current-${{matrix.os}}-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
81
81
  restore-keys: |
82
- rspec-status-current-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
83
- rspec-status-current-${{matrix.ruby}}-${{matrix.appraisal}}-
82
+ rspec-status-current-${{matrix.os}}-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
83
+ rspec-status-current-${{matrix.os}}-${{matrix.ruby}}-${{matrix.appraisal}}-
84
84
 
85
- - name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
86
- run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
85
+ {KJ|CI:OS_TEST_STEPS}
@@ -5,6 +5,8 @@ permissions:
5
5
  contents: read
6
6
 
7
7
  env:
8
+ # Kill stalled test workers instead of hanging until the CI job timeout.
9
+ TURBO_TESTS2_WATCHDOG_SECONDS: 900
8
10
  K_SOUP_COV_DO: false
9
11
 
10
12
  on:
@@ -31,6 +33,7 @@ jobs:
31
33
  if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
32
34
  name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}${{ matrix.name_extra || '' }}
33
35
  runs-on: ubuntu-latest
36
+ timeout-minutes: 30
34
37
  continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
35
38
  env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps
36
39
  BUNDLE_GEMFILE: ${{ github.workspace }}/${{ matrix.bundle_gemfile || 'Appraisal.root.gemfile' }}
@@ -61,7 +64,7 @@ jobs:
61
64
 
62
65
  - name: Setup Ruby & RubyGems
63
66
  if: ${{ !env.ACT }}
64
- uses: appraisal-rb/setup-ruby-flash@925395edf973d2dc0a629919f407f3547a03d4b5 # v2.1 compatibility bundle installation
67
+ uses: appraisal-rb/setup-ruby-flash@6f8ad36ba7488db591541483afb5464d01e8861b # v2.14 compatibility bundle installation
65
68
  with:
66
69
  ruby-version: ${{ matrix.ruby }}
67
70
  rubygems: ${{ matrix.rubygems }}
@@ -102,7 +105,7 @@ jobs:
102
105
  run: bundle exec ${{ matrix.exec_cmd }}
103
106
 
104
107
  truffleruby:
105
- if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'truffleruby/') || startsWith(github.head_ref, 'feature/release'))"
108
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'truffleruby/') || startsWith(github.head_ref, 'feature/release') || startsWith(github.event.pull_request.title, 'Release '))"
106
109
  name: Specs truffleruby@dep-heads
107
110
  runs-on: ubuntu-latest
108
111
  continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -134,7 +137,7 @@ jobs:
134
137
 
135
138
  - name: Setup Ruby & RubyGems
136
139
  if: ${{ !env.ACT }}
137
- uses: appraisal-rb/setup-ruby-flash@925395edf973d2dc0a629919f407f3547a03d4b5 # v2.1 compatibility bundle installation
140
+ uses: appraisal-rb/setup-ruby-flash@6f8ad36ba7488db591541483afb5464d01e8861b # v2.14 compatibility bundle installation
138
141
  with:
139
142
  ruby-version: ${{ matrix.ruby }}
140
143
  rubygems: ${{ matrix.rubygems }}
@@ -175,7 +178,7 @@ jobs:
175
178
  run: bundle exec ${{ matrix.exec_cmd }}
176
179
 
177
180
  jruby:
178
- if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/') || startsWith(github.head_ref, 'feature/release'))"
181
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/') || startsWith(github.head_ref, 'feature/release') || startsWith(github.event.pull_request.title, 'Release '))"
179
182
  name: Specs jruby@dep-heads
180
183
  runs-on: ubuntu-latest
181
184
  continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -208,7 +211,7 @@ jobs:
208
211
 
209
212
  - name: Setup Ruby & RubyGems
210
213
  if: ${{ !env.ACT }}
211
- uses: appraisal-rb/setup-ruby-flash@925395edf973d2dc0a629919f407f3547a03d4b5 # v2.1 compatibility bundle installation
214
+ uses: appraisal-rb/setup-ruby-flash@6f8ad36ba7488db591541483afb5464d01e8861b # v2.14 compatibility bundle installation
212
215
  with:
213
216
  ruby-version: ${{ matrix.ruby }}
214
217
  rubygems: ${{ matrix.rubygems }}
@@ -7,6 +7,8 @@ permissions:
7
7
  contents: read
8
8
 
9
9
  env:
10
+ # Kill stalled test workers instead of hanging until the CI job timeout.
11
+ TURBO_TESTS2_WATCHDOG_SECONDS: 900
10
12
  K_SOUP_COV_DO: false
11
13
 
12
14
  on:
@@ -33,6 +35,7 @@ jobs:
33
35
  if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
34
36
  name: Specs ${{ matrix.ruby }}@${{ matrix.framework_version }}
35
37
  runs-on: ubuntu-latest
38
+ timeout-minutes: 30
36
39
  continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
37
40
  env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps
38
41
  BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
@@ -58,7 +61,7 @@ jobs:
58
61
  persist-credentials: false
59
62
 
60
63
  - name: Setup Ruby & RubyGems
61
- uses: appraisal-rb/setup-ruby-flash@925395edf973d2dc0a629919f407f3547a03d4b5 # v2.1 compatibility bundle installation
64
+ uses: appraisal-rb/setup-ruby-flash@6f8ad36ba7488db591541483afb5464d01e8861b # v2.14 compatibility bundle installation
62
65
  with:
63
66
  ruby-version: "${{ matrix.ruby }}"
64
67
  rubygems: "${{ matrix.rubygems }}"
@@ -4,6 +4,8 @@ permissions:
4
4
  contents: read
5
5
 
6
6
  env:
7
+ # Kill stalled test workers instead of hanging until the CI job timeout.
8
+ TURBO_TESTS2_WATCHDOG_SECONDS: 900
7
9
  K_SOUP_COV_DO: false
8
10
 
9
11
  on:
@@ -30,6 +32,7 @@ jobs:
30
32
  if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
31
33
  name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}${{ matrix.name_extra || '' }}
32
34
  runs-on: ubuntu-latest
35
+ timeout-minutes: 30
33
36
  continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
34
37
  env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps
35
38
  BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
@@ -54,7 +57,7 @@ jobs:
54
57
 
55
58
  - name: Setup Ruby & RubyGems
56
59
  if: ${{ !env.ACT }}
57
- uses: appraisal-rb/setup-ruby-flash@925395edf973d2dc0a629919f407f3547a03d4b5 # v2.1 compatibility bundle installation
60
+ uses: appraisal-rb/setup-ruby-flash@6f8ad36ba7488db591541483afb5464d01e8861b # v2.14 compatibility bundle installation
58
61
  with:
59
62
  ruby-version: ${{ matrix.ruby }}
60
63
  rubygems: ${{ matrix.rubygems }}
@@ -73,69 +76,12 @@ jobs:
73
76
  # Effectively an automatic retry of the previous step.
74
77
  - name: "[Attempt 2] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
75
78
  id: bundleAppraisalAttempt2
76
- # If bundleAppraisalAttempt1 failed, try again here; Otherwise skip.
79
+ # If bundleAppraisalAttempt1 failed, clean lock/vendor and retry; Otherwise skip.
77
80
  if: ${{ !env.ACT && steps.bundleAppraisalAttempt1.outcome == 'failure' }}
78
- run: bundle exec appraisal ${{ matrix.appraisal }} install
79
-
80
- - name: Restore RSpec status log
81
- if: "${{!env.ACT}}"
82
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
83
- with:
84
- path: .rspec_status
85
- key: rspec-status-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
86
- restore-keys: |
87
- rspec-status-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
88
- rspec-status-heads-${{matrix.ruby}}-${{matrix.appraisal}}-
89
-
90
- - name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }}
91
- if: ${{ !env.ACT }}
92
- run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
93
-
94
- truffleruby:
95
- if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'truffleruby/') || startsWith(github.head_ref, 'feature/release'))"
96
- name: Specs truffleruby-head@head
97
- runs-on: ubuntu-latest
98
- continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
99
- env:
100
- BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
101
- strategy:
102
- fail-fast: true
103
- matrix:
104
- include:
105
- - ruby: "truffleruby-head"
106
- appraisal: "head"
107
- exec_cmd: "{KJ|CI:EXEC_CMD}"
108
- rubygems: default
109
- bundler: default
110
-
111
- steps:
112
- - name: Checkout
113
- if: ${{ !env.ACT }}
114
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
115
- with:
116
- persist-credentials: false
117
-
118
- - name: Setup Ruby & RubyGems
119
- if: ${{ !env.ACT }}
120
- uses: appraisal-rb/setup-ruby-flash@925395edf973d2dc0a629919f407f3547a03d4b5 # v2.1 compatibility bundle installation
121
- with:
122
- ruby-version: ${{ matrix.ruby }}
123
- rubygems: ${{ matrix.rubygems }}
124
- bundler: ${{ matrix.bundler }}
125
- bundler-cache: true
126
- manual-compatibility-bundle: true
127
- gem-install-retries: 7
128
-
129
- - name: "[Attempt 1] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
130
- id: bundleAppraisalAttempt1
131
- if: ${{ !env.ACT }}
132
- run: bundle exec appraisal ${{ matrix.appraisal }} install
133
- continue-on-error: true
134
-
135
- - name: "[Attempt 2] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
136
- id: bundleAppraisalAttempt2
137
- if: ${{ !env.ACT && steps.bundleAppraisalAttempt1.outcome == 'failure' }}
138
- run: bundle exec appraisal ${{ matrix.appraisal }} install
81
+ run: |
82
+ rm -f gemfiles/${{ matrix.appraisal }}.gemfile.lock
83
+ rm -rf vendor/bundle "$HOME/.bundle/cache"
84
+ bundle exec appraisal ${{ matrix.appraisal }} install
139
85
 
140
86
  - name: Restore RSpec status log
141
87
  if: "${{!env.ACT}}"
@@ -152,7 +98,7 @@ jobs:
152
98
  run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
153
99
 
154
100
  jruby:
155
- if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/') || startsWith(github.head_ref, 'feature/release'))"
101
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/') || startsWith(github.head_ref, 'feature/release') || startsWith(github.event.pull_request.title, 'Release '))"
156
102
  name: Specs jruby-head@head
157
103
  runs-on: ubuntu-latest
158
104
  continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
@@ -177,7 +123,7 @@ jobs:
177
123
 
178
124
  - name: Setup Ruby & RubyGems
179
125
  if: ${{ !env.ACT }}
180
- uses: appraisal-rb/setup-ruby-flash@925395edf973d2dc0a629919f407f3547a03d4b5 # v2.1 compatibility bundle installation
126
+ uses: appraisal-rb/setup-ruby-flash@6f8ad36ba7488db591541483afb5464d01e8861b # v2.14 compatibility bundle installation
181
127
  with:
182
128
  ruby-version: ${{ matrix.ruby }}
183
129
  rubygems: ${{ matrix.rubygems }}
@@ -194,8 +140,12 @@ jobs:
194
140
 
195
141
  - name: "[Attempt 2] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
196
142
  id: bundleAppraisalAttempt2
143
+ # If bundleAppraisalAttempt1 failed, clean lock/vendor and retry; Otherwise skip.
197
144
  if: ${{ !env.ACT && steps.bundleAppraisalAttempt1.outcome == 'failure' }}
198
- run: bundle exec appraisal ${{ matrix.appraisal }} install
145
+ run: |
146
+ rm -f gemfiles/${{ matrix.appraisal }}.gemfile.lock
147
+ rm -rf vendor/bundle "$HOME/.bundle/cache"
148
+ bundle exec appraisal ${{ matrix.appraisal }} install
199
149
 
200
150
  - name: Restore RSpec status log
201
151
  if: "${{!env.ACT}}"
@@ -4,6 +4,15 @@ permissions:
4
4
  contents: read
5
5
 
6
6
  env:
7
+ # Kill stalled test workers instead of hanging until the CI job timeout.
8
+ TURBO_TESTS2_WATCHDOG_SECONDS: 1500
9
+ # Each turbo_tests2 worker is a full JVM subprocess; without a heap cap
10
+ # JRuby defaults to 1/4 of runner RAM per worker, and concurrent workers
11
+ # get OOM-killed silently mid-run (watchdog then reports total silence).
12
+ JRUBY_OPTS: "-J-Xmx1280m"
13
+ # Fewer, smaller JVM workers: bound workers x per-worker heap under the
14
+ # runner RAM so the kernel OOM killer never silences workers mid-run.
15
+ TURBO_TESTS2_MAX_PROCESSES: 2
7
16
  K_SOUP_COV_DO: false
8
17
 
9
18
  on:
@@ -27,9 +36,10 @@ concurrency:
27
36
 
28
37
  jobs:
29
38
  test:
30
- if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/') || startsWith(github.head_ref, 'feature/release'))"
39
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/') || startsWith(github.head_ref, 'feature/release') || startsWith(github.event.pull_request.title, 'Release '))"
31
40
  name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
32
41
  runs-on: ubuntu-latest
42
+ timeout-minutes: 30
33
43
  continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
34
44
  env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps
35
45
  BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
@@ -53,7 +63,7 @@ jobs:
53
63
 
54
64
  - name: Setup Ruby & RubyGems
55
65
  if: ${{ !env.ACT }}
56
- uses: appraisal-rb/setup-ruby-flash@925395edf973d2dc0a629919f407f3547a03d4b5 # v2.1 compatibility bundle installation
66
+ uses: appraisal-rb/setup-ruby-flash@6f8ad36ba7488db591541483afb5464d01e8861b # v2.14 compatibility bundle installation
57
67
  with:
58
68
  ruby-version: ${{ matrix.ruby }}
59
69
  rubygems: ${{ matrix.rubygems }}
@@ -74,7 +84,10 @@ jobs:
74
84
  id: bundleAppraisalAttempt2
75
85
  # If bundleAppraisalAttempt1 failed, try again here; Otherwise skip.
76
86
  if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' && !env.ACT }}
77
- run: bundle exec appraisal ${{ matrix.appraisal }} install
87
+ run: |
88
+ rm -f gemfiles/${{ matrix.appraisal }}.gemfile.lock
89
+ rm -rf vendor/bundle "$HOME/.bundle/cache"
90
+ bundle exec appraisal ${{ matrix.appraisal }} install
78
91
 
79
92
  - name: Restore RSpec status log
80
93
  if: "${{!env.ACT}}"
@@ -4,6 +4,15 @@ permissions:
4
4
  contents: read
5
5
 
6
6
  env:
7
+ # Kill stalled test workers instead of hanging until the CI job timeout.
8
+ TURBO_TESTS2_WATCHDOG_SECONDS: 1500
9
+ # Each turbo_tests2 worker is a full JVM subprocess; without a heap cap
10
+ # JRuby defaults to 1/4 of runner RAM per worker, and concurrent workers
11
+ # get OOM-killed silently mid-run (watchdog then reports total silence).
12
+ JRUBY_OPTS: "-J-Xmx1280m"
13
+ # Fewer, smaller JVM workers: bound workers x per-worker heap under the
14
+ # runner RAM so the kernel OOM killer never silences workers mid-run.
15
+ TURBO_TESTS2_MAX_PROCESSES: 2
7
16
  K_SOUP_COV_DO: false
8
17
 
9
18
  on:
@@ -27,9 +36,10 @@ concurrency:
27
36
 
28
37
  jobs:
29
38
  test:
30
- if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/') || startsWith(github.head_ref, 'feature/release'))"
39
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/') || startsWith(github.head_ref, 'feature/release') || startsWith(github.event.pull_request.title, 'Release '))"
31
40
  name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
32
41
  runs-on: ubuntu-22.04
42
+ timeout-minutes: 30
33
43
  continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
34
44
  env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps
35
45
  BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
@@ -52,7 +62,7 @@ jobs:
52
62
 
53
63
  - name: Setup Ruby & RubyGems
54
64
  if: ${{ !env.ACT }}
55
- uses: appraisal-rb/setup-ruby-flash@925395edf973d2dc0a629919f407f3547a03d4b5 # v2.1 compatibility bundle installation
65
+ uses: appraisal-rb/setup-ruby-flash@6f8ad36ba7488db591541483afb5464d01e8861b # v2.14 compatibility bundle installation
56
66
  with:
57
67
  ruby-version: ${{ matrix.ruby }}
58
68
  rubygems: ${{ matrix.rubygems }}
@@ -73,7 +83,10 @@ jobs:
73
83
  id: bundleAppraisalAttempt2
74
84
  # If bundleAppraisalAttempt1 failed, try again here; Otherwise skip.
75
85
  if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' && !env.ACT }}
76
- run: bundle exec appraisal ${{ matrix.appraisal }} install
86
+ run: |
87
+ rm -f gemfiles/${{ matrix.appraisal }}.gemfile.lock
88
+ rm -rf vendor/bundle "$HOME/.bundle/cache"
89
+ bundle exec appraisal ${{ matrix.appraisal }} install
77
90
 
78
91
  - name: Restore RSpec status log
79
92
  if: "${{!env.ACT}}"
@@ -4,6 +4,15 @@ permissions:
4
4
  contents: read
5
5
 
6
6
  env:
7
+ # Kill stalled test workers instead of hanging until the CI job timeout.
8
+ TURBO_TESTS2_WATCHDOG_SECONDS: 1500
9
+ # Each turbo_tests2 worker is a full JVM subprocess; without a heap cap
10
+ # JRuby defaults to 1/4 of runner RAM per worker, and concurrent workers
11
+ # get OOM-killed silently mid-run (watchdog then reports total silence).
12
+ JRUBY_OPTS: "-J-Xmx1280m"
13
+ # Fewer, smaller JVM workers: bound workers x per-worker heap under the
14
+ # runner RAM so the kernel OOM killer never silences workers mid-run.
15
+ TURBO_TESTS2_MAX_PROCESSES: 2
7
16
  K_SOUP_COV_DO: false
8
17
 
9
18
  on:
@@ -27,9 +36,10 @@ concurrency:
27
36
 
28
37
  jobs:
29
38
  test:
30
- if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/') || startsWith(github.head_ref, 'feature/release'))"
39
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/') || startsWith(github.head_ref, 'feature/release') || startsWith(github.event.pull_request.title, 'Release '))"
31
40
  name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
32
41
  runs-on: ubuntu-22.04
42
+ timeout-minutes: 30
33
43
  continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
34
44
  env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps
35
45
  BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
@@ -52,7 +62,7 @@ jobs:
52
62
 
53
63
  - name: Setup Ruby & RubyGems
54
64
  if: ${{ !env.ACT }}
55
- uses: appraisal-rb/setup-ruby-flash@925395edf973d2dc0a629919f407f3547a03d4b5 # v2.1 compatibility bundle installation
65
+ uses: appraisal-rb/setup-ruby-flash@6f8ad36ba7488db591541483afb5464d01e8861b # v2.14 compatibility bundle installation
56
66
  with:
57
67
  ruby-version: ${{ matrix.ruby }}
58
68
  rubygems: ${{ matrix.rubygems }}
@@ -78,7 +88,10 @@ jobs:
78
88
  id: bundleAppraisalAttempt2
79
89
  # If bundleAppraisalAttempt1 failed, try again here; Otherwise skip.
80
90
  if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' && !env.ACT }}
81
- run: bundle exec appraisal ${{ matrix.appraisal }} install
91
+ run: |
92
+ rm -f gemfiles/${{ matrix.appraisal }}.gemfile.lock
93
+ rm -rf vendor/bundle "$HOME/.bundle/cache"
94
+ bundle exec appraisal ${{ matrix.appraisal }} install
82
95
 
83
96
  - name: Restore RSpec status log
84
97
  if: "${{!env.ACT}}"
@@ -4,6 +4,15 @@ permissions:
4
4
  contents: read
5
5
 
6
6
  env:
7
+ # Kill stalled test workers instead of hanging until the CI job timeout.
8
+ TURBO_TESTS2_WATCHDOG_SECONDS: 1500
9
+ # Each turbo_tests2 worker is a full JVM subprocess; without a heap cap
10
+ # JRuby defaults to 1/4 of runner RAM per worker, and concurrent workers
11
+ # get OOM-killed silently mid-run (watchdog then reports total silence).
12
+ JRUBY_OPTS: "-J-Xmx1280m"
13
+ # Fewer, smaller JVM workers: bound workers x per-worker heap under the
14
+ # runner RAM so the kernel OOM killer never silences workers mid-run.
15
+ TURBO_TESTS2_MAX_PROCESSES: 2
7
16
  K_SOUP_COV_DO: false
8
17
 
9
18
  on:
@@ -27,9 +36,10 @@ concurrency:
27
36
 
28
37
  jobs:
29
38
  test:
30
- if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/') || startsWith(github.head_ref, 'feature/release'))"
39
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/') || startsWith(github.head_ref, 'feature/release') || startsWith(github.event.pull_request.title, 'Release '))"
31
40
  name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
32
41
  runs-on: ubuntu-22.04
42
+ timeout-minutes: 30
33
43
  continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
34
44
  env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps
35
45
  BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
@@ -52,7 +62,7 @@ jobs:
52
62
 
53
63
  - name: Setup Ruby & RubyGems
54
64
  if: ${{ !env.ACT }}
55
- uses: appraisal-rb/setup-ruby-flash@925395edf973d2dc0a629919f407f3547a03d4b5 # v2.1 compatibility bundle installation
65
+ uses: appraisal-rb/setup-ruby-flash@6f8ad36ba7488db591541483afb5464d01e8861b # v2.14 compatibility bundle installation
56
66
  with:
57
67
  ruby-version: ${{ matrix.ruby }}
58
68
  rubygems: ${{ matrix.rubygems }}
@@ -78,7 +88,10 @@ jobs:
78
88
  id: bundleAppraisalAttempt2
79
89
  # If bundleAppraisalAttempt1 failed, try again here; Otherwise skip.
80
90
  if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' && !env.ACT }}
81
- run: bundle exec appraisal ${{ matrix.appraisal }} install
91
+ run: |
92
+ rm -f gemfiles/${{ matrix.appraisal }}.gemfile.lock
93
+ rm -rf vendor/bundle "$HOME/.bundle/cache"
94
+ bundle exec appraisal ${{ matrix.appraisal }} install
82
95
 
83
96
  - name: Restore RSpec status log
84
97
  if: "${{!env.ACT}}"
@@ -4,6 +4,15 @@ permissions:
4
4
  contents: read
5
5
 
6
6
  env:
7
+ # Kill stalled test workers instead of hanging until the CI job timeout.
8
+ TURBO_TESTS2_WATCHDOG_SECONDS: 1500
9
+ # Each turbo_tests2 worker is a full JVM subprocess; without a heap cap
10
+ # JRuby defaults to 1/4 of runner RAM per worker, and concurrent workers
11
+ # get OOM-killed silently mid-run (watchdog then reports total silence).
12
+ JRUBY_OPTS: "-J-Xmx1280m"
13
+ # Fewer, smaller JVM workers: bound workers x per-worker heap under the
14
+ # runner RAM so the kernel OOM killer never silences workers mid-run.
15
+ TURBO_TESTS2_MAX_PROCESSES: 2
7
16
  K_SOUP_COV_DO: false
8
17
 
9
18
  on:
@@ -27,9 +36,10 @@ concurrency:
27
36
 
28
37
  jobs:
29
38
  test:
30
- if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/') || startsWith(github.head_ref, 'feature/release'))"
39
+ if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'jruby/') || startsWith(github.head_ref, 'feature/release') || startsWith(github.event.pull_request.title, 'Release '))"
31
40
  name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
32
41
  runs-on: ubuntu-22.04
42
+ timeout-minutes: 30
33
43
  continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
34
44
  env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps
35
45
  BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
@@ -52,7 +62,7 @@ jobs:
52
62
 
53
63
  - name: Setup Ruby & RubyGems
54
64
  if: ${{ !env.ACT }}
55
- uses: appraisal-rb/setup-ruby-flash@925395edf973d2dc0a629919f407f3547a03d4b5 # v2.1 compatibility bundle installation
65
+ uses: appraisal-rb/setup-ruby-flash@6f8ad36ba7488db591541483afb5464d01e8861b # v2.14 compatibility bundle installation
56
66
  with:
57
67
  ruby-version: ${{ matrix.ruby }}
58
68
  rubygems: ${{ matrix.rubygems }}
@@ -78,7 +88,10 @@ jobs:
78
88
  id: bundleAppraisalAttempt2
79
89
  # If bundleAppraisalAttempt1 failed, try again here; Otherwise skip.
80
90
  if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' && !env.ACT }}
81
- run: bundle exec appraisal ${{ matrix.appraisal }} install
91
+ run: |
92
+ rm -f gemfiles/${{ matrix.appraisal }}.gemfile.lock
93
+ rm -rf vendor/bundle "$HOME/.bundle/cache"
94
+ bundle exec appraisal ${{ matrix.appraisal }} install
82
95
 
83
96
  - name: Restore RSpec status log
84
97
  if: "${{!env.ACT}}"