Merge remote-tracking branch 'origin/master' #1
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: Press Tests | |
| on: | |
| push: | |
| branches: | |
| - master | |
| pull_request: | |
| branches: | |
| - '*' | |
| workflow_dispatch: | |
| concurrency: | |
| group: ${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| changes: | |
| name: Check for Changes and Lint | |
| runs-on: ubuntu-latest | |
| outputs: | |
| changed-python: ${{ steps.changed-python-files.outputs.any_changed }} | |
| changed-python-files: ${{ steps.changed-python-files.outputs.all_changed_files }} | |
| changed-build: ${{ steps.changed-build-files.outputs.any_changed }} | |
| changed-json: ${{ steps.changed-json-files.outputs.any_changed }} | |
| changed-js-vue: ${{ steps.changed-js-vue-files.outputs.any_changed }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Get changed python files | |
| id: changed-python-files | |
| uses: tj-actions/changed-files@v45 | |
| with: | |
| files: | | |
| **.py | |
| - name: Get changed build files | |
| id: changed-build-files | |
| uses: tj-actions/changed-files@v45 | |
| with: | |
| files: | | |
| pyproject.toml | |
| - name: Get changed json files | |
| id: changed-json-files | |
| uses: tj-actions/changed-files@v45 | |
| with: | |
| files: | | |
| **.json | |
| - name: Get changed js or vue files | |
| id: changed-js-vue-files | |
| uses: tj-actions/changed-files@v45 | |
| with: | |
| files: | | |
| **.js | |
| **.vue | |
| - name: Check for valid Python & Merge Conflicts | |
| run: | | |
| python -m compileall -q -f "${GITHUB_WORKSPACE}" | |
| if grep -lr --exclude-dir=node_modules "^<<<<<<< " "${GITHUB_WORKSPACE}" | |
| then echo "Found merge conflicts" | |
| exit 1 | |
| fi | |
| - name: Set up Python | |
| if: steps.changed-python-files.outputs.any_changed == 'true' | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.10.20' | |
| - name: Cache pip | |
| if: steps.changed-python-files.outputs.any_changed == 'true' | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.cache/pip | |
| key: ${{ runner.os }}-pip-${{ hashFiles('**/*dev-requirements.txt, **/*requirements.txt', '**/pyproject.toml', '**/setup.py', '**/setup.cfg') }} | |
| restore-keys: | | |
| ${{ runner.os }}-pip- | |
| ${{ runner.os }}- | |
| - name: Lint Check | |
| if: steps.changed-python-files.outputs.any_changed == 'true' | |
| env: | |
| ALL_CHANGED_FILES: ${{ steps.changed-python-files.outputs.all_changed_files }} | |
| run: | | |
| pip install ruff | |
| ruff check --output-format github ${ALL_CHANGED_FILES} | |
| format: | |
| name: Format & Type Check | |
| runs-on: ubuntu-latest | |
| needs: changes | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Set up Python | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.10.20' | |
| - name: Cache pip | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.cache/pip | |
| key: ${{ runner.os }}-pip-${{ hashFiles('**/*dev-requirements.txt, **/*requirements.txt', '**/pyproject.toml', '**/setup.py', '**/setup.cfg') }} | |
| restore-keys: | | |
| ${{ runner.os }}-pip- | |
| ${{ runner.os }}- | |
| - name: Install dependencies | |
| run: | | |
| pip install -r dev-requirements.txt | |
| - name: List all changed files | |
| if: needs.changes.outputs.changed-python == 'true' | |
| env: | |
| ALL_CHANGED_FILES: ${{ needs.changes.outputs.changed-python-files }} | |
| run: | | |
| for file in ${ALL_CHANGED_FILES}; do | |
| echo "$file was changed" | |
| done | |
| - name: Format Check | |
| if: needs.changes.outputs.changed-python == 'true' | |
| env: | |
| ALL_CHANGED_FILES: ${{ needs.changes.outputs.changed-python-files }} | |
| run: | | |
| ruff format --check ${ALL_CHANGED_FILES} --diff | |
| - name: Typing Check | |
| if: needs.changes.outputs.changed-python == 'true' | |
| env: | |
| ALL_CHANGED_FILES: ${{ needs.changes.outputs.changed-python-files }} | |
| run: | | |
| mypy ${ALL_CHANGED_FILES} | |
| semgrep: | |
| name: Semgrep Rules | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.10.20' | |
| - name: Run Semgrep rules | |
| run: | | |
| pip install semgrep==1.32 | |
| semgrep ci --config ./press-semgrep-rules.yml --config r/python.lang.correctness --baseline-commit "${{ github.base_ref || 'master' }}" | |
| install: | |
| name: Setup Bench | |
| runs-on: ubuntu-latest | |
| needs: changes | |
| if: needs.changes.outputs.changed-python == 'true' || needs.changes.outputs.changed-json == 'true' || needs.changes.outputs.changed-js-vue == 'true' || needs.changes.outputs.changed-build == 'true' | |
| services: | |
| mariadb: | |
| image: mariadb:10.6 | |
| env: | |
| MYSQL_ROOT_PASSWORD: root | |
| ports: | |
| - 3306:3306 | |
| options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3 | |
| volumes: | |
| - /data/mariadb_data:/var/lib/mysql | |
| steps: | |
| - name: Clone | |
| uses: actions/checkout@v4 | |
| - name: Setup Python | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.10.20' | |
| - name: Setup Node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| check-latest: true | |
| - name: Cache apt | |
| uses: awalsh128/cache-apt-pkgs-action@latest | |
| with: | |
| packages: redis-server libcups2-dev | |
| version: 1.0 # Arbitrary version to bust cache when needed | |
| - name: Cache wkhtmltopdf | |
| id: cache-wkhtmltopdf | |
| uses: actions/cache@v4 | |
| with: | |
| path: /usr/local/bin/wkhtmltopdf | |
| key: ${{ runner.os }}-wkhtmltopdf-0.12.3 | |
| - name: Install wkhtmltopdf | |
| if: steps.cache-wkhtmltopdf.outputs.cache-hit != 'true' | |
| run: | | |
| wget -O /tmp/wkhtmltox.tar.xz https://github.com/frappe/wkhtmltopdf/raw/master/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz | |
| tar -xf /tmp/wkhtmltox.tar.xz -C /tmp | |
| sudo mv /tmp/wkhtmltox/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf | |
| sudo chmod o+x /usr/local/bin/wkhtmltopdf | |
| - name: Cache pip | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.cache/pip | |
| key: ${{ runner.os }}-pip-${{ hashFiles('**/*dev-requirements.txt, **/*requirements.txt', '**/pyproject.toml', '**/setup.py', '**/setup.cfg') }} | |
| restore-keys: | | |
| ${{ runner.os }}-pip- | |
| ${{ runner.os }}- | |
| - name: Get yarn cache directory path | |
| id: yarn-cache-dir-path | |
| run: 'echo "::set-output name=dir::$(yarn cache dir)"' | |
| - name: Cache yarn | |
| uses: actions/cache@v4 | |
| id: yarn-cache | |
| with: | |
| path: ${{ steps.yarn-cache-dir-path.outputs.dir }} | |
| key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-yarn- | |
| - name: Install | |
| run: bash ${GITHUB_WORKSPACE}/.github/helper/install.sh | |
| - name: Cache bench directory | |
| uses: actions/cache/save@v4 | |
| with: | |
| key: bench-dir-${{ github.run_id }} | |
| path: /home/runner/frappe-bench | |
| - name: Stop mariadb service | |
| run: | | |
| docker stop ${{ job.services.mariadb.id }} | |
| - name: Change ownership of mariadb data directory (for caching) | |
| run: | | |
| sudo chown -R runner:runner /data/mariadb_data | |
| - name: Cache mariadb data directory | |
| uses: actions/cache/save@v4 | |
| with: | |
| key: mariadb-data-${{ github.run_id }} | |
| path: /data/mariadb_data | |
| ui-tests: | |
| needs: [changes, install] | |
| name: Client | |
| runs-on: ubuntu-latest | |
| env: | |
| PRESS_ADMIN_USER_EMAIL: playwright@example.com | |
| PRESS_ADMIN_USER_PASSWORD: playwright | |
| BASE_URL: http://test_site:8000 | |
| if: needs.changes.outputs.changed-python == 'true' || needs.changes.outputs.changed-json == 'true' || needs.changes.outputs.changed-js-vue == 'true' || needs.changes.outputs.changed-build == 'true' | |
| steps: | |
| - name: Create mariadb data directory | |
| run: | | |
| sudo mkdir -p /data/mariadb_data | |
| - name: Change ownership of mariadb data directory (for cache restore) | |
| run: | | |
| sudo chown -R runner:runner /data/mariadb_data | |
| - name: Restore mariadb data directory from cache | |
| uses: actions/cache/restore@v4 | |
| with: | |
| key: mariadb-data-${{ github.run_id }} | |
| path: /data/mariadb_data | |
| - name: Change ownership of mariadb data directory (post cache restore) | |
| run: | | |
| sudo chown -R 999:systemd-journal /data/mariadb_data | |
| - name: Start mariadb service | |
| run: | | |
| docker run -d \ | |
| --name mariadb \ | |
| -e MYSQL_ROOT_PASSWORD=root \ | |
| -p 3306:3306 \ | |
| -v /data/mariadb_data:/var/lib/mysql \ | |
| --health-cmd="mysqladmin ping" \ | |
| --health-interval=5s \ | |
| --health-timeout=2s \ | |
| --health-retries=3 \ | |
| mariadb:10.6 | |
| - name: Clone | |
| uses: actions/checkout@v4 | |
| - name: Setup Python | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.10.20' | |
| - name: Setup Node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 18 | |
| check-latest: true | |
| - name: Cache apt | |
| uses: awalsh128/cache-apt-pkgs-action@latest | |
| with: | |
| packages: redis-server libcups2-dev | |
| version: 1.0 # Arbitrary version to bust cache when needed | |
| - name: Cache wkhtmltopdf | |
| id: cache-wkhtmltopdf | |
| uses: actions/cache@v4 | |
| with: | |
| path: /usr/local/bin/wkhtmltopdf | |
| key: ${{ runner.os }}-wkhtmltopdf-0.12.3 | |
| - name: Install wkhtmltopdf | |
| if: steps.cache-wkhtmltopdf.outputs.cache-hit != 'true' | |
| run: | | |
| wget -O /tmp/wkhtmltox.tar.xz https://github.com/frappe/wkhtmltopdf/raw/master/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz | |
| tar -xf /tmp/wkhtmltox.tar.xz -C /tmp | |
| sudo mv /tmp/wkhtmltox/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf | |
| sudo chmod o+x /usr/local/bin/wkhtmltopdf | |
| - name: Restore bench directory from cache | |
| uses: actions/cache/restore@v4 | |
| with: | |
| path: /home/runner/frappe-bench | |
| key: bench-dir-${{ github.run_id }} | |
| - name: Install Bench command | |
| run: pip install frappe-bench | |
| - name: Don't run unnecessary services | |
| working-directory: /home/runner/frappe-bench | |
| run: | | |
| sed -i 's/watch:/# watch:/g' Procfile | |
| sed -i 's/schedule:/# schedule:/g' Procfile | |
| sed -i 's/socketio:/# socketio:/g' Procfile | |
| sed -i 's/redis_socketio:/# redis_socketio:/g' Procfile | |
| - name: Start Bench | |
| working-directory: /home/runner/frappe-bench | |
| run: | | |
| bench start &> bench_start_logs.txt & | |
| - name: Add to Hosts | |
| run: | | |
| echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts | |
| - name: Expose GitHub Runtime | |
| uses: crazy-max/ghaction-github-runtime@v3 | |
| - name: Install Playwright browsers | |
| working-directory: /home/runner/frappe-bench/apps/press/dashboard | |
| run: npx playwright install chromium | |
| - name: Setup Test Users | |
| working-directory: /home/runner/frappe-bench/apps/press/dashboard | |
| run: | | |
| bench --site test_site execute press.press.doctype.team.test_team.create_test_press_admin_team \ | |
| --kwargs "{\"email\": \"${PRESS_ADMIN_USER_EMAIL}\", \"free_account\": True, \"skip_onboarding\": True}" | |
| bench --site test_site set-password "$PRESS_ADMIN_USER_EMAIL" "$PRESS_ADMIN_USER_PASSWORD" | |
| - name: Run Playwright Tests | |
| working-directory: /home/runner/frappe-bench/apps/press/dashboard | |
| run: npx playwright test --project=chromium | |
| - name: Generate Coverage Report | |
| working-directory: /home/runner/frappe-bench/apps/press/dashboard | |
| run: npx nyc report --reporter=cobertura --reporter=text --report-dir=./coverage | |
| - name: Upload Playwright Test report | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: playwright-report | |
| path: /home/runner/frappe-bench/apps/press/dashboard/playwright-report | |
| - name: Upload coverage data | |
| uses: codecov/codecov-action@v5 | |
| with: | |
| disable_search: true | |
| files: /home/runner/frappe-bench/apps/press/dashboard/coverage/cobertura-coverage.xml | |
| fail_ci_if_error: false | |
| verbose: true | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| name: press-dashboard | |
| flags: dashboard | |
| server-tests: | |
| needs: [changes, install] | |
| name: Server | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| container: [1, 2, 3] | |
| if: needs.changes.outputs.changed-python == 'true' || needs.changes.outputs.changed-json == 'true' || needs.changes.outputs.changed-build == 'true' | |
| steps: | |
| - name: Create mariadb data directory | |
| run: | | |
| sudo mkdir -p /data/mariadb_data | |
| - name: Change ownership of mariadb data directory (for cache restore) | |
| run: | | |
| sudo chown -R runner:runner /data/mariadb_data | |
| - name: Restore mariadb data directory from cache | |
| uses: actions/cache/restore@v4 | |
| with: | |
| key: mariadb-data-${{ github.run_id }} | |
| path: /data/mariadb_data | |
| - name: Change ownership of mariadb data directory (post cache restore) | |
| run: | | |
| sudo chown -R 999:systemd-journal /data/mariadb_data | |
| - name: Start mariadb service | |
| run: | | |
| docker run -d \ | |
| --name mariadb \ | |
| -e MYSQL_ROOT_PASSWORD=root \ | |
| -p 3306:3306 \ | |
| -v /data/mariadb_data:/var/lib/mysql \ | |
| --health-cmd="mysqladmin ping" \ | |
| --health-interval=5s \ | |
| --health-timeout=2s \ | |
| --health-retries=3 \ | |
| mariadb:10.6 | |
| - name: Clone | |
| uses: actions/checkout@v4 | |
| - name: Setup Python | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.10.20' | |
| - name: Cache apt | |
| uses: awalsh128/cache-apt-pkgs-action@latest | |
| with: | |
| packages: redis-server libcups2-dev | |
| version: 1.0 # Arbitrary version to bust cache when needed | |
| - name: Restore bench directory from cache | |
| uses: actions/cache/restore@v4 | |
| with: | |
| path: /home/runner/frappe-bench | |
| key: bench-dir-${{ github.run_id }} | |
| - name: Install Bench command | |
| run: pip install frappe-bench | |
| - name: Start Bench | |
| working-directory: /home/runner/frappe-bench | |
| run: | | |
| bench start &> bench_start_logs.txt & | |
| - name: Add to Hosts | |
| run: | | |
| echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts | |
| - name: Expose GitHub Runtime | |
| uses: crazy-max/ghaction-github-runtime@v3 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| with: | |
| install: true | |
| - name: Run Tests | |
| working-directory: /home/runner/frappe-bench | |
| run: | | |
| bench --site test_site set-config allow_tests true | |
| bench --site test_site run-parallel-tests --app press --with-coverage --total-builds 3 --build-number ${{ matrix.container }} | |
| env: | |
| TYPE: server | |
| COVERAGE_RCFILE: /home/runner/frappe-bench/apps/press/.coveragerc | |
| - name: Upload coverage reports to Codecov | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: coverage-${{ matrix.container }} | |
| path: /home/runner/frappe-bench/sites/coverage.xml | |
| if: always() | |
| - name: Upload bench start logs | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: bench-start-logs-${{ matrix.container }} | |
| path: /home/runner/frappe-bench/bench_start_logs.txt | |
| if: always() | |
| coverage: | |
| name: Coverage Wrap Up | |
| needs: server-tests | |
| if: always() | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Clone | |
| uses: actions/checkout@v4 | |
| - name: Download artifacts | |
| uses: actions/download-artifact@v4 | |
| - name: Upload coverage data | |
| uses: codecov/codecov-action@v4 | |
| with: | |
| fail_ci_if_error: false | |
| verbose: true | |
| token: ${{ secrets.CODECOV_TOKEN }} |