GSS stands for GHES(GitHub Enterprise Server) Schedule Scanner.
GSS is a high-performance Kubernetes add-on for DevOps and SRE teams to monitor and analyze CI/CD workflows in GitHub Enterprise Server. Written in Rust, GSS runs as a kubernetes cronJob that scans and analyzes scheduled workflows across your GHES environment.
GHES Schedule Scanner runs as a kubernetes cronJob that periodically scans GitHub Enterprise Server repositories for scheduled workflows. It collects information about:
- Workflow names and schedules
- Last execution status
- Last committer details
- Repository information
The scanner is designed for high performance with async/concurrent scanning capabilities and provides timezone conversion between UTC and KST for better schedule visibility.
- GitHub Enterprise Server Integration: Compatible with self-hosted GitHub Enterprise Server (3.11+)
- Organization-wide Scanning: Scan scheduled workflows across all repositories in an organization
- Timezone Support: UTC/KST timezone conversion for better schedule visibility
- Status Monitoring: Track workflow execution status and identify failed workflows
- High Performance: Async concurrent scanning (scans 900+ repositories in about 15-18 seconds)
- Multiple Publishers: Publish results to console or Slack Canvas
- Kubernetes Native: Runs as a Kubernetes cronJob for periodic scanning
- Low Resource Usage: Optimized for minimal CPU and memory consumption
- Rust 1.90+ (2024 edition)
- GitHub Personal Access Token with
repo
andworkflow
scopes - Access to GitHub Enterprise Server instance
# Build release binary
cargo build --release
# Or use Makefile
make build
Set environment variables needed for local development:
# Required
export GITHUB_TOKEN="ghp_token"
export GITHUB_ORG="your_organization"
export GITHUB_BASE_URL="https://your-ghes-domain"
# Optional
export LOG_LEVEL="info"
export PUBLISHER_TYPE="console" # Available values: `console`, `slack-canvas`
export CONCURRENT_SCANS="10" # Number of parallel repository scans
# For Slack Canvas Publisher
export SLACK_TOKEN="xoxb-token"
export SLACK_CHANNEL_ID="C01234ABCD"
export SLACK_CANVAS_ID="F01234ABCD"
Run the application:
# Using cargo
cargo run --release
# Or using the binary
./target/release/ghes-schedule-scanner
Version: 1.0.0
Build Date: 2025-01-23T10:30:00Z
Git Commit: abc1234
Rust Version: 1.83.0
NO REPOSITORY WORKFLOW UTC SCHEDULE KST SCHEDULE LAST COMMITTER LAST STATUS
1 api-test-server api unit test 0 15 * * * 0 0 * * * younsl completed
2 daily-batch daily batch service 0 0 * * * 0 9 * * * ddukbg completed
Total: 2 scheduled workflows found in 100 repositories (5 excluded)
Scan duration: 18.5s
Variable | Description | Example |
---|---|---|
GITHUB_TOKEN |
GitHub Personal Access Token | ghp_xxxxxxxxxxxx |
GITHUB_ORG |
Target GitHub organization | my-company |
GITHUB_BASE_URL |
GitHub Enterprise Server URL | https://github.example.com |
Variable | Description | Default |
---|---|---|
LOG_LEVEL |
Logging level (debug, info, warn, error) | info |
PUBLISHER_TYPE |
Output format (console, slack-canvas) | console |
REQUEST_TIMEOUT |
HTTP request timeout for scanning (seconds) | 60 |
CONCURRENT_SCANS |
Max concurrent repository scans | 10 |
CONNECTIVITY_MAX_RETRIES |
Connection retry attempts | 3 |
CONNECTIVITY_RETRY_INTERVAL |
Retry delay (seconds) | 5 |
CONNECTIVITY_TIMEOUT |
Connectivity check timeout (seconds) | 5 |
GSS supports multiple publishers to display scan results:
Outputs scan results to the console/logs with structured JSON logging. This is the default publisher.
export PUBLISHER_TYPE="console"
Publishes scan results to a Slack Canvas, providing a rich, interactive view of your scheduled workflows.
Required environment variables:
SLACK_TOKEN
: Slack Bot Token (must start withxoxb-
)SLACK_CHANNEL_ID
: Slack Channel IDSLACK_CANVAS_ID
: Slack Canvas ID
export PUBLISHER_TYPE="slack-canvas"
export SLACK_TOKEN="xoxb-your-token"
export SLACK_CHANNEL_ID="C01234ABCD"
export SLACK_CANVAS_ID="F01234ABCD"
# Run all tests
cargo test
# Run tests with output
cargo test -- --nocapture
# Run specific test
cargo test test_config_load
# Format code
cargo fmt
# Check formatting
cargo fmt -- --check
# Run linter
cargo clippy -- -D warnings
# Run all checks
make ci
# Build using Makefile
make docker-build
# Or manually
docker build -t ghes-schedule-scanner:latest .
docker run --rm \
-e GITHUB_TOKEN=ghp_xxxx \
-e GITHUB_ORG=my-org \
-e GITHUB_BASE_URL=https://github.example.com \
ghes-schedule-scanner:latest
See the Installation Guide for detailed instructions on deploying to Kubernetes using Helm.
Quick example:
# Install using Helm
helm install ghes-schedule-scanner \
./charts/ghes-schedule-scanner \
--set image.repository=ghes-schedule-scanner \
--set image.tag=latest
- Installation Guide - Kubernetes deployment with Helm
- Troubleshooting - Common issues and solutions
- Roadmap - Future plans and features
- Contributing Guidelines - How to contribute
- Acknowledgements - Credits and thanks
Metric | Value |
---|---|
Binary Size | 3.8MB (stripped) |
Memory Usage | ~40MB |
Startup Time | ~50ms |
Scan Time (100 repos) | ~18s |
Scan Time (900 repos) | ~35s |
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.