diff --git a/.gitea/workflows/deploy-dev.yml b/.gitea/workflows/deploy-dev.yml index befadb7..43590d1 100644 --- a/.gitea/workflows/deploy-dev.yml +++ b/.gitea/workflows/deploy-dev.yml @@ -11,15 +11,138 @@ concurrency: cancel-in-progress: true jobs: - # Run tests first - tests: - name: Run Tests - uses: ./.gitea/workflows/test.yml + # Run tests first - inline instead of reusable workflow + backend-tests: + name: Backend Tests + runs-on: ubuntu-latest + env: + SECRET_KEY: test-secret-key-for-ci-environment-32chars-minimum + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Setup Python + run: | + python3 --version + pip3 --version + + - name: Cache Python dependencies + id: cache-python + run: | + CACHE_KEY="python-$(cat dashboard/backend/requirements.txt dashboard/backend/requirements-dev.txt | md5sum | cut -d' ' -f1)" + CACHE_DIR="/tmp/pytest-cache/$CACHE_KEY" + PIP_CACHE_DIR="/tmp/pip-cache" + echo "CACHE_DIR=$CACHE_DIR" >> $GITHUB_ENV + echo "CACHE_KEY=$CACHE_KEY" >> $GITHUB_ENV + echo "PIP_CACHE_DIR=$PIP_CACHE_DIR" >> $GITHUB_ENV + mkdir -p "$PIP_CACHE_DIR" + if [ -d "$CACHE_DIR" ]; then + echo "Cache hit for $CACHE_KEY" + echo "cache-hit=true" >> $GITHUB_OUTPUT + else + echo "Cache miss for $CACHE_KEY" + echo "cache-hit=false" >> $GITHUB_OUTPUT + mkdir -p "$CACHE_DIR" + fi + + - name: Install dependencies + run: | + cd dashboard/backend + if [ "${{ steps.cache-python.outputs.cache-hit }}" = "true" ]; then + echo "Restoring venv from cache $CACHE_KEY..." + cp -a $CACHE_DIR/venv . + else + echo "Installing fresh dependencies..." + python3 -m venv venv + . venv/bin/activate + pip install --cache-dir=$PIP_CACHE_DIR -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt + pip install --cache-dir=$PIP_CACHE_DIR -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements-dev.txt + pip install --cache-dir=$PIP_CACHE_DIR -i https://pypi.tuna.tsinghua.edu.cn/simple pytest-timeout pytest-cov + echo "Saving venv to cache $CACHE_KEY..." + cp -a venv $CACHE_DIR/ + fi + + - name: Run tests with coverage + run: | + cd dashboard/backend + . venv/bin/activate + pytest tests/ -v --timeout=30 \ + --cov=. --cov-report=xml --cov-report=term \ + --junit-xml=test-results.xml \ + --cov-fail-under=49 + + if [ $? -ne 0 ]; then + echo "❌ Backend tests failed!" + exit 1 + fi + echo "✅ Backend tests passed" + + frontend-tests: + name: Frontend Tests + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Setup Node.js + run: | + node --version + npm --version + + - name: Cache Node dependencies + id: cache-node + run: | + CACHE_KEY="node-$(md5sum dashboard/frontend/package-lock.json | cut -d' ' -f1)" + CACHE_DIR="/tmp/npm-cache/$CACHE_KEY" + echo "CACHE_DIR=$CACHE_DIR" >> $GITHUB_ENV + echo "CACHE_KEY=$CACHE_KEY" >> $GITHUB_ENV + if [ -d "$CACHE_DIR" ]; then + echo "Cache hit for $CACHE_KEY" + echo "cache-hit=true" >> $GITHUB_OUTPUT + else + echo "Cache miss for $CACHE_KEY" + echo "cache-hit=false" >> $GITHUB_OUTPUT + mkdir -p "$CACHE_DIR" + fi + + - name: Install dependencies + env: + NODE_OPTIONS: "--max-old-space-size=2048" + run: | + cd dashboard/frontend + if [ "${{ steps.cache-node.outputs.cache-hit }}" = "true" ]; then + echo "Restoring from cache $CACHE_KEY..." + cp -a $CACHE_DIR/node_modules . + else + echo "Installing fresh dependencies..." + npm ci + echo "Saving to cache $CACHE_KEY..." + cp -a node_modules $CACHE_DIR/ + fi + + - name: Run tests + env: + NODE_OPTIONS: "--max-old-space-size=2048" + run: | + cd dashboard/frontend + npm run test:coverage -- --reporter=verbose --run --pool=forks --poolOptions.forks.maxForks=2 + + if [ $? -ne 0 ]; then + echo "❌ Frontend tests failed!" + exit 1 + fi + echo "✅ Frontend tests passed" deploy-dev: name: Deploy to Dev runs-on: ubuntu-latest - needs: tests + needs: [backend-tests, frontend-tests] steps: - name: Checkout repository uses: actions/checkout@v4 diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 3973843..96c2c73 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -11,15 +11,138 @@ concurrency: cancel-in-progress: true jobs: - # Run tests first - tests: - name: Run Tests - uses: ./.gitea/workflows/test.yml + # Run tests first - inline instead of reusable workflow + backend-tests: + name: Backend Tests + runs-on: ubuntu-latest + env: + SECRET_KEY: test-secret-key-for-ci-environment-32chars-minimum + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Setup Python + run: | + python3 --version + pip3 --version + + - name: Cache Python dependencies + id: cache-python + run: | + CACHE_KEY="python-$(cat dashboard/backend/requirements.txt dashboard/backend/requirements-dev.txt | md5sum | cut -d' ' -f1)" + CACHE_DIR="/tmp/pytest-cache/$CACHE_KEY" + PIP_CACHE_DIR="/tmp/pip-cache" + echo "CACHE_DIR=$CACHE_DIR" >> $GITHUB_ENV + echo "CACHE_KEY=$CACHE_KEY" >> $GITHUB_ENV + echo "PIP_CACHE_DIR=$PIP_CACHE_DIR" >> $GITHUB_ENV + mkdir -p "$PIP_CACHE_DIR" + if [ -d "$CACHE_DIR" ]; then + echo "Cache hit for $CACHE_KEY" + echo "cache-hit=true" >> $GITHUB_OUTPUT + else + echo "Cache miss for $CACHE_KEY" + echo "cache-hit=false" >> $GITHUB_OUTPUT + mkdir -p "$CACHE_DIR" + fi + + - name: Install dependencies + run: | + cd dashboard/backend + if [ "${{ steps.cache-python.outputs.cache-hit }}" = "true" ]; then + echo "Restoring venv from cache $CACHE_KEY..." + cp -a $CACHE_DIR/venv . + else + echo "Installing fresh dependencies..." + python3 -m venv venv + . venv/bin/activate + pip install --cache-dir=$PIP_CACHE_DIR -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt + pip install --cache-dir=$PIP_CACHE_DIR -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements-dev.txt + pip install --cache-dir=$PIP_CACHE_DIR -i https://pypi.tuna.tsinghua.edu.cn/simple pytest-timeout pytest-cov + echo "Saving venv to cache $CACHE_KEY..." + cp -a venv $CACHE_DIR/ + fi + + - name: Run tests with coverage + run: | + cd dashboard/backend + . venv/bin/activate + pytest tests/ -v --timeout=30 \ + --cov=. --cov-report=xml --cov-report=term \ + --junit-xml=test-results.xml \ + --cov-fail-under=49 + + if [ $? -ne 0 ]; then + echo "❌ Backend tests failed!" + exit 1 + fi + echo "✅ Backend tests passed" + + frontend-tests: + name: Frontend Tests + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Setup Node.js + run: | + node --version + npm --version + + - name: Cache Node dependencies + id: cache-node + run: | + CACHE_KEY="node-$(md5sum dashboard/frontend/package-lock.json | cut -d' ' -f1)" + CACHE_DIR="/tmp/npm-cache/$CACHE_KEY" + echo "CACHE_DIR=$CACHE_DIR" >> $GITHUB_ENV + echo "CACHE_KEY=$CACHE_KEY" >> $GITHUB_ENV + if [ -d "$CACHE_DIR" ]; then + echo "Cache hit for $CACHE_KEY" + echo "cache-hit=true" >> $GITHUB_OUTPUT + else + echo "Cache miss for $CACHE_KEY" + echo "cache-hit=false" >> $GITHUB_OUTPUT + mkdir -p "$CACHE_DIR" + fi + + - name: Install dependencies + env: + NODE_OPTIONS: "--max-old-space-size=2048" + run: | + cd dashboard/frontend + if [ "${{ steps.cache-node.outputs.cache-hit }}" = "true" ]; then + echo "Restoring from cache $CACHE_KEY..." + cp -a $CACHE_DIR/node_modules . + else + echo "Installing fresh dependencies..." + npm ci + echo "Saving to cache $CACHE_KEY..." + cp -a node_modules $CACHE_DIR/ + fi + + - name: Run tests + env: + NODE_OPTIONS: "--max-old-space-size=2048" + run: | + cd dashboard/frontend + npm run test:coverage -- --reporter=verbose --run --pool=forks --poolOptions.forks.maxForks=2 + + if [ $? -ne 0 ]; then + echo "❌ Frontend tests failed!" + exit 1 + fi + echo "✅ Frontend tests passed" deploy: name: Deploy to Production runs-on: ubuntu-latest - needs: tests + needs: [backend-tests, frontend-tests] container: volumes: - /var/packages/ContainerManager/target/usr/bin/docker:/usr/bin/docker