diff --git a/.gitea/workflows/check.yaml b/.gitea/workflows/check.yaml index 25fcc22..0dc6ccb 100644 --- a/.gitea/workflows/check.yaml +++ b/.gitea/workflows/check.yaml @@ -19,10 +19,120 @@ jobs: run: npm ci - name: Run ESLint - run: npm run eslint -- --quiet + run: npm run eslint - name: Run TypeScript type check run: npx tsc --noEmit - name: Run tests - run: npm test -- --quiet \ No newline at end of file + 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 \ No newline at end of file