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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +15 -2
- data/README.md +2 -1
- data/lib/kettle/dev/ci_helpers.rb +32 -0
- data/lib/kettle/dev/ci_monitor.rb +26 -3
- 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: c6532c0b875c1c1581f43bf3035bc3f9b4ff7ba8d04f7a90f6bf78be7fb167ac
|
|
4
|
+
data.tar.gz: 9894c1dd7477202261502e23f1e6d37b6f0f174350ac456b834dc8df19b143ba
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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.
|
|
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
|
|
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
|
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.1.
|
|
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.
|
|
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.
|
|
426
|
-
changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v3.1.
|
|
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.
|
|
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
|