freeleaps-pub/devbox/cli/LOCAL_CODE_PACKAGING.md

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.