Skip to content

Merge remote-tracking branch 'origin/master' #1

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master' #1

Workflow file for this run

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 }}