name: CI/CD Pipeline on: push: branches: [ main, develop ] pull_request: branches: [ main ] env: DOCKER_REGISTRY: ghcr.io IMAGE_NAME: $ jobs: test: runs-on: ubuntu-latest services: postgres: image: postgres:15 env: POSTGRES_PASSWORD: postgres POSTGRES_DB: test_db options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 redis: image: redis:7-alpine options: >- --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 6379:6379 steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: '3.11' cache: 'pip' - name: Install dependencies run: | pip install -r requirements.txt pip install pytest pytest-cov pytest-asyncio black flake8 mypy - name: Run linter run: | flake8 src/ tests/ --max-line-length=120 --ignore=E203,W503 || true black --check src/ tests/ || true - name: Run type checker run: mypy src/ --ignore-missing-imports || true - name: Run unit tests run: pytest tests/ --cov=src --cov-report=xml --cov-report=html env: DATABASE_URL: postgresql://postgres:postgres@localhost:5432/test_db JWT_SECRET: test-secret REDIS_HOST: localhost REDIS_PORT: 6379 - name: Upload coverage reports uses: codecov/codecov-action@v3 with: files: ./coverage.xml build: needs: test runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to Container Registry uses: docker/login-action@v3 with: registry: $ username: $ password: $ - name: Build and push Docker image uses: docker/build-push-action@v5 with: context: . file: ./Dockerfile push: true tags: | $/$:$ $/$:latest deploy-staging: needs: build runs-on: ubuntu-latest if: github.ref == 'refs/heads/develop' steps: - name: Checkout code uses: actions/checkout@v4 - name: Configure kubectl uses: azure/k8s-set-context@v3 with: method: kubeconfig kubeconfig: $ - name: Deploy to staging run: | kubectl set image deployment/test_project-deployment test_project=$/$:$ -n staging deploy-production: needs: build runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' steps: - name: Checkout code uses: actions/checkout@v4 - name: Configure kubectl uses: azure/k8s-set-context@v3 with: method: kubeconfig kubeconfig: $ - name: Deploy to production run: | kubectl set image deployment/test_project-deployment test_project=$/$:$ -n production