forked from freeleaps/freeleaps-pub
337 lines
9.2 KiB
Markdown
337 lines
9.2 KiB
Markdown
# Local Code Packaging Feature
|
|
|
|
## Overview
|
|
|
|
The `devbox package` command is a powerful feature that allows engineers to package their local code into production-ready Docker containers for final testing before submitting to CI/CD pipelines. This feature mimics the real CI/CD flow by creating Docker images that closely resemble what would be deployed in production environments.
|
|
|
|
## Why This Feature?
|
|
|
|
### Problem Statement
|
|
- Engineers develop locally but can't easily test their code in a production-like environment
|
|
- CI/CD failures often occur due to environment differences between local development and production
|
|
- No easy way to validate Docker builds before committing code
|
|
- Integration testing requires complex setup
|
|
|
|
### Solution Benefits
|
|
- **Early Detection**: Catch Docker build issues before CI/CD
|
|
- **Environment Consistency**: Test in containers that match production
|
|
- **Integration Testing**: Run full integration tests with packaged containers
|
|
- **Confidence**: Ensure code works in production-like environment
|
|
- **Time Saving**: Reduce CI/CD iteration cycles
|
|
|
|
## Architecture
|
|
|
|
### Two Packaging Modes
|
|
|
|
#### 1. Test Mode (`--test-mode=test`)
|
|
- Runs unit tests before packaging
|
|
- Uses development Dockerfile
|
|
- Optimized for fast iteration
|
|
- Includes debugging capabilities
|
|
|
|
#### 2. Production Mode (`--test-mode=production`)
|
|
- Creates production-optimized Dockerfile
|
|
- Multi-stage builds for smaller images
|
|
- Security hardening (non-root user)
|
|
- Health checks and monitoring
|
|
- Optimized for production deployment
|
|
|
|
### Component Structure
|
|
```
|
|
freeleaps/
|
|
├── apps/
|
|
│ ├── chat/
|
|
│ │ ├── Dockerfile
|
|
│ │ ├── requirements.txt
|
|
│ │ └── tests/
|
|
│ ├── authentication/
|
|
│ │ ├── Dockerfile
|
|
│ │ ├── requirements.txt
|
|
│ │ └── tests/
|
|
│ └── ...
|
|
```
|
|
|
|
## Usage Examples
|
|
|
|
### Basic Packaging
|
|
```bash
|
|
# Package all components for testing
|
|
devbox package
|
|
|
|
# Package specific component
|
|
devbox package --component=chat
|
|
|
|
# Package for production
|
|
devbox package --test-mode=production
|
|
```
|
|
|
|
### Advanced Usage
|
|
```bash
|
|
# Package with custom image tag
|
|
devbox package --image-tag=v1.2.3 --test-mode=production
|
|
|
|
# Package with integration tests
|
|
devbox package --run-integration=true
|
|
|
|
# Package specific component with integration tests
|
|
devbox package --component=chat --run-integration=true --test-mode=production
|
|
```
|
|
|
|
## Command Reference
|
|
|
|
### `devbox package`
|
|
|
|
Packages local code into Docker containers for final testing.
|
|
|
|
#### Arguments
|
|
- `--working-home, -w`: Working home directory (default: `$HOME/devbox`)
|
|
- `--image-repo, -r`: Docker image repository (default: `freeleaps-local`)
|
|
- `--image-tag, -t`: Docker image tag (default: timestamp)
|
|
- `--component, -c`: Component to package (default: all components)
|
|
- `--test-mode, -m`: Packaging mode: `test` or `production` (default: `test`)
|
|
- `--run-integration, -i`: Run integration tests after packaging (default: `false`)
|
|
|
|
#### Examples
|
|
```bash
|
|
# Package all components for testing
|
|
devbox package
|
|
|
|
# Package chat component for production
|
|
devbox package --component=chat --test-mode=production
|
|
|
|
# Package with integration tests
|
|
devbox package --run-integration=true
|
|
|
|
# Package with custom settings
|
|
devbox package --image-repo=my-repo --image-tag=latest --test-mode=production
|
|
```
|
|
|
|
## Workflow Integration
|
|
|
|
### Typical Development Workflow
|
|
|
|
1. **Local Development**
|
|
```bash
|
|
# Engineer develops locally
|
|
cd ~/devbox/freeleaps/apps/chat
|
|
# Make changes to code
|
|
```
|
|
|
|
2. **Local Testing**
|
|
```bash
|
|
# Run unit tests
|
|
python -m pytest tests/
|
|
```
|
|
|
|
3. **Package for Final Testing**
|
|
```bash
|
|
# Package the component
|
|
devbox package --component=chat --test-mode=production
|
|
```
|
|
|
|
4. **Integration Testing**
|
|
```bash
|
|
# Run integration tests with packaged container
|
|
devbox package --component=chat --run-integration=true
|
|
```
|
|
|
|
5. **Submit to CI/CD**
|
|
```bash
|
|
# If all tests pass, commit and push
|
|
git add .
|
|
git commit -m "Feature: Add new chat functionality"
|
|
git push
|
|
```
|
|
|
|
### CI/CD Integration
|
|
|
|
The packaged containers can be:
|
|
- Used as base images for CI/CD pipelines
|
|
- Tested against production configurations
|
|
- Validated for security and performance
|
|
- Deployed to staging environments
|
|
|
|
## Technical Details
|
|
|
|
### Production Dockerfile Generation
|
|
|
|
When using `--test-mode=production`, the system generates optimized Dockerfiles:
|
|
|
|
```dockerfile
|
|
# Multi-stage build for production
|
|
FROM python:3.11-slim-buster as builder
|
|
|
|
# Install build dependencies
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
gcc g++ && rm -rf /var/lib/apt/lists/*
|
|
|
|
# Create virtual environment
|
|
RUN python -m venv /opt/venv
|
|
ENV PATH="/opt/venv/bin:$PATH"
|
|
|
|
# Copy and install requirements
|
|
COPY apps/chat/requirements.txt /tmp/requirements.txt
|
|
RUN pip install --no-cache-dir -r /tmp/requirements.txt
|
|
|
|
# Production stage
|
|
FROM python:3.11-slim-buster
|
|
|
|
# Create non-root user
|
|
RUN groupadd -r appuser && useradd -r -g appuser appuser
|
|
|
|
# Copy virtual environment from builder
|
|
COPY --from=builder /opt/venv /opt/venv
|
|
ENV PATH="/opt/venv/bin:$PATH"
|
|
|
|
# Set working directory
|
|
WORKDIR /app
|
|
|
|
# Copy application code
|
|
COPY apps/chat/ /app/
|
|
|
|
# Set environment variables for production
|
|
ENV PYTHONUNBUFFERED=1 \
|
|
PYTHONDONTWRITEBYTECODE=1 \
|
|
PIP_NO_CACHE_DIR=1 \
|
|
PIP_DISABLE_PIP_VERSION_CHECK=1
|
|
|
|
# Change ownership to non-root user
|
|
RUN chown -R appuser:appuser /app
|
|
|
|
# Switch to non-root user
|
|
USER appuser
|
|
|
|
# Health check
|
|
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
|
|
CMD python -c "import requests; requests.get('http://localhost:8000/health')" || exit 1
|
|
|
|
# Expose port
|
|
EXPOSE 8000
|
|
|
|
# Default command
|
|
CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
|
|
```
|
|
|
|
### Integration Testing
|
|
|
|
The integration testing system:
|
|
|
|
1. **Creates Test Network**: Isolated Docker network for testing
|
|
2. **Starts Dependencies**: MongoDB, Redis, RabbitMQ containers
|
|
3. **Runs Components**: Each packaged component in test mode
|
|
4. **Health Checks**: Validates component functionality
|
|
5. **Cleanup**: Removes all test containers and networks
|
|
|
|
### Environment Validation
|
|
|
|
The system validates:
|
|
- Source code existence
|
|
- Docker buildx support
|
|
- Available disk space (5GB minimum)
|
|
- Required tools (python, pip, pytest)
|
|
- Component structure and Dockerfiles
|
|
|
|
## Best Practices
|
|
|
|
### 1. Component Structure
|
|
Ensure your components follow the standard structure:
|
|
```
|
|
apps/component_name/
|
|
├── Dockerfile
|
|
├── requirements.txt
|
|
├── tests/
|
|
│ ├── test_component.py
|
|
│ └── conftest.py
|
|
└── main.py
|
|
```
|
|
|
|
### 2. Testing Strategy
|
|
- Write comprehensive unit tests
|
|
- Include integration test scenarios
|
|
- Test both development and production modes
|
|
- Validate health check endpoints
|
|
|
|
### 3. Dockerfile Best Practices
|
|
- Use multi-stage builds for production
|
|
- Minimize image layers
|
|
- Include health checks
|
|
- Use non-root users
|
|
- Set appropriate environment variables
|
|
|
|
### 4. CI/CD Integration
|
|
- Use packaged images as base for CI/CD
|
|
- Validate against production configurations
|
|
- Run security scans on packaged images
|
|
- Test deployment procedures
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
1. **Missing Dockerfile**
|
|
```
|
|
Error: Dockerfile not found for component: chat
|
|
```
|
|
**Solution**: Ensure each component has a Dockerfile in its directory.
|
|
|
|
2. **Test Failures**
|
|
```
|
|
Error: Component tests failed for chat
|
|
```
|
|
**Solution**: Fix unit tests before packaging.
|
|
|
|
3. **Integration Test Failures**
|
|
```
|
|
Error: chat integration test failed
|
|
```
|
|
**Solution**: Check component health endpoints and dependencies.
|
|
|
|
4. **Insufficient Disk Space**
|
|
```
|
|
Error: Insufficient disk space for packaging
|
|
```
|
|
**Solution**: Free up disk space (minimum 5GB required).
|
|
|
|
### Debugging Tips
|
|
|
|
1. **Check Component Structure**
|
|
```bash
|
|
ls -la ~/devbox/freeleaps/apps/chat/
|
|
```
|
|
|
|
2. **Validate Dockerfile**
|
|
```bash
|
|
docker buildx build --dry-run -f ~/devbox/freeleaps/apps/chat/Dockerfile .
|
|
```
|
|
|
|
3. **Test Component Locally**
|
|
```bash
|
|
cd ~/devbox/freeleaps/apps/chat
|
|
python -m pytest tests/ -v
|
|
```
|
|
|
|
4. **Check Integration Test Logs**
|
|
```bash
|
|
docker logs test-chat
|
|
```
|
|
|
|
## Future Enhancements
|
|
|
|
### Planned Features
|
|
1. **Multi-architecture Support**: ARM64 and AMD64 builds
|
|
2. **Security Scanning**: Automated vulnerability scanning
|
|
3. **Performance Testing**: Load testing of packaged containers
|
|
4. **Registry Integration**: Push to container registries
|
|
5. **Rollback Support**: Version management and rollback capabilities
|
|
|
|
### Integration Opportunities
|
|
1. **Git Hooks**: Pre-commit packaging validation
|
|
2. **IDE Integration**: VS Code and IntelliJ plugins
|
|
3. **Monitoring**: Integration with monitoring systems
|
|
4. **Compliance**: Automated compliance checking
|
|
|
|
## Conclusion
|
|
|
|
The `devbox package` feature bridges the gap between local development and production deployment by providing engineers with the ability to test their code in production-like containers before submitting to CI/CD pipelines. This significantly reduces deployment failures and improves development confidence.
|
|
|
|
By following the best practices outlined in this document, teams can leverage this feature to create a more robust and reliable development workflow that closely mirrors production environments. |