kettle-dev 1.0.7 → 1.0.9
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/.github/workflows/ancient.yml +2 -4
- data/.github/workflows/coverage.yml +2 -4
- data/.github/workflows/current.yml +2 -4
- data/.github/workflows/heads.yml +2 -4
- data/.github/workflows/jruby.yml +2 -4
- data/.github/workflows/legacy.yml +2 -4
- data/.github/workflows/locked_deps.yml +1 -4
- data/.github/workflows/style.yml +2 -4
- data/.github/workflows/supported.yml +2 -4
- data/.github/workflows/truffle.yml +2 -4
- data/.github/workflows/unlocked_deps.yml +1 -4
- data/.github/workflows/unsupported.yml +2 -4
- data/CHANGELOG.md +39 -3
- data/CHANGELOG.md.example +47 -0
- data/README.md +5 -0
- data/Rakefile +36 -43
- data/exe/kettle-commit-msg +6 -4
- data/exe/kettle-readme-backers +5 -1
- data/exe/kettle-release +157 -4
- data/lib/kettle/dev/rakelib/ci.rake +62 -9
- data/lib/kettle/dev/rakelib/template.rake +11 -0
- data/lib/kettle/dev/version.rb +1 -1
- data/sig/kettle/dev/ci_helpers.rbs +19 -0
- data.tar.gz.sig +2 -1
- metadata +6 -9
- metadata.gz.sig +0 -0
- data/checksums/kettle-dev-1.0.7.gem.sha256 +0 -1
- data/checksums/kettle-dev-1.0.7.gem.sha512 +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 32a4bff14544feed4dc60644fe0bb8d0ed1a76cb1f49c0144c8f9748e23ea993
|
4
|
+
data.tar.gz: d574fb5dc72da3caf7ee83f64fb064606930d33df23ff6f9a6a907692a21fbe8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f68fef35d7bd888e0132e68e27cfcf31f18ba6098ecbccebeadab0cb4154f1fd12ce32fdce828a5699a18362893059ea4302224084a7446fb90b7a12aaee00b5
|
7
|
+
data.tar.gz: ac0dea1fca1ea03add3375fa9f8b884f5b57394d45db39c1b00caebe8bcb33f79a66b9d88ef020a4edc3b19d4630086625fda371522953a48f1f38c5994307af
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
@@ -4,12 +4,10 @@ on:
|
|
4
4
|
push:
|
5
5
|
branches:
|
6
6
|
- 'main'
|
7
|
+
- "*-stable"
|
7
8
|
tags:
|
8
9
|
- '!*' # Do not execute on tags
|
9
10
|
pull_request:
|
10
|
-
# types specification prevents double build on push & pull request
|
11
|
-
# See: https://github.com/Shopify/ruby-style-guide/pull/235#issuecomment-777623642
|
12
|
-
types: [opened, synchronize]
|
13
11
|
branches:
|
14
12
|
- '*'
|
15
13
|
# Allow manually triggering the workflow.
|
@@ -23,7 +21,7 @@ concurrency:
|
|
23
21
|
|
24
22
|
jobs:
|
25
23
|
test:
|
26
|
-
if:
|
24
|
+
if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
|
27
25
|
name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }}
|
28
26
|
runs-on: ubuntu-22.04
|
29
27
|
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
|
@@ -19,12 +19,10 @@ on:
|
|
19
19
|
push:
|
20
20
|
branches:
|
21
21
|
- 'main'
|
22
|
+
- "*-stable"
|
22
23
|
tags:
|
23
24
|
- '!*' # Do not execute on tags
|
24
25
|
pull_request:
|
25
|
-
# types specification prevents double build on push & pull request
|
26
|
-
# See: https://github.com/Shopify/ruby-style-guide/pull/235#issuecomment-777623642
|
27
|
-
types: [opened, synchronize]
|
28
26
|
branches:
|
29
27
|
- '*'
|
30
28
|
# Allow manually triggering the workflow.
|
@@ -38,7 +36,7 @@ concurrency:
|
|
38
36
|
|
39
37
|
jobs:
|
40
38
|
coverage:
|
41
|
-
if:
|
39
|
+
if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
|
42
40
|
name: Code Coverage on ${{ matrix.ruby }}@current
|
43
41
|
runs-on: ubuntu-latest
|
44
42
|
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
|
@@ -8,12 +8,10 @@ on:
|
|
8
8
|
push:
|
9
9
|
branches:
|
10
10
|
- 'main'
|
11
|
+
- "*-stable"
|
11
12
|
tags:
|
12
13
|
- '!*' # Do not execute on tags
|
13
14
|
pull_request:
|
14
|
-
# types specification prevents double build on push & pull request
|
15
|
-
# See: https://github.com/Shopify/ruby-style-guide/pull/235#issuecomment-777623642
|
16
|
-
types: [opened, synchronize]
|
17
15
|
branches:
|
18
16
|
- '*'
|
19
17
|
# Allow manually triggering the workflow.
|
@@ -30,7 +28,7 @@ concurrency:
|
|
30
28
|
|
31
29
|
jobs:
|
32
30
|
test:
|
33
|
-
if:
|
31
|
+
if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
|
34
32
|
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}
|
35
33
|
runs-on: ubuntu-latest
|
36
34
|
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
|
data/.github/workflows/heads.yml
CHANGED
@@ -7,12 +7,10 @@ on:
|
|
7
7
|
push:
|
8
8
|
branches:
|
9
9
|
- 'main'
|
10
|
+
- "*-stable"
|
10
11
|
tags:
|
11
12
|
- '!*' # Do not execute on tags
|
12
13
|
pull_request:
|
13
|
-
# types specification prevents double build on push & pull request
|
14
|
-
# See: https://github.com/Shopify/ruby-style-guide/pull/235#issuecomment-777623642
|
15
|
-
types: [opened, synchronize]
|
16
14
|
branches:
|
17
15
|
- '*'
|
18
16
|
# Allow manually triggering the workflow.
|
@@ -29,7 +27,7 @@ concurrency:
|
|
29
27
|
|
30
28
|
jobs:
|
31
29
|
test:
|
32
|
-
if:
|
30
|
+
if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
|
33
31
|
name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}${{ matrix.name_extra || '' }}
|
34
32
|
runs-on: ubuntu-latest
|
35
33
|
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
|
data/.github/workflows/jruby.yml
CHANGED
@@ -7,12 +7,10 @@ on:
|
|
7
7
|
push:
|
8
8
|
branches:
|
9
9
|
- 'main'
|
10
|
+
- "*-stable"
|
10
11
|
tags:
|
11
12
|
- '!*' # Do not execute on tags
|
12
13
|
pull_request:
|
13
|
-
# types specification prevents double build on push & pull request
|
14
|
-
# See: https://github.com/Shopify/ruby-style-guide/pull/235#issuecomment-777623642
|
15
|
-
types: [opened, synchronize]
|
16
14
|
branches:
|
17
15
|
- '*'
|
18
16
|
# Allow manually triggering the workflow.
|
@@ -29,7 +27,7 @@ concurrency:
|
|
29
27
|
|
30
28
|
jobs:
|
31
29
|
test:
|
32
|
-
if:
|
30
|
+
if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
|
33
31
|
name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }}
|
34
32
|
runs-on: ubuntu-22.04
|
35
33
|
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
|
@@ -7,12 +7,10 @@ on:
|
|
7
7
|
push:
|
8
8
|
branches:
|
9
9
|
- 'main'
|
10
|
+
- "*-stable"
|
10
11
|
tags:
|
11
12
|
- '!*' # Do not execute on tags
|
12
13
|
pull_request:
|
13
|
-
# types specification prevents double build on push & pull request
|
14
|
-
# See: https://github.com/Shopify/ruby-style-guide/pull/235#issuecomment-777623642
|
15
|
-
types: [opened, synchronize]
|
16
14
|
branches:
|
17
15
|
- '*'
|
18
16
|
# Allow manually triggering the workflow.
|
@@ -29,7 +27,7 @@ concurrency:
|
|
29
27
|
|
30
28
|
jobs:
|
31
29
|
test:
|
32
|
-
if:
|
30
|
+
if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
|
33
31
|
name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }}
|
34
32
|
runs-on: ubuntu-22.04
|
35
33
|
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
|
@@ -41,9 +41,6 @@ on:
|
|
41
41
|
tags:
|
42
42
|
- '!*' # Do not execute on tags
|
43
43
|
pull_request:
|
44
|
-
# types specification prevents double build on push & pull request
|
45
|
-
# See: https://github.com/Shopify/ruby-style-guide/pull/235#issuecomment-777623642
|
46
|
-
types: [opened, synchronize]
|
47
44
|
branches:
|
48
45
|
- '*'
|
49
46
|
# Allow manually triggering the workflow.
|
@@ -57,7 +54,7 @@ concurrency:
|
|
57
54
|
|
58
55
|
jobs:
|
59
56
|
test:
|
60
|
-
if:
|
57
|
+
if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
|
61
58
|
name: Default rake task w/ main Gemfile.lock ${{ matrix.name_extra || '' }}
|
62
59
|
runs-on: ubuntu-latest
|
63
60
|
continue-on-error: ${{ matrix.experimental }}
|
data/.github/workflows/style.yml
CHANGED
@@ -4,12 +4,10 @@ on:
|
|
4
4
|
push:
|
5
5
|
branches:
|
6
6
|
- 'main'
|
7
|
+
- "*-stable"
|
7
8
|
tags:
|
8
9
|
- '!*' # Do not execute on tags
|
9
10
|
pull_request:
|
10
|
-
# types specification prevents double build on push & pull request
|
11
|
-
# See: https://github.com/Shopify/ruby-style-guide/pull/235#issuecomment-777623642
|
12
|
-
types: [opened, synchronize]
|
13
11
|
branches:
|
14
12
|
- '*'
|
15
13
|
# Allow manually triggering the workflow.
|
@@ -26,7 +24,7 @@ concurrency:
|
|
26
24
|
|
27
25
|
jobs:
|
28
26
|
rubocop:
|
29
|
-
if:
|
27
|
+
if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
|
30
28
|
name: Style on ${{ matrix.ruby }}@current
|
31
29
|
runs-on: ubuntu-latest
|
32
30
|
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
|
@@ -7,12 +7,10 @@ on:
|
|
7
7
|
push:
|
8
8
|
branches:
|
9
9
|
- 'main'
|
10
|
+
- "*-stable"
|
10
11
|
tags:
|
11
12
|
- '!*' # Do not execute on tags
|
12
13
|
pull_request:
|
13
|
-
# types specification prevents double build on push & pull request
|
14
|
-
# See: https://github.com/Shopify/ruby-style-guide/pull/235#issuecomment-777623642
|
15
|
-
types: [opened, synchronize]
|
16
14
|
branches:
|
17
15
|
- '*'
|
18
16
|
# Allow manually triggering the workflow.
|
@@ -29,7 +27,7 @@ concurrency:
|
|
29
27
|
|
30
28
|
jobs:
|
31
29
|
test:
|
32
|
-
if:
|
30
|
+
if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
|
33
31
|
name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }}
|
34
32
|
runs-on: ubuntu-latest
|
35
33
|
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
|
@@ -7,12 +7,10 @@ on:
|
|
7
7
|
push:
|
8
8
|
branches:
|
9
9
|
- 'main'
|
10
|
+
- "*-stable"
|
10
11
|
tags:
|
11
12
|
- '!*' # Do not execute on tags
|
12
13
|
pull_request:
|
13
|
-
# types specification prevents double build on push & pull request
|
14
|
-
# See: https://github.com/Shopify/ruby-style-guide/pull/235#issuecomment-777623642
|
15
|
-
types: [opened, synchronize]
|
16
14
|
branches:
|
17
15
|
- '*'
|
18
16
|
# Allow manually triggering the workflow.
|
@@ -29,7 +27,7 @@ concurrency:
|
|
29
27
|
|
30
28
|
jobs:
|
31
29
|
test:
|
32
|
-
if:
|
30
|
+
if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
|
33
31
|
name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }}
|
34
32
|
runs-on: ubuntu-22.04
|
35
33
|
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
|
@@ -31,9 +31,6 @@ on:
|
|
31
31
|
tags:
|
32
32
|
- '!*' # Do not execute on tags
|
33
33
|
pull_request:
|
34
|
-
# types specification prevents double build on push & pull request
|
35
|
-
# See: https://github.com/Shopify/ruby-style-guide/pull/235#issuecomment-777623642
|
36
|
-
types: [opened, synchronize]
|
37
34
|
branches:
|
38
35
|
- '*'
|
39
36
|
# Allow manually triggering the workflow.
|
@@ -47,7 +44,7 @@ concurrency:
|
|
47
44
|
|
48
45
|
jobs:
|
49
46
|
test:
|
50
|
-
if:
|
47
|
+
if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
|
51
48
|
name: Default rake task w/ unlocked deps ${{ matrix.name_extra || '' }}
|
52
49
|
runs-on: ubuntu-latest
|
53
50
|
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
|
@@ -7,12 +7,10 @@ on:
|
|
7
7
|
push:
|
8
8
|
branches:
|
9
9
|
- 'main'
|
10
|
+
- "*-stable"
|
10
11
|
tags:
|
11
12
|
- '!*' # Do not execute on tags
|
12
13
|
pull_request:
|
13
|
-
# types specification prevents double build on push & pull request
|
14
|
-
# See: https://github.com/Shopify/ruby-style-guide/pull/235#issuecomment-777623642
|
15
|
-
types: [opened, synchronize]
|
16
14
|
branches:
|
17
15
|
- '*'
|
18
16
|
# Allow manually triggering the workflow.
|
@@ -29,7 +27,7 @@ concurrency:
|
|
29
27
|
|
30
28
|
jobs:
|
31
29
|
test:
|
32
|
-
if:
|
30
|
+
if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
|
33
31
|
name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }}
|
34
32
|
runs-on: ubuntu-22.04
|
35
33
|
continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,20 @@
|
|
1
1
|
# Changelog
|
2
|
+
|
3
|
+
[![SemVer 2.0.0][📌semver-img]][📌semver] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog]
|
4
|
+
|
2
5
|
All notable changes to this project will be documented in this file.
|
3
6
|
|
4
|
-
The format is based on [Keep a Changelog
|
5
|
-
and this project adheres to [Semantic Versioning
|
7
|
+
The format is based on [Keep a Changelog][📗keep-changelog],
|
8
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
|
9
|
+
and [yes][📌major-versions-not-sacred], platform and engine support are part of the [public API][📌semver-breaking].
|
10
|
+
Please file a bug if you notice a violation of semantic versioning.
|
11
|
+
|
12
|
+
[📌semver]: https://semver.org/spec/v2.0.0.html
|
13
|
+
[📌semver-img]: https://img.shields.io/badge/semver-2.0.0-FFDD67.svg?style=flat
|
14
|
+
[📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
|
15
|
+
[📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
|
16
|
+
[📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
|
17
|
+
[📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-FFDD67.svg?style=flat
|
6
18
|
|
7
19
|
## [Unreleased]
|
8
20
|
### Added
|
@@ -12,6 +24,26 @@ and this project adheres to [Semantic Versioning v2](https://semver.org/spec/v2.
|
|
12
24
|
### Fixed
|
13
25
|
### Security
|
14
26
|
|
27
|
+
## [1.0.9] - 2025-08-24
|
28
|
+
- TAG: [v1.0.9][1.0.9t]
|
29
|
+
- COVERAGE: 100.00% -- 130/130 lines in 7 files
|
30
|
+
- BRANCH COVERAGE: 96.00% -- 48/50 branches in 7 files
|
31
|
+
- 95.35% documented
|
32
|
+
### Added
|
33
|
+
- kettle-release: Add a sanity check for the latest released version of the gem being released, and display it during the confirmation with user that CHANGELOG.md and version.rb have been updated, so they can compare the value in version.rb with the value of the latest released version.
|
34
|
+
- If the value in version.rb is less than the latest released version's major or minor, then check for the latest released version that matches the major + minor of what is in version.rb.
|
35
|
+
- This way a stable branch intended to release patch updates to older versions is able to work use the script.
|
36
|
+
- kettle-release: optional pre-push local CI run using `act`, controlled by env var `K_RELEASE_LOCAL_CI` ("true" to run, "ask" to prompt) and `K_RELEASE_LOCAL_CI_WORKFLOW` to choose a workflow; defaults to `locked_deps.yml` when present; on failure, soft-resets the release prep commit and aborts.
|
37
|
+
- template task: now copies `certs/pboling.pem` into the host project when available.
|
38
|
+
|
39
|
+
## [1.0.8] - 2025-08-24
|
40
|
+
- TAG: [v1.0.8][1.0.8t]
|
41
|
+
- COVERAGE: 100.00% -- 130/130 lines in 7 files
|
42
|
+
- BRANCH COVERAGE: 96.00% -- 48/50 branches in 7 files
|
43
|
+
- 95.35% documented
|
44
|
+
### Fixed
|
45
|
+
- Can't add checksums to the gem package, because it changes the checksum (duh!)
|
46
|
+
|
15
47
|
## [1.0.7] - 2025-08-24
|
16
48
|
- TAG: [v1.0.7][1.0.7t]
|
17
49
|
- COVERAGE: 100.00% -- 130/130 lines in 7 files
|
@@ -108,7 +140,11 @@ and this project adheres to [Semantic Versioning v2](https://semver.org/spec/v2.
|
|
108
140
|
- Selecting will run the selected workflow via `act`
|
109
141
|
- This may move to its own gem in the future.
|
110
142
|
|
111
|
-
[Unreleased]: https://gitlab.com/kettle-rb/kettle-dev/-/compare/v1.0.
|
143
|
+
[Unreleased]: https://gitlab.com/kettle-rb/kettle-dev/-/compare/v1.0.9...HEAD
|
144
|
+
[1.0.9]: https://gitlab.com/kettle-rb/kettle-dev/-/compare/v1.0.8...v1.0.9
|
145
|
+
[1.0.9t]: https://gitlab.com/kettle-rb/kettle-dev/-/tags/v1.0.9
|
146
|
+
[1.0.8]: https://gitlab.com/kettle-rb/kettle-dev/-/compare/v1.0.7...v1.0.8
|
147
|
+
[1.0.8t]: https://gitlab.com/kettle-rb/kettle-dev/-/tags/v1.0.8
|
112
148
|
[1.0.7]: https://gitlab.com/kettle-rb/kettle-dev/-/compare/v1.0.6...v1.0.7
|
113
149
|
[1.0.7t]: https://gitlab.com/kettle-rb/kettle-dev/-/tags/v1.0.7
|
114
150
|
[1.0.6]: https://gitlab.com/kettle-rb/kettle-dev/-/compare/v1.0.5...v1.0.6
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
[![SemVer 2.0.0][📌semver-img]][📌semver] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog]
|
4
|
+
|
5
|
+
All notable changes to this project will be documented in this file.
|
6
|
+
|
7
|
+
The format is based on [Keep a Changelog][📗keep-changelog],
|
8
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
|
9
|
+
and [yes][📌major-versions-not-sacred], platform and engine support are part of the [public API][📌semver-breaking].
|
10
|
+
Please file a bug if you notice a violation of semantic versioning.
|
11
|
+
|
12
|
+
[📌semver]: https://semver.org/spec/v2.0.0.html
|
13
|
+
[📌semver-img]: https://img.shields.io/badge/semver-2.0.0-FFDD67.svg?style=flat
|
14
|
+
[📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
|
15
|
+
[📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
|
16
|
+
[📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
|
17
|
+
[📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-FFDD67.svg?style=flat
|
18
|
+
|
19
|
+
## [Unreleased]
|
20
|
+
### Added
|
21
|
+
### Changed
|
22
|
+
### Deprecated
|
23
|
+
### Removed
|
24
|
+
### Fixed
|
25
|
+
### Security
|
26
|
+
|
27
|
+
## [1.0.1] - 2025-08-24
|
28
|
+
- TAG: [v1.0.1][1.0.1t]
|
29
|
+
- COVERAGE: 100.00% -- 130/130 lines in 7 files
|
30
|
+
- BRANCH COVERAGE: 96.00% -- 48/50 branches in 7 files
|
31
|
+
- 100% documented
|
32
|
+
### Fixed
|
33
|
+
- bugfix: oopsie
|
34
|
+
|
35
|
+
## [1.0.0] - 2025-08-24
|
36
|
+
- TAG: [v1.0.0][1.0.0t]
|
37
|
+
- COVERAGE: 100.00% -- 130/130 lines in 7 files
|
38
|
+
- BRANCH COVERAGE: 96.00% -- 48/50 branches in 7 files
|
39
|
+
- 100% documented
|
40
|
+
### Added
|
41
|
+
- Initial release
|
42
|
+
|
43
|
+
[Unreleased]: https://gitlab.com/kettle-rb/kettle-dev/-/compare/v1.0.0...HEAD
|
44
|
+
[1.0.1]: https://gitlab.com/kettle-rb/kettle-dev/-/compare/v1.0.0...v1.0.1
|
45
|
+
[1.0.1t]: https://gitlab.com/kettle-rb/kettle-dev/-/tags/v1.0.1
|
46
|
+
[1.0.0]: https://gitlab.com/kettle-rb/kettle-dev/-/compare/a427c302df09cfe4253a7c8d400333f9a4c1a208...v1.0.0
|
47
|
+
[1.0.0t]: https://gitlab.com/kettle-rb/kettle-dev/-/tags/v1.0.0
|
data/README.md
CHANGED
@@ -231,6 +231,7 @@ GitHub Actions local runner helper
|
|
231
231
|
Project automation bootstrap
|
232
232
|
- `bundle exec rake kettle:dev:install` — copies the library’s `.github` folder into your project and offers to install `.git-hooks` templates locally or globally.
|
233
233
|
- `bundle exec rake kettle:dev:template` — runs only the templating step used by install; useful to re-apply updates to templates (.github workflows, .devcontainer, .qlty, modular Gemfiles, README, and friends) without the `install` task’s extra prompts.
|
234
|
+
- Also copies maintainer certificate `certs/pboling.pem` into your project when present (used for signed gem builds).
|
234
235
|
- README carry-over during templating: when your project’s README.md is replaced by the template, selected sections from your existing README are preserved and merged into the new one. Specifically, the task carries over the following sections (matched case-insensitively):
|
235
236
|
- "Synopsis"
|
236
237
|
- "Configuration"
|
@@ -249,6 +250,10 @@ Project automation bootstrap
|
|
249
250
|
Releasing (maintainers)
|
250
251
|
- `exe/kettle-release` — guided release helper that:
|
251
252
|
- Runs sanity checks (`bin/setup`, `bin/rake`), confirms version/changelog, optionally updates Appraisals, commits “🔖 Prepare release vX.Y.Z”.
|
253
|
+
- Optionally runs your CI locally with `act` before any push:
|
254
|
+
- Enable with env: `K_RELEASE_LOCAL_CI="true"` (run automatically) or `K_RELEASE_LOCAL_CI="ask"` (prompt [Y/n]).
|
255
|
+
- 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.
|
256
|
+
- On failure, the release prep commit is soft-rolled-back (`git reset --soft HEAD^`) and the process aborts.
|
252
257
|
- Ensures trunk sync and rebases feature as needed, pushes, monitors GitHub Actions with a progress bar, and merges feature to trunk on success.
|
253
258
|
- 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).
|
254
259
|
|
data/Rakefile
CHANGED
@@ -1,22 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
#
|
3
|
+
# kettle-dev Rakefile v1.0.0 - 2025-08-23
|
4
4
|
# Ruby 2.3 (Safe Navigation) or higher required
|
5
5
|
#
|
6
|
-
# CHANGELOG
|
7
|
-
# v1.0.0 - initial release w/ support for rspec, minitest, rubocop, reek, yard, and stone_checksums
|
8
|
-
# v1.0.1 - fix test / spec tasks running 2x
|
9
|
-
# v1.0.2 - fix duplicate task warning from RuboCop
|
10
|
-
# v1.0.3 - add bench tasks to run mini benchmarks (add scripts to /benchmarks)
|
11
|
-
# v1.0.4 - add support for floss_funding:install
|
12
|
-
# v1.0.5 - add support for halting in Rake tasks with binding.b (from debug gem)
|
13
|
-
# v1.0.6 - add RBS files and checksums to YARD-generated docs site
|
14
|
-
# v1.0.7 - works with vanilla ruby, non-gem, bundler-managed, projects
|
15
|
-
# v1.0.8 - improved Dir globs, add back and document rbconfig dependency
|
16
|
-
# v1.0.9 - add appraisal:update task to update Appraisal gemfiles and autocorrect with RuboCop Gradual
|
17
|
-
# v1.0.10 - add ci:act to run GHA workflows locally, and get status of remote workflows
|
18
|
-
# v1.0.11 - ci:act workflows are populated entirely dynamically, based on existing files
|
19
|
-
#
|
20
6
|
# MIT License (see License.txt)
|
21
7
|
#
|
22
8
|
# Copyright (c) 2025 Peter H. Boling (galtzo.com)
|
@@ -25,34 +11,41 @@
|
|
25
11
|
#
|
26
12
|
# Sets up tasks for appraisal, floss_funding, rspec, minitest, rubocop, reek, yard, and stone_checksums.
|
27
13
|
#
|
28
|
-
# rake appraisal:update
|
29
|
-
# rake bench
|
30
|
-
# rake bench:list
|
31
|
-
# rake bench:run
|
32
|
-
# rake build
|
33
|
-
# rake build:checksum
|
34
|
-
# rake build:generate_checksums
|
35
|
-
# rake bundle:audit:check
|
36
|
-
# rake bundle:audit:update
|
37
|
-
# rake ci:act[opt]
|
38
|
-
# rake clean
|
39
|
-
# rake clobber
|
40
|
-
# rake coverage
|
41
|
-
# rake
|
42
|
-
# rake install
|
43
|
-
# rake install:local
|
44
|
-
# rake
|
45
|
-
# rake
|
46
|
-
# rake
|
47
|
-
# rake
|
48
|
-
# rake
|
49
|
-
# rake rubocop_gradual
|
50
|
-
# rake rubocop_gradual:
|
51
|
-
# rake rubocop_gradual:
|
52
|
-
# rake rubocop_gradual:
|
53
|
-
# rake
|
54
|
-
# rake
|
55
|
-
# rake
|
14
|
+
# rake appraisal:update # Update Appraisal gemfiles and run RuboCop...
|
15
|
+
# rake bench # Run all benchmarks (alias for bench:run)
|
16
|
+
# rake bench:list # List available benchmark scripts
|
17
|
+
# rake bench:run # Run all benchmark scripts (skips on CI)
|
18
|
+
# rake build # Build kettle-dev-1.0.0.gem into the pkg d...
|
19
|
+
# rake build:checksum # Generate SHA512 checksum of kettle-dev-1....
|
20
|
+
# rake build:generate_checksums # Generate both SHA256 & SHA512 checksums i...
|
21
|
+
# rake bundle:audit:check # Checks the Gemfile.lock for insecure depe...
|
22
|
+
# rake bundle:audit:update # Updates the bundler-audit vulnerability d...
|
23
|
+
# rake ci:act[opt] # Run 'act' with a selected workflow
|
24
|
+
# rake clean # Remove any temporary products
|
25
|
+
# rake clobber # Remove any generated files
|
26
|
+
# rake coverage # Run specs w/ coverage and open results in...
|
27
|
+
# rake default # Default tasks aggregator
|
28
|
+
# rake install # Build and install kettle-dev-1.0.0.gem in...
|
29
|
+
# rake install:local # Build and install kettle-dev-1.0.0.gem in...
|
30
|
+
# rake kettle:dev:install # Install kettle-dev GitHub automation and ...
|
31
|
+
# rake kettle:dev:template # Template kettle-dev files into the curren...
|
32
|
+
# rake reek # Check for code smells
|
33
|
+
# rake reek:update # Run reek and store the output into the RE...
|
34
|
+
# rake release[remote] # Create tag v1.0.0 and build and push kett...
|
35
|
+
# rake rubocop_gradual # Run RuboCop Gradual
|
36
|
+
# rake rubocop_gradual:autocorrect # Run RuboCop Gradual with autocorrect (onl...
|
37
|
+
# rake rubocop_gradual:autocorrect_all # Run RuboCop Gradual with autocorrect (saf...
|
38
|
+
# rake rubocop_gradual:check # Run RuboCop Gradual to check the lock file
|
39
|
+
# rake rubocop_gradual:force_update # Run RuboCop Gradual to force update the l...
|
40
|
+
# rake rubocop_gradual_debug # Run RuboCop Gradual
|
41
|
+
# rake rubocop_gradual_debug:autocorrect # Run RuboCop Gradual with autocorrect (onl...
|
42
|
+
# rake rubocop_gradual_debug:autocorrect_all # Run RuboCop Gradual with autocorrect (saf...
|
43
|
+
# rake rubocop_gradual_debug:check # Run RuboCop Gradual to check the lock file
|
44
|
+
# rake rubocop_gradual_debug:force_update # Run RuboCop Gradual to force update the l...
|
45
|
+
# rake spec # Run RSpec code examples
|
46
|
+
# rake test # Run tests
|
47
|
+
# rake yard # Generate YARD Documentation
|
48
|
+
#
|
56
49
|
|
57
50
|
# External gems
|
58
51
|
require "bundler/gem_tasks" if !Dir[File.join(__dir__, "*.gemspec")].empty?
|
data/exe/kettle-commit-msg
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# vim: set syntax=ruby
|
3
3
|
|
4
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
|
5
|
-
|
6
4
|
require "rubygems"
|
7
|
-
|
5
|
+
begin
|
6
|
+
require "bundler/setup"
|
7
|
+
rescue LoadError
|
8
|
+
# Allow running outside of Bundler; runtime deps should still be available via rubygems
|
9
|
+
end
|
8
10
|
|
9
11
|
# Standard library
|
10
12
|
require "erb"
|
@@ -51,7 +53,7 @@ class GitCommitFooter
|
|
51
53
|
NAME_ASSIGNMENT_REGEX = /\bname\s*=\s*(["'])([^"']+)\1/.freeze
|
52
54
|
FOOTER_APPEND = ENV.fetch("GIT_HOOK_FOOTER_APPEND", "false").casecmp("true").zero?
|
53
55
|
SENTINEL = ENV["GIT_HOOK_FOOTER_SENTINEL"] # No default to avoid accidental duplicate commit of a footer via ammended commits
|
54
|
-
raise "Set GIT_HOOK_FOOTER_SENTINEL=<footer sentinel> in .env.local (e.g., '⚡️ A message from a fellow meat-based-AI ⚡️')" if FOOTER_APPEND && SENTINEL.nil? || SENTINEL.empty?
|
56
|
+
raise "Set GIT_HOOK_FOOTER_SENTINEL=<footer sentinel> in .env.local (e.g., '⚡️ A message from a fellow meat-based-AI ⚡️')" if FOOTER_APPEND && (SENTINEL.nil? || SENTINEL.to_s.empty?)
|
55
57
|
|
56
58
|
class << self
|
57
59
|
def git_toplevel
|
data/exe/kettle-readme-backers
CHANGED
@@ -20,7 +20,11 @@
|
|
20
20
|
# # or ensure .opencollective.yml exists with collective: "kettle-rb"
|
21
21
|
|
22
22
|
require "rubygems"
|
23
|
-
|
23
|
+
begin
|
24
|
+
require "bundler/setup"
|
25
|
+
rescue LoadError
|
26
|
+
# Allow running outside of Bundler; runtime deps should still be available via rubygems
|
27
|
+
end
|
24
28
|
|
25
29
|
require "yaml"
|
26
30
|
require "json"
|
data/exe/kettle-release
CHANGED
@@ -51,11 +51,47 @@ module Kettle
|
|
51
51
|
|
52
52
|
ensure_bundler_2_7_plus!
|
53
53
|
|
54
|
-
run_cmd!("bin/setup")
|
55
|
-
run_cmd!("bin/rake")
|
56
|
-
|
57
54
|
version = detect_version
|
58
55
|
puts "Detected version: #{version.inspect}"
|
56
|
+
|
57
|
+
# Sanity check against latest released gem version (RubyGems)
|
58
|
+
begin
|
59
|
+
gem_name = detect_gem_name
|
60
|
+
latest_overall, latest_for_series = latest_released_versions(gem_name, version)
|
61
|
+
if latest_overall
|
62
|
+
msg = "Latest released: #{latest_overall}"
|
63
|
+
if latest_for_series && latest_for_series != latest_overall
|
64
|
+
msg += " | Latest for series #{Gem::Version.new(version).segments[0, 2].join(".")}.x: #{latest_for_series}"
|
65
|
+
elsif latest_for_series
|
66
|
+
msg += " (matches current series)"
|
67
|
+
end
|
68
|
+
puts msg
|
69
|
+
|
70
|
+
# Choose the comparison target:
|
71
|
+
# - If current series (MAJOR.MINOR) is behind overall latest, compare against the latest for the current series.
|
72
|
+
# - Otherwise (same or ahead), compare against overall latest.
|
73
|
+
cur = Gem::Version.new(version)
|
74
|
+
overall = Gem::Version.new(latest_overall)
|
75
|
+
cur_series = cur.segments[0, 2]
|
76
|
+
overall_series = overall.segments[0, 2]
|
77
|
+
target = if (cur_series <=> overall_series) == -1
|
78
|
+
latest_for_series # may be nil if no prior release in this series
|
79
|
+
else
|
80
|
+
latest_overall
|
81
|
+
end
|
82
|
+
if target && Gem::Version.new(version) <= Gem::Version.new(target)
|
83
|
+
series = cur_series.join(".")
|
84
|
+
warn("version.rb (#{version}) must be greater than the latest released version for series #{series}. Latest for series: #{target}.")
|
85
|
+
warn("Tip: bump PATCH for a stable branch release, or bump MINOR/MAJOR when on trunk.")
|
86
|
+
abort("Aborting: version bump required.")
|
87
|
+
end
|
88
|
+
else
|
89
|
+
puts "Could not determine latest released version from RubyGems (offline?). Proceeding without sanity check."
|
90
|
+
end
|
91
|
+
rescue StandardError => e
|
92
|
+
warn("Warning: failed to check RubyGems for latest version (#{e.class}: #{e.message}). Proceeding.")
|
93
|
+
end
|
94
|
+
|
59
95
|
puts "Have you updated lib/**/version.rb and CHANGELOG.md for v#{version}? [y/N]"
|
60
96
|
print("> ")
|
61
97
|
ans = $stdin.gets&.strip
|
@@ -75,7 +111,10 @@ module Kettle
|
|
75
111
|
end
|
76
112
|
|
77
113
|
ensure_git_user!
|
78
|
-
commit_release_prep!(version)
|
114
|
+
committed = commit_release_prep!(version)
|
115
|
+
|
116
|
+
# Optional: run a local CI check with 'act' prior to pushing
|
117
|
+
maybe_run_local_ci_before_push!(committed)
|
79
118
|
|
80
119
|
trunk = detect_trunk_branch
|
81
120
|
feature = current_branch
|
@@ -234,6 +273,86 @@ module Kettle
|
|
234
273
|
end
|
235
274
|
end
|
236
275
|
|
276
|
+
# Run a local CI workflow using 'act' before pushing the release prep commit, if enabled.
|
277
|
+
# Controlled by env var K_RELEASE_LOCAL_CI:
|
278
|
+
# - "true" => run without prompt
|
279
|
+
# - "ask" => prompt user [Y/n]
|
280
|
+
# - anything else or unset => skip
|
281
|
+
# Workflow selection:
|
282
|
+
# - If .github/workflows/locked_deps.yml (or .yaml) exists, default to it.
|
283
|
+
# - Else, use the first workflow from CIHelpers.workflows_list unless K_RELEASE_LOCAL_CI_WORKFLOW points to another file.
|
284
|
+
# On failure, soft reset the last commit if one was created, then abort.
|
285
|
+
def maybe_run_local_ci_before_push!(committed)
|
286
|
+
mode = (ENV["K_RELEASE_LOCAL_CI"] || "").strip.downcase
|
287
|
+
run_it = case mode
|
288
|
+
when "true", "1", "yes", "y" then true
|
289
|
+
when "ask"
|
290
|
+
print("Run local CI with 'act' before pushing? [Y/n] ")
|
291
|
+
ans = $stdin.gets&.strip
|
292
|
+
ans.nil? || ans.empty? || ans =~ /\Ay(es)?\z/i
|
293
|
+
else
|
294
|
+
false
|
295
|
+
end
|
296
|
+
return unless run_it
|
297
|
+
|
298
|
+
# Check for 'act'
|
299
|
+
act_ok = begin
|
300
|
+
system("act", "--version", out: File::NULL, err: File::NULL)
|
301
|
+
rescue StandardError
|
302
|
+
false
|
303
|
+
end
|
304
|
+
unless act_ok
|
305
|
+
puts "Skipping local CI: 'act' command not found. Install https://github.com/nektos/act to enable."
|
306
|
+
return
|
307
|
+
end
|
308
|
+
|
309
|
+
root = Kettle::Dev::CIHelpers.project_root
|
310
|
+
workflows_dir = File.join(root, ".github", "workflows")
|
311
|
+
candidates = Kettle::Dev::CIHelpers.workflows_list(root)
|
312
|
+
|
313
|
+
# Explicit override via env
|
314
|
+
chosen = (ENV["K_RELEASE_LOCAL_CI_WORKFLOW"] || "").strip
|
315
|
+
if !chosen.empty?
|
316
|
+
# Normalize to a basename with extension
|
317
|
+
if chosen !~ /\.ya?ml\z/
|
318
|
+
chosen = "#{chosen}.yml"
|
319
|
+
end
|
320
|
+
else
|
321
|
+
# Default to locked_deps if present
|
322
|
+
chosen = if candidates.include?("locked_deps.yml")
|
323
|
+
"locked_deps.yml"
|
324
|
+
elsif candidates.include?("locked_deps.yaml")
|
325
|
+
"locked_deps.yaml"
|
326
|
+
else
|
327
|
+
candidates.first
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
unless chosen
|
332
|
+
puts "Skipping local CI: no workflows found under .github/workflows."
|
333
|
+
return
|
334
|
+
end
|
335
|
+
|
336
|
+
file_path = File.join(workflows_dir, chosen)
|
337
|
+
unless File.file?(file_path)
|
338
|
+
puts "Skipping local CI: selected workflow not found: #{file_path}"
|
339
|
+
return
|
340
|
+
end
|
341
|
+
|
342
|
+
puts "== Running local CI with act on #{chosen} =="
|
343
|
+
ok = system("act", "-W", file_path)
|
344
|
+
if ok
|
345
|
+
puts "Local CI succeeded for #{chosen}."
|
346
|
+
else
|
347
|
+
puts "Local CI failed for #{chosen}."
|
348
|
+
if committed
|
349
|
+
puts "Rolling back release prep commit (soft reset)..."
|
350
|
+
system("git", "reset", "--soft", "HEAD^")
|
351
|
+
end
|
352
|
+
abort("Aborting due to local CI failure.")
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
237
356
|
def detect_version
|
238
357
|
# Look for lib/**/version.rb and extract VERSION constant string
|
239
358
|
candidates = Dir[File.join(@root, "lib", "**", "version.rb")]
|
@@ -245,14 +364,48 @@ module Kettle
|
|
245
364
|
m[2]
|
246
365
|
end
|
247
366
|
|
367
|
+
def detect_gem_name
|
368
|
+
# Find a .gemspec in project root and extract spec.name
|
369
|
+
gemspecs = Dir[File.join(@root, "*.gemspec")]
|
370
|
+
abort("Could not find a .gemspec in project root.") if gemspecs.empty?
|
371
|
+
path = gemspecs.min
|
372
|
+
content = File.read(path)
|
373
|
+
m = content.match(/spec\.name\s*=\s*(["'])([^"']+)\1/)
|
374
|
+
abort("Could not determine gem name from #{path}.") unless m
|
375
|
+
m[2]
|
376
|
+
end
|
377
|
+
|
378
|
+
# Returns [latest_overall, latest_for_series] as strings (or nils)
|
379
|
+
def latest_released_versions(gem_name, current_version)
|
380
|
+
uri = URI("https://rubygems.org/api/v1/versions/#{gem_name}.json")
|
381
|
+
res = Net::HTTP.get_response(uri)
|
382
|
+
return [nil, nil] unless res.is_a?(Net::HTTPSuccess)
|
383
|
+
data = JSON.parse(res.body)
|
384
|
+
versions = data.map { |h| h["number"] }.compact
|
385
|
+
# Drop pre-releases if API indicates; fall back to simple filter by '-' pattern
|
386
|
+
versions.reject! { |v| v.to_s.include?("-pre") || v.to_s.include?(".pre") || v.to_s =~ /[a-zA-Z]/ }
|
387
|
+
gversions = versions.map { |s| Gem::Version.new(s) }.sort
|
388
|
+
latest_overall = gversions.last&.to_s
|
389
|
+
|
390
|
+
cur = Gem::Version.new(current_version)
|
391
|
+
series = cur.segments[0, 2]
|
392
|
+
series_versions = gversions.select { |gv| gv.segments[0, 2] == series }
|
393
|
+
latest_series = series_versions.last&.to_s
|
394
|
+
[latest_overall, latest_series]
|
395
|
+
rescue StandardError
|
396
|
+
[nil, nil]
|
397
|
+
end
|
398
|
+
|
248
399
|
def commit_release_prep!(version)
|
249
400
|
msg = "🔖 Prepare release v#{version}"
|
250
401
|
# Only commit if there are changes (version/changelog)
|
251
402
|
out, _ = git_output(["status", "--porcelain"])
|
252
403
|
if out.empty?
|
253
404
|
puts "No changes to commit for release prep (continuing)."
|
405
|
+
false
|
254
406
|
else
|
255
407
|
run_cmd!(%(git commit -am #{Shellwords.escape(msg)}))
|
408
|
+
true
|
256
409
|
end
|
257
410
|
end
|
258
411
|
|
@@ -65,6 +65,21 @@ namespace :ci do
|
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
+
get_sha = proc do
|
69
|
+
out, status = Open3.capture2("git", "rev-parse", "--short", "HEAD")
|
70
|
+
status.success? ? out.strip : nil
|
71
|
+
end
|
72
|
+
|
73
|
+
get_upstream = proc do
|
74
|
+
out, status = Open3.capture2("git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}")
|
75
|
+
if status.success?
|
76
|
+
out.strip
|
77
|
+
else
|
78
|
+
br = get_branch.call
|
79
|
+
br ? "origin/#{br}" : nil
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
68
83
|
status_emoji = proc do |status, conclusion|
|
69
84
|
case status
|
70
85
|
when "queued"
|
@@ -196,6 +211,20 @@ namespace :ci do
|
|
196
211
|
owner, repo = org if org
|
197
212
|
token = ENV["GITHUB_TOKEN"] || ENV["GH_TOKEN"]
|
198
213
|
|
214
|
+
# Header with remote branch and SHA
|
215
|
+
upstream = get_upstream.call
|
216
|
+
sha = get_sha.call
|
217
|
+
if org && branch
|
218
|
+
puts "Repo: #{owner}/#{repo}"
|
219
|
+
elsif org
|
220
|
+
puts "Repo: #{owner}/#{repo}"
|
221
|
+
else
|
222
|
+
puts "Repo: n/a"
|
223
|
+
end
|
224
|
+
puts "Upstream: #{upstream || "n/a"}"
|
225
|
+
puts "HEAD: #{sha || "n/a"}"
|
226
|
+
puts
|
227
|
+
|
199
228
|
puts "Select a workflow to run with 'act':"
|
200
229
|
|
201
230
|
# Render initial menu with placeholder statuses
|
@@ -239,16 +268,40 @@ namespace :ci do
|
|
239
268
|
Thread.exit
|
240
269
|
end
|
241
270
|
uri = URI("https://api.github.com/repos/#{ow}/#{rp}/actions/workflows/#{f}/runs?branch=#{URI.encode_www_form_component(br)}&per_page=1")
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
271
|
+
poll_interval = Integer(ENV["CI_ACT_POLL_INTERVAL"] || 5)
|
272
|
+
loop do
|
273
|
+
begin
|
274
|
+
req = Net::HTTP::Get.new(uri)
|
275
|
+
req["User-Agent"] = "ci:act rake task"
|
276
|
+
req["Authorization"] = "token #{tk}" if tk && !tk.empty?
|
277
|
+
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
|
278
|
+
if res.is_a?(Net::HTTPSuccess)
|
279
|
+
data = JSON.parse(res.body)
|
280
|
+
run = data["workflow_runs"]&.first
|
281
|
+
if run
|
282
|
+
st = run["status"]
|
283
|
+
con = run["conclusion"]
|
284
|
+
emoji = case st
|
285
|
+
when "queued" then "⏳️"
|
286
|
+
when "in_progress" then "👟"
|
287
|
+
when "completed" then ((con == "success") ? "✅" : "🍅")
|
288
|
+
else "⏳️"
|
289
|
+
end
|
290
|
+
details = [st, con].compact.join("/")
|
291
|
+
status_q << [c, f, "#{emoji} (#{details})"]
|
292
|
+
break if st == "completed"
|
293
|
+
else
|
294
|
+
status_q << [c, f, "none"]
|
295
|
+
break
|
296
|
+
end
|
297
|
+
else
|
298
|
+
status_q << [c, f, "fail #{res.code}"]
|
299
|
+
end
|
300
|
+
rescue StandardError
|
301
|
+
status_q << [c, f, "err"]
|
251
302
|
end
|
303
|
+
sleep(poll_interval)
|
304
|
+
end
|
252
305
|
rescue StandardError
|
253
306
|
status_q << [c, f, "err"]
|
254
307
|
end
|
@@ -329,6 +329,17 @@ namespace :kettle do
|
|
329
329
|
end
|
330
330
|
end
|
331
331
|
|
332
|
+
# 7b) certs/pboling.pem
|
333
|
+
begin
|
334
|
+
cert_src = File.join(gem_checkout_root, "certs", "pboling.pem")
|
335
|
+
cert_dest = File.join(project_root, "certs", "pboling.pem")
|
336
|
+
if File.exist?(cert_src)
|
337
|
+
helpers.copy_file_with_prompt(cert_src, cert_dest, allow_create: true, allow_replace: true)
|
338
|
+
end
|
339
|
+
rescue StandardError => e
|
340
|
+
puts "WARNING: Skipped copying certs/pboling.pem due to #{e.class}: #{e.message}"
|
341
|
+
end
|
342
|
+
|
332
343
|
# After creating or replacing .envrc or .env.local.example, require review and exit unless allowed
|
333
344
|
begin
|
334
345
|
envrc_path = File.join(project_root, ".envrc")
|
data/lib/kettle/dev/version.rb
CHANGED
@@ -24,6 +24,25 @@ module Kettle
|
|
24
24
|
def self.failed?: ({ "status" => String?, "conclusion" => String? } | nil run) -> bool
|
25
25
|
|
26
26
|
def self.default_token: () -> String?
|
27
|
+
|
28
|
+
# GitLab support
|
29
|
+
def self.origin_url: () -> String?
|
30
|
+
|
31
|
+
def self.repo_info_gitlab: () -> [String, String]?
|
32
|
+
|
33
|
+
def self.default_gitlab_token: () -> String?
|
34
|
+
|
35
|
+
def self.gitlab_latest_pipeline: (
|
36
|
+
owner: String,
|
37
|
+
repo: String,
|
38
|
+
?branch: String?,
|
39
|
+
?host: String,
|
40
|
+
?token: String?
|
41
|
+
) -> { "status" => String?, "web_url" => String?, "id" => untyped }?
|
42
|
+
|
43
|
+
def self.gitlab_success?: ({ "status" => String? } | nil pipeline) -> bool
|
44
|
+
|
45
|
+
def self.gitlab_failed?: ({ "status" => String? } | nil pipeline) -> bool
|
27
46
|
end
|
28
47
|
end
|
29
48
|
end
|
data.tar.gz.sig
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
2�j��"z:,K<�j�(�c��Z�l��n:gmm�&�(�#d����*�h�B�<DVHS�(w��ݜX��5�D�/�4�!l$ʉݨ3���l��P8Q��� '��������z(R���S4�O�˦l��Bs:L�����߁&����QXx���2��KH1��/y��C�KE𢡄C��ß�p�a�K����Q�S��]>�<Jڒ��b��T�}�1}p\hnv(Ng��R Lb���ܘ��@�4�����ٷ��i�Y�&I�bY<}��Z����"3(�R�~wI<��X#G�/"�z�_۪�,��!���[���۔����Z�0(7#1��_tGԸޯ<?�d�l
|
2
|
+
��4�Vc���#�����M�m�V��������
|
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: 1.0.
|
4
|
+
version: 1.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter H. Boling
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt
|
36
36
|
L9nRqA==
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2025-08-
|
38
|
+
date: 2025-08-25 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: version_gem
|
@@ -203,8 +203,6 @@ extra_rdoc_files:
|
|
203
203
|
- REEK
|
204
204
|
- RUBOCOP.md
|
205
205
|
- SECURITY.md
|
206
|
-
- checksums/kettle-dev-1.0.7.gem.sha256
|
207
|
-
- checksums/kettle-dev-1.0.7.gem.sha512
|
208
206
|
files:
|
209
207
|
- ".devcontainer/devcontainer.json"
|
210
208
|
- ".envrc"
|
@@ -246,6 +244,7 @@ files:
|
|
246
244
|
- Appraisal.root.gemfile
|
247
245
|
- Appraisals
|
248
246
|
- CHANGELOG.md
|
247
|
+
- CHANGELOG.md.example
|
249
248
|
- CITATION.cff
|
250
249
|
- CODE_OF_CONDUCT.md
|
251
250
|
- CONTRIBUTING.md
|
@@ -256,8 +255,6 @@ files:
|
|
256
255
|
- RUBOCOP.md
|
257
256
|
- Rakefile
|
258
257
|
- SECURITY.md
|
259
|
-
- checksums/kettle-dev-1.0.7.gem.sha256
|
260
|
-
- checksums/kettle-dev-1.0.7.gem.sha512
|
261
258
|
- exe/kettle-commit-msg
|
262
259
|
- exe/kettle-readme-backers
|
263
260
|
- exe/kettle-release
|
@@ -290,10 +287,10 @@ licenses:
|
|
290
287
|
- MIT
|
291
288
|
metadata:
|
292
289
|
homepage_uri: https://kettle-dev.galtzo.com/
|
293
|
-
source_code_uri: https://github.com/galtzo-floss/kettle-dev/tree/v1.0.
|
294
|
-
changelog_uri: https://github.com/galtzo-floss/kettle-dev/blob/v1.0.
|
290
|
+
source_code_uri: https://github.com/galtzo-floss/kettle-dev/tree/v1.0.9
|
291
|
+
changelog_uri: https://github.com/galtzo-floss/kettle-dev/blob/v1.0.9/CHANGELOG.md
|
295
292
|
bug_tracker_uri: https://github.com/galtzo-floss/kettle-dev/issues
|
296
|
-
documentation_uri: https://www.rubydoc.info/gems/kettle-dev/1.0.
|
293
|
+
documentation_uri: https://www.rubydoc.info/gems/kettle-dev/1.0.9
|
297
294
|
funding_uri: https://github.com/sponsors/pboling
|
298
295
|
wiki_uri: https://github.com/galtzo-floss/kettle-dev/wiki
|
299
296
|
news_uri: https://www.railsbling.com/tags/kettle-dev
|
metadata.gz.sig
CHANGED
Binary file
|
@@ -1 +0,0 @@
|
|
1
|
-
f5a4e19daf87b88e9f61c4bfec481ea915f5f734cf665dbcbd34be6979718c89
|
@@ -1 +0,0 @@
|
|
1
|
-
7b99485e9d4411f2766d7cf53121923e26284f455146a7ba281982634cc534384d91739d83113618852f8abd5093dbc465362afff62e5da041f996bed2bd3a4b
|