kettle-family 1.2.66 → 1.2.67

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2a19cf5604af70e74e9f7b12803c1d4fceb80f5ec66975c4f6ebc418a20b950f
4
- data.tar.gz: 40529c2035a5896477c17d34eb7ac1d38904acbfddb831220ffd9b68c301f112
3
+ metadata.gz: b6cce9c43c8db0ddb5984da9e0656dd3790a47dc718fa28195716a73d7b84a68
4
+ data.tar.gz: accd2cad6a1265c9c954e9908e6ab22ed02282bd0258c8116da295a9e6bf725f
5
5
  SHA512:
6
- metadata.gz: 2e0c056d35770de260972bb0e7a17177292dbb8574f40a20aa7fbc37807a26d75e0aa888bacebc490fce9266b5cd99ed463e5d43e307912affa787cae6a62620
7
- data.tar.gz: 581fb42e3f2e7c40ffbf05b5e0725a8c7807606e2ca7787c02258dc277ac98fe9e1ecd0971925780e7bd1df259fef119b82d44d93d75636d4108bff4040ea156
6
+ metadata.gz: f9bb56dbb8b43e418441588cd45c904d874086a7f9af349e097aa78a738779e86cef91dadf41e3f5ca0ae99737f717ccda23f0be250944646c247e24a0b3a99a
7
+ data.tar.gz: 45ea1c723af5437ec77d50961d3c0deca340358b2a904961addd8396ec47c28592faeaf68a94badbad8eb69da92b8124db7ad15fdf904fb91b29234830c6481e
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,23 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [1.2.67] - 2026-08-30
34
+
35
+ - TAG: [v1.2.67][1.2.67t]
36
+ - COVERAGE: 93.17% -- 5453/5853 lines in 33 files
37
+ - BRANCH COVERAGE: 76.13% -- 2210/2903 branches in 33 files
38
+ - 30.32% documented
39
+
40
+ ### Changed
41
+
42
+ - Add configurable aggregate release validation that runs shared changelog coverage and one monitored CI validation while preserving excluded independent members.
43
+
44
+ - [kc] release-recovery-docs: Clarify direct release recovery from later steps.
45
+
46
+ ### Fixed
47
+
48
+ - Emit member-scoped family release recovery commands from failed child release steps.
49
+
33
50
  ## [1.2.66] - 2026-08-30
34
51
 
35
52
  - TAG: [v1.2.66][1.2.66t]
@@ -2290,7 +2307,9 @@ Please file a bug if you notice a violation of semantic versioning.
2290
2307
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
2291
2308
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
2292
2309
 
