name: CI/CD Pipeline on: push: branches: [ main, develop ] pull_request: branches: [ main, develop ] env: PYTHON_VERSION: '3.11' NODE_VERSION: '18' jobs: # ============================================== # Backend тесты # ============================================== backend-tests: runs-on: ubuntu-latest services: postgres: image: postgres:16-alpine env: POSTGRES_DB: test_db POSTGRES_USER: test_user POSTGRES_PASSWORD: test_password 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: - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v4 with: python-version: ${{ env.PYTHON_VERSION }} - name: Install dependencies working-directory: ./backend run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Lint with flake8 working-directory: ./backend run: | pip install flake8 flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Run tests working-directory: ./backend env: DATABASE_URL: postgresql://test_user:test_password@localhost:5432/test_db REDIS_URL: redis://localhost:6379/0 SECRET_KEY: test-secret-key DEBUG: 'False' run: | python manage.py test --noinput - name: Check migrations working-directory: ./backend run: | python manage.py makemigrations --check --dry-run # ============================================== # Frontend тесты # ============================================== frontend-tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Node.js uses: actions/setup-node@v3 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' cache-dependency-path: ./frontend/package-lock.json - name: Install dependencies working-directory: ./frontend run: npm ci - name: Lint working-directory: ./frontend run: npm run lint || true - name: Type check working-directory: ./frontend run: npm run type-check || true - name: Build working-directory: ./frontend env: NEXT_PUBLIC_API_URL: http://localhost:8123/api run: npm run build # ============================================== # Docker build # ============================================== docker-build: runs-on: ubuntu-latest needs: [backend-tests, frontend-tests] steps: - uses: actions/checkout@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Build backend image uses: docker/build-push-action@v4 with: context: ./backend push: false tags: platform-backend:test cache-from: type=gha cache-to: type=gha,mode=max - name: Build frontend image uses: docker/build-push-action@v4 with: context: ./frontend push: false tags: platform-frontend:test cache-from: type=gha cache-to: type=gha,mode=max # ============================================== # Deploy (только для main ветки) # ============================================== deploy: runs-on: ubuntu-latest needs: [docker-build] if: github.ref == 'refs/heads/main' && github.event_name == 'push' steps: - uses: actions/checkout@v3 - name: Deploy to production run: | echo "Deploy to production server" # Здесь будет команда деплоя на сервер # Например, через SSH или через Docker registry