feat: add security improvements to CI (#142)

## Summary

- Add dual commit signature verification (trusted PRs with comments,
forked PRs read-only)
- Split security job into audit-only (forked PRs) and SonarCloud-enabled
(trusted branches)
- Add forked PR isolation filter on `update_prlog`
- Add signature verification as gating requirement for `update_prlog`

Part of Phase 3 security improvements rollout across jerus-org repos.

## Test plan

- [ ] Signature verification jobs run on PRs
- [ ] Security jobs split correctly (audit-only vs SonarCloud)
- [ ] `update_prlog` filters forked PRs
- [ ] `update_prlog` requires signature verification

🤖 Generated with [Claude Code](https://claude.com/claude-code)
This commit is contained in:
Jeremiah Russell
2026-02-11 14:13:29 +00:00
committed by GitHub
3 changed files with 49 additions and 12 deletions

View File

@@ -49,6 +49,25 @@ workflows:
- << pipeline.parameters.validation_flag >> - << pipeline.parameters.validation_flag >>
- not: << pipeline.parameters.release_flag >> - not: << pipeline.parameters.release_flag >>
jobs: jobs:
# Signature verification for trusted PRs (with write access for comments)
- toolkit/verify_commit_signatures:
name: verify_commit_signatures_trusted
context: bot-check
post_comment: true
update_pcu: false
filters:
branches:
ignore:
- main
- /pull\/[0-9]+/
# Signature verification for forked PRs (read-only, no comments)
- toolkit/verify_commit_signatures:
name: verify_commit_signatures_forked
post_comment: false
update_pcu: false
filters:
branches:
only: /pull\/[0-9]+/
- toolkit/label: - toolkit/label:
min_rust_version: << pipeline.parameters.min_rust_version >> min_rust_version: << pipeline.parameters.min_rust_version >>
context: pcu-app context: pcu-app
@@ -73,18 +92,34 @@ workflows:
- toolkit/idiomatic_rust: - toolkit/idiomatic_rust:
min_rust_version: << pipeline.parameters.min_rust_version >> min_rust_version: << pipeline.parameters.min_rust_version >>
- toolkit/security: - toolkit/security:
name: security audit only
sonarcloud: false
ignore_advisories: RUSTSEC-2025-0066
filters:
branches:
only: /pull\/[0-9]+/
- toolkit/security:
name: security with sonarcloud
context: SonarCloud context: SonarCloud
ignore_advisories: RUSTSEC-2025-0066 ignore_advisories: RUSTSEC-2025-0066
filters:
branches:
ignore:
- /pull\/[0-9]+/
- main
- toolkit/update_prlog: - toolkit/update_prlog:
filters: filters:
branches: branches:
ignore: ignore:
- /pull\/[0-9]+/
- main - main
requires: requires:
- verify_commit_signatures_trusted
- toolkit/required_builds - toolkit/required_builds
- toolkit/test_doc_build - toolkit/test_doc_build
- toolkit/idiomatic_rust - toolkit/idiomatic_rust
- toolkit/security - security audit only
- security with sonarcloud
- toolkit/common_tests - toolkit/common_tests
context: context:
- release - release

22
Cargo.lock generated
View File

@@ -222,9 +222,9 @@ checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
[[package]] [[package]]
name = "bytes" name = "bytes"
version = "1.11.0" version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
dependencies = [ dependencies = [
"serde", "serde",
] ]
@@ -1422,9 +1422,9 @@ checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
[[package]] [[package]]
name = "num-conv" name = "num-conv"
version = "0.1.0" version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050"
[[package]] [[package]]
name = "num-traits" name = "num-traits"
@@ -2090,9 +2090,9 @@ dependencies = [
[[package]] [[package]]
name = "time" name = "time"
version = "0.3.44" version = "0.3.47"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
dependencies = [ dependencies = [
"deranged", "deranged",
"itoa", "itoa",
@@ -2100,22 +2100,22 @@ dependencies = [
"num-conv", "num-conv",
"num_threads", "num_threads",
"powerfmt", "powerfmt",
"serde", "serde_core",
"time-core", "time-core",
"time-macros", "time-macros",
] ]
[[package]] [[package]]
name = "time-core" name = "time-core"
version = "0.1.6" version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
[[package]] [[package]]
name = "time-macros" name = "time-macros"
version = "0.2.24" version = "0.2.27"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
dependencies = [ dependencies = [
"num-conv", "num-conv",
"time-core", "time-core",

View File

@@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- ✨ add optional rules path argument to cli(pr [#110]) - ✨ add optional rules path argument to cli(pr [#110])
- ✨ enhance rules configuration(pr [#112]) - ✨ enhance rules configuration(pr [#112])
- BREAKING: migrate to circleci-toolkit v4.2.1(pr [#134]) - BREAKING: migrate to circleci-toolkit v4.2.1(pr [#134])
- add security improvements to CI(pr [#142])
### Changed ### Changed
@@ -413,6 +414,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[#139]: https://github.com/jerus-org/cull-gmail/pull/139 [#139]: https://github.com/jerus-org/cull-gmail/pull/139
[#140]: https://github.com/jerus-org/cull-gmail/pull/140 [#140]: https://github.com/jerus-org/cull-gmail/pull/140
[#141]: https://github.com/jerus-org/cull-gmail/pull/141 [#141]: https://github.com/jerus-org/cull-gmail/pull/141
[#142]: https://github.com/jerus-org/cull-gmail/pull/142
[Unreleased]: https://github.com/jerus-org/cull-gmail/compare/v0.0.16...HEAD [Unreleased]: https://github.com/jerus-org/cull-gmail/compare/v0.0.16...HEAD
[0.0.16]: https://github.com/jerus-org/cull-gmail/compare/v0.0.15...v0.0.16 [0.0.16]: https://github.com/jerus-org/cull-gmail/compare/v0.0.15...v0.0.16
[0.0.15]: https://github.com/jerus-org/cull-gmail/compare/v0.0.14...v0.0.15 [0.0.15]: https://github.com/jerus-org/cull-gmail/compare/v0.0.14...v0.0.15