kettle-jem 7.1.29 → 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 (43) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +38 -1
  4. data/README.md +1 -129
  5. data/lib/kettle/jem/templates/.devcontainer/devcontainer.json.example +1 -1
  6. data/lib/kettle/jem/templates/.github/workflows/coverage.yml.example +23 -1
  7. data/lib/kettle/jem/templates/.github/workflows/current.yml.example +5 -1
  8. data/lib/kettle/jem/templates/.github/workflows/dep-heads.yml.example +3 -0
  9. data/lib/kettle/jem/templates/.github/workflows/framework-ci.yml.example +3 -0
  10. data/lib/kettle/jem/templates/.github/workflows/heads.yml.example +13 -3
  11. data/lib/kettle/jem/templates/.github/workflows/jruby-10.0.yml.example +14 -1
  12. data/lib/kettle/jem/templates/.github/workflows/jruby-9.1.yml.example +14 -1
  13. data/lib/kettle/jem/templates/.github/workflows/jruby-9.2.yml.example +14 -1
  14. data/lib/kettle/jem/templates/.github/workflows/jruby-9.3.yml.example +14 -1
  15. data/lib/kettle/jem/templates/.github/workflows/jruby-9.4.yml.example +14 -1
  16. data/lib/kettle/jem/templates/.github/workflows/jruby.yml.example +14 -1
  17. data/lib/kettle/jem/templates/.github/workflows/locked_deps.yml.example +1 -0
  18. data/lib/kettle/jem/templates/.github/workflows/ruby-2.3.yml.example +7 -1
  19. data/lib/kettle/jem/templates/.github/workflows/ruby-2.4.yml.example +7 -1
  20. data/lib/kettle/jem/templates/.github/workflows/ruby-2.5.yml.example +7 -1
  21. data/lib/kettle/jem/templates/.github/workflows/ruby-2.6.yml.example +7 -1
  22. data/lib/kettle/jem/templates/.github/workflows/ruby-2.7.yml.example +7 -1
  23. data/lib/kettle/jem/templates/.github/workflows/ruby-3.0.yml.example +8 -2
  24. data/lib/kettle/jem/templates/.github/workflows/ruby-3.1.yml.example +7 -1
  25. data/lib/kettle/jem/templates/.github/workflows/ruby-3.2.yml.example +7 -1
  26. data/lib/kettle/jem/templates/.github/workflows/ruby-3.3.yml.example +7 -1
  27. data/lib/kettle/jem/templates/.github/workflows/ruby-3.4.yml.example +7 -1
  28. data/lib/kettle/jem/templates/.github/workflows/style.yml.example +4 -1
  29. data/lib/kettle/jem/templates/.github/workflows/templating.yml.example +4 -1
  30. data/lib/kettle/jem/templates/.github/workflows/truffle.yml.example +14 -1
  31. data/lib/kettle/jem/templates/.github/workflows/truffleruby-22.3.yml.example +14 -1
  32. data/lib/kettle/jem/templates/.github/workflows/truffleruby-23.1.yml.example +10 -0
  33. data/lib/kettle/jem/templates/.github/workflows/truffleruby-24.2.yml.example +14 -1
  34. data/lib/kettle/jem/templates/.github/workflows/truffleruby-25.0.yml.example +14 -1
  35. data/lib/kettle/jem/templates/.github/workflows/truffleruby-33.0.yml.example +14 -1
  36. data/lib/kettle/jem/templates/.github/workflows/unlocked_deps.yml.example +5 -1
  37. data/lib/kettle/jem/templates/gem.gemspec.example +3 -3
  38. data/lib/kettle/jem/templates/shim/gem.gemspec.example +2 -2
  39. data/lib/kettle/jem/version.rb +1 -1
  40. data/lib/kettle/jem.rb +47 -7
  41. data.tar.gz.sig +0 -0
  42. metadata +8 -8
  43. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb5935979a968dd6116dca64f7103743cd61a7c4a82eba917a5fc10d96e6215f
