feat: Add CI validation script for local testing #15
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: API Test Automation CI/CD | ||
| on: | ||
| push: | ||
| branches: [ main, develop, 'fix/*', 'feature/*' ] | ||
| pull_request: | ||
| branches: [ main ] | ||
| schedule: | ||
| # Run tests daily at 6 AM UTC | ||
| - cron: '0 6 * * *' | ||
| workflow_dispatch: | ||
| jobs: | ||
| test: | ||
| runs-on: ubuntu-latest | ||
| strategy: | ||
| matrix: | ||
| python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - name: Set up Python ${{ matrix.python-version }} | ||
| uses: actions/setup-python@v5 | ||
| with: | ||
| python-version: ${{ matrix.python-version }} | ||
| - name: Cache pip dependencies | ||
| uses: actions/cache@v4 | ||
| with: | ||
| path: ~/.cache/pip | ||
| key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} | ||
| restore-keys: | | ||
| ${{ runner.os }}-pip- | ||
| - name: Install dependencies | ||
| run: | | ||
| python -m pip install --upgrade pip | ||
| pip install -r requirements.txt | ||
| - name: Lint with flake8 | ||
| run: | | ||
| pip install flake8 | ||
| # Stop the build if there are Python syntax errors or undefined names | ||
| flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics | ||
| # Exit-zero treats all errors as warnings | ||
| flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics | ||
| - name: Run smoke tests | ||
| run: | | ||
| python -m pytest tests/ -m smoke -v --tb=short | ||
| - name: Run all tests with coverage | ||
| run: | | ||
| pip install pytest-cov | ||
| python -m pytest tests/ -v --cov=utils --cov=tests --cov-report=xml --cov-report=html | ||
| - name: Upload coverage to Codecov | ||
| uses: codecov/codecov-action@v5 | ||
| with: | ||
| file: ./coverage.xml | ||
| flags: unittests | ||
| name: codecov-umbrella | ||
| - name: Generate Allure results | ||
| if: always() | ||
| run: | | ||
| pip install allure-pytest | ||
| python -m pytest tests/ --alluredir=allure-results | ||
| - name: Install Allure CLI | ||
| if: always() | ||
| run: | | ||
| sudo apt-get update | ||
| sudo apt-get install -y default-jre | ||
| curl -o allure-2.13.8.tgz -Ls https://github.com/allure-framework/allure2/releases/download/2.13.8/allure-2.13.8.tgz | ||
| sudo tar -zxvf allure-2.13.8.tgz -C /opt/ | ||
| sudo ln -s /opt/allure-2.13.8/bin/allure /usr/bin/allure | ||
| allure --version | ||
| - name: Generate Allure HTML report | ||
| if: always() | ||
| run: | | ||
| allure generate allure-results --clean -o allure-report | ||
| - name: Upload Allure results | ||
| if: always() | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: allure-results-${{ matrix.python-version }} | ||
| path: allure-results/ | ||
| - name: Upload Allure HTML report | ||
| if: always() | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: allure-report-${{ matrix.python-version }} | ||
| path: allure-report/ | ||
| - name: Upload test reports | ||
| if: always() | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: test-reports-${{ matrix.python-version }} | ||
| path: reports/ | ||
| security-scan: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - name: Set up Python | ||
| uses: actions/setup-python@v5 | ||
| with: | ||
| python-version: "3.11" | ||
| - name: Install dependencies | ||
| run: | | ||
| python -m pip install --upgrade pip | ||
| pip install bandit safety | ||
| - name: Run Bandit security scan | ||
| run: bandit -r . -f json -o bandit-report.json || true | ||
| - name: Run Safety check | ||
| run: safety check --json --output safety-report.json || true | ||
| - name: Upload security reports | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: security-reports | ||
| path: | | ||
| bandit-report.json | ||
| safety-report.json | ||
| performance-test: | ||
| runs-on: ubuntu-latest | ||
| if: github.event_name == 'schedule' || contains(github.event.head_commit.message, '[perf]') | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - name: Set up Python | ||
| uses: actions/setup-python@v5 | ||
| with: | ||
| python-version: "3.11" | ||
| - name: Install dependencies | ||
| run: | | ||
| python -m pip install --upgrade pip | ||
| pip install -r requirements.txt | ||
| - name: Run performance tests | ||
| run: | | ||
| python -m pytest tests/ -m performance -v --tb=short | ||
| - name: Upload performance results | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: performance-results | ||
| path: reports/ | ||
| deploy-docs: | ||
| runs-on: ubuntu-latest | ||
| needs: test | ||
| if: github.ref == 'refs/heads/main' | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - name: Set up Python | ||
| uses: actions/setup-python@v5 | ||
| with: | ||
| python-version: "3.11" | ||
| - name: Install dependencies | ||
| run: | | ||
| python -m pip install --upgrade pip | ||
| pip install -r requirements.txt | ||
| pip install allure-pytest | ||
| - name: Install Allure CLI | ||
| run: | | ||
| sudo apt-get update | ||
| sudo apt-get install -y default-jre | ||
| curl -o allure-2.13.8.tgz -Ls https://github.com/allure-framework/allure2/releases/download/2.13.8/allure-2.13.8.tgz | ||
| sudo tar -zxvf allure-2.13.8.tgz -C /opt/ | ||
| sudo ln -s /opt/allure-2.13.8/bin/allure /usr/bin/allure | ||
| allure --version | ||
| - name: Generate test documentation | ||
| run: | | ||
| python -m pytest tests/ --alluredir=allure-results | ||
| # Generate Allure report | ||
| allure generate allure-results -o allure-report --clean | ||
| - name: Deploy to GitHub Pages | ||
| uses: peaceiris/actions-gh-pages@v4 | ||
| with: | ||
| github_token: ${{ secrets.GITHUB_TOKEN }} | ||
| publish_dir: ./allure-report | ||
| destination_dir: test-reports | ||
| notify: | ||
| runs-on: ubuntu-latest | ||
| needs: [test, security-scan] | ||
| if: failure() | ||
| steps: | ||
| - name: Notify on failure | ||
| run: | | ||
| echo "Tests failed! Check the logs for details." | ||
| # Add Slack/Teams notification here if needed | ||