162 lines
4.0 KiB
Markdown
162 lines
4.0 KiB
Markdown
# Homework Backend - Docker & Jenkins CI/CD Setup
|
|
|
|
This project includes complete CI/CD setup with Jenkins pipeline and Docker containerization.
|
|
|
|
## 🏗️ Build & Deploy
|
|
|
|
### Local Development
|
|
|
|
1. **Build and run locally:**
|
|
```bash
|
|
# Build the application
|
|
./build.sh
|
|
|
|
# Run with Docker Compose
|
|
docker-compose up --build
|
|
```
|
|
|
|
2. **Access the application:**
|
|
- API: http://localhost:8080
|
|
- Swagger UI: http://localhost:8080/swagger
|
|
|
|
### Jenkins Pipeline
|
|
|
|
The Jenkins pipeline includes the following stages:
|
|
|
|
1. **Checkout** - Clone the repository
|
|
2. **Restore Dependencies** - Install NuGet packages
|
|
3. **Build** - Compile the application
|
|
4. **Test** - Run unit tests
|
|
5. **Publish** - Create deployment artifacts
|
|
6. **Build Docker Image** - Create Docker image
|
|
7. **Push Docker Image** - Push to registry
|
|
8. **Deploy to Staging** - Deploy to staging environment
|
|
9. **Integration Tests** - Run tests against staging
|
|
10. **Deploy to Production** - Manual approval then production deploy
|
|
|
|
### Environment Variables
|
|
|
|
Set these environment variables for Jenkins:
|
|
|
|
```bash
|
|
DOCKER_REGISTRY=your-registry.com
|
|
DB_PASSWORD=your-database-password
|
|
```
|
|
|
|
### Docker Registry Credentials
|
|
|
|
Configure Docker registry credentials in Jenkins:
|
|
- Credential ID: `docker-registry-credentials`
|
|
- Type: Username with password
|
|
|
|
## 📁 File Structure
|
|
|
|
```
|
|
├── Dockerfile # Multi-stage Docker build
|
|
├── Jenkinsfile # Jenkins pipeline definition
|
|
├── docker-compose.yml # Local development setup
|
|
├── docker-compose.staging.yml # Staging environment
|
|
├── docker-compose.prod.yml # Production environment
|
|
├── .dockerignore # Docker build exclusions
|
|
├── build.sh # Local build script
|
|
├── deploy.sh # Deployment script
|
|
├── init.sql # Database initialization
|
|
├── nginx/
|
|
│ └── nginx.conf # Nginx reverse proxy config
|
|
└── Homework/
|
|
├── appsettings.json # Application configuration
|
|
└── ... # Application code
|
|
```
|
|
|
|
## 🚀 Deployment Environments
|
|
|
|
### Development
|
|
- Single container setup with PostgreSQL
|
|
- Hot reload enabled
|
|
- Logs mounted to host
|
|
|
|
### Staging
|
|
- Load balanced (2 replicas)
|
|
- Resource limits applied
|
|
- Integration testing environment
|
|
|
|
### Production
|
|
- Load balanced (3 replicas)
|
|
- Nginx reverse proxy with SSL
|
|
- Resource limits and health checks
|
|
- Database persistence
|
|
|
|
## 🔧 Configuration
|
|
|
|
### Application Settings
|
|
|
|
Update `Homework/appsettings.json` for different environments:
|
|
|
|
```json
|
|
{
|
|
"Logging": {
|
|
"LogLevel": {
|
|
"Default": "Information",
|
|
"Microsoft.AspNetCore": "Warning"
|
|
}
|
|
},
|
|
"JwtSettings": {
|
|
"Key": "your-jwt-secret-key",
|
|
"Issuer": "your-issuer",
|
|
"Audience": "your-audience"
|
|
},
|
|
"ConnectionStrings": {
|
|
"DefaultConnection": "Host=postgres;Database=homework;Username=homework_user;Password=homework_password"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Jenkins Pipeline Customization
|
|
|
|
Modify the `Jenkinsfile` to:
|
|
- Change Docker registry URL
|
|
- Add additional test stages
|
|
- Modify deployment targets
|
|
- Add notification channels
|
|
|
|
## 🏥 Health Checks
|
|
|
|
The application includes health check endpoints:
|
|
- `/health` - Basic health check
|
|
- Container health checks configured in Docker
|
|
|
|
## 🔒 Security
|
|
|
|
- Non-root user in containers
|
|
- Security headers in Nginx
|
|
- Resource limits applied
|
|
- Secrets management via environment variables
|
|
|
|
## 📊 Monitoring
|
|
|
|
- Application logs are written to files and console
|
|
- Nginx access logs
|
|
- Docker container logs
|
|
- Health check monitoring
|
|
|
|
## 🐛 Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
1. **Build fails**: Check .NET SDK version in Dockerfile
|
|
2. **Database connection**: Verify PostgreSQL credentials
|
|
3. **Port conflicts**: Ensure ports 8080, 5432 are available
|
|
4. **Registry push fails**: Check Docker registry credentials
|
|
|
|
### Logs
|
|
|
|
```bash
|
|
# View application logs
|
|
docker-compose logs homework-backend
|
|
|
|
# View database logs
|
|
docker-compose logs postgres
|
|
|
|
# View all logs
|
|
docker-compose logs
|
|
``` |