4
- data.tar.gz: fc3e4e4c387c415121b90fb92428951b360ef7e21166810e722a493f411495f4
3
+ metadata.gz: 8009dad8893b30d251357d02f553a4d32af34d29bffcb274ce911eeb69d30326
4
+ data.tar.gz: 3b19519b494622d3c73ef6e6f92ef94cd82230a98351969bd00cea49a6d6bdbc
5
5
  SHA512:
6
- metadata.gz: 538d11740a16375ad1db36a60a59aca480f1a6eb5f92be4c9e63008332f23d3dbd73414e7d0f3ecc815a0ea966ebe7064e25340097321eba1a0f26ec3292608a
7
- data.tar.gz: cfcc8775260d2dfd62d4a71ca8d7f005bb7815a4de1e6cd2f69c545d2159abe100c213f5570b0051bdb721d444c44214062a64bcbd364bee34bb466ffff01313
6
+ metadata.gz: fe7724acb8c7af1f5f2a2f58e18b601aef0e94b74555c70215b5f2fd78e5119a05c5641df4e2352c25464f48cfadbf48b83737050966ea96f48d6ef7e1fd1215
7
+ data.tar.gz: 51286f474e10f2da5e83c19672ae074f175cbcb41dbc813adeb4bc57d5f05328192335eb31e1854f362a925ec97ea10d3351b57570cf8dd5146250e54ed3e44c
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,41 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [7.1.30] - 2026-10-15
34
+
35
+ - TAG: [v7.1.30][7.1.30t]
36
+ - COVERAGE: 93.50% -- 11359/12149 lines in 17 files
37
+ - BRANCH COVERAGE: 77.27% -- 4917/6363 branches in 17 files
38
+ - 19.72% documented
39
+
40
+ ### Changed
41
+
42
+ - [kc] kettle-jem-deps-floor: Update kettle-jem template dependency floors:
43
+ - kettle-changelog (>= 1.0.9 -> >= 1.0.10)
44
+ - kettle-dev (>= 3.1.11 -> >= 3.1.13)
45
+ - kettle-test (>= 2.0.24 -> >= 2.0.25)
46
+ - rspec-stubbed_env (>= 1.0.6 -> >= 1.0.17)
47
+ - turbo_tests2 (>= 3.2.14 -> >= 4.0.0)
48
+
49
+ - [kc] kettle-jem/template: updated 7 project files:
50
+ - code and tests (1)
51
+ - dependencies (4)
52
+ - documentation (1)
53
+ - other (1)
54
+
55
+ - JRuby workflow templates now cap worker JVMs at 2 (TURBO_TESTS2_MAX_PROCESSES=2) alongside the -Xmx1280m heap cap, and truffleruby workflow templates no longer force serial-only lanes (MAX_PROCESSES 1 -> 2): turbo_tests2 workers are spawn-based and engine-portable, so JVM engines run parallel workers safely once workers x per-worker heap is bounded under the runner RAM; the old serial-only setting wasted CI time and made lanes trip the stall watchdog on legitimately long tests
56
+
57
+ - [kc] kettle-jem-workflow-pins: Update pinned GitHub Actions in kettle-jem templates:
58
+ - ruby/setup-ruby v1.328.0 (e81a8fa391b11a595c1b7ed84177cc0fe02faf83) -> v1.329.0 (651ff0d62c5c79bed6d53ec518387aae20e72c1a)
59
+
60
+ - Dependency floors raised: turbo_tests2 4.0.0 (drops parallel_tests for runtime_groups) in the template gemspec and managed-floors registry
61
+
62
+ ### Fixed
63
+
64
+ - JRuby workflow templates now set TURBO_TESTS2_WATCHDOG_SECONDS=1500 (matching the truffleruby serial-lane margin): JRuby engines cannot fork, so turbo_tests2 runs serial and a single slow spec could exceed the previous 900s watchdog and fail the whole lane (jruby-9.2 killed mid-run after 805 passing examples)
65
+
66
+ - JRuby workflow templates now cap each turbo_tests2 worker JVM at -Xmx1280m via JRUBY_OPTS: without a cap JRuby defaults to 1/4 of runner RAM per worker and concurrent workers get OOM-killed silently mid-run, which the watchdog then reports as total worker silence (the jruby-9.2 lane died this way with 805 examples passing)
67
+
33
68
  ## [7.1.29] - 2026-10-11
