name: CI/CD Pipeline on: push: branches: [ main, develop ] pull_request: branches: [ main ] jobs: test: name: Test runs-on: ubuntu-latest strategy: matrix: python-version: ['3.11', '3.12'] steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Cache pip packages uses: actions/cache@v3 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} restore-keys: | ${{ runner.os }}-pip- - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install pytest pytest-cov pytest-asyncio - name: Run tests env: USE_IN_MEMORY_DB: true run: | pytest tests/ -v --cov=packages --cov-report=xml --cov-report=term - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: file: ./coverage.xml flags: unittests name: codecov-umbrella lint: name: Lint runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.12' - name: Install linting tools run: | python -m pip install --upgrade pip pip install black isort flake8 mypy - name: Check code formatting with black run: black --check packages/ apps/ tests/ - name: Check import sorting with isort run: isort --check-only packages/ apps/ tests/ - name: Lint with flake8 run: flake8 packages/ apps/ tests/ --max-line-length=100 --ignore=E203,W503 build: name: Build Docker Image runs-on: ubuntu-latest needs: [test, lint] steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build Docker image uses: docker/build-push-action@v5 with: context: . push: false tags: xiaoxia-saas:${{ github.sha }} cache-from: type=gha cache-to: type=gha,mode=max deploy-staging: name: Deploy to Staging runs-on: ubuntu-latest needs: [build] if: github.ref == 'refs/heads/develop' steps: - name: Checkout code uses: actions/checkout@v4 - name: Deploy to staging run: | echo "Deploying to staging environment..." # Add your staging deployment commands here # Example: ssh deploy@staging-server 'cd /app && docker-compose pull && docker-compose up -d' deploy-production: name: Deploy to Production runs-on: ubuntu-latest needs: [build] if: github.ref == 'refs/heads/main' && github.event_name == 'push' steps: - name: Checkout code uses: actions/checkout@v4 - name: Deploy to production run: | echo "Deploying to production environment..." # Add your production deployment commands here # Example: ssh deploy@prod-server 'cd /app && docker-compose pull && docker-compose up -d'