233 lines
8.1 KiB
Markdown
233 lines
8.1 KiB
Markdown
|
# Forgejo Actions CI/CD Setup for Pricing Tests
|
|||
|
|
|||
|
## Overview
|
|||
|
|
|||
|
I've created a comprehensive Forgejo Actions CI/CD setup that automatically runs your pricing tests whenever code changes are made. This ensures that your pricing calculations remain accurate and prevents regressions from being introduced into production.
|
|||
|
|
|||
|
## Files Created
|
|||
|
|
|||
|
### Workflow Files
|
|||
|
1. **`.forgejo/workflows/ci.yml`** - Main CI/CD pipeline (208 lines)
|
|||
|
2. **`.forgejo/workflows/pricing-tests.yml`** - Dedicated pricing tests (297 lines)
|
|||
|
3. **`.forgejo/workflows/pr-pricing-validation.yml`** - Pull request validation (234 lines)
|
|||
|
4. **`.forgejo/workflows/scheduled-pricing-tests.yml`** - Daily scheduled tests (359 lines)
|
|||
|
|
|||
|
### Documentation and Utilities
|
|||
|
5. **`.forgejo/workflows/README.md`** - Comprehensive workflow documentation
|
|||
|
6. **`.forgejo/setup-local-testing.sh`** - Local testing setup script
|
|||
|
|
|||
|
## Workflow Features
|
|||
|
|
|||
|
### 🚀 Main CI/CD Pipeline (`ci.yml`)
|
|||
|
**Triggers**: Push to main/develop, Pull Requests
|
|||
|
|
|||
|
**Jobs**:
|
|||
|
- **Test Job**: Runs all Django tests including pricing tests with PostgreSQL
|
|||
|
- **Lint Job**: Code quality checks with ruff
|
|||
|
- **Security Job**: Security scanning with safety and bandit
|
|||
|
- **Build Job**: Docker image building (only on main/develop)
|
|||
|
- **Deploy Job**: Production deployment to OpenShift (only on main)
|
|||
|
|
|||
|
**Key Features**:
|
|||
|
- Separates pricing tests into distinct groups for visibility
|
|||
|
- Uses PostgreSQL service for realistic database testing
|
|||
|
- Only builds and deploys if all tests pass
|
|||
|
- Includes comprehensive Django system checks
|
|||
|
|
|||
|
### 🧮 Pricing-Specific Tests (`pricing-tests.yml`)
|
|||
|
**Triggers**: Changes to pricing-related files
|
|||
|
- `hub/services/models/pricing.py`
|
|||
|
- `hub/services/tests/test_pricing*.py`
|
|||
|
- `hub/services/forms.py`
|
|||
|
- `hub/services/views/**`
|
|||
|
- `hub/services/templates/**`
|
|||
|
|
|||
|
**Features**:
|
|||
|
- **Matrix Testing**: Python 3.12/3.13 × Django 5.0/5.1
|
|||
|
- **Performance Testing**: Large dataset calculations and stress tests
|
|||
|
- **Coverage Reporting**: Test coverage analysis and HTML reports
|
|||
|
- **Sample Validation**: Real pricing scenarios validation
|
|||
|
- **Documentation Checks**: Ensures tests are properly documented
|
|||
|
|
|||
|
### 🔍 Pull Request Validation (`pr-pricing-validation.yml`)
|
|||
|
**Triggers**: Pull requests affecting pricing code
|
|||
|
|
|||
|
**Features**:
|
|||
|
- **Migration Detection**: Checks if pricing model changes need migrations
|
|||
|
- **Coverage Threshold**: Enforces 85% test coverage minimum
|
|||
|
- **Critical Method Analysis**: Detects changes to important pricing methods
|
|||
|
- **Backward Compatibility**: Validates that existing APIs still work
|
|||
|
- **Test Addition Validation**: Ensures new features have corresponding tests
|
|||
|
- **PR Summary Generation**: Creates detailed summaries for reviewers
|
|||
|
|
|||
|
### 📅 Scheduled Testing (`scheduled-pricing-tests.yml`)
|
|||
|
**Triggers**: Daily at 6 AM UTC, Manual dispatch
|
|||
|
|
|||
|
**Features**:
|
|||
|
- **Multi-Database Testing**: SQLite and PostgreSQL matrix
|
|||
|
- **Stress Testing**: Concurrent calculations and large datasets
|
|||
|
- **Data Integrity Checks**: Validates pricing data consistency
|
|||
|
- **Daily Reports**: System health and statistics
|
|||
|
- **Automatic Issue Creation**: Creates GitHub issues on failures
|
|||
|
- **Performance Monitoring**: Tracks calculation performance over time
|
|||
|
|
|||
|
## Security and Environment
|
|||
|
|
|||
|
### Required Secrets
|
|||
|
Set these in your Forgejo repository settings:
|
|||
|
```yaml
|
|||
|
REGISTRY_USERNAME # Container registry username
|
|||
|
REGISTRY_PASSWORD # Container registry password
|
|||
|
OPENSHIFT_SERVER # OpenShift server URL
|
|||
|
OPENSHIFT_TOKEN # OpenShift authentication token
|
|||
|
```
|
|||
|
|
|||
|
### Environment Variables
|
|||
|
```yaml
|
|||
|
REGISTRY: registry.vshn.net
|
|||
|
NAMESPACE: vshn-servalafe-prod
|
|||
|
DATABASE_URL: # Set automatically by workflows
|
|||
|
DJANGO_SETTINGS_MODULE: hub.settings
|
|||
|
```
|
|||
|
|
|||
|
## Test Coverage
|
|||
|
|
|||
|
The workflows provide comprehensive testing of:
|
|||
|
|
|||
|
### ✅ Core Pricing Functionality
|
|||
|
- Progressive discount calculations with multiple tiers
|
|||
|
- Final price calculations including base fees, unit rates, and addons
|
|||
|
- Multi-currency support (CHF, EUR, USD)
|
|||
|
- Service level pricing differences (Best Effort vs Guaranteed)
|
|||
|
- Addon pricing (base fee and unit rate types)
|
|||
|
|
|||
|
### ✅ Edge Cases and Error Handling
|
|||
|
- Zero and negative value handling
|
|||
|
- Very large number calculations
|
|||
|
- Missing price data scenarios
|
|||
|
- Decimal precision edge cases
|
|||
|
- Database constraint validation
|
|||
|
- Inactive discount model behavior
|
|||
|
|
|||
|
### ✅ Integration Scenarios
|
|||
|
- Complete service setups with all components
|
|||
|
- Real-world pricing scenarios (e.g., PostgreSQL with 16GB RAM)
|
|||
|
- External price comparisons with competitors
|
|||
|
- Cross-model relationship validation
|
|||
|
|
|||
|
### ✅ Performance and Stress Testing
|
|||
|
- Large dataset calculations (up to 5000 units)
|
|||
|
- Concurrent price calculations (50 simultaneous)
|
|||
|
- Complex discount models with multiple tiers
|
|||
|
- Performance regression detection
|
|||
|
|
|||
|
## Usage Examples
|
|||
|
|
|||
|
### Automatic Triggers
|
|||
|
```bash
|
|||
|
# Trigger full CI/CD pipeline
|
|||
|
git push origin main
|
|||
|
|
|||
|
# Trigger pricing-specific tests
|
|||
|
git push origin feature/pricing-improvements
|
|||
|
|
|||
|
# Trigger PR validation
|
|||
|
git checkout -b feature/new-pricing
|
|||
|
# Make changes to pricing files
|
|||
|
git push origin feature/new-pricing
|
|||
|
# Create pull request
|
|||
|
```
|
|||
|
|
|||
|
### Manual Triggers
|
|||
|
- Use Forgejo Actions UI to manually run workflows
|
|||
|
- Scheduled tests can be run with different scopes:
|
|||
|
- `all` - All pricing tests
|
|||
|
- `pricing-only` - Basic pricing tests only
|
|||
|
- `integration-only` - Integration tests only
|
|||
|
|
|||
|
### Local Testing
|
|||
|
```bash
|
|||
|
# Run local validation before pushing
|
|||
|
./.forgejo/setup-local-testing.sh
|
|||
|
```
|
|||
|
|
|||
|
## Monitoring and Alerts
|
|||
|
|
|||
|
### Test Results
|
|||
|
- **Real-time feedback**: See test results in PR checks
|
|||
|
- **Detailed logs**: Comprehensive logging with grouped output
|
|||
|
- **Coverage reports**: HTML coverage reports as downloadable artifacts
|
|||
|
- **Performance metrics**: Timing data for all calculations
|
|||
|
|
|||
|
### Failure Handling
|
|||
|
- **PR blocking**: Failed tests prevent merging
|
|||
|
- **Issue creation**: Scheduled test failures automatically create GitHub issues
|
|||
|
- **Notification**: Team notifications on critical failures
|
|||
|
- **Artifact preservation**: Test results saved for 30 days
|
|||
|
|
|||
|
## Integration with Existing CI/CD
|
|||
|
|
|||
|
### Relationship with GitLab CI
|
|||
|
Your existing `.gitlab-ci.yml` focuses on:
|
|||
|
- Docker image building
|
|||
|
- Production deployment
|
|||
|
- Simple build-test-deploy workflow
|
|||
|
|
|||
|
The new Forgejo Actions provide:
|
|||
|
- **Comprehensive testing** with multiple scenarios
|
|||
|
- **Detailed validation** of pricing-specific changes
|
|||
|
- **Matrix testing** across Python/Django versions
|
|||
|
- **Automated quality gates** with coverage thresholds
|
|||
|
- **Continuous monitoring** with scheduled tests
|
|||
|
|
|||
|
Both systems can coexist and complement each other.
|
|||
|
|
|||
|
## Best Practices
|
|||
|
|
|||
|
### For Developers
|
|||
|
1. **Run tests locally** using the setup script before pushing
|
|||
|
2. **Add tests** for any new pricing functionality
|
|||
|
3. **Check coverage** to ensure adequate test coverage
|
|||
|
4. **Review PR summaries** for detailed change analysis
|
|||
|
|
|||
|
### For Maintainers
|
|||
|
1. **Monitor scheduled tests** for early issue detection
|
|||
|
2. **Review coverage trends** to maintain quality
|
|||
|
3. **Update thresholds** as the codebase evolves
|
|||
|
4. **Investigate failures** promptly to prevent regressions
|
|||
|
|
|||
|
## Benefits
|
|||
|
|
|||
|
### 🛡️ Regression Prevention
|
|||
|
- Comprehensive test suite catches pricing calculation errors
|
|||
|
- Matrix testing ensures compatibility across versions
|
|||
|
- Backward compatibility checks prevent API breakage
|
|||
|
|
|||
|
### 🔍 Quality Assurance
|
|||
|
- 85% minimum test coverage enforced
|
|||
|
- Code quality checks with ruff
|
|||
|
- Security scanning with safety and bandit
|
|||
|
- Documentation completeness validation
|
|||
|
|
|||
|
### 📊 Continuous Monitoring
|
|||
|
- Daily health checks catch issues early
|
|||
|
- Performance regression detection
|
|||
|
- Data integrity validation
|
|||
|
- Automatic issue creation for failures
|
|||
|
|
|||
|
### 🚀 Developer Experience
|
|||
|
- Fast feedback on pricing changes
|
|||
|
- Detailed PR summaries for reviewers
|
|||
|
- Local testing script for pre-push validation
|
|||
|
- Clear documentation and troubleshooting guides
|
|||
|
|
|||
|
## Next Steps
|
|||
|
|
|||
|
1. **Set up secrets** in your Forgejo repository settings
|
|||
|
2. **Test locally** using `./.forgejo/setup-local-testing.sh`
|
|||
|
3. **Push changes** to trigger the workflows
|
|||
|
4. **Monitor results** in the Actions tab
|
|||
|
5. **Customize** workflows based on your specific needs
|
|||
|
|
|||
|
The system is designed to be robust, comprehensive, and maintainable, ensuring that your pricing calculations remain accurate as your codebase evolves.
|