34
69
 
35
70
  - TAG: [v7.1.29][7.1.29t]
@@ -2229,7 +2264,9 @@ Please file a bug if you notice a violation of semantic versioning.
2229
2264
  - Released kettle-jem as part of the initial StructuredMerge Ruby 7.0.0 gem set.
2230
2265
  - Included packaged templates and parser-backed merge support for Ruby gem templating.
2231
2266
 
2232
- [Unreleased]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.29...HEAD
2267
+ [Unreleased]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.30...HEAD
2268
+ [7.1.30]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.29...v7.1.30
2269
+ [7.1.30t]: https://github.com/structuredmerge/structuredmerge-ruby/releases/tag/v7.1.30
2233
2270
  [7.1.29]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.28...v7.1.29
2234
2271
  [7.1.29t]: https://github.com/structuredmerge/structuredmerge-ruby/releases/tag/v7.1.29
2235
2272
  [7.1.28]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.27...v7.1.28
data/README.md CHANGED
@@ -98,61 +98,6 @@ Merge analysis must enter parsing through `tree_haver`. Parser-specific gems reg
98
98
  [sm-family-rust]: https://github.com/structuredmerge/structuredmerge
99
99
  [sm-family-typescript]: https://github.com/structuredmerge/structuredmerge-typescript
100
100
 
