name: Code Quality Checks run-name: Проверка кода (lint & typecheck) от ${{ gitea.actor }} on: [push] jobs: lint-and-typecheck: runs-on: ubuntu-latest steps: - name: Check out repository code uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' cache: 'npm' - name: Install dependencies run: npm ci - name: Run ESLint run: npm run eslint - name: Run TypeScript type check run: npx tsc --noEmit - name: Run tests run: npm test smoke-test: runs-on: ubuntu-latest needs: lint-and-typecheck steps: - name: Check out repository code uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' cache: 'npm' - name: Install dependencies run: npm ci - name: Start MongoDB run: | docker run -d \ --name mongodb-smoke-test \ -p 27017:27017 \ -e MONGO_INITDB_ROOT_USERNAME=admin \ -e MONGO_INITDB_ROOT_PASSWORD=password \ mongo:8.0.3 - name: Wait for MongoDB to be ready run: | timeout=30 elapsed=0 while ! docker exec mongodb-smoke-test mongosh --eval "db.adminCommand('ping')" --quiet > /dev/null 2>&1; do if [ $elapsed -ge $timeout ]; then echo "MongoDB не запустился за $timeout секунд" exit 1 fi echo "Ожидание запуска MongoDB... ($elapsed/$timeout)" sleep 2 elapsed=$((elapsed + 2)) done echo "MongoDB готов" - name: Start application env: MONGO_ADDR: mongodb://admin:password@localhost:27017/test_db?authSource=admin PORT: 8044 NODE_ENV: test run: | npm start > app.log 2>&1 & echo $! > app.pid echo "Приложение запущено с PID: $(cat app.pid)" - name: Wait for application to start run: | timeout=30 elapsed=0 while ! node -e "require('http').get('http://localhost:8044', (r) => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))" 2>/dev/null; do if [ $elapsed -ge $timeout ]; then echo "Приложение не запустилось за $timeout секунд" cat app.log exit 1 fi echo "Ожидание запуска приложения... ($elapsed/$timeout)" sleep 2 elapsed=$((elapsed + 2)) done echo "Приложение запущено" - name: Check application stability (30 seconds) run: | duration=30 elapsed=0 while [ $elapsed -lt $duration ]; do if ! kill -0 $(cat app.pid) 2>/dev/null; then echo "❌ Приложение упало через $elapsed секунд" cat app.log exit 1 fi if ! node -e "require('http').get('http://localhost:8044', (r) => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))" 2>/dev/null; then echo "❌ Приложение не отвечает через $elapsed секунд" cat app.log exit 1 fi echo "✓ Приложение работает ($elapsed/$duration секунд)" sleep 5 elapsed=$((elapsed + 5)) done echo "✅ Приложение стабильно работает в течение $duration секунд" - name: Stop application if: always() run: | if [ -f app.pid ]; then pid=$(cat app.pid) if kill -0 $pid 2>/dev/null; then echo "Остановка приложения (PID: $pid)" kill -TERM $pid || true sleep 3 if kill -0 $pid 2>/dev/null; then echo "Принудительная остановка приложения" kill -9 $pid 2>/dev/null || true fi fi rm -f app.pid fi - name: Stop MongoDB if: always() run: | docker stop mongodb-smoke-test || true docker rm mongodb-smoke-test || true