kettle-dev 3.0.29 → 3.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +31 -1
- data/README.md +1 -1
- data/lib/kettle/dev/lockfile_reset.rb +4 -6
- data/lib/kettle/dev/release_cli.rb +85 -1
- data/lib/kettle/dev/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +4 -4
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8793d6f66be47b9b55bc6dd2b7dce86a6b80e5b66c3a7f3a8b23356d34dbafde
|
|
4
|
+
data.tar.gz: a15e9ab1030f1d875cf9b2f5cf13c8d271754a51a97f20dcb930ab28fc5e3eab
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 610789813bbdefc88abf9f708f80b66ceb7441ae9cab53bd579289a2d94668c90dd94435185ff629a6ec625da50c465b6bde1d13a1cc31c796857808c4c8fa47
|
|
7
|
+
data.tar.gz: 375cf47db46bc26f3bace6b2cd03c0f3078e8af1735c2012abeb494451dcdcadfd1dac9f857d9fb8a6e8d95564a7d6a4f7631fa3936956cdafb4a4e8490d3016
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,32 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [3.0.31] - 2026-09-06
|
|
34
|
+
|
|
35
|
+
- TAG: [v3.0.31][3.0.31t]
|
|
36
|
+
- COVERAGE: 91.85% -- 6060/6598 lines in 47 files
|
|
37
|
+
- BRANCH COVERAGE: 76.33% -- 2315/3033 branches in 47 files
|
|
38
|
+
- 50.00% documented
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- Preserve every configured Bundler lockfile platform when resetting release lockfiles.
|
|
43
|
+
|
|
44
|
+
- Materialize normalized release bundles before running bundle-exec release checks.
|
|
45
|
+
|
|
46
|
+
## [3.0.30] - 2026-09-01
|
|
47
|
+
|
|
48
|
+
- TAG: [v3.0.30][3.0.30t]
|
|
49
|
+
- COVERAGE: 91.68% -- 6038/6586 lines in 47 files
|
|
50
|
+
- BRANCH COVERAGE: 76.31% -- 2310/3027 branches in 47 files
|
|
51
|
+
- 50.00% documented
|
|
52
|
+
|
|
53
|
+
### Fixed
|
|
54
|
+
|
|
55
|
+
- Add an isolated family-member publish mode for concurrent monorepo releases.
|
|
56
|
+
|
|
57
|
+
- Add serialized family-member checksum finalization for concurrent monorepo releases.
|
|
58
|
+
|
|
33
59
|
## [3.0.29] - 2026-09-01
|
|
34
60
|
|
|
35
61
|
- TAG: [v3.0.29][3.0.29t]
|
|
@@ -3786,7 +3812,11 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
3786
3812
|
- Selecting will run the selected workflow via `act`
|
|
3787
3813
|
- This may move to its own gem in the future.
|
|
3788
3814
|
|
|
3789
|
-
[Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.
|
|
3815
|
+
[Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.31...HEAD
|
|
3816
|
+
[3.0.31]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.30...v3.0.31
|
|
3817
|
+
[3.0.31t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.0.31
|
|
3818
|
+
[3.0.30]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.29...v3.0.30
|
|
3819
|
+
[3.0.30t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.0.30
|
|
3790
3820
|
[3.0.29]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.28...v3.0.29
|
|
3791
3821
|
[3.0.29t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.0.29
|
|
3792
3822
|
[3.0.28]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.27...v3.0.28
|
data/README.md
CHANGED
|
@@ -1066,7 +1066,7 @@ Thanks for RTFM. ☺️
|
|
|
1066
1066
|
[📌gitmoji]: https://gitmoji.dev
|
|
1067
1067
|
[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
|
1068
1068
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
|
1069
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-6.
|
|
1069
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-6.598-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
|
1070
1070
|
[🔐security]: https://github.com/kettle-dev/kettle-dev/blob/main/SECURITY.md
|
|
1071
1071
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
|
1072
1072
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
|
@@ -202,12 +202,10 @@ module Kettle
|
|
|
202
202
|
command << " #{key}=#{Shellwords.escape(value)}"
|
|
203
203
|
end
|
|
204
204
|
command << " bundle lock"
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
platforms.
|
|
209
|
-
command << " --add-platform=#{Shellwords.escape(platform)}"
|
|
210
|
-
end
|
|
205
|
+
# Bundler accepts each platform option once followed by a list. Repeating
|
|
206
|
+
# either option silently keeps only the final occurrence with Bundler 4.
|
|
207
|
+
command << " --remove-platform #{removed_platforms.sort.map { |platform| Shellwords.escape(platform) }.join(" ")}" unless removed_platforms.empty?
|
|
208
|
+
command << " --add-platform #{platforms.map { |platform| Shellwords.escape(platform) }.join(" ")}" unless platforms.empty?
|
|
211
209
|
command << " --update"
|
|
212
210
|
command << " #{update_gems.map { |gem_name| Shellwords.escape(gem_name) }.join(" ")}" unless update_gems.empty?
|
|
213
211
|
# Bundler preserves BUNDLED WITH during a normal lockfile update.
|
|
@@ -69,6 +69,8 @@ module Kettle
|
|
|
69
69
|
].freeze
|
|
70
70
|
DEBUG_TRUE_VALUES = %w[1 true yes on].freeze
|
|
71
71
|
RELEASE_VALIDATION_SOURCE = "https://gem.coop"
|
|
72
|
+
FAMILY_MEMBER_PUBLISH_MODE_ENV = "KETTLE_RELEASE_FAMILY_MEMBER_PUBLISH"
|
|
73
|
+
FAMILY_MEMBER_FINALIZE_MODE_ENV = "KETTLE_RELEASE_FAMILY_MEMBER_FINALIZE"
|
|
72
74
|
|
|
73
75
|
class << self
|
|
74
76
|
def run_cmd!(cmd)
|
|
@@ -223,6 +225,8 @@ module Kettle
|
|
|
223
225
|
@finished_report = nil
|
|
224
226
|
@changelog_generated_coverage = false
|
|
225
227
|
@release_task_lockfile_paths = {}
|
|
228
|
+
@family_member_publish = truthy_value?(ENV[FAMILY_MEMBER_PUBLISH_MODE_ENV])
|
|
229
|
+
@family_member_finalize = truthy_value?(ENV[FAMILY_MEMBER_FINALIZE_MODE_ENV])
|
|
226
230
|
end
|
|
227
231
|
|
|
228
232
|
def run
|
|
@@ -255,11 +259,17 @@ module Kettle
|
|
|
255
259
|
attr_reader :finished_report
|
|
256
260
|
|
|
257
261
|
def run_with_release_environment
|
|
262
|
+
return run_family_member_publish if family_member_publish?
|
|
263
|
+
return run_family_member_finalize if family_member_finalize?
|
|
264
|
+
|
|
258
265
|
# Changelog generation at step 0 runs the target project's test bundle
|
|
259
266
|
# to collect coverage. Normalize its canonical release lockfile before
|
|
260
267
|
# that subprocess starts; otherwise a local development PATH lock can
|
|
261
268
|
# force Bundler to resolve an invalid mixed local/released graph.
|
|
262
|
-
|
|
269
|
+
if release_lockfile_preflight_needed?
|
|
270
|
+
prepare_release_lockfiles_for_release_tasks!
|
|
271
|
+
materialize_release_lockfiles_for_release_tasks!
|
|
272
|
+
end
|
|
263
273
|
run_pre_release_checks! if run_step?(0)
|
|
264
274
|
|
|
265
275
|
# 1. Ensure Bundler version and record its current release in the
|
|
@@ -605,6 +615,41 @@ module Kettle
|
|
|
605
615
|
@skip_bundle_audit
|
|
606
616
|
end
|
|
607
617
|
|
|
618
|
+
# Kettle Family uses this mode only after it has prepared and validated
|
|
619
|
+
# the shared monorepo release commit. A member may build and publish its
|
|
620
|
+
# gem, but it must never alter the shared Git repository or release it.
|
|
621
|
+
def family_member_publish?
|
|
622
|
+
@family_member_publish
|
|
623
|
+
end
|
|
624
|
+
|
|
625
|
+
def family_member_finalize?
|
|
626
|
+
@family_member_finalize
|
|
627
|
+
end
|
|
628
|
+
|
|
629
|
+
def run_family_member_publish
|
|
630
|
+
version = detect_version
|
|
631
|
+
prepare_release_lockfiles_for_release_tasks!
|
|
632
|
+
ensure_signing_setup_or_skip!
|
|
633
|
+
ensure_release_secrets_ready_for_signing! if signing_enabled? && release_secrets_configured?
|
|
634
|
+
run_cmd!(release_project_command("bundle exec rake build"))
|
|
635
|
+
|
|
636
|
+
gem_name = detect_gem_name
|
|
637
|
+
@release_candidate = build_release_candidate(gem_name, version)
|
|
638
|
+
with_unpublished_candidate_cleanup { publish_built_gem!(version) }
|
|
639
|
+
human_output.puts "\n🚀 Published #{gem_name} v#{version} from family member mode 🚀"
|
|
640
|
+
end
|
|
641
|
+
|
|
642
|
+
# Kettle Family invokes this serially in the primary checkout after
|
|
643
|
+
# concurrent member publication. bin/gem_checksums owns its checksum
|
|
644
|
+
# commit; the family owns the one shared tag, pushes, and GitHub Release.
|
|
645
|
+
def run_family_member_finalize
|
|
646
|
+
version = detect_version
|
|
647
|
+
gem_path = checksum_gem_path_for_version!(version)
|
|
648
|
+
run_cmd!(release_child_command("bin/gem_checksums #{Shellwords.escape(gem_path)}"))
|
|
649
|
+
validate_checksums!(version, stage: "after family member publish")
|
|
650
|
+
human_output.puts "\n🔒 Finalized checksums for #{detect_gem_name} v#{version} from family member mode 🔒"
|
|
651
|
+
end
|
|
652
|
+
|
|
608
653
|
def truthy_value?(value)
|
|
609
654
|
return true if value == true
|
|
610
655
|
|
|
@@ -710,6 +755,36 @@ module Kettle
|
|
|
710
755
|
reset_release_lockfiles!(stage: "before release task bundle installs")
|
|
711
756
|
end
|
|
712
757
|
|
|
758
|
+
# Resetting can select a platform-specific artifact that is not installed
|
|
759
|
+
# in the invoking development bundle. Materialize every canonical release
|
|
760
|
+
# bundle before a release gate runs `bundle exec`. Use a disposable copy:
|
|
761
|
+
# Bundler may reconcile the active host platform during installation, and
|
|
762
|
+
# that must never alter the canonical release-preparation lockfile.
|
|
763
|
+
def materialize_release_lockfiles_for_release_tasks!
|
|
764
|
+
release_lockfile_paths.each do |lockfile|
|
|
765
|
+
gemfile = release_gemfile_for_lockfile(lockfile)
|
|
766
|
+
next unless gemfile && File.file?(gemfile)
|
|
767
|
+
|
|
768
|
+
begin
|
|
769
|
+
stage = "before release task bundle installs"
|
|
770
|
+
task_lockfile = release_task_lockfile_path(gemfile: gemfile)
|
|
771
|
+
emit_release_lockfile_event(action: "install", status: "started", stage: stage, reason: File.basename(gemfile))
|
|
772
|
+
puts "Installing normalized release bundle for #{File.basename(gemfile)}..."
|
|
773
|
+
run_cmd!(release_child_command(
|
|
774
|
+
"bundle install",
|
|
775
|
+
environment: {
|
|
776
|
+
"BUNDLE_GEMFILE" => gemfile,
|
|
777
|
+
"BUNDLE_LOCKFILE" => task_lockfile || lockfile
|
|
778
|
+
}
|
|
779
|
+
))
|
|
780
|
+
emit_release_lockfile_event(action: "install", status: "ok", stage: stage, reason: File.basename(gemfile))
|
|
781
|
+
rescue => error
|
|
782
|
+
emit_release_lockfile_event(action: "install", status: "failed", stage: stage, reason: error.message)
|
|
783
|
+
raise
|
|
784
|
+
end
|
|
785
|
+
end
|
|
786
|
+
end
|
|
787
|
+
|
|
713
788
|
def reset_release_lockfiles!(stage:)
|
|
714
789
|
return if @release_lockfiles_reset_for_release_tasks && stage == "before release task bundle installs"
|
|
715
790
|
|
|
@@ -1868,6 +1943,15 @@ module Kettle
|
|
|
1868
1943
|
abort("Failed to create local tag #{tag}.") unless @git.tag_annotated(tag, tag)
|
|
1869
1944
|
end
|
|
1870
1945
|
|
|
1946
|
+
publish_built_gem!(version)
|
|
1947
|
+
end
|
|
1948
|
+
|
|
1949
|
+
def publish_built_gem!(version)
|
|
1950
|
+
gem_path = gem_file_for_version(version)
|
|
1951
|
+
unless gem_path && File.file?(gem_path)
|
|
1952
|
+
abort("Unable to locate built gem for version #{version} in pkg/. Did the build succeed?")
|
|
1953
|
+
end
|
|
1954
|
+
|
|
1871
1955
|
puts "Publishing #{File.basename(gem_path)} to RubyGems without pushing git refs..."
|
|
1872
1956
|
run_cmd!("gem push #{Shellwords.escape(gem_path)}")
|
|
1873
1957
|
gem_name = gem_name_from_gem_path(gem_path, version)
|
data/lib/kettle/dev/version.rb
CHANGED
|
@@ -5,7 +5,7 @@ module Kettle
|
|
|
5
5
|
# Version namespace for this gem.
|
|
6
6
|
module Version
|
|
7
7
|
# Current gem version.
|
|
8
|
-
VERSION = "3.0.
|
|
8
|
+
VERSION = "3.0.31"
|
|
9
9
|
end
|
|
10
10
|
# Current gem version exposed at the traditional constant location.
|
|
11
11
|
VERSION = Version::VERSION # Traditional Constant Location
|
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kettle-dev
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.0.
|
|
4
|
+
version: 3.0.31
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -400,10 +400,10 @@ licenses:
|
|
|
400
400
|
- AGPL-3.0-only
|
|
401
401
|
metadata:
|
|
402
402
|
homepage_uri: https://kettle-dev.galtzo.com
|
|
403
|
-
source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v3.0.
|
|
404
|
-
changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v3.0.
|
|
403
|
+
source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v3.0.31
|
|
404
|
+
changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v3.0.31/CHANGELOG.md
|
|
405
405
|
bug_tracker_uri: https://github.com/kettle-dev/kettle-dev/issues
|
|
406
|
-
documentation_uri: https://www.rubydoc.info/gems/kettle-dev/3.0.
|
|
406
|
+
documentation_uri: https://www.rubydoc.info/gems/kettle-dev/3.0.31
|
|
407
407
|
funding_uri: https://github.com/sponsors/pboling
|
|
408
408
|
wiki_uri: https://github.com/kettle-dev/kettle-dev/wiki
|
|
409
409
|
news_uri: https://www.railsbling.com/tags/kettle-dev
|
metadata.gz.sig
CHANGED
|
Binary file
|