101
- ### Runtime and Platform Support
102
-
103
- Support tiers describe what this project's CI actually exercises, not what may
104
- work in an untested environment:
105
-
106
- - **Parallel support**: CI runs the test suite with multiple workers available.
107
- - **Unsupported**: the engine/platform combination is not covered by CI and is
108
- not a project compatibility claim.
109
-
110
- | Ruby engine/version | Linux | macOS | Windows | Notes |
111
- |---------------------|-------|-------|---------|-------|
112
- | MRI 4.0-4.0 | Parallel support | Unsupported | Unsupported | Versioned Ruby workflows run on Linux. |
113
- | MRI current | Parallel support | Parallel support | Unsupported | Current Ruby workflow covers the declared OS platforms. |
114
- | MRI head | Parallel support | Unsupported | Unsupported | CI is allowed to fail while Ruby is in development. |
115
- | JRuby (all CI lanes) | Parallel support | Unsupported | Unsupported | Engine workflows run on Linux; macOS and Windows are not exercised by CI. |
116
-
117
- ### Federated DVCS
118
-
119
- <details markdown="1">
120
- <summary>Find this repo on federated forges (Coming soon!)</summary>
121
-
122
- | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI |
123
- |-------------------------------------------------|-------------------------------------------|-------------------|------------------|-----------------|----------------|
124
- | 🧪 [structuredmerge/structuredmerge-ruby on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix |
125
- | 🧊 [structuredmerge/structuredmerge-ruby on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix |
126
- | 🐙 [structuredmerge/structuredmerge-ruby on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix |
127
-
128
- </details>
129
-
130
- ### Enterprise Support
131
-
132
- [![Tidelift](https://tidelift.com/badges/package/rubygems/kettle-jem)](https://tidelift.com/subscription/pkg/rubygems-kettle-jem?utm_source=rubygems-kettle-jem&utm_medium=referral&utm_campaign=readme)
133
-
134
- Available as part of the Tidelift Subscription.
135
-
136
- <details markdown="1">
137
- <summary>Need enterprise-level guarantees?</summary>
138
-
139
- The maintainers of this and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
140
-
141
- [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
142
-
143
- - 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
144
- - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
145
- - 💡Tidelift pays maintainers to maintain the software you depend on!<br/>📊`@`Pointy Haired Boss: An [enterprise support][🏙️entsup-tidelift] subscription is "[never gonna let you down][🧮kloc]", and *supports* open source maintainers
146
-
147
- Alternatively:
148
-
149
- - [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum]
150
- - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
151
- - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
152
- - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
153
-
154
- </details>
155
-
156
101
  ## ✨ Installation
157
102
 
158
103
  Install the gem and add to the application's Gemfile by executing:
@@ -712,30 +657,6 @@ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you m
712
657
 
713
658
  See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
714
659
 
715
- ### 🚀 Release Instructions
716
-
717
- See [CONTRIBUTING.md][🤝contributing].
718
-
719
- ### Code Coverage
720
-
721
- <details markdown="1">
722
- <summary>Coverage service badges</summary>
723
-
724
- </details>
725
-
726
- ### 🪇 Code of Conduct
727
-
728
- Everyone interacting with this project's codebases, issue trackers,
729
- chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
730
-
731
- ## 🌈 Contributors
732
-
733
- [![Contributors][🖐contributors-img]][🖐contributors]
734
-
735
- Made with [contributors-img][🖐contrib-rocks].
736
-
737
- Also see GitLab Contributors: [https://gitlab.com/structuredmerge/structuredmerge-ruby/-/graphs/main][🚎contributors-gl]
738
-
739
660
  ## 📌 Versioning
740
661
 
741
662
  This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.
@@ -769,41 +690,6 @@ See [LICENSE.md][📄license] for details.
769
690
 
770
691
  If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license.
771
692
 
772
- ### © Copyright
773
-
774
- See [LICENSE.md][📄license] for the official copyright notice.
775
-
776
- <details markdown="1">
777
- <summary>Copyright holders</summary>
778
-
779
- - Required Notice: Copyright (c) 2026 Peter H. Boling
780
-
781
- </details>
782
-
783
- ## 🤑 A request for help
784
-
785
- Maintainers have teeth and need to pay their dentists.
786
- After getting laid off in an RIF in March, and encountering difficulty finding a new one,
787
- I began spending most of my time building open source tools.
788
- I'm hoping to be able to pay for my kids' health insurance this month,
789
- so if you value the work I am doing, I need your support.
790
- Please consider sponsoring me or the project.
791
-
792
- To join the community or get help, use the RubyForum or Discord.
793
-
794
- [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum]
795
- [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
796
-
797
- To say "thanks!" ☝️ Join the community or 👇️ send money.
798
-
799
- [![Sponsor kettle-dev/kettle-jem on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
800
-
801
- ### Please give the project a star ⭐ ♥.
802
-
803
- Many parts of this project are actively managed by a [kettle-jem](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem) smart template utilizing [StructuredMerge.org](https://structuredmerge.org) merge contracts.
804
-
805
- Thanks for RTFM. ☺️
806
-
807
693
  [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
808
694
  [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
809
695
  [⛳liberapay]: https://liberapay.com/pboling/donate
@@ -838,7 +724,6 @@ Thanks for RTFM. ☺️
838
724
  [✉️ruby-forum-top-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&style=flat&logo=discourse&label=Ruby%20Users%20Forum
839
725
  [✉️ruby-forum-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&style=for-the-badge&logo=discourse&label=Ruby%20Users%20Forum
840
726
  [✉️ruby-forum]: https://www.rubyforum.org/tag/structuredmerge
841
-
842
727
  [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
843
728
  [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem
844
729
  [⛳️namespace-img]: https://img.shields.io/badge/namespace-Kettle::Jem-3C2D2D.svg?style=square&logo=ruby&logoColor=white
@@ -909,7 +794,6 @@ Thanks for RTFM. ☺️
909
794
  [🖐contrib-rocks]: https://contrib.rocks
910
795
  [🖐contributors]: https://github.com/structuredmerge/structuredmerge-ruby/graphs/contributors
911
796
  [🖐contributors-img]: https://contrib.rocks/image?repo=structuredmerge/structuredmerge-ruby
912
- [🚎contributors-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/graphs/main
913
797
  [🪇conduct]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/CODE_OF_CONDUCT.md
914
798
  [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
915
799
  [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
@@ -923,7 +807,7 @@ Thanks for RTFM. ☺️
923
807
  [📌gitmoji]: https://gitmoji.dev
924
808
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
925
809
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
926
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-12.132-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
810
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-12.149-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
927
811
  [🔐security]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/SECURITY.md
928
812
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
929
813
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -932,7 +816,6 @@ Thanks for RTFM. ☺️
932
816
  [📄license-img]: https://img.shields.io/badge/License-AGPL--3.0--only_OR_PolyForm--Small--Business--1.0.0-259D6C.svg
933
817
  [📄license-compat]: https://www.apache.org/legal/resolved.html#category-x
934
818
  [📄license-compat-img]: https://img.shields.io/badge/Apache_Incompatible:_Category_X-%E2%9C%97-C0392B.svg?style=flat&logo=Apache
935
-
936
819
  [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
937
820
  [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
938
821
  [🚎yard-current]: http://rubydoc.info/gems/kettle-jem
@@ -944,14 +827,3 @@ Thanks for RTFM. ☺️
944
827
  [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
945
828
  [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
946
829
  [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
947
-
948
- <!-- kettle-jem:metadata:start -->
949
- | Field | Value |
950
- |---|---|
951
- | Package | kettle-jem |
952
- | Description | 🔮 Kettle::Jem provides gem scaffolding, templating, and setup automation using the *-merge gem family for AST-based file merging and token-resolver for template token resolution. Includes MergerConfig presets, YAML recipes, and a complete gem template scaffold. |
953
- | Homepage | https://github.com/structuredmerge/structuredmerge-ruby |
954
- | Source | https://github.com/structuredmerge/structuredmerge-ruby |
955
- | License | `AGPL-3.0-only` OR `PolyForm-Small-Business-1.0.0` |
956
- | Funding | https://github.com/sponsors/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/kettle-dev, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/kettle-jem, https://www.buymeacoffee.com/pboling |
957
- <!-- kettle-jem:metadata:end -->
@@ -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": {
@@ -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
@@ -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}
@@ -31,6 +31,7 @@ jobs:
31
31
  if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
32
32
  name: Specs ${{ matrix.os }} ${{ matrix.ruby }}@${{ matrix.appraisal }}
33
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:
@@ -66,7 +67,10 @@ jobs:
66
67
  id: bundleAppraisalAttempt2
67
68
  # If bundleAppraisalAttempt1 failed, try again here; Otherwise skip.
68
69
  if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' }}
69
- 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
70
74
 
71
75
  - name: Restore RSpec status log
72
76
  if: "${{!env.ACT}}"
@@ -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' }}
@@ -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
@@ -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
@@ -73,9 +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
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
79
85
 
80
86
  - name: Restore RSpec status log
81
87
  if: "${{!env.ACT}}"
@@ -134,8 +140,12 @@ jobs:
134
140
 
135
141
  - name: "[Attempt 2] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
136
142
  id: bundleAppraisalAttempt2
143
+ # If bundleAppraisalAttempt1 failed, clean lock/vendor and retry; Otherwise skip.
137
144
  if: ${{ !env.ACT && steps.bundleAppraisalAttempt1.outcome == 'failure' }}
138
- 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
139
149
 
140
150
  - name: Restore RSpec status log
141
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:
@@ -30,6 +39,7 @@ jobs:
30
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
@@ -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:
@@ -30,6 +39,7 @@ jobs:
30
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
@@ -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:
@@ -30,6 +39,7 @@ jobs:
30
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
@@ -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:
@@ -30,6 +39,7 @@ jobs:
30
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
@@ -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:
@@ -30,6 +39,7 @@ jobs:
30
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
@@ -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:
@@ -30,6 +39,7 @@ jobs:
30
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
@@ -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}}"
@@ -57,6 +57,7 @@ jobs:
57
57
  if: "github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))"
58
58
  name: Default rake task w/ main Gemfile.lock ${{ matrix.name_extra || '' }}
59
59
  runs-on: ubuntu-latest
60
+ timeout-minutes: 30
60
61
  continue-on-error: ${{ matrix.experimental }}
61
62
  strategy:
62
63
  fail-fast: false