2293
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.66...HEAD
2310
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.67...HEAD
2311
+ [1.2.67]: https://github.com/kettle-dev/kettle-family/compare/v1.2.66...v1.2.67
2312
+ [1.2.67t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.67
2294
2313
  [1.2.66]: https://github.com/kettle-dev/kettle-family/compare/v1.2.65...v1.2.66
2295
2314
  [1.2.66t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.66
2296
2315
  [1.2.65]: https://github.com/kettle-dev/kettle-family/compare/v1.2.64...v1.2.65
data/README.md CHANGED
@@ -249,6 +249,10 @@ release:
249
249
  family_changelog:
250
250
  enabled: true
251
251
  command: bundle exec kettle-changelog
252
+ aggregate_validation:
253
+ enabled: true
254
+ exclude_members:
255
+ - kettle-jem
252
256
  ```
253
257
 
254
258
  `family.local_path_env` names the environment variable that activates local
@@ -323,6 +327,29 @@ configured family name and `K_CHANGELOG_VERSION_FILE` when `version_file` is
323
327
  configured, so `kettle-changelog` can operate from a repository root without a
324
328
  root gemspec.
325
329
 
330
+ ### Aggregate release validation
331
+
332
+ Set `release.aggregate_validation.enabled: true` only for a shared-changelog
333
+ family whose root suite validates the release graph. `kettle-family` then:
334
+
335
+ 1. Runs `family_changelog` once, which runs the root coverage suite once.
336
+ 2. Marks the first selected non-excluded member's release-prep commit as the
337
+ aggregate CI validation and waits for that one CI run.
338
+ 3. Skips member changelog generation, the duplicate `bin/rake` test task, and
339
+ remote CI monitoring for the remaining aggregate members.
340
+
341
+ The marker is explicit (`[kettle-family:aggregate-ci]` for the validation
342
+ commit and `[kettle-family:aggregate-member]` for later members), allowing the
343
+ repository workflow to run one root suite for the validation commit and skip
344
+ redundant jobs for later release-only commits. Configure that workflow behavior
345
+ before enabling this policy.
346
+
347
+ Use `release.aggregate_validation.exclude_members` for a member that remains
348
+ independently releasable. Excluded members keep their own changelog coverage,
349
+ local test task, and monitored CI release flow. This is appropriate for a tool
350
+ such as `kettle-jem`, whose independent releases must not rely on a coordinated
351
+ family release having run first.
352
+
326
353
  For a flat repository that releases from multiple long-lived branches, list the
327
354
  release branches under `release.target_branches`. The branch list is processed
328
355
  in order. Each branch must be clean enough for `git checkout`, and each branch
@@ -355,6 +382,12 @@ metadata fix requires a new full release run from step 0:
355
382
  kettle-family release --publish --start-step 10 --local-ci
356
383
  ```
357
384
 
385
+ `--skip-changelog` skips only `kettle-changelog`; `--skip-appraisals` skips
386
+ only the Appraisal generation portion of release step 5 and still runs
387
+ `bin/rake yard`; and `--skip-ci` skips only remote CI monitoring. The generic
388
+ `--skip-steps LIST` remains available when a numbered release step is the
389
+ intended boundary.
390
+
358
391
  Executed publish runs skip versions that are already published. CI failures
359
392
  abort by default; pass `--continue-ci-failures` to set
360
393
  `K_RELEASE_CI_CONTINUE=true` for the underlying `kettle-release` process.
@@ -648,9 +681,12 @@ Executed family resets fail if the resulting lockfiles still contain sibling
648
681
  path remotes or checksum gaps.
649
682
 
650
683
  Resume a failed family publish after fixing the failure. Already published
651
- versions are skipped automatically; `start_step` is passed to `kettle-release`
652
- for unreleased members that still need work. Use `--start-step` only after the
653
- pre-release gate already passed or the failure was intentionally handled:
684
+ versions are skipped automatically. A release report gives a member-scoped
685
+ resume command for each failed child, including the recorded `--start-step`
686
+ when the child emitted a failed release-step event. Run those commands one at a
687
+ time. If any members were never started, the report also gives a separate
688
+ normal-flow command for exactly those members. Use `--start-step` only after
689
+ the pre-release gate already passed or the failure was intentionally handled:
654
690
 
655
691
  ```console
656
692
  kettle-family release --publish --execute --start-step 10
@@ -995,7 +1031,7 @@ Thanks for RTFM. ☺️
995
1031
  [📌gitmoji]: https://gitmoji.dev
996
1032
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
997
1033
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
998
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.804-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1034
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.853-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
999
1035
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
1000
1036
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
1001
1037
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -164,6 +164,7 @@ module Kettle
164
164
  release_fast_recovery_members: nil,
165
165
  release_skip_ci: false,
166
166
  release_skip_changelog: false,
167
+ release_skip_appraisals: false,
167
168
  release_local_ci: false,
168
169
  release_continue_ci_failures: false,
169
170
  release_ci_workflows: nil,
@@ -537,6 +538,7 @@ module Kettle
537
538
  option :fast_recovery_members, long: "--fast-recovery-members", value: {type: String, usage: "MEMBERS"}, desc: "Limit fast recovery to selected comma-separated members; defaults to all selected members"
538
539
  option :skip_ci, long: "--skip-ci", desc: "Run every selected member from step 0 while skipping only remote CI monitoring; requires --publish"
539
540
  option :skip_changelog, long: "--skip-changelog", desc: "Run release checks and child releases while skipping kettle-changelog"
541
+ option :skip_appraisals, long: "--skip-appraisals", desc: "Skip appraisal generation while retaining documentation generation"
540
542
  option :local_ci, long: "--local-ci", desc: "Pass --local-ci through to kettle-release commands"
541
543
  option :continue_ci_failures, long: "--continue-ci-failures", desc: "Set K_RELEASE_CI_CONTINUE=true for release commands"
542
544
  option :ci_workflows, long: "--ci-workflows", value: {type: String, usage: "LIST"}, desc: "Pass a comma-separated CI workflow monitor subset through to kettle-release commands"
@@ -566,6 +568,7 @@ module Kettle
566
568
  release_fast_recovery_members: options[:fast_recovery_members],
567
569
  release_skip_ci: truthy_option?(:skip_ci),
568
570
  release_skip_changelog: truthy_option?(:skip_changelog),
571
+ release_skip_appraisals: truthy_option?(:skip_appraisals),
569
572
  release_local_ci: truthy_option?(:local_ci),
570
573
  release_continue_ci_failures: truthy_option?(:continue_ci_failures),
571
574
  release_ci_workflows: options[:ci_workflows],
@@ -844,6 +847,7 @@ module Kettle
844
847
  fast_recovery_members: options[:release_fast_recovery_members],
845
848
  skip_ci: options[:release_skip_ci],
846
849
  skip_changelog: options[:release_skip_changelog],
850
+ skip_appraisals: options[:release_skip_appraisals],
847
851
  local_ci: options[:release_local_ci],
848
852
  continue_ci_failures: options[:release_continue_ci_failures],
849
853
  ci_workflows: options[:release_ci_workflows],
@@ -16,7 +16,8 @@ module Kettle
16
16
  :reason,
17
17
  :branch,
18
18
  :output_streamed,
19
- :log_path
19
+ :log_path,
20
+ :resume_step
20
21
  ) do
21
22
  def to_h
22
23
  {
@@ -33,7 +34,8 @@ module Kettle
33
34
  "skipped" => skipped,
34
35
  "reason" => reason,
35
36
  "output_streamed" => output_streamed?,
36
- "log_path" => log_path
37
+ "log_path" => log_path,
38
+ "resume_step" => resume_step
37
39
  }
38
40
  end
39
41
 
@@ -313,6 +313,21 @@ module Kettle
313
313
  fetch_path("release", "family_changelog", "command") || "bundle exec kettle-changelog"
314
314
  end
315
315
 
316
+ # An aggregate validation release runs the shared changelog/coverage
317
+ # suite once locally, then validates that family state once in CI before
318
+ # publishing the remaining members. Excluded members retain their normal
319
+ # independent kettle-release test and CI lifecycle.
320
+ def release_aggregate_validation?
321
+ fetch_path("release", "aggregate_validation", "enabled") == true
322
+ end
323
+
324
+ def release_aggregate_validation_excluded_members
325
+ Array(fetch_path("release", "aggregate_validation", "exclude_members"))
326
+ .map(&:to_s)
327
+ .map(&:strip)
328
+ .reject(&:empty?)
329
+ end
330
+
316
331
  def release_tag_command
317
332
  fetch_path("release", "tag_command") || command_for("release_tag") || "git tag"
318
333
  end
@@ -67,7 +67,8 @@ module Kettle
67
67
  "command" => command,
68
68
  "results" => results.map(&:to_h),
69
69
  "summary" => summary,
70
- "resume_hint" => resume_hint
70
+ "resume_hint" => resume_hint,
71
+ "resume_hints" => resume_hints
71
72
  }
72
73
  end
73
74
 
@@ -145,7 +146,13 @@ module Kettle
145
146
  lines << " skipped: #{summary_list(data.fetch("skipped"))}"
146
147
  lines << " failed: #{summary_list(data.fetch("failed").map { |entry| summary_entry(entry) })}"
147
148
  lines << " pending: #{summary_list(data.fetch("pending").map { |entry| summary_entry(entry) })}"
148
- lines << " resume: #{data.fetch("resume_hint")}" if data.fetch("resume_hint")
149
+ hints = data.fetch("resume_hints")
150
+ if hints.one?
151
+ lines << " resume: #{hints.first}"
152
+ elsif hints.any?
153
+ lines << " resume:"
154
+ hints.each { |hint| lines << " #{hint}" }
155
+ end
149
156
  end
150
157
 
151
158
  def report_context_lines
@@ -170,7 +177,8 @@ module Kettle
170
177
  "failed" => summary_failed,
171
178
  "pending" => summary_pending,
172
179
  "release_log_dirs" => release_log_dirs,
173
- "resume_hint" => resume_hint
180
+ "resume_hint" => resume_hint,
181
+ "resume_hints" => resume_hints
174
182
  }
175
183
  end
176
184
 
@@ -661,21 +669,50 @@ module Kettle
661
669
  end
662
670
 
663
671
  def resume_hint
672
+ resume_hints.first
673
+ end
674
+
675
+ def resume_hints
676
+ return [] if success?
677
+ return non_release_resume_hints unless command == "release"
678
+
679
+ release_resume_hints
680
+ end
681
+
682
+ def non_release_resume_hints
664
683
  failed = results.find { |result| !result.ok? }
665
- resume_hint_for(failed) if failed
684
+ failed ? [resume_hint_for(failed)] : []
685
+ end
686
+
687
+ def release_resume_hints
688
+ failed_hints = visible_results.reject(&:ok?).map { |result| resume_hint_for(result) }.uniq
689
+ pending_names = summary_pending.map { |entry| entry.fetch("member") }
690
+ return failed_hints if pending_names.empty?
691
+
692
+ [*failed_hints, release_resume_hint_for_pending(pending_names)]
666
693
  end
667
694
 
668
695
  def resume_hint_for(result)
669
- return release_resume_hint if command == "release"
696
+ return release_resume_hint(result) if command == "release"
670
697
 
671
698
  "kettle-family #{command} --start-at #{result.member_name}"
672
699
  end
673
700
 
674
- def release_resume_hint
675
- hint = "kettle-family release --execute"
676
- hint = "#{hint} --publish" if release_mode == "publish"
701
+ def release_resume_hint(result)
702
+ hint = release_resume_base
703
+ hint = "#{hint} --only #{result.member_name}" if result.member_name
704
+ hint = "#{hint} --start-step #{result.resume_step}" if result.respond_to?(:resume_step) && result.resume_step
677
705
  hint
678
706
  end
707
+
708
+ def release_resume_hint_for_pending(member_names)
709
+ "#{release_resume_base} --only #{member_names.join(",")}"
710
+ end
711
+
712
+ def release_resume_base
713
+ hint = "kettle-family release --execute"
714
+ (release_mode == "publish") ? "#{hint} --publish" : hint
715
+ end
679
716
  end
680
717
  end
681
718
  end
@@ -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.66"
8
+ VERSION = "1.2.67"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
@@ -106,7 +106,7 @@ module Kettle
106
106
  REGISTRY_WAIT_ATTEMPTS = 15
107
107
  REGISTRY_WAIT_INTERVAL_SECONDS = 15
108
108
 
109
- def initialize(command:, config:, members:, family_members: nil, execute: false, accept: true, commit: true, allow_dirty: false, autostash: true, template_cleanup: true, publish: false, push: false, tag: false, start_step: nil, skip_steps: nil, fast_recovery: nil, fast_recovery_members: nil, skip_ci: false, skip_changelog: false, local_ci: false, continue_ci_failures: false, ci_workflows: nil, skip_bundle_audit: false, skip_remotes: nil, required_remotes: nil, auto_dependency_floors: nil, validate_ci_bundles: nil, gha_sha_pins_upgrade: "patch", gha_sha_pins_check: false, gha_sha_pins_ttl_days: nil, env_overrides: {}, debug: false, verbose: false, gem_signing_password: nil, secrets_provider: nil, jobs: nil, progress_io: nil, reset_target: nil, bup_args: [], bex_args: [], start_member: nil, start_branch: nil, **options)
109
+ def initialize(command:, config:, members:, family_members: nil, execute: false, accept: true, commit: true, allow_dirty: false, autostash: true, template_cleanup: true, publish: false, push: false, tag: false, start_step: nil, skip_steps: nil, fast_recovery: nil, fast_recovery_members: nil, skip_ci: false, skip_changelog: false, skip_appraisals: false, local_ci: false, continue_ci_failures: false, ci_workflows: nil, skip_bundle_audit: false, skip_remotes: nil, required_remotes: nil, auto_dependency_floors: nil, validate_ci_bundles: nil, gha_sha_pins_upgrade: "patch", gha_sha_pins_check: false, gha_sha_pins_ttl_days: nil, env_overrides: {}, debug: false, verbose: false, gem_signing_password: nil, secrets_provider: nil, jobs: nil, progress_io: nil, reset_target: nil, bup_args: [], bex_args: [], start_member: nil, start_branch: nil, **options)
110
110
  @command = command
111
111
  @config = config
112
112
  @members = members
@@ -136,6 +136,7 @@ module Kettle
136
136
  @fast_recovery_members = normalize_fast_recovery_members(fast_recovery_members)
137
137
  @skip_ci = !!skip_ci
138
138
  @skip_changelog = !!skip_changelog
139
+ @skip_appraisals = !!skip_appraisals
139
140
  @local_ci = local_ci
140
141
  @continue_ci_failures = continue_ci_failures
141
142
  @ci_workflows = validate_ci_workflows(ci_workflows)
@@ -205,7 +206,7 @@ module Kettle
205
206
  execute && release_command_delegates_secrets_to_kettle_release?
206
207
  end
207
208
 
208
- attr_reader :command, :config, :members, :family_members, :execute, :accept, :commit, :allow_dirty, :autostash, :template_cleanup, :publish, :push, :tag, :start_step, :skip_steps, :fast_recovery, :fast_recovery_members, :skip_ci, :skip_changelog, :local_ci, :continue_ci_failures, :ci_workflows, :skip_bundle_audit, :skip_remotes, :required_remotes, :auto_dependency_floors, :validate_ci_bundles, :gha_sha_pins_upgrade, :gha_sha_pins_check, :gha_sha_pins_ttl_days, :env_overrides, :debug, :verbose, :jobs, :progress_io, :reset_target, :bup_args, :bex_args, :start_member, :start_branch
209
+ attr_reader :command, :config, :members, :family_members, :execute, :accept, :commit, :allow_dirty, :autostash, :template_cleanup, :publish, :push, :tag, :start_step, :skip_steps, :fast_recovery, :fast_recovery_members, :skip_ci, :skip_changelog, :skip_appraisals, :local_ci, :continue_ci_failures, :ci_workflows, :skip_bundle_audit, :skip_remotes, :required_remotes, :auto_dependency_floors, :validate_ci_bundles, :gha_sha_pins_upgrade, :gha_sha_pins_check, :gha_sha_pins_ttl_days, :env_overrides, :debug, :verbose, :jobs, :progress_io, :reset_target, :bup_args, :bex_args, :start_member, :start_branch
209
210
 
210
211
  def template_with_worktree_sync_results
211
212
  runner = command_runner
@@ -1219,6 +1220,7 @@ module Kettle
1219
1220
  runner = release_command_runner
1220
1221
  results = []
1221
1222
  @release_completed_member_names = []
1223
+ @aggregate_validation_member_name = aggregate_validation_members(release_members).first&.name
1222
1224
  append_family_changelog_result(runner: runner, memo: results) if include_family_changelog
1223
1225
  return results unless results.all?(&:ok?)
1224
1226
  return parallel_release_member_results(release_members, results) if parallel_release_members?(release_members)
@@ -1376,16 +1378,18 @@ module Kettle
1376
1378
  memo.last(2).each { |result| emit_member_result_progress(member, result, progress: progress) }
1377
1379
  return memo unless memo.last(2).all?(&:ok?)
1378
1380
 
1381
+ release_event_state = {}
1379
1382
  release_result = runner.call(
1380
1383
  member: member,
1381
1384
  phase: release_phase,
1382
1385
  command: release_command_for(member),
1383
1386
  env: release_env_for_member(member),
1384
1387
  interactive: release_command_interactive?,
1385
- stdout_line_handler: release_event_line_handler(member, progress: progress),
1388
+ stdout_line_handler: release_event_line_handler(member, progress: progress, state: release_event_state),
1386
1389
  log_path: release_command_log_path(member, release_phase),
1387
1390
  passthrough_output: release_command_passthrough_output?
1388
1391
  )
1392
+ release_result.resume_step = release_event_state[:failed_step] unless release_result.ok?
1389
1393
  memo << release_result
1390
1394
  emit_member_result_progress(member, memo.last, progress: progress)
1391
1395
  return memo unless memo.last.ok?
@@ -2222,7 +2226,8 @@ module Kettle
2222
2226
  effective_skip_steps = release_skip_steps_for(member)
2223
2227
  args << "start_step=#{effective_start_step}" if effective_start_step
2224
2228
  args << "skip_steps=#{effective_skip_steps}" unless effective_skip_steps.empty?
2225
- args << "--skip-changelog" if skip_changelog
2229
+ args << "--skip-changelog" if skip_changelog || aggregate_validation_member?(member)
2230
+ args << "--skip-appraisals" if skip_appraisals
2226
2231
  args << "--ci-workflows=#{ci_workflows}" if ci_workflows && !ci_workflows.to_s.empty?
2227
2232
  args << "--local-ci" if local_ci
2228
2233
  args << "--skip-bundle-audit" if skip_bundle_audit
@@ -2245,12 +2250,37 @@ module Kettle
2245
2250
  (fast_recovery == "retry-ci") ? 10 : 11
2246
2251
  end
2247
2252
 
2248
- def release_skip_steps_for(_member)
2253
+ def release_skip_steps_for(member)
2249
2254
  steps = Array(skip_steps).flat_map { |entry| entry.to_s.split(",") }.map(&:strip).reject(&:empty?)
2250
2255
  steps << "10" if skip_ci
2256
+ if aggregate_validation_member?(member)
2257
+ # The shared family changelog already ran the full local suite. The
2258
+ # validation member waits for the one aggregate CI run; all later
2259
+ # aggregate members publish without duplicate test/monitor phases.
2260
+ steps << "4"
2261
+ steps << "10" unless aggregate_validation_member_name?(member)
2262
+ end
2251
2263
  steps.uniq.join(",")
2252
2264
  end
2253
2265
 
2266
+ def aggregate_validation_members(release_members = members)
2267
+ return [] unless config.release_aggregate_validation?
2268
+ return [] unless config.shared_changelog?
2269
+
2270
+ excluded = config.release_aggregate_validation_excluded_members
2271
+ Array(release_members).reject { |member| excluded.include?(member.name) }
2272
+ end
2273
+
2274
+ def aggregate_validation_member?(member)
2275
+ return false unless member
2276
+
2277
+ aggregate_validation_members.include?(member)
2278
+ end
2279
+
2280
+ def aggregate_validation_member_name?(member)
2281
+ member && member.name == (@aggregate_validation_member_name || aggregate_validation_members.first&.name)
2282
+ end
2283
+
2254
2284
  def fast_recovery_for?(member)
2255
2285
  return false unless fast_recovery
2256
2286
  return false unless member
@@ -2377,6 +2407,9 @@ module Kettle
2377
2407
  # GitHub Release.
2378
2408
  env["KETTLE_RELEASE_SKIP_GITHUB_RELEASE"] = "true" if aggregate_monorepo_github_release?
2379
2409
  end
2410
+ if aggregate_validation_member?(member)
2411
+ env["KETTLE_RELEASE_FAMILY_CI_MODE"] = aggregate_validation_member_name?(member) ? "validation" : "member"
2412
+ end
2380
2413
  return env unless config.shared_changelog?
2381
2414
  if config.member_local_changelog?(member)
2382
2415
  return env.merge(
@@ -3241,11 +3274,15 @@ module Kettle
3241
3274
  end
3242
3275
  end
3243
3276
 
3244
- def release_event_line_handler(member, progress: nil)
3277
+ def release_event_line_handler(member, progress: nil, state: nil)
3245
3278
  lambda do |line|
3246
3279
  event = parse_template_event(line)
3247
3280
  next false unless event
3248
3281
 
3282
+ if event["type"] == "command_step" && event["phase"] == "release" && event["status"] == "failed"
3283
+ state[:failed_step] = event["index"].to_i if state && event["index"].to_s.match?(/\A\d+\z/)
3284
+ end
3285
+
3249
3286
  if progress_io
3250
3287
  if suppress_release_secret_provider_event?(event, progress: progress)
3251
3288
  next true
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.66
4
+ version: 1.2.67
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -91,7 +91,7 @@ dependencies:
91
91
  requirements:
92
92
  - - ">="
93
93
  - !ruby/object:Gem::Version
94
- version: 3.0.20
94
+ version: 3.0.22
95
95
  - - "<"
96
96
  - !ruby/object:Gem::Version
97
97
  version: 4.0.0
@@ -101,7 +101,7 @@ dependencies:
101
101
  requirements:
102
102
  - - ">="
103
103
  - !ruby/object:Gem::Version
104
- version: 3.0.20
104
+ version: 3.0.22
105
105
  - - "<"
106
106
  - !ruby/object:Gem::Version
107
107
  version: 4.0.0
@@ -441,10 +441,10 @@ licenses:
441
441
  - AGPL-3.0-only
442
442
  metadata:
443
443
  homepage_uri: https://kettle-family.galtzo.com
444
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.66
445
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.66/CHANGELOG.md
444
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.67
445
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.67/CHANGELOG.md
446
446
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
447
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.66
447
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.67
448
448
  funding_uri: https://github.com/sponsors/pboling
449
449
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
450
450
  news_uri: https://www.railsbling.com/tags/kettle-family
metadata.gz.sig CHANGED
Binary file