# cost-center-automation **Repository Path**: mirrors_github/cost-center-automation ## Basic Information - **Project Name**: cost-center-automation - **Description**: Open source utilities for automating cost center administration - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-27 - **Last Updated**: 2025-10-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # GitHub Copilot Cost Center Automation Automate GitHub Copilot license cost center assignments for your enterprise with two powerful modes: - **PRU-Based Mode**: Simple two-tier model (PRU overages allowed/not allowed) - **Teams-Based Mode**: Automatic assignment based on GitHub team membership ## 🚀 Quick Start (5 minutes) ### 1. Create Your Token Create a GitHub Personal Access Token with these scopes: - `manage_billing:enterprise` (required) - `read:org` (required for Teams Mode) [→ Create token here](https://github.com/settings/tokens/new) ### 2. Choose Your Mode
PRU-Based Mode (Simple two-tier model) ```bash # Clone and setup git clone cd cost-center-automation pip install -r requirements.txt # Configure export GITHUB_TOKEN="your_token_here" export GITHUB_ENTERPRISE="your-enterprise" # Run (creates cost centers automatically) python main.py --create-cost-centers --assign-cost-centers --mode apply --yes ``` **Done!** All users are now in "00 - No PRU overages" cost center. To allow specific users PRU overages, edit `config/config.yaml`: ```yaml cost_centers: prus_exception_users: - "alice" - "bob" ```
Teams-Based Mode (Sync with GitHub teams) ```bash # Clone and setup git clone cd cost-center-automation pip install -r requirements.txt # Configure cp config/config.example.yaml config/config.yaml export GITHUB_TOKEN="your_token_here" export GITHUB_ENTERPRISE="your-enterprise" # Edit config/config.yaml teams: enabled: true scope: "organization" # or "enterprise" organizations: - "your-org-name" # Run python main.py --teams-mode --assign-cost-centers --mode apply --yes ``` **Done!** Cost centers created for each team, users automatically assigned. See [TEAMS_QUICKSTART.md](TEAMS_QUICKSTART.md) for more details.
### 3. Automate (Optional) Set up GitHub Actions for automatic syncing every 6 hours - see [Automation](#automation) below. ## Features ### Two Operational Modes **PRU-Based Mode** (Default) - Simple two-tier model: PRU overages allowed/not allowed - Automatic cost center creation with default names - Exception list for users who need PRU access - Incremental processing support (only new users) **Teams-Based Mode** - Organization scope: Sync teams from specific GitHub orgs - Enterprise scope: Sync all teams across the enterprise - Automatic cost center creation with bracket notation naming - Orphaned user detection and removal - Single assignment (multi-team users get last team's assignment) ### Additional Features - 🔄 **Plan/Apply execution**: Preview changes before applying - 📊 **Enhanced logging**: Real-time success/failure tracking - 🐳 **Container ready**: Dockerfile and docker-compose included - ⚙️ **Automation examples**: GitHub Actions, cron, and shell scripts - 🔧 **Auto-creation**: Automatic cost center creation (no manual UI setup) ## Prerequisites - GitHub Enterprise Cloud with admin access - GitHub Personal Access Token with scopes: - `manage_billing:enterprise` (required for all modes) - `read:org` (required for Teams Mode) - Python 3.8+ (for local execution) ## Configuration Configuration lives in `config/config.yaml` (copy from `config/config.example.yaml`). ### PRU-Based Mode Configuration ```yaml github: enterprise: "" # Or set via GITHUB_ENTERPRISE env var cost_centers: auto_create: true # Automatically create cost centers no_prus_cost_center_name: "00 - No PRU overages" prus_allowed_cost_center_name: "01 - PRU overages allowed" # Users who need PRU access prus_exception_users: - "alice" - "bob" ``` ### Teams-Based Mode Configuration ```yaml teams: enabled: true scope: "organization" # or "enterprise" mode: "auto" # One cost center per team organizations: # Only for organization scope - "your-org" auto_create_cost_centers: true remove_orphaned_users: true ``` **Cost Center Naming:** - Organization scope: `[org team] {org-name}/{team-name}` - Enterprise scope: `[enterprise team] {team-name}` ### Environment Variables Set these instead of config file values: - `GITHUB_TOKEN` (required) - `GITHUB_ENTERPRISE` (required) ## Teams Mode Details For complete Teams Mode documentation, see: - [TEAMS_QUICKSTART.md](TEAMS_QUICKSTART.md) - Step-by-step setup guide - [TEAMS_INTEGRATION.md](TEAMS_INTEGRATION.md) - Full reference documentation ### Key Concepts **Organization vs Enterprise Scope** - **Organization**: Syncs teams from specific GitHub organizations you specify - **Enterprise**: Syncs all teams across your entire GitHub Enterprise **Cost Center Naming** - Organization scope: `[org team] {org-name}/{team-name}` - Enterprise scope: `[enterprise team] {team-name}` **Multi-Team Users** - Each user can only belong to ONE cost center - Multi-team users are assigned to their last team's cost center - Warnings logged for review before applying ### Manual Mode For advanced use cases, map specific teams to specific cost centers: ```yaml teams: mode: "manual" team_mappings: "my-org/frontend": "Engineering: Frontend" "my-org/backend": "Engineering: Backend" ``` ## Usage ### Common Commands ```bash # View configuration python main.py --show-config python main.py --teams-mode --show-config # List all Copilot users python main.py --list-users ``` ### PRU-Based Mode ```bash # Plan assignments (preview, no changes) python main.py --assign-cost-centers --mode plan # Apply assignments (with confirmation) python main.py --assign-cost-centers --mode apply # Apply without confirmation (automation) python main.py --create-cost-centers --assign-cost-centers --mode apply --yes # Incremental mode (only new users, for cron jobs) python main.py --assign-cost-centers --incremental --mode apply --yes ``` ### Teams-Based Mode ```bash # Plan assignments (preview, no changes) python main.py --teams-mode --assign-cost-centers --mode plan # Apply assignments (with confirmation) python main.py --teams-mode --assign-cost-centers --mode apply # Apply without confirmation (automation) python main.py --teams-mode --assign-cost-centers --mode apply --yes # Generate summary report python main.py --teams-mode --summary-report ``` **Note:** Incremental mode is NOT supported in Teams Mode. All team members are processed every run. ## Incremental Processing (PRU Mode Only) Process only users added since the last run - perfect for cron jobs: ```bash # First run: processes all users, saves timestamp python main.py --assign-cost-centers --incremental --mode apply --yes # Subsequent runs: only new users python main.py --assign-cost-centers --incremental --mode apply --yes ``` **Note:** Teams Mode does not support incremental processing. ## Logging Logs are written to `logs/populate_cost_centers.log` with detailed tracking: ```log 2025-10-08 10:39:06 [INFO] ✅ Successfully added 3 users to cost center abc123 2025-10-08 10:39:06 [INFO] ✅ user1 → abc123 2025-10-08 10:39:06 [INFO] ✅ user2 → abc123 2025-10-08 10:39:06 [INFO] 📊 ASSIGNMENT RESULTS: 3/3 users successfully assigned ``` ## Automation ### GitHub Actions (Recommended) The included workflow automatically syncs cost centers every 6 hours: 1. Add token as secret: `COST_CENTER_AUTOMATION_TOKEN` 2. Go to **Actions** tab → "Cost center automation" 3. Click "Run workflow" → Select mode → Run See `.github/workflows/` for configuration. ### Docker ```bash # Build and run docker build -t copilot-cc . docker run --rm -e GITHUB_TOKEN=$GITHUB_TOKEN copilot-cc \ python main.py --assign-cost-centers --mode apply --yes # Background service docker compose up -d --build ``` ### Cron Jobs ```bash # PRU mode with incremental processing (hourly) 0 * * * * cd /path/to/repo && ./automation/update_cost_centers.sh # Teams mode (weekly) 0 2 * * 1 cd /path/to/repo && python main.py --teams-mode --assign-cost-centers --mode apply --yes ``` See `automation/update_cost_centers.sh` for the included automation script. ## Keeping Up-to-Date This repository includes automatic template sync from `github/cost-center-automation`. **Setup:** 1. Create a PAT with `Contents: Write` and `Pull requests: Write` 2. Add as secret: `TEMPLATE_SYNC_TOKEN` 3. Automatic sync runs every Monday, creating PRs with updates **What's synced:** Code, workflows, docs, dependencies **What's protected:** `config/config.yaml`, `.syncignore` files Manual trigger: **Actions** → "Sync from template" → "Run workflow" ## Troubleshooting | Issue | Solution | |-------|----------| | 401/403 errors | Regenerate token with correct scopes | | No teams found | Verify `read:org` scope for Teams Mode | | Cost center creation fails | Ensure `manage_billing:enterprise` scope | | Multi-team user warnings | Review plan output, adjust team structure if needed | Check `logs/populate_cost_centers.log` for detailed traces. Use `--verbose` for DEBUG logging. ## Contributing 1. Fork this repository and create a branch (`feat/`) 2. Make focused changes with clear commit messages 3. Submit PR with description and link related issues ## Additional Documentation - [TEAMS_QUICKSTART.md](TEAMS_QUICKSTART.md) - Teams Mode setup guide - [TEAMS_INTEGRATION.md](TEAMS_INTEGRATION.md) - Teams Mode reference - [ORPHANED_USERS_FEATURE.md](ORPHANED_USERS_FEATURE.md) - Orphaned users documentation ## License This project is licensed under the MIT License. See [LICENSE](LICENSE) file for details. --- **Latest Features:** Teams-based assignment (organization & enterprise scope), orphaned user detection, bracket notation naming, enhanced logging, incremental processing