kettle-family 1.2.45 → 1.2.46
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 +14 -1
- data/README.md +1 -1
- data/lib/kettle/family/version.rb +1 -1
- data/lib/kettle/family/workflow.rb +7 -68
- 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: 927dd8ea2185b00cfff68f01eb09a93d0a1b7f48fcb2fc3c2a9c52b0c76898aa
|
|
4
|
+
data.tar.gz: a2d7f81ebc0e07a395bfefbf72685c6dff5951e5440c7f4f6e53904a16dace28
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ff77a0078c229e82e5d04952006502e188f26df36621079af986af2807dd2117988f7dbd0e8d5159f67669198fd275860e757ac3f3f0b4b558a7697a619e6e03
|
|
7
|
+
data.tar.gz: 75eca26e357b3570335ac16bd3668c01b3ab8482f6813431ad22e550b47bc5961432bcc1e88f7f83b57411c75fa55983e25ca1c77d0b1d4f8c754c52bf3f1b31
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,17 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [1.2.46] - 2026-08-10
|
|
34
|
+
|
|
35
|
+
- TAG: [v1.2.46][1.2.46t]
|
|
36
|
+
- COVERAGE: 93.63% -- 5083/5429 lines in 32 files
|
|
37
|
+
- BRANCH COVERAGE: 76.32% -- 2040/2673 branches in 32 files
|
|
38
|
+
- 29.72% documented
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- Delegate configured release secrets to kettle-release so its native OTP retry can complete all remaining release steps.
|
|
43
|
+
|
|
33
44
|
## [1.2.45] - 2026-08-09
|
|
34
45
|
|
|
35
46
|
- TAG: [v1.2.45][1.2.45t]
|
|
@@ -1992,7 +2003,9 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
1992
2003
|
- Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
|
|
1993
2004
|
- Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
|
|
1994
2005
|
|
|
1995
|
-
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.
|
|
2006
|
+
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.46...HEAD
|
|
2007
|
+
[1.2.46]: https://github.com/kettle-dev/kettle-family/compare/v1.2.45...v1.2.46
|
|
2008
|
+
[1.2.46t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.46
|
|
1996
2009
|
[1.2.45]: https://github.com/kettle-dev/kettle-family/compare/v1.2.44...v1.2.45
|
|
1997
2010
|
[1.2.45t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.45
|
|
1998
2011
|
[1.2.44]: https://github.com/kettle-dev/kettle-family/compare/v1.2.43...v1.2.44
|
data/README.md
CHANGED
|
@@ -850,7 +850,7 @@ Thanks for RTFM. ☺️
|
|
|
850
850
|
[📌gitmoji]: https://gitmoji.dev
|
|
851
851
|
[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
|
852
852
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
|
853
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-5.
|
|
853
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-5.429-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
|
854
854
|
[🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
|
|
855
855
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
|
856
856
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
|
@@ -5,7 +5,7 @@ module Kettle
|
|
|
5
5
|
# Version namespace for this gem.
|
|
6
6
|
module Version
|
|
7
7
|
# Current gem version.
|
|
8
|
-
VERSION = "1.2.
|
|
8
|
+
VERSION = "1.2.46"
|
|
9
9
|
end
|
|
10
10
|
# Current gem version exposed at the traditional constant location.
|
|
11
11
|
VERSION = Version::VERSION # Traditional Constant Location
|
|
@@ -17,7 +17,6 @@ module Kettle
|
|
|
17
17
|
module Family
|
|
18
18
|
class Workflow
|
|
19
19
|
PreflightProgressMember = Struct.new(:name)
|
|
20
|
-
RUBYGEMS_INVALID_OTP = /Your OTP code is incorrect\. Please check it and retry\./
|
|
21
20
|
|
|
22
21
|
DEFAULT_COMMANDS = {
|
|
23
22
|
"template" => "bundle exec kettle-jem install",
|
|
@@ -1128,7 +1127,6 @@ module Kettle
|
|
|
1128
1127
|
wave_jobs = release_jobs(wave)
|
|
1129
1128
|
mutex = Mutex.new
|
|
1130
1129
|
stop = false
|
|
1131
|
-
release_otp_coordinator&.queue_total = wave_jobs
|
|
1132
1130
|
Array.new(wave_jobs) do
|
|
1133
1131
|
Thread.new do # rubocop:disable ThreadSafety/NewThread -- family release intentionally runs independent members concurrently.
|
|
1134
1132
|
runner = release_command_runner
|
|
@@ -1227,7 +1225,6 @@ module Kettle
|
|
|
1227
1225
|
log_path: release_command_log_path(member, release_phase),
|
|
1228
1226
|
passthrough_output: release_command_passthrough_output?
|
|
1229
1227
|
)
|
|
1230
|
-
release_result = retry_release_gem_push_after_invalid_otp(member: member, failed_result: release_result, runner: runner)
|
|
1231
1228
|
memo << release_result
|
|
1232
1229
|
emit_member_result_progress(member, memo.last, progress: progress)
|
|
1233
1230
|
return memo unless memo.last.ok?
|
|
@@ -1267,41 +1264,13 @@ module Kettle
|
|
|
1267
1264
|
execute: execute,
|
|
1268
1265
|
accept: release_command_uses_kettle_release_yes? ? false : accept,
|
|
1269
1266
|
gem_signing_password: release_command_delegates_secrets_to_kettle_release? ? nil : @gem_signing_password,
|
|
1270
|
-
|
|
1267
|
+
# RubyGems MFA belongs to the child release command. Keeping an OTP
|
|
1268
|
+
# coordinator here can make a family-level gem retry look successful
|
|
1269
|
+
# while skipping the child's checksums and GitHub release steps.
|
|
1270
|
+
otp_coordinator: nil
|
|
1271
1271
|
)
|
|
1272
1272
|
end
|
|
1273
1273
|
|
|
1274
|
-
def release_otp_coordinator
|
|
1275
|
-
return nil unless execute && release_command_interactive?
|
|
1276
|
-
|
|
1277
|
-
@release_otp_coordinator ||= CommandRunner::OtpCoordinator.new(
|
|
1278
|
-
secrets_provider: @secrets_provider,
|
|
1279
|
-
event_handler: method(:handle_release_otp_event)
|
|
1280
|
-
)
|
|
1281
|
-
end
|
|
1282
|
-
|
|
1283
|
-
def handle_release_otp_event(member_name, event)
|
|
1284
|
-
progress = @release_progress
|
|
1285
|
-
return unless progress
|
|
1286
|
-
|
|
1287
|
-
member = release_progress_member_for(member_name)
|
|
1288
|
-
if progress_io && suppress_release_secret_provider_event?(event, progress: progress)
|
|
1289
|
-
return
|
|
1290
|
-
end
|
|
1291
|
-
if progress_io
|
|
1292
|
-
if verbose || debug
|
|
1293
|
-
emit_release_event_progress(member, event)
|
|
1294
|
-
elsif progress.tty?
|
|
1295
|
-
emit_release_event_status(member, event, progress: progress)
|
|
1296
|
-
end
|
|
1297
|
-
end
|
|
1298
|
-
end
|
|
1299
|
-
|
|
1300
|
-
def release_progress_member_for(member_name)
|
|
1301
|
-
@release_progress_members_by_name ||= members.to_h { |member| [member.name, member] }
|
|
1302
|
-
@release_progress_members_by_name.fetch(member_name.to_s) { PreflightProgressMember.new(member_name.to_s) }
|
|
1303
|
-
end
|
|
1304
|
-
|
|
1305
1274
|
def parallel_release_members?(release_members)
|
|
1306
1275
|
execute &&
|
|
1307
1276
|
release_jobs(release_members) > 1 &&
|
|
@@ -1927,38 +1896,6 @@ module Kettle
|
|
|
1927
1896
|
verbose || debug
|
|
1928
1897
|
end
|
|
1929
1898
|
|
|
1930
|
-
# kettle-family normally owns the RubyGems OTP prompt so one code can be
|
|
1931
|
-
# coordinated across concurrent member releases. If RubyGems rejects
|
|
1932
|
-
# that code, the member's release command has already tagged and pushed
|
|
1933
|
-
# the repository before attempting the gem upload. Retry only the
|
|
1934
|
-
# existing artifact; rerunning the full release command would repeat git
|
|
1935
|
-
# tagging and CI work and can fail for an unrelated reason.
|
|
1936
|
-
def retry_release_gem_push_after_invalid_otp(member:, failed_result:, runner:)
|
|
1937
|
-
return failed_result unless release_phase == "release_publish"
|
|
1938
|
-
return failed_result if failed_result.ok?
|
|
1939
|
-
return failed_result unless [failed_result.stdout, failed_result.stderr].any? { |output| output.to_s.match?(RUBYGEMS_INVALID_OTP) }
|
|
1940
|
-
|
|
1941
|
-
gem_path = release_gem_path(member)
|
|
1942
|
-
return failed_result unless gem_path
|
|
1943
|
-
|
|
1944
|
-
puts "RubyGems rejected the first OTP; retrying the existing gem artifact with a fresh OTP..."
|
|
1945
|
-
runner.call(
|
|
1946
|
-
member: member,
|
|
1947
|
-
phase: release_phase,
|
|
1948
|
-
command: ["gem", "push", gem_path],
|
|
1949
|
-
env: release_env_for_member(member),
|
|
1950
|
-
interactive: true,
|
|
1951
|
-
stdout_line_handler: release_event_line_handler(member, progress: @release_progress),
|
|
1952
|
-
log_path: release_command_log_path(member, "release_publish_otp_retry"),
|
|
1953
|
-
passthrough_output: release_command_passthrough_output?
|
|
1954
|
-
)
|
|
1955
|
-
end
|
|
1956
|
-
|
|
1957
|
-
def release_gem_path(member)
|
|
1958
|
-
suffix = "-#{member.version}.gem"
|
|
1959
|
-
Dir.glob(File.join(member.root, "pkg", "*.gem")).find { |path| File.basename(path).end_with?(suffix) }
|
|
1960
|
-
end
|
|
1961
|
-
|
|
1962
1899
|
def kettle_release_command?(command)
|
|
1963
1900
|
case command
|
|
1964
1901
|
when Array
|
|
@@ -1990,6 +1927,9 @@ module Kettle
|
|
|
1990
1927
|
args << "--skip-bundle-audit" if skip_bundle_audit
|
|
1991
1928
|
args << "--skip-remotes=#{skip_remotes}" if skip_remotes && !skip_remotes.to_s.empty?
|
|
1992
1929
|
args << "--required-remotes=#{required_remotes}" if required_remotes && !required_remotes.to_s.empty?
|
|
1930
|
+
if release_command_delegates_secrets_to_kettle_release? && !command_includes_arg?(command, "--secrets-provider")
|
|
1931
|
+
args << "--secrets-provider=1password"
|
|
1932
|
+
end
|
|
1993
1933
|
args << "--yes" if release_command_uses_kettle_release_yes? && !command_includes_arg?(command, "--yes")
|
|
1994
1934
|
args << "--events" unless command_includes_arg?(command, "--events")
|
|
1995
1935
|
return command if args.empty?
|
|
@@ -2233,7 +2173,6 @@ module Kettle
|
|
|
2233
2173
|
def release_command_delegates_secrets_to_kettle_release?
|
|
2234
2174
|
kettle_release_supports_direct_secrets? &&
|
|
2235
2175
|
kettle_release_command?(raw_release_command) &&
|
|
2236
|
-
command_includes_arg?(raw_release_command, "--secrets-provider") &&
|
|
2237
2176
|
release_secrets_provider_one_password?
|
|
2238
2177
|
end
|
|
2239
2178
|
|
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kettle-family
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.2.
|
|
4
|
+
version: 1.2.46
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -360,10 +360,10 @@ licenses:
|
|
|
360
360
|
- AGPL-3.0-only
|
|
361
361
|
metadata:
|
|
362
362
|
homepage_uri: https://kettle-family.galtzo.com
|
|
363
|
-
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.
|
|
364
|
-
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.
|
|
363
|
+
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.46
|
|
364
|
+
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.46/CHANGELOG.md
|
|
365
365
|
bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
|
|
366
|
-
documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.
|
|
366
|
+
documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.46
|
|
367
367
|
funding_uri: https://github.com/sponsors/pboling
|
|
368
368
|
wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
|
|
369
369
|
news_uri: https://www.railsbling.com/tags/kettle-family
|
metadata.gz.sig
CHANGED
|
Binary file
|