gem-ci 0.2.1 → 0.4.0
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
- data/.env.example +35 -0
- data/.secrets.example +33 -0
- data/.slack/app-manifest.json +23 -0
- data/CHANGELOG.md +114 -0
- data/README.md +104 -75
- data/docs/_config.yml +60 -0
- data/docs/diagrams/ci-workflow-overview.md +28 -17
- data/docs/diagrams/gitflow-diagram.md +233 -0
- data/docs/guides/gitflow.md +266 -0
- data/docs/guides/local-testing.md +323 -0
- data/docs/index.md +112 -0
- data/docs/setup/github-pages.md +147 -0
- data/docs/{SECRETS_SETUP_GUIDE.md → setup/secrets.md} +7 -7
- data/docs/workflows/overview.md +259 -0
- data/lib/gem_ci/version.rb +1 -1
- data/public/gem-ci-transparent-bg.png +0 -0
- data/public/gem-ci.jpeg +0 -0
- data/public/gem-ci.svg +3621 -0
- data/scripts/README.md +258 -0
- data/scripts/test-local +315 -0
- data/scripts/test-workflows +303 -0
- metadata +19 -4
- data/docs/MANUAL_WORKFLOW_TESTING.md +0 -190
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1de4bfa589da0bd420e8c7a1a1f0b16cd4246a155a7c56d00d9f95fc2b3b0bf
|
4
|
+
data.tar.gz: c5aeb1437ee5621aa4b7d7995620e8e2824639f88b2999fa3906227707ea3a73
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '042285d28439cb27b9ac042368703214d0234a1fb4ee058f51bc55847b69e882959ef9714ad19ad189066013520a711195373a8af6c2af2c4bde2133124c5fc7'
|
7
|
+
data.tar.gz: 46b2ab6d9317c1dfaaed75f1a1777f6e6dc91e0f852dea2d9b51ad4d8d21530a730ec240a19a93e17dc4132892d623025f1b40d4213c77dba422de034093ea8f
|
data/.env.example
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Example environment variables file for local testing with act
|
2
|
+
# Copy this file to .env.local or .env.test and modify as needed
|
3
|
+
# Format: KEY=VALUE (dotenv format)
|
4
|
+
|
5
|
+
# Ruby version for testing (override workflow default)
|
6
|
+
RUBY_VERSION=3.3
|
7
|
+
|
8
|
+
# Node.js version for documentation builds
|
9
|
+
NODE_VERSION=20
|
10
|
+
|
11
|
+
# Cache version (for debugging cache issues)
|
12
|
+
CACHE_VERSION=v2
|
13
|
+
|
14
|
+
# Workflow behavior controls
|
15
|
+
DEFAULT_TIMEOUT=300
|
16
|
+
API_RETRY_COUNT=3
|
17
|
+
|
18
|
+
# Testing flags (prevent actual publishing/deployment)
|
19
|
+
DRY_RUN=true
|
20
|
+
SKIP_PUBLISH=true
|
21
|
+
SKIP_DEPLOY=true
|
22
|
+
|
23
|
+
# Development/debug settings
|
24
|
+
DEBUG=true
|
25
|
+
VERBOSE=true
|
26
|
+
LOG_LEVEL=debug
|
27
|
+
|
28
|
+
# Override workflow settings for local testing
|
29
|
+
GITHUB_REPOSITORY=your-username/your-repo
|
30
|
+
GITHUB_REF=refs/heads/main
|
31
|
+
GITHUB_SHA=abc1234567890
|
32
|
+
|
33
|
+
# Custom environment variables for your workflows
|
34
|
+
# Add any environment variables your workflows use
|
35
|
+
# CUSTOM_ENV_VAR=local_value
|
data/.secrets.example
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# Example secrets file for local testing with act
|
2
|
+
# Copy this file to .secrets and fill in your actual values
|
3
|
+
# Format: KEY=VALUE (dotenv format)
|
4
|
+
|
5
|
+
# GitHub Personal Access Token (required)
|
6
|
+
# Get from: GitHub → Settings → Developer settings → Personal access tokens
|
7
|
+
# Permissions needed: repo, workflow, write:packages
|
8
|
+
GITHUB_TOKEN=github_pat_11ABCDEFG_your_token_here
|
9
|
+
|
10
|
+
# GitHub App credentials (required for some workflows)
|
11
|
+
# Get from: GitHub → Settings → Developer settings → GitHub Apps
|
12
|
+
APP_ID=123456
|
13
|
+
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
|
14
|
+
your_private_key_content_here
|
15
|
+
-----END RSA PRIVATE KEY-----"
|
16
|
+
|
17
|
+
# Slack Bot Token (optional - for rich notifications using official Slack action)
|
18
|
+
# Get from: api.slack.com → Your App → OAuth & Permissions
|
19
|
+
# Scopes needed: chat:write
|
20
|
+
SLACK_BOT_TOKEN=xoxb-random_string_here
|
21
|
+
|
22
|
+
# Slack Channel ID (optional - for notifications)
|
23
|
+
# Get from: Slack → Right-click channel → View channel details
|
24
|
+
SLACK_CHANNEL_ID=C1234567890
|
25
|
+
|
26
|
+
# RubyGems API Key (optional - for publishing)
|
27
|
+
# Get from: rubygems.org → Account → API Keys
|
28
|
+
# Permissions needed: Push rubygems
|
29
|
+
RUBYGEMS_API_KEY=rubygems_your_api_key_here
|
30
|
+
|
31
|
+
# Additional secrets as needed
|
32
|
+
# Add any other secrets your workflows require
|
33
|
+
# MY_CUSTOM_SECRET=value
|
@@ -0,0 +1,23 @@
|
|
1
|
+
{
|
2
|
+
"display_information": {
|
3
|
+
"name": "gem-ci",
|
4
|
+
"description": "Automated CI/CD notifications for GemCI",
|
5
|
+
"background_color": "#2c3e50"
|
6
|
+
},
|
7
|
+
"features": {
|
8
|
+
"bot_user": {
|
9
|
+
"display_name": "gem-ci",
|
10
|
+
"always_online": true
|
11
|
+
}
|
12
|
+
},
|
13
|
+
"oauth_config": {
|
14
|
+
"scopes": {
|
15
|
+
"bot": ["chat:write", "chat:write.public"]
|
16
|
+
}
|
17
|
+
},
|
18
|
+
"settings": {
|
19
|
+
"org_deploy_enabled": false,
|
20
|
+
"socket_mode_enabled": false,
|
21
|
+
"token_rotation_enabled": false
|
22
|
+
}
|
23
|
+
}
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,119 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [0.4.0](https://github.com/patrick204nqh/gem-ci/compare/gem-ci-v0.3.0...gem-ci/v0.4.0) (2025-07-27)
|
4
|
+
|
5
|
+
|
6
|
+
### 🚀 Features
|
7
|
+
|
8
|
+
* Add composite actions for performance monitoring, command retry, test execution, and environment setup ([a4ffac6](https://github.com/patrick204nqh/gem-ci/commit/a4ffac66b796e7a22ee857d20fc4aed6d4c6717a))
|
9
|
+
* Add Dependabot configuration for automated dependency updates ([14e2b9b](https://github.com/patrick204nqh/gem-ci/commit/14e2b9b0b09bc4fc308ecb9eb594cdcc41650aaf))
|
10
|
+
* Add GitFlow guide and workflow diagram for gem-ci projects ([bccdf0b](https://github.com/patrick204nqh/gem-ci/commit/bccdf0b056fe181ae0586f370a0a5da25dc65d77))
|
11
|
+
* Add GitHub App token generation for PR status updates ([3662c2e](https://github.com/patrick204nqh/gem-ci/commit/3662c2e1366142051eb40a96a61944a2cb1bc72a))
|
12
|
+
* Add local testing scripts for gem-ci workflows ([37ac022](https://github.com/patrick204nqh/gem-ci/commit/37ac0224a74d6410bc31f796333271a8330c6a47))
|
13
|
+
* Add markdownlint configuration with relaxed rules for better developer experience ([e8e905a](https://github.com/patrick204nqh/gem-ci/commit/e8e905a088200bb094630558ec02e5fc283b9620))
|
14
|
+
* Add release management configuration and update gem structure ([bd8ae0c](https://github.com/patrick204nqh/gem-ci/commit/bd8ae0c5774f7be38211b8aa14423d87ae72edbf))
|
15
|
+
* **ci:** Add PR status update action for CI, Security, and Quality workflows ([b9a42d9](https://github.com/patrick204nqh/gem-ci/commit/b9a42d97c4a8bd750bb87b29415929784e058261))
|
16
|
+
* Enhance PR status comment with structured table for workflow results ([3f3520d](https://github.com/patrick204nqh/gem-ci/commit/3f3520df4f1263059fe8ac76379e0bccee2a8326))
|
17
|
+
* Implement GitHub reaction actions for PRs, releases, and comments ([4fb4d24](https://github.com/patrick204nqh/gem-ci/commit/4fb4d24b4ca354128674f6b0ca3997cf977f0388))
|
18
|
+
* Refactor bot command workflow to enhance command handling and response structure ([5262bc3](https://github.com/patrick204nqh/gem-ci/commit/5262bc38441df89ad1f51fb99f95a337e7e20ec2))
|
19
|
+
* Update Ruby version in branch protection and push restrictions; add GitHub App token generation to ecosystem workflow ([611cd3e](https://github.com/patrick204nqh/gem-ci/commit/611cd3e37d64b5e290d73e9feebe28e306a4d6d6))
|
20
|
+
|
21
|
+
|
22
|
+
### 🐛 Bug Fixes
|
23
|
+
|
24
|
+
* Add missing checkout step in stale management job ([679a603](https://github.com/patrick204nqh/gem-ci/commit/679a60377930993c42745f6cc0c0b7f24781961c))
|
25
|
+
* Correct description formatting for sponsored label in labels.yml ([a013d1c](https://github.com/patrick204nqh/gem-ci/commit/a013d1c1a4a6462eb53b13bc783095858ac9ad6f))
|
26
|
+
* Improve command execution readability in CI jobs ([c54b578](https://github.com/patrick204nqh/gem-ci/commit/c54b578385c3eabe2c1ee54c9c4ad731daa4ff09))
|
27
|
+
* Improve description formatting in gemspec for better readability ([447313f](https://github.com/patrick204nqh/gem-ci/commit/447313f12a96970181f5472a2b575ff2a6349b81))
|
28
|
+
* Simplify command execution in CI jobs for better readability ([aa9a8d2](https://github.com/patrick204nqh/gem-ci/commit/aa9a8d2135852ff7639fa1cbc46667ea3d90949e))
|
29
|
+
* Update gemspec metadata to include homepage URI and correct documentation URI ([02dfb2b](https://github.com/patrick204nqh/gem-ci/commit/02dfb2ba4c5c60a56123a4e00bbd56beef5e1b1e))
|
30
|
+
* Update label configuration file paths in workflows ([94937a3](https://github.com/patrick204nqh/gem-ci/commit/94937a345cd3b779474fa59bc2571a3b9f83d751))
|
31
|
+
* Update sponsored label description and adjust workflow triggers for label synchronization ([533ef4a](https://github.com/patrick204nqh/gem-ci/commit/533ef4aba474b5262596e1c34ad57c200987f1bd))
|
32
|
+
* Update super-linter to version 6 and add filter to exclude coverage files ([229a28c](https://github.com/patrick204nqh/gem-ci/commit/229a28c46f20581c64253bd1bbd20dfd7e6a6dbd))
|
33
|
+
|
34
|
+
|
35
|
+
### 📚 Documentation
|
36
|
+
|
37
|
+
* Add README for validation workflows and their purposes ([14e2b9b](https://github.com/patrick204nqh/gem-ci/commit/14e2b9b0b09bc4fc308ecb9eb594cdcc41650aaf))
|
38
|
+
* Create GitHub App setup guide for branded automation ([14e2b9b](https://github.com/patrick204nqh/gem-ci/commit/14e2b9b0b09bc4fc308ecb9eb594cdcc41650aaf))
|
39
|
+
* Create repository secrets setup guide for automation workflows ([14e2b9b](https://github.com/patrick204nqh/gem-ci/commit/14e2b9b0b09bc4fc308ecb9eb594cdcc41650aaf))
|
40
|
+
* Revise main README to enhance clarity and detail on automation features ([14e2b9b](https://github.com/patrick204nqh/gem-ci/commit/14e2b9b0b09bc4fc308ecb9eb594cdcc41650aaf))
|
41
|
+
|
42
|
+
|
43
|
+
### 🔧 Dependencies
|
44
|
+
|
45
|
+
* **deps:** Bump json from 2.13.0 to 2.13.1 ([ae45255](https://github.com/patrick204nqh/gem-ci/commit/ae4525555a35d1a017b532568fed312fdde1841f))
|
46
|
+
* **deps:** Bump rubocop from 1.78.0 to 1.79.0 in the development group ([01e4bc0](https://github.com/patrick204nqh/gem-ci/commit/01e4bc0da2e43ce48998756f1b18b743aa2d49cc))
|
47
|
+
|
48
|
+
|
49
|
+
### ♻️ Refactoring
|
50
|
+
|
51
|
+
* **ci-cd:** Remove legacy Ruby workflow and add validation workflows for GitHub App, labels synchronization, repository rulesets, and Slack integration. Update Gemfile with new dependencies for testing and coverage reporting. Enhance spec helper for coverage metrics and clean up existing tests. ([6365ae2](https://github.com/patrick204nqh/gem-ci/commit/6365ae2ef85b92673bd75399ac2adf0d65e82aff))
|
52
|
+
* Rename community management workflow for clarity ([14e2b9b](https://github.com/patrick204nqh/gem-ci/commit/14e2b9b0b09bc4fc308ecb9eb594cdcc41650aaf))
|
53
|
+
* Rename ecosystem integration workflow for clarity ([14e2b9b](https://github.com/patrick204nqh/gem-ci/commit/14e2b9b0b09bc4fc308ecb9eb594cdcc41650aaf))
|
54
|
+
* Rename monitoring workflow for clarity ([14e2b9b](https://github.com/patrick204nqh/gem-ci/commit/14e2b9b0b09bc4fc308ecb9eb594cdcc41650aaf))
|
55
|
+
* Rename quality workflow for clarity ([14e2b9b](https://github.com/patrick204nqh/gem-ci/commit/14e2b9b0b09bc4fc308ecb9eb594cdcc41650aaf))
|
56
|
+
* Rename release management workflow for clarity ([14e2b9b](https://github.com/patrick204nqh/gem-ci/commit/14e2b9b0b09bc4fc308ecb9eb594cdcc41650aaf))
|
57
|
+
* Rename security workflow for clarity ([14e2b9b](https://github.com/patrick204nqh/gem-ci/commit/14e2b9b0b09bc4fc308ecb9eb594cdcc41650aaf))
|
58
|
+
* Replace GitHub App token action with local implementation for consistency across workflows ([715ba16](https://github.com/patrick204nqh/gem-ci/commit/715ba1642dece92a85534b671c85bba362976766))
|
59
|
+
* Replace performance-monitor action with inline command execution in CI jobs ([d8d9ff6](https://github.com/patrick204nqh/gem-ci/commit/d8d9ff6d8b609eb99d57e4a5cf337a08612382f3))
|
60
|
+
* Simplify CI workflows and enhance monitoring with basic health checks and summaries ([ad0c84a](https://github.com/patrick204nqh/gem-ci/commit/ad0c84ae798c8474b53b2be13d476fc90f3fbb7c))
|
61
|
+
* Standardize labeler.yml structure for file change types ([b34df93](https://github.com/patrick204nqh/gem-ci/commit/b34df9383345ac7c76ff4c3586fc5bec83933956))
|
62
|
+
* Standardize workflow names and update branch references to main and master ([017b4cf](https://github.com/patrick204nqh/gem-ci/commit/017b4cf1b284d62bdb676728df0cc97912dd9a43))
|
63
|
+
* Update CI/CD workflows to use default branch variable and adjust README for Ruby versions ([c0abddc](https://github.com/patrick204nqh/gem-ci/commit/c0abddcb159ef12a7c2e401864e46a3cb828771f))
|
64
|
+
* Update GitHub Actions workflows for improved error handling and metrics output ([0d07488](https://github.com/patrick204nqh/gem-ci/commit/0d07488e7f1d14f4fcc6b944e0abc18205fb2ea9))
|
65
|
+
* Update labeler configuration and enhance CI workflows with repository checkout steps ([d13d065](https://github.com/patrick204nqh/gem-ci/commit/d13d065eb48d106e0791811421966a9c07cabae5))
|
66
|
+
* Update security and ecosystem workflows for improved pull request handling and reduce matrix size ([caacb33](https://github.com/patrick204nqh/gem-ci/commit/caacb3354718edd7a76b0b247b265beea06e7eaa))
|
67
|
+
* Update workflow names and improve branch protection rules; enhance label configurations ([79c58d2](https://github.com/patrick204nqh/gem-ci/commit/79c58d258fc83aa690843c166a68fac1e0a97e5c))
|
68
|
+
|
69
|
+
|
70
|
+
### 🤖 CI/CD
|
71
|
+
|
72
|
+
* **deps:** Bump github/codeql-action from 2 to 3 in the security-actions group ([3a87434](https://github.com/patrick204nqh/gem-ci/commit/3a87434d016875f20d0d65342cad8c4261baa08a))
|
73
|
+
* **deps:** Bump github/codeql-action in the security-actions group ([2cecda3](https://github.com/patrick204nqh/gem-ci/commit/2cecda34c7afa72919ab1f337dc94287e6b492c7))
|
74
|
+
* **deps:** Bump github/super-linter from 4 to 7 in the quality-actions group ([394950e](https://github.com/patrick204nqh/gem-ci/commit/394950e4690a1e5b2560f8e24df3dc977ec55fec))
|
75
|
+
* **deps:** Bump github/super-linter in the quality-actions group ([48573f1](https://github.com/patrick204nqh/gem-ci/commit/48573f1a80df84e1222ce72e33d0527b61a3bb72))
|
76
|
+
* **deps:** Bump the github-actions group across 1 directory with 3 updates ([71f9254](https://github.com/patrick204nqh/gem-ci/commit/71f9254aa0670b7b0fa1f9fc5240bc7ecaff2cb1))
|
77
|
+
* **deps:** Bump the github-actions group across 1 directory with 3 updates ([0c55db5](https://github.com/patrick204nqh/gem-ci/commit/0c55db53910128174b982ac9e4f9663605be6cae))
|
78
|
+
* **saving-cost:** Add auto-labeling and repository labels configuration; update workflows for Slack notifications and command handling ([7cbd8de](https://github.com/patrick204nqh/gem-ci/commit/7cbd8de140a0182d06a095dbca009383587c8144))
|
79
|
+
* **workflows:** Refactor GitHub Actions and Documentation ([bf9bca1](https://github.com/patrick204nqh/gem-ci/commit/bf9bca1d0dfe6e3ac7c508231a0e8afea4a9d633))
|
80
|
+
|
81
|
+
## [0.3.0](https://github.com/patrick204nqh/gem-ci/compare/gem-ci/v0.2.1...gem-ci/v0.3.0) (2025-07-27)
|
82
|
+
|
83
|
+
|
84
|
+
### 🚀 Features
|
85
|
+
|
86
|
+
* Add GitFlow guide and workflow diagram for gem-ci projects ([bccdf0b](https://github.com/patrick204nqh/gem-ci/commit/bccdf0b056fe181ae0586f370a0a5da25dc65d77))
|
87
|
+
* Add GitHub App token generation for PR status updates ([3662c2e](https://github.com/patrick204nqh/gem-ci/commit/3662c2e1366142051eb40a96a61944a2cb1bc72a))
|
88
|
+
* Add local testing scripts for gem-ci workflows ([37ac022](https://github.com/patrick204nqh/gem-ci/commit/37ac0224a74d6410bc31f796333271a8330c6a47))
|
89
|
+
* **ci:** Add PR status update action for CI, Security, and Quality workflows ([b9a42d9](https://github.com/patrick204nqh/gem-ci/commit/b9a42d97c4a8bd750bb87b29415929784e058261))
|
90
|
+
* Enhance PR status comment with structured table for workflow results ([3f3520d](https://github.com/patrick204nqh/gem-ci/commit/3f3520df4f1263059fe8ac76379e0bccee2a8326))
|
91
|
+
* Implement GitHub reaction actions for PRs, releases, and comments ([4fb4d24](https://github.com/patrick204nqh/gem-ci/commit/4fb4d24b4ca354128674f6b0ca3997cf977f0388))
|
92
|
+
* Refactor bot command workflow to enhance command handling and response structure ([5262bc3](https://github.com/patrick204nqh/gem-ci/commit/5262bc38441df89ad1f51fb99f95a337e7e20ec2))
|
93
|
+
* Update Ruby version in branch protection and push restrictions; add GitHub App token generation to ecosystem workflow ([611cd3e](https://github.com/patrick204nqh/gem-ci/commit/611cd3e37d64b5e290d73e9feebe28e306a4d6d6))
|
94
|
+
|
95
|
+
|
96
|
+
### 🐛 Bug Fixes
|
97
|
+
|
98
|
+
* Update label configuration file paths in workflows ([94937a3](https://github.com/patrick204nqh/gem-ci/commit/94937a345cd3b779474fa59bc2571a3b9f83d751))
|
99
|
+
|
100
|
+
|
101
|
+
### 🔧 Dependencies
|
102
|
+
|
103
|
+
* **deps:** Bump json from 2.13.0 to 2.13.1 ([ae45255](https://github.com/patrick204nqh/gem-ci/commit/ae4525555a35d1a017b532568fed312fdde1841f))
|
104
|
+
* **deps:** Bump rubocop from 1.78.0 to 1.79.0 in the development group ([01e4bc0](https://github.com/patrick204nqh/gem-ci/commit/01e4bc0da2e43ce48998756f1b18b743aa2d49cc))
|
105
|
+
|
106
|
+
|
107
|
+
### 🤖 CI/CD
|
108
|
+
|
109
|
+
* **deps:** Bump github/codeql-action from 2 to 3 in the security-actions group ([3a87434](https://github.com/patrick204nqh/gem-ci/commit/3a87434d016875f20d0d65342cad8c4261baa08a))
|
110
|
+
* **deps:** Bump github/codeql-action in the security-actions group ([2cecda3](https://github.com/patrick204nqh/gem-ci/commit/2cecda34c7afa72919ab1f337dc94287e6b492c7))
|
111
|
+
* **deps:** Bump github/super-linter from 4 to 7 in the quality-actions group ([394950e](https://github.com/patrick204nqh/gem-ci/commit/394950e4690a1e5b2560f8e24df3dc977ec55fec))
|
112
|
+
* **deps:** Bump github/super-linter in the quality-actions group ([48573f1](https://github.com/patrick204nqh/gem-ci/commit/48573f1a80df84e1222ce72e33d0527b61a3bb72))
|
113
|
+
* **deps:** Bump the github-actions group across 1 directory with 3 updates ([71f9254](https://github.com/patrick204nqh/gem-ci/commit/71f9254aa0670b7b0fa1f9fc5240bc7ecaff2cb1))
|
114
|
+
* **deps:** Bump the github-actions group across 1 directory with 3 updates ([0c55db5](https://github.com/patrick204nqh/gem-ci/commit/0c55db53910128174b982ac9e4f9663605be6cae))
|
115
|
+
* **saving-cost:** Add auto-labeling and repository labels configuration; update workflows for Slack notifications and command handling ([7cbd8de](https://github.com/patrick204nqh/gem-ci/commit/7cbd8de140a0182d06a095dbca009383587c8144))
|
116
|
+
|
3
117
|
## [0.2.1](https://github.com/patrick204nqh/gem-ci/compare/gem-ci/v0.2.0...gem-ci/v0.2.1) (2025-07-26)
|
4
118
|
|
5
119
|
|
data/README.md
CHANGED
@@ -1,32 +1,53 @@
|
|
1
|
-
|
1
|
+
<div align="center">
|
2
2
|
|
3
|
-
|
3
|
+
# 🏆 gem-ci
|
4
|
+
|
5
|
+

|
6
|
+
|
7
|
+
**The Ultimate Ruby Gem Automation Showcase**
|
8
|
+
|
9
|
+
*Battle-tested GitHub Actions workflows with comprehensive CI/CD, security, and community management*
|
10
|
+
|
11
|
+
[](https://www.ruby-lang.org/)
|
12
|
+
[](https://github.com/features/actions)
|
13
|
+
[](LICENSE.txt)
|
14
|
+
[](CONTRIBUTING.md)
|
15
|
+
|
16
|
+
[](https://github.com/patrick204nqh/gem-ci/actions/workflows/02-ci.yml)
|
17
|
+
[](https://github.com/patrick204nqh/gem-ci/actions/workflows/03-security.yml)
|
18
|
+
[](https://github.com/patrick204nqh/gem-ci/actions/workflows/04-quality.yml)
|
19
|
+
|
20
|
+
</div>
|
4
21
|
|
5
22
|
## ✨ What This Provides
|
6
23
|
|
7
|
-
This repository serves as the **
|
24
|
+
This repository serves as the **ultimate showcase** for Ruby gem automation. It includes **9 comprehensive workflows** that handle every aspect of your gem's lifecycle:
|
8
25
|
|
9
|
-
- 🔄 **Automated CI/CD**
|
26
|
+
- 🔄 **Automated CI/CD** with consolidated PR status dashboard
|
10
27
|
- 🔒 **Security scanning** and vulnerability detection
|
11
|
-
- 📊 **Code quality** enforcement
|
28
|
+
- 📊 **Code quality** enforcement with focused linting
|
12
29
|
- 🚀 **Automated releases** with semantic versioning
|
13
30
|
- 👥 **Community management** and contributor engagement
|
14
|
-
- 📈 **Performance monitoring** and health
|
31
|
+
- 📈 **Performance monitoring** and ecosystem health
|
32
|
+
- 🤖 **Bot commands** for interactive workflow management
|
33
|
+
- 🌐 **Ecosystem integration** and compatibility checks
|
34
|
+
- 📊 **Advanced monitoring** with cost-optimized scheduling
|
15
35
|
|
16
36
|
## 🚀 Quick Start
|
17
37
|
|
18
38
|
1. **Use this template** to create your new repository
|
19
|
-
2. **Set up secrets** following the [Secrets Setup Guide](docs/
|
39
|
+
2. **Set up secrets** following the [Secrets Setup Guide](docs/setup/secrets.md)
|
20
40
|
3. **Configure labels** by running the label sync workflow
|
21
41
|
4. **Import rulesets** from `.github/config/rulesets/`
|
22
|
-
5. **
|
42
|
+
5. **Test locally** using our [Local Testing Guide](docs/guides/local-testing.md)
|
43
|
+
6. **Start developing** - automation handles the rest!
|
23
44
|
|
24
45
|
## 📋 Complete Automation Tasks
|
25
46
|
|
26
47
|
| **Category** | **Task** | **Workflow** | **Action Used** | **Configuration** |
|
27
48
|
| ------------------- | ----------------------- | ---------------------------------------- | ----------------------------------------- | --------------------------- |
|
28
|
-
| **🔄 CI/CD** |
|
29
|
-
| |
|
49
|
+
| **🔄 CI/CD** | Ruby testing | `02-ci.yml` | `ruby/setup-ruby@v1` | Ruby 3.3 (optimized) |
|
50
|
+
| | Ubuntu testing | `02-ci.yml` | `actions/checkout@v4` | Ubuntu-latest (cost optimized) |
|
30
51
|
| | Dependency caching | `02-ci.yml` | `actions/cache@v3` | Bundler cache |
|
31
52
|
| | Test execution | `02-ci.yml` | Custom scripts | RSpec, Minitest |
|
32
53
|
| | Coverage reporting | `04-quality.yml` | `simplecov` gem | 90% threshold |
|
@@ -39,8 +60,8 @@ This repository serves as the **perfect template** for Ruby gem automation. It i
|
|
39
60
|
| | Documentation | `04-quality.yml` | `yard` gem | API documentation |
|
40
61
|
| | Markdown linting | `04-quality.yml` | `DavidAnson/markdownlint-cli2-action@v16` | Markdown standards |
|
41
62
|
| | Super linting | `04-quality.yml` | `super-linter/super-linter@v5` | Multi-language linting |
|
42
|
-
| **🏷️ Labels** | Label sync | `01-intake.yml` | `crazy-max/ghaction-github-labeler@v5` | `.github/labels.yml`
|
43
|
-
| | Auto-labeling | `01-intake.yml` | `actions/labeler@v5` | `.github/labeler.yml`
|
63
|
+
| **🏷️ Labels** | Label sync | `01-intake.yml` | `crazy-max/ghaction-github-labeler@v5` | `.github/config/labels.yml` |
|
64
|
+
| | Auto-labeling | `01-intake.yml` | `actions/labeler@v5` | `.github/config/labeler.yml` |
|
44
65
|
| | Size labeling | `01-intake.yml` | Custom script | PR size detection |
|
45
66
|
| **👥 Community** | Welcome messages | `01-intake.yml` | `actions/first-interaction@v1` | First-time contributors |
|
46
67
|
| | Stale management | `05-community.yml` | `actions/stale@v9` | 60-day stale policy |
|
@@ -57,8 +78,15 @@ This repository serves as the **perfect template** for Ruby gem automation. It i
|
|
57
78
|
| **🛡️ Protection** | Branch protection | Rulesets | GitHub native | `.github/config/rulesets/` |
|
58
79
|
| | Tag protection | Rulesets | GitHub native | Release tag protection |
|
59
80
|
| | Push restrictions | Rulesets | GitHub native | Development branch rules |
|
60
|
-
| **📢 Notifications** | Slack integration | Multiple |
|
61
|
-
| |
|
81
|
+
| **📢 Notifications** | Slack integration | Multiple | Custom shared action | `SLACK_BOT_TOKEN` + `SLACK_CHANNEL_ID` |
|
82
|
+
| | PR Status Dashboard | Multiple | `update-pr-status` action | Consolidated PR comments |
|
83
|
+
| **🤖 Bot Commands** | Release management | `09-bot-commands.yml` | `actions/github-script@v7` | Slash commands |
|
84
|
+
| | Help system | `09-bot-commands.yml` | `actions/github-script@v7` | Interactive help |
|
85
|
+
| **🌐 Ecosystem** | Dependency health | `07-ecosystem.yml` | Custom scripts | Bi-weekly checks |
|
86
|
+
| | Compatibility matrix | `07-ecosystem.yml` | `ruby/setup-ruby@v1` | Ruby version testing |
|
87
|
+
| | Performance benchmarks | `07-ecosystem.yml` | Custom benchmark scripts | Release validation |
|
88
|
+
| **📊 Monitoring** | Workflow metrics | `08-monitoring.yml` | `actions/github-script@v7` | Weekly performance tracking |
|
89
|
+
| | Repository health | `08-monitoring.yml` | Custom health checks | Automated health reports |
|
62
90
|
| **🧪 Validation** | GitHub App setup | `tests/validate-github-app.yml` | `actions/create-github-app-token@v1` | Token validation |
|
63
91
|
| | Slack integration | `tests/validate-slack-integration.yml` | `slackapi/slack-github-action@v1.27.0` | Message testing |
|
64
92
|
| | Label sync | `tests/validate-labels-sync.yml` | `crazy-max/ghaction-github-labeler@v5` | Configuration validation |
|
@@ -78,93 +106,94 @@ This repository serves as the **perfect template** for Ruby gem automation. It i
|
|
78
106
|
### **Configuration Files**
|
79
107
|
| File | Purpose | Required |
|
80
108
|
|------|---------|----------|
|
81
|
-
| `.github/labels.yml` | Label definitions and colors | ✅ Yes |
|
82
|
-
| `.github/labeler.yml` | Auto-labeling rules | ✅ Yes |
|
109
|
+
| `.github/config/labels.yml` | Label definitions and colors | ✅ Yes |
|
110
|
+
| `.github/config/labeler.yml` | Auto-labeling rules for PRs | ✅ Yes |
|
83
111
|
| `.github/dependabot.yml` | Dependency update configuration | ✅ Yes |
|
84
112
|
| `.github/CODEOWNERS` | Code ownership and review assignments | ✅ Yes |
|
85
113
|
| `.github/config/codeql.yml` | CodeQL analysis configuration | ✅ Yes |
|
114
|
+
| `.github/config/release-please-config.json` | Release configuration | ✅ Yes |
|
115
|
+
| `.github/config/release-please-manifest.json` | Release manifest | ✅ Yes |
|
86
116
|
| `.github/config/rulesets/*.json` | Repository protection rules | ❌ Optional |
|
87
117
|
|
118
|
+
### **Bot Commands**
|
119
|
+
<details>
|
120
|
+
<summary>Available interactive commands (comment on issues/PRs)</summary>
|
121
|
+
|
122
|
+
| Command | Description | Example |
|
123
|
+
|---------|-------------|---------|
|
124
|
+
| `/gem-ci help` | Show available commands | `/gem-ci help` |
|
125
|
+
| `/gem-ci revise release [from] to [to]` | Change release type | `/gem-ci revise release minor to patch` |
|
126
|
+
| `/gem-ci cancel release` | Cancel current release PR | `/gem-ci cancel release` |
|
127
|
+
|
128
|
+
**Usage**: Comment these commands on any issue or PR to trigger bot actions.
|
129
|
+
</details>
|
130
|
+
|
88
131
|
## 🔄 Ruby Gem Repository Lifecycle
|
89
132
|
|
90
133
|
This template provides a complete automation solution that follows the natural lifecycle of a Ruby gem repository:
|
91
134
|
|
92
135
|
### 🚀 **Phase 1: Repository Setup** (One-time)
|
93
|
-
- **🏷️ Label Management**: Sync professional labels
|
136
|
+
- **🏷️ Label Management**: Sync professional labels and organize repository structure
|
94
137
|
- **🔐 Secret Configuration**: Setup GitHub App authentication and integrations
|
95
138
|
- **🛡️ Branch Protection**: Configure repository rulesets and security policies
|
96
|
-
- **⚙️ Initial Configuration**:
|
139
|
+
- **⚙️ Initial Configuration**: Setup dependency management, security scanning, and automation workflows
|
97
140
|
|
98
141
|
### 💻 **Phase 2: Development Cycle** (Daily)
|
99
|
-
- **🧪 Continuous Testing**:
|
100
|
-
- **🔒 Security Scanning**:
|
101
|
-
- **📊 Code Quality**:
|
102
|
-
- **🏷️ Auto-labeling**:
|
103
|
-
- **👋 Contributor Welcome**:
|
142
|
+
- **🧪 Continuous Testing**: Run comprehensive test suites and validate gem functionality
|
143
|
+
- **🔒 Security Scanning**: Detect vulnerabilities in code and dependencies
|
144
|
+
- **📊 Code Quality**: Enforce coding standards, style guides, and generate documentation
|
145
|
+
- **🏷️ Auto-labeling**: Automatically categorize and organize issues and pull requests
|
146
|
+
- **👋 Contributor Welcome**: Guide first-time contributors and provide context
|
104
147
|
|
105
148
|
### 📦 **Phase 3: Dependency Management** (Automated)
|
106
|
-
- **🤖
|
107
|
-
- **🧪 Update Testing**:
|
108
|
-
- **✅ Safe Auto-merge**:
|
149
|
+
- **🤖 Dependency Updates**: Monitor and update gem dependencies automatically
|
150
|
+
- **🧪 Update Testing**: Validate compatibility and functionality after updates
|
151
|
+
- **✅ Safe Auto-merge**: Automatically merge low-risk dependency updates
|
152
|
+
- **📊 Security Auditing**: Scan dependencies for known vulnerabilities
|
109
153
|
|
110
154
|
### 🚀 **Phase 4: Release Process** (On-demand)
|
111
|
-
- **🏗️ Gem Building**:
|
112
|
-
- **💎 RubyGems Publishing**:
|
113
|
-
- **📝 Changelog Generation**:
|
114
|
-
- **📢 Release Notifications**:
|
155
|
+
- **🏗️ Gem Building**: Package gem files with proper versioning and metadata
|
156
|
+
- **💎 RubyGems Publishing**: Publish to RubyGems registry with proper validation
|
157
|
+
- **📝 Changelog Generation**: Generate release notes and update documentation
|
158
|
+
- **📢 Release Notifications**: Announce releases to team and community channels
|
115
159
|
|
116
160
|
### 🔄 **Phase 5: Ongoing Maintenance** (Background)
|
117
|
-
- **🧹 Stale Management**:
|
118
|
-
- **🌐 Ecosystem Monitoring**:
|
119
|
-
- **📈 Health Monitoring**:
|
120
|
-
- **👥 Community Engagement**:
|
161
|
+
- **🧹 Stale Management**: Clean up inactive issues and pull requests
|
162
|
+
- **🌐 Ecosystem Monitoring**: Check compatibility with Ruby versions and dependencies
|
163
|
+
- **📈 Health Monitoring**: Track repository activity, performance, and community engagement
|
164
|
+
- **👥 Community Engagement**: Recognize contributors and maintain project health
|
165
|
+
- **🤖 Interactive Commands**: Provide bot-driven release management and workflow control
|
121
166
|
|
122
167
|
## 📚 Documentation
|
123
168
|
|
124
|
-
|
125
|
-
|
126
|
-
-
|
127
|
-
-
|
128
|
-
-
|
169
|
+
Complete documentation is available on our **[Documentation Site](https://patrick204nqh.github.io/gem-ci/)** including:
|
170
|
+
|
171
|
+
- **🚀 Getting Started**: Setup guides, secrets configuration, and local testing
|
172
|
+
- **📊 Workflows**: Complete workflow documentation and architecture overview
|
173
|
+
- **🎯 Advanced Features**: Customization, integrations, and bot commands
|
174
|
+
- **✅ Validation**: Testing and troubleshooting guides
|
175
|
+
|
176
|
+
### **🧪 Quick Local Testing**
|
177
|
+
|
178
|
+
```bash
|
179
|
+
# Setup (one time)
|
180
|
+
cp .secrets.example .secrets && nano .secrets
|
181
|
+
|
182
|
+
# Test workflows locally
|
183
|
+
./scripts/test-local # Test push workflows
|
184
|
+
./scripts/test-local ci # Test CI workflow
|
185
|
+
./scripts/test-workflows # Run validation tests
|
186
|
+
```
|
187
|
+
|
188
|
+
**[📖 View Testing Scripts Documentation](scripts/README.md)**
|
129
189
|
|
130
190
|
## 🎯 Key Features
|
131
191
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
### **🔒 Comprehensive Security**
|
138
|
-
- CodeQL static analysis
|
139
|
-
- Dependency vulnerability scanning
|
140
|
-
- Secret detection in git history
|
141
|
-
- Container security scanning
|
142
|
-
- Automated security updates
|
143
|
-
|
144
|
-
### **📊 Quality Enforcement**
|
145
|
-
- RuboCop code style enforcement
|
146
|
-
- Test coverage reporting (90% threshold)
|
147
|
-
- Documentation coverage checking
|
148
|
-
- Markdown and YAML linting
|
149
|
-
|
150
|
-
### **🚀 Automated Releases**
|
151
|
-
- Semantic version bumping
|
152
|
-
- Automated changelog generation
|
153
|
-
- RubyGems publishing
|
154
|
-
- GitHub release creation
|
155
|
-
- Slack release notifications
|
156
|
-
|
157
|
-
### **👥 Community Management**
|
158
|
-
- Welcome messages for new contributors
|
159
|
-
- Stale issue/PR management
|
160
|
-
- Contributor achievement recognition
|
161
|
-
- Community health monitoring
|
162
|
-
|
163
|
-
### **🏷️ Smart Labeling**
|
164
|
-
- 33 professionally designed labels
|
165
|
-
- Automatic labeling based on file changes
|
166
|
-
- PR size detection and labeling
|
167
|
-
- Accessible color scheme (WCAG AA compliant)
|
192
|
+
**🔄 Optimized CI/CD** • **🔒 Comprehensive Security** • **📊 Quality Enforcement** • **🚀 Automated Releases** • **👥 Community Management** • **🏷️ Smart Labeling**
|
193
|
+
|
194
|
+
Includes **9 optimized workflows** with 75-80% cost reduction, custom linting, consolidated PR dashboard, automated releases, and comprehensive security scanning.
|
195
|
+
|
196
|
+
**[📖 View Complete Feature List](docs/workflows/overview.md)**
|
168
197
|
|
169
198
|
## 🤝 Contributing
|
170
199
|
|
data/docs/_config.yml
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
title: gem-ci Documentation
|
2
|
+
description: The Ultimate Ruby Gem Automation Showcase
|
3
|
+
url: "https://patrick204nqh.github.io"
|
4
|
+
baseurl: "/gem-ci"
|
5
|
+
|
6
|
+
theme: minima
|
7
|
+
|
8
|
+
markdown: kramdown
|
9
|
+
highlighter: rouge
|
10
|
+
permalink: pretty
|
11
|
+
|
12
|
+
plugins:
|
13
|
+
- jekyll-feed
|
14
|
+
- jekyll-sitemap
|
15
|
+
- jekyll-seo-tag
|
16
|
+
|
17
|
+
header_pages:
|
18
|
+
- setup/secrets.md
|
19
|
+
- guides/local-testing.md
|
20
|
+
- workflows/overview.md
|
21
|
+
- guides/customization.md
|
22
|
+
|
23
|
+
collections:
|
24
|
+
guides:
|
25
|
+
output: true
|
26
|
+
permalink: /:collection/:name/
|
27
|
+
setup:
|
28
|
+
output: true
|
29
|
+
permalink: /:collection/:name/
|
30
|
+
workflows:
|
31
|
+
output: true
|
32
|
+
permalink: /:collection/:name/
|
33
|
+
|
34
|
+
defaults:
|
35
|
+
- scope:
|
36
|
+
path: ""
|
37
|
+
type: "pages"
|
38
|
+
values:
|
39
|
+
layout: "default"
|
40
|
+
- scope:
|
41
|
+
path: ""
|
42
|
+
type: "guides"
|
43
|
+
values:
|
44
|
+
layout: "default"
|
45
|
+
- scope:
|
46
|
+
path: ""
|
47
|
+
type: "setup"
|
48
|
+
values:
|
49
|
+
layout: "default"
|
50
|
+
- scope:
|
51
|
+
path: ""
|
52
|
+
type: "workflows"
|
53
|
+
values:
|
54
|
+
layout: "default"
|
55
|
+
|
56
|
+
exclude:
|
57
|
+
- Gemfile
|
58
|
+
- Gemfile.lock
|
59
|
+
- node_modules/
|
60
|
+
- vendor/
|
@@ -89,18 +89,20 @@ graph LR
|
|
89
89
|
T12[🧹 Manage Stale Issues]
|
90
90
|
T13[🌐 Check Ecosystem Health]
|
91
91
|
T14[📈 Monitor Performance]
|
92
|
+
T15[🤖 Interactive Commands]
|
92
93
|
end
|
93
94
|
|
94
95
|
subgraph "🤖 Our CI/CD Workflows"
|
95
96
|
W1[01-intake.yml<br/>🏷️ Intake & Labels]
|
96
|
-
W2[02-ci.yml<br/>🧪
|
97
|
-
W3[03-security.yml<br/>🔒 Security
|
98
|
-
W4[04-quality.yml<br/>📊
|
99
|
-
W5[05-community.yml<br/>👥 Community
|
97
|
+
W2[02-ci.yml<br/>🧪 CI - Ruby 3.3 + Ubuntu]
|
98
|
+
W3[03-security.yml<br/>🔒 Security - Weekly]
|
99
|
+
W4[04-quality.yml<br/>📊 Quality - Custom Linting]
|
100
|
+
W5[05-community.yml<br/>👥 Community - Weekly]
|
100
101
|
W6[06-release.yml<br/>🚀 Release & Publishing]
|
101
|
-
W7[07-ecosystem.yml<br/>🌐 Ecosystem
|
102
|
-
W8[08-monitoring.yml<br/>📈
|
103
|
-
W9[
|
102
|
+
W7[07-ecosystem.yml<br/>🌐 Ecosystem - Bi-weekly]
|
103
|
+
W8[08-monitoring.yml<br/>📈 Monitoring - Weekly]
|
104
|
+
W9[09-bot-commands.yml<br/>🤖 Bot Commands]
|
105
|
+
W10[Dependabot<br/>📦 Dependency Updates]
|
104
106
|
end
|
105
107
|
|
106
108
|
%% Task to Workflow Mappings
|
@@ -111,8 +113,8 @@ graph LR
|
|
111
113
|
T3 --> W4
|
112
114
|
T4 --> W1
|
113
115
|
T5 --> W1
|
114
|
-
T6 -->
|
115
|
-
T7 -->
|
116
|
+
T6 --> W10
|
117
|
+
T7 --> W10
|
116
118
|
T8 --> W6
|
117
119
|
T9 --> W6
|
118
120
|
T10 --> W6
|
@@ -120,13 +122,14 @@ graph LR
|
|
120
122
|
T12 --> W5
|
121
123
|
T13 --> W7
|
122
124
|
T14 --> W8
|
125
|
+
T15 --> W9
|
123
126
|
|
124
127
|
%% Styling
|
125
128
|
classDef task fill:#e8f5e8
|
126
129
|
classDef workflow fill:#f3e5f5
|
127
130
|
|
128
|
-
class T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 task
|
129
|
-
class W1,W2,W3,W4,W5,W6,W7,W8,W9 workflow
|
131
|
+
class T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 task
|
132
|
+
class W1,W2,W3,W4,W5,W6,W7,W8,W9,W10 workflow
|
130
133
|
```
|
131
134
|
|
132
135
|
## 📈 Repository Lifecycle Timeline
|
@@ -150,9 +153,10 @@ graph LR
|
|
150
153
|
| **🏷️ Auto-label** | `01-intake.yml` | PR/Issue created | Every PR/Issue |
|
151
154
|
| **📦 Update Dependencies** | Dependabot + CI workflows | Schedule | Weekly + testing |
|
152
155
|
| **🚀 Build & Publish** | `06-release.yml` | Tag created | Per release |
|
153
|
-
| **🧹 Manage Community** | `05-community.yml` | Schedule |
|
154
|
-
| **🌐 Check Ecosystem** | `07-ecosystem.yml` | Schedule |
|
155
|
-
| **📈 Monitor Health** | `08-monitoring.yml` | Schedule |
|
156
|
+
| **🧹 Manage Community** | `05-community.yml` | Schedule | **Weekly** - 85% reduction |
|
157
|
+
| **🌐 Check Ecosystem** | `07-ecosystem.yml` | Schedule | **Bi-weekly** - 50% reduction |
|
158
|
+
| **📈 Monitor Health** | `08-monitoring.yml` | Schedule | **Weekly** - 85% reduction |
|
159
|
+
| **🤖 Interactive Commands** | `09-bot-commands.yml` | Issue comments | On-demand |
|
156
160
|
|
157
161
|
## 🔄 Complete Development Flow
|
158
162
|
|
@@ -161,10 +165,17 @@ Repository Lifecycle:
|
|
161
165
|
Setup → Development ⟷ Dependencies → Release → Maintenance
|
162
166
|
↓ ↓ ↓ ↓ ↓
|
163
167
|
Our Workflows:
|
164
|
-
Manual → 01,02,03,04 → Dependabot+CI → 06 → 05,07,08
|
168
|
+
Manual → 01,02,03,04 → Dependabot+CI → 06 → 05,07,08,09
|
169
|
+
Ruby 3.3+Ubuntu Security Weekly/Bi-weekly
|
165
170
|
```
|
166
171
|
|
167
172
|
This separation makes it much clearer:
|
168
173
|
1. **First diagram**: Shows the natural lifecycle and tasks
|
169
|
-
2. **Second diagram**: Shows how our
|
170
|
-
3. **Tables**: Provide detailed mapping and timing information
|
174
|
+
2. **Second diagram**: Shows how our optimized workflows handle those tasks
|
175
|
+
3. **Tables**: Provide detailed mapping and timing information
|
176
|
+
|
177
|
+
**Key Optimizations Applied:**
|
178
|
+
- **75-80% cost reduction** through Ruby 3.3 only, Ubuntu only, reduced schedules
|
179
|
+
- **70% performance improvement** with custom linting vs super-linter
|
180
|
+
- **Zero comment spam** with consolidated PR dashboard
|
181
|
+
- **Enhanced security** with weekly scanning and release validation
|