kettle-dev 3.1.10 → 3.1.11

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: 402314d89802c8ea05c0ad109c93b25ee8a703e767a5581855ac80ab1981f139
4
- data.tar.gz: 91d16f55dfe212bb82f0506d030734daa151dcbd0cc1cf2cf9f7f4547597e82c
3
+ metadata.gz: c6532c0b875c1c1581f43bf3035bc3f9b4ff7ba8d04f7a90f6bf78be7fb167ac
4
+ data.tar.gz: 9894c1dd7477202261502e23f1e6d37b6f0f174350ac456b834dc8df19b143ba
5
5
  SHA512:
6
- metadata.gz: 3e4c5dbd0e71242d0b8d7ad112858de871a169f76dfe49d1754525656e31f5d7421c324dcdbddc597a2a38e55228640f57d34a637d7d30f35a0565476a32442f
7
- data.tar.gz: c1ceeb7a1c40a1f989ff4ba76fe44bebc988c76d82fb945c6f15ccac66d6e547e6924557bb3cef10f661fd1f91b82407613a014462bbae47fa63b8c70f460a52
6
+ metadata.gz: 5bf4bd022743bdac03fc5806ff9598781abf17814c14ec9cddd5a917d33af628055dea5adbdbf11ee3d4284aa9f5dc2926c8456dab0710fc59ea7093aa23d457
7
+ data.tar.gz: a9aa5312d72d80c8868becdb10cbf8e11f57ae4df5e37edc78f781656873b4dea9bc1fd48aca064a4ec63e76ee2156dfe05626e8efa90743a7ffda4b24a397bd
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
+ ## [3.1.11] - 2026-10-11
34
+
35
+ - TAG: [v3.1.11][3.1.11t]
36
+ - COVERAGE: 91.71% -- 6352/6926 lines in 49 files
37
+ - BRANCH COVERAGE: 75.79% -- 2420/3193 branches in 49 files
38
+ - 52.20% documented
39
+
40
+ ### Fixed
41
+
42
+ - CI monitor aborts on the first failed GitHub Actions job instead of waiting for run-level completion: a large matrix keeps the run in_progress for minutes after a red job, so releases burned dead time a re-run must spend anyway; the abort names the job and links it
43
+
33
44
  ## [3.1.10] - 2026-10-11
34
45
 
35
46
  - TAG: [v3.1.10][3.1.10t]
@@ -43,7 +54,7 @@ Please file a bug if you notice a violation of semantic versioning.
43
54
 
44
55
  ### Security
45
56
 
46
- - InteractiveReleaseCommand now scrubs every configured secret from child output before printing, capturing, or logging it: a PTY echoes bytes written to its input back onto the output stream while the child's terminal echo is on (e.g. before RubyGems' noecho wraps the password read), so the gem signing passphrase previously appeared in release logs; the scrubber tracks written secrets in memory, removes them from every chunk including secrets split across chunk boundaries, and clears the prompt buffer after answering so a stale prompt cannot trigger a duplicate write
57
+ - InteractiveReleaseCommand now scrubs every configured secret from child output before printing, capturing, or logging it: a PTY echoes bytes written to its input back onto the output stream while the child's terminal echo is on (e.g. before RubyGems' noecho wraps the password read), so the gem signing passphrase previously appeared in release logs; the scrubber tracks written secrets in memory, removes them from every chunk including secrets split across chunk boundaries, and clears the prompt buffer after answering so a stale prompt cannot trigger a duplicate write. Prompt detection runs on a scrubbed-but-untruncated view of the stream while emitted output keeps the anti-leak holdback, fixing a deadlock where `gem push` printed the RubyGems OTP prompt as its final output and blocked forever on stdin with the prompt tail withheld (the fix landed mid-release and was omitted from this section's original content)
47
58
 
48
59
  - kettle-release aborts at startup under a prerelease Bundler, and LockfileReset now treats a lockfile BUNDLED WITH a prerelease Bundler as drift: Bundler auto-installs the locked version (including betas) on every bundle install, so one beta-pinned lockfile re-infects every machine that bundles against it; the reset re-locks with the currently running stable Bundler
49
60
 
@@ -4038,7 +4049,9 @@ Please file a bug if you notice a violation of semantic versioning.
4038
4049
  - Selecting will run the selected workflow via `act`
4039
4050
  - This may move to its own gem in the future.
4040
4051
 
4041
- [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.10...HEAD
4052
+ [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.11...HEAD
4053
+ [3.1.11]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.10...v3.1.11
4054
+ [3.1.11t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.1.11
4042
4055
  [3.1.10]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.9...v3.1.10
4043
4056
  [3.1.10t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.1.10
4044
4057
  [3.1.9]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.8...v3.1.9
data/README.md CHANGED
@@ -421,6 +421,7 @@ What it does:
421
421
  - Select workflow with `K_RELEASE_LOCAL_CI_WORKFLOW` (with or without .yml/.yaml). Defaults to `locked_deps.yml` if present; otherwise the first workflow discovered.
422
422
  - On failure, the release prep commit is soft-rolled-back (`git reset --soft HEAD^`) and the process aborts.
423
423
  - Ensures trunk sync and rebases feature branches as needed, pushes, monitors GitHub Actions with a progress bar, and merges feature to trunk on success.
424
+ - CI monitoring aborts as soon as any single workflow job fails (not only when the whole run concludes), naming the failed job and linking to it — a large matrix can keep a run in_progress for many minutes after its first red job.
424
425
  - For release branches listed in `.kettle-family.yml` branch-stack targets, it intentionally does not pull/rebase from trunk or merge the leaf branch into trunk. Instead, it starts the selected GitHub Actions workflows directly on the pushed release branch; each selected workflow must declare `workflow_dispatch`. This validates the exact branch-stack commit without requiring an often-conflicting PR to trunk.
425
426
  - Exports `SOURCE_DATE_EPOCH`, builds (optionally signed), creates gem checksums, and runs `bundle exec rake release` (prompts for signing key + RubyGems MFA OTP as needed).
426
427
  - Options:
@@ -1067,7 +1068,7 @@ Thanks for RTFM. ☺️
1067
1068
  [📌gitmoji]: https://gitmoji.dev
1068
1069
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
1069
1070
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
1070
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.909-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1071
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.926-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1071
1072
  [🔐security]: https://github.com/kettle-dev/kettle-dev/blob/main/SECURITY.md
1072
1073
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
1073
1074
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -188,6 +188,38 @@ module Kettle
188
188
  run && run["status"] == "completed" && run["conclusion"] && run["conclusion"] != "success"
189
189
  end
190
190
 
191
+ # Jobs of a workflow run. Used to detect a failed job BEFORE the
192
+ # workflow-level status completes: a large matrix keeps the run
193
+ # in_progress for many minutes after its first job has already
194
+ # concluded failure, while an operator watching the Actions UI sees
195
+ # the red job immediately.
196
+ # @param owner [String]
197
+ # @param repo [String]
198
+ # @param run_id [Integer, String]
199
+ # @param token [String, nil]
200
+ # @return [Array<Hash>] job summaries: name, status, conclusion, html_url
201
+ def run_jobs(owner:, repo:, run_id:, token: default_token)
202
+ return [] unless owner && repo && run_id
203
+
204
+ data = github_get_json(
205
+ "https://api.github.com/repos/#{owner}/#{repo}/actions/runs/#{run_id}/jobs?per_page=100",
206
+ token: token
207
+ )
208
+ return [] unless data
209
+
210
+ Array(data["jobs"]).map do |job|
211
+ {
212
+ "name" => job["name"],
213
+ "status" => job["status"],
214
+ "conclusion" => job["conclusion"],
215
+ "html_url" => job["html_url"]
216
+ }
217
+ end
218
+ rescue => e
219
+ Kettle::Dev.debug_error(e, __method__)
220
+ []
221
+ end
222
+
191
223
  # Default GitHub token sourced from environment.
192
224
  # @return [String, nil]
193
225
  def default_token
@@ -404,9 +404,31 @@ module Kettle
404
404
  total: total
405
405
  )
406
406
  end
407
- elsif Kettle::Dev::CIHelpers.failed?(run) && !passed[wf] && !failed[wf]
407
+ elsif !failed[wf]
408
+ # Detect a failure at the JOB level while the run is still
409
+ # in_progress: a large matrix keeps the run-level status
410
+ # pending for many minutes after its first job has already
411
+ # concluded failure, but an operator watching the Actions UI
412
+ # sees the red job immediately. Abort as soon as any job is
413
+ # definitively red so the release stops burning minutes that
414
+ # a re-run will have to spend anyway.
415
+ run_failed = Kettle::Dev::CIHelpers.failed?(run)
416
+ failed_job = nil
417
+ if !passed[wf] && !run_failed && run["status"] != "completed"
418
+ # Run still in flight: poll its jobs so a single red job in
419
+ # a large matrix aborts immediately instead of waiting for
420
+ # the whole workflow to conclude.
421
+ jobs = Kettle::Dev::CIHelpers.run_jobs(owner: owner, repo: repo, run_id: run["id"])
422
+ failed_job = jobs.find do |job|
423
+ job["status"] == "completed" && job["conclusion"] && job["conclusion"] != "success" && job["conclusion"] != "skipped"
424
+ end
425
+ end
426
+ next unless run_failed || failed_job
427
+
408
428
  puts
409
429
  wf_url = run["html_url"] || "https://github.com/#{owner}/#{repo}/actions/workflows/#{wf}"
430
+ failed_job_note = failed_job ? " (job: #{failed_job["name"]})" : ""
431
+ wf_url = failed_job["html_url"] if failed_job && failed_job["html_url"]
410
432
  emit_ci_monitor_event(
411
433
  event_recorder,
412
434
  action: "github_workflow",
@@ -416,12 +438,13 @@ module Kettle
416
438
  url: wf_url,
417
439
  run_status: run["status"],
418
440
  conclusion: run["conclusion"],
441
+ failed_job: failed_job && failed_job["name"],
419
442
  completed: passed.size,
420
443
  total: total,
421
- reason: "Workflow failed"
444
+ reason: "Workflow failed#{failed_job_note}"
422
445
  )
423
446
  unless continue_ci_failures?
424
- abort("Workflow failed: #{wf} -> #{wf_url} Fix the workflow, then restart this tool from CI validation with: #{restart_hint}")
447
+ abort("Workflow failed#{failed_job_note}: #{wf} -> #{wf_url} Fix the workflow, then restart this tool from CI validation with: #{restart_hint}")
425
448
  end
426
449
 
427
450
  failed[wf] = true
@@ -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.1.10"
8
+ VERSION = "3.1.11"
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.1.10
4
+ version: 3.1.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -422,10 +422,10 @@ licenses:
422
422
  - AGPL-3.0-only
423
423
  metadata:
424
424
  homepage_uri: https://kettle-dev.galtzo.com
425
- source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v3.1.10
426
- changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v3.1.10/CHANGELOG.md
425
+ source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v3.1.11
426
+ changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v3.1.11/CHANGELOG.md
427
427
  bug_tracker_uri: https://github.com/kettle-dev/kettle-dev/issues
428
- documentation_uri: https://www.rubydoc.info/gems/kettle-dev/3.1.10
428
+ documentation_uri: https://www.rubydoc.info/gems/kettle-dev/3.1.11
429
429
  funding_uri: https://github.com/sponsors/pboling
430
430
  wiki_uri: https://github.com/kettle-dev/kettle-dev/wiki
431
431
  news_uri: https://www.railsbling.com/tags/kettle-dev
metadata.gz.sig CHANGED
Binary file