444 lines
9.7 KiB
Markdown
444 lines
9.7 KiB
Markdown
|
|
# CI/CD Integration Guide
|
||
|
|
|
||
|
|
This document explains how automated tests are integrated into the MineSeeker deployment pipeline using Gitea Actions.
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
MineSeeker uses **Gitea Actions** (GitHub Actions compatible) for continuous integration and deployment:
|
||
|
|
|
||
|
|
- **CI Pipeline** (`.gitea/workflows/ci.yml`) - Runs on every push/PR to main/develop
|
||
|
|
- **CD Pipeline** (`.gitea/workflows/deploy.yml`) - Runs on version tags, includes tests before deployment
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## CI Workflow (Continuous Integration)
|
||
|
|
|
||
|
|
**Trigger:** Push or Pull Request to `main` or `develop` branches
|
||
|
|
|
||
|
|
**File:** `.gitea/workflows/ci.yml`
|
||
|
|
|
||
|
|
### Jobs
|
||
|
|
|
||
|
|
#### 1. **Tests Job**
|
||
|
|
|
||
|
|
Runs the full PHPUnit test suite with:
|
||
|
|
|
||
|
|
- PostgreSQL 18 service container
|
||
|
|
- PHP 8.3 with required extensions
|
||
|
|
- Composer dependency installation
|
||
|
|
- Node.js for asset building
|
||
|
|
- Database setup and migrations
|
||
|
|
- 71 PHPUnit tests with testdox output
|
||
|
|
|
||
|
|
**Steps:**
|
||
|
|
1. Checkout code
|
||
|
|
2. Setup PHP 8.3 with extensions (pdo_pgsql, gd, intl, zip, sodium)
|
||
|
|
3. Validate `composer.json`
|
||
|
|
4. Cache and install Composer dependencies
|
||
|
|
5. Setup Node.js 20 and install dependencies
|
||
|
|
6. Build frontend assets with Vite
|
||
|
|
7. Create `.env.test` configuration
|
||
|
|
8. Setup test database with migrations
|
||
|
|
9. Run PHPUnit tests with `--testdox` output
|
||
|
|
10. (Optional) Generate coverage report on PRs
|
||
|
|
|
||
|
|
#### 2. **Lint Job**
|
||
|
|
|
||
|
|
Code quality checks:
|
||
|
|
|
||
|
|
- ESLint for JavaScript/JSX
|
||
|
|
- PHP-CS-Fixer (if installed)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## CD Workflow (Continuous Deployment)
|
||
|
|
|
||
|
|
**Trigger:** Push of version tags (e.g., `v1.0.0`, `v1.2.3`)
|
||
|
|
|
||
|
|
**File:** `.gitea/workflows/deploy.yml`
|
||
|
|
|
||
|
|
### Jobs
|
||
|
|
|
||
|
|
#### 1. **Test Job** (Pre-deployment)
|
||
|
|
|
||
|
|
**Critical:** Deployment only proceeds if tests pass.
|
||
|
|
|
||
|
|
- Runs same test suite as CI workflow
|
||
|
|
- Uses `--stop-on-failure` flag for fast feedback
|
||
|
|
- Blocks deployment on any test failure
|
||
|
|
|
||
|
|
#### 2. **Deploy Job** (Production Deployment)
|
||
|
|
|
||
|
|
**Depends on:** `test` job must complete successfully
|
||
|
|
|
||
|
|
**Steps:**
|
||
|
|
1. Checkout tagged version
|
||
|
|
2. Write production `.env` from secrets
|
||
|
|
3. Build Docker image
|
||
|
|
4. Run database migrations
|
||
|
|
5. Clear production cache
|
||
|
|
6. Start/restart services with `docker compose up -d`
|
||
|
|
7. Health check (curl to verify app is running)
|
||
|
|
8. Notify success/failure
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Configuration Requirements
|
||
|
|
|
||
|
|
### Gitea Repository Variables
|
||
|
|
|
||
|
|
Set these in Gitea repository settings:
|
||
|
|
|
||
|
|
```
|
||
|
|
PROD_APP_DIR=/path/to/production/app
|
||
|
|
```
|
||
|
|
|
||
|
|
### Gitea Repository Secrets
|
||
|
|
|
||
|
|
```
|
||
|
|
PROD_ENV_FILE=<contents of production .env file>
|
||
|
|
```
|
||
|
|
|
||
|
|
### Test Database Configuration
|
||
|
|
|
||
|
|
The CI/CD pipeline uses a PostgreSQL service container with these credentials:
|
||
|
|
|
||
|
|
```env
|
||
|
|
POSTGRES_USER=mineseeker_test
|
||
|
|
POSTGRES_PASSWORD=test_password
|
||
|
|
POSTGRES_DB=mineseeker_test
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Running Tests Locally
|
||
|
|
|
||
|
|
Before pushing, run tests locally to catch issues early:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Setup test database (first time only)
|
||
|
|
make test-db-setup
|
||
|
|
|
||
|
|
# Run tests
|
||
|
|
make test
|
||
|
|
|
||
|
|
# Run with testdox output
|
||
|
|
vendor/bin/phpunit --testdox
|
||
|
|
|
||
|
|
# Run with coverage
|
||
|
|
XDEBUG_MODE=coverage vendor/bin/phpunit --coverage-html=var/coverage
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Deployment Workflow
|
||
|
|
|
||
|
|
### Standard Deployment Process
|
||
|
|
|
||
|
|
1. **Develop features** on feature branches
|
||
|
|
2. **Open Pull Request** to `develop` or `main`
|
||
|
|
- CI workflow runs automatically
|
||
|
|
- Tests must pass before merge
|
||
|
|
3. **Merge PR** after review and passing tests
|
||
|
|
4. **Create version tag** when ready to deploy:
|
||
|
|
```bash
|
||
|
|
git tag -a v1.2.3 -m "Release version 1.2.3"
|
||
|
|
git push origin v1.2.3
|
||
|
|
```
|
||
|
|
5. **Deployment runs automatically:**
|
||
|
|
- Tests run first
|
||
|
|
- If tests pass, Docker image builds
|
||
|
|
- Migrations run
|
||
|
|
- Services restart
|
||
|
|
- Health check verifies deployment
|
||
|
|
|
||
|
|
### Rollback Process
|
||
|
|
|
||
|
|
If deployment fails or issues are discovered:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Tag and deploy previous stable version
|
||
|
|
git push origin v1.2.2
|
||
|
|
|
||
|
|
# Or SSH to production and manually rollback
|
||
|
|
cd /path/to/production/app
|
||
|
|
git checkout v1.2.2
|
||
|
|
docker compose build
|
||
|
|
docker compose up -d
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Test Suite Details
|
||
|
|
|
||
|
|
### Test Coverage
|
||
|
|
|
||
|
|
The CI/CD pipeline runs **71 tests** across:
|
||
|
|
|
||
|
|
- **Controller Tests** (29 tests)
|
||
|
|
- GameController, ProfileController, SecurityController
|
||
|
|
- HTTP status codes, authentication, routing
|
||
|
|
|
||
|
|
- **DTO Tests** (9 tests)
|
||
|
|
- ProfileGameDto, ProfileStatsDto, ProfileChartDataDto
|
||
|
|
- Serialization, null handling, calculations
|
||
|
|
|
||
|
|
- **Entity Tests** (8 tests)
|
||
|
|
- UserStats calculations and defaults
|
||
|
|
|
||
|
|
- **Service Tests** (13 tests)
|
||
|
|
- MercureJwtService, RecaptchaService
|
||
|
|
- Token generation, API verification
|
||
|
|
|
||
|
|
- **Integration Tests** (12 tests)
|
||
|
|
- Factory usage examples
|
||
|
|
- Database isolation
|
||
|
|
|
||
|
|
### Test Execution Time
|
||
|
|
|
||
|
|
Typical test suite runtime: **6-8 seconds**
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Best Practices
|
||
|
|
|
||
|
|
### Before Committing
|
||
|
|
|
||
|
|
✅ **Always run tests locally:**
|
||
|
|
```bash
|
||
|
|
make test
|
||
|
|
```
|
||
|
|
|
||
|
|
✅ **Check code style:**
|
||
|
|
```bash
|
||
|
|
vendor/bin/php-cs-fixer fix --dry-run
|
||
|
|
npm run lint
|
||
|
|
```
|
||
|
|
|
||
|
|
✅ **Verify assets build:**
|
||
|
|
```bash
|
||
|
|
npm run build
|
||
|
|
```
|
||
|
|
|
||
|
|
### When Creating PRs
|
||
|
|
|
||
|
|
✅ **Wait for CI checks** to pass before requesting review
|
||
|
|
|
||
|
|
✅ **Fix failing tests** immediately - don't merge broken code
|
||
|
|
|
||
|
|
✅ **Review test output** in Gitea Actions logs
|
||
|
|
|
||
|
|
### When Deploying
|
||
|
|
|
||
|
|
✅ **Tag semantic versions:** `v1.2.3` (major.minor.patch)
|
||
|
|
|
||
|
|
✅ **Write meaningful tag messages:**
|
||
|
|
```bash
|
||
|
|
git tag -a v1.2.3 -m "Add bonus points to battle cards, fix avatar upload bug"
|
||
|
|
```
|
||
|
|
|
||
|
|
✅ **Monitor deployment logs** in Gitea Actions
|
||
|
|
|
||
|
|
✅ **Verify health check** passes after deployment
|
||
|
|
|
||
|
|
✅ **Test critical features** in production after deployment
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Tests Pass Locally but Fail in CI
|
||
|
|
|
||
|
|
**Possible causes:**
|
||
|
|
|
||
|
|
1. **Database state:** CI uses fresh database, local may have leftover data
|
||
|
|
```bash
|
||
|
|
make test-db-reset # Reset local test database
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **Environment differences:** Check `.env.test` matches CI configuration
|
||
|
|
|
||
|
|
3. **Cached dependencies:** CI caches may be stale
|
||
|
|
- Clear cache in Gitea Actions settings
|
||
|
|
- Or add `--no-cache` to composer install
|
||
|
|
|
||
|
|
### Deployment Fails After Tests Pass
|
||
|
|
|
||
|
|
**Common issues:**
|
||
|
|
|
||
|
|
1. **Migration conflicts:** Manually run migrations on production
|
||
|
|
```bash
|
||
|
|
docker compose run --rm app php bin/console doctrine:migrations:migrate
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **Missing environment variables:** Check `PROD_ENV_FILE` secret is up-to-date
|
||
|
|
|
||
|
|
3. **Docker build errors:** Check Dockerfile and build context
|
||
|
|
|
||
|
|
4. **Health check timeout:** Increase sleep time or check application startup
|
||
|
|
|
||
|
|
### Database Migration Issues
|
||
|
|
|
||
|
|
If migrations fail during deployment:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# SSH to production server
|
||
|
|
cd /path/to/production/app
|
||
|
|
|
||
|
|
# Check migration status
|
||
|
|
docker compose run --rm app php bin/console doctrine:migrations:status
|
||
|
|
|
||
|
|
# Manually run migrations
|
||
|
|
docker compose run --rm app php bin/console doctrine:migrations:migrate --no-interaction
|
||
|
|
|
||
|
|
# If migration is stuck, mark as executed
|
||
|
|
docker compose run --rm app php bin/console doctrine:migrations:version YYYYMMDDHHMMSS --add
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Monitoring and Notifications
|
||
|
|
|
||
|
|
### Viewing CI/CD Logs
|
||
|
|
|
||
|
|
1. Go to Gitea repository
|
||
|
|
2. Click **Actions** tab
|
||
|
|
3. Select workflow run
|
||
|
|
4. View detailed logs for each step
|
||
|
|
|
||
|
|
### Setting Up Notifications
|
||
|
|
|
||
|
|
**Gitea webhook notifications:**
|
||
|
|
|
||
|
|
Configure webhooks in repository settings to notify:
|
||
|
|
- Slack/Discord when builds fail
|
||
|
|
- Email on deployment success/failure
|
||
|
|
- Custom endpoints for monitoring systems
|
||
|
|
|
||
|
|
**Example webhook payload:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"event": "workflow_run",
|
||
|
|
"repository": "Mine",
|
||
|
|
"workflow": "deploy.yml",
|
||
|
|
"status": "success",
|
||
|
|
"tag": "v1.2.3"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Advanced Configuration
|
||
|
|
|
||
|
|
### Running Tests with Coverage
|
||
|
|
|
||
|
|
Enable coverage in CI (requires Xdebug):
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
- name: Run tests with coverage
|
||
|
|
run: |
|
||
|
|
XDEBUG_MODE=coverage vendor/bin/phpunit \
|
||
|
|
--coverage-clover=coverage.xml \
|
||
|
|
--coverage-html=var/coverage
|
||
|
|
```
|
||
|
|
|
||
|
|
### Parallel Test Execution
|
||
|
|
|
||
|
|
For larger test suites, use ParaTest:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
composer require --dev brianium/paratest
|
||
|
|
```
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
- name: Run tests in parallel
|
||
|
|
run: vendor/bin/paratest --processes=4
|
||
|
|
```
|
||
|
|
|
||
|
|
### Database Seeding for E2E Tests
|
||
|
|
|
||
|
|
Add step before tests:
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
- name: Seed test data
|
||
|
|
run: |
|
||
|
|
php bin/console doctrine:fixtures:load --no-interaction --env=test
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Security Considerations
|
||
|
|
|
||
|
|
### Secrets Management
|
||
|
|
|
||
|
|
❗ **Never commit secrets to repository**
|
||
|
|
|
||
|
|
✅ **Use Gitea secrets** for sensitive data:
|
||
|
|
- `PROD_ENV_FILE` - Production environment variables
|
||
|
|
- Database credentials
|
||
|
|
- API keys
|
||
|
|
|
||
|
|
✅ **Rotate secrets regularly**
|
||
|
|
|
||
|
|
✅ **Use environment-specific secrets** (staging, production)
|
||
|
|
|
||
|
|
### Database Security
|
||
|
|
|
||
|
|
✅ **Test database is isolated** - No production data access
|
||
|
|
|
||
|
|
✅ **Credentials are ephemeral** - Service containers use temporary passwords
|
||
|
|
|
||
|
|
✅ **No data persistence** - Test database recreated on each run
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Performance Optimization
|
||
|
|
|
||
|
|
### Caching Strategies
|
||
|
|
|
||
|
|
CI/CD workflows cache:
|
||
|
|
|
||
|
|
1. **Composer dependencies** - `vendor/` directory
|
||
|
|
2. **Node modules** - `node_modules/` directory
|
||
|
|
3. **Docker layers** - Image build cache
|
||
|
|
|
||
|
|
### Reducing Build Time
|
||
|
|
|
||
|
|
✅ **Use `composer install --no-dev`** in production builds
|
||
|
|
|
||
|
|
✅ **Multi-stage Docker builds** - Separate assets from PHP
|
||
|
|
|
||
|
|
✅ **Parallel jobs** - Tests and linting run concurrently
|
||
|
|
|
||
|
|
✅ **Skip unnecessary steps** - Use conditionals (`if:` statements)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Future Enhancements
|
||
|
|
|
||
|
|
### Planned Improvements
|
||
|
|
|
||
|
|
- [ ] Automated browser tests with Symfony Panther
|
||
|
|
- [ ] Visual regression testing for UI changes
|
||
|
|
- [ ] Performance benchmarking in CI
|
||
|
|
- [ ] Automated security scanning (Symfony Security Checker)
|
||
|
|
- [ ] Staging environment deployments before production
|
||
|
|
- [ ] Blue-green deployment strategy
|
||
|
|
- [ ] Automated rollback on health check failure
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## References
|
||
|
|
|
||
|
|
- **Gitea Actions Documentation:** https://docs.gitea.com/usage/actions/overview
|
||
|
|
- **GitHub Actions Reference:** https://docs.github.com/en/actions (compatible syntax)
|
||
|
|
- **PHPUnit Documentation:** https://phpunit.de/documentation.html
|
||
|
|
- **Symfony Testing:** https://symfony.com/doc/current/testing.html
|
||
|
|
- **Docker Compose:** https://docs.docker.com/compose/
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Last Updated:** 2026-04-21
|
||
|
|
**MineSeeker Version:** 1.0.0
|
||
|
|
**CI/CD Platform:** Gitea Actions
|