mirror of
https://github.com/frappe/erpnext.git
synced 2026-08-11 13:41:47 +00:00
The Patch Test fetches the frappe repo using this erpnext PR's base branch
name. For an ordinary PR that is develop, which exists in frappe/frappe. For a
stacked PR the base is an erpnext feature branch with no counterpart there, so
the fetch fails and the step exits 128 before any patch runs:
fatal: couldn't find remote ref pg-audit/bom-amount-per-line
This affects every stacked PR. It has been latent rather than absent: earlier
stacks passed only because their Patch Test ran while they still targeted
develop, before being retargeted onto the layer below.
Fall back to develop when the base ref does not resolve. Ordinary PRs and
version-branch PRs are unaffected -- their base exists in frappe, so the first
fetch succeeds and the fallback never runs.
200 lines
6.4 KiB
YAML
200 lines
6.4 KiB
YAML
name: Patch
|
|
|
|
on:
|
|
pull_request:
|
|
paths-ignore:
|
|
- '**.js'
|
|
- '**.css'
|
|
- '**.md'
|
|
- '**.html'
|
|
- '**.csv'
|
|
- 'crowdin.yml'
|
|
- '.coderabbit.yml'
|
|
- '.mergify.yml'
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: patch-develop-${{ github.event_name }}-${{ github.event.number || github.event_name == 'workflow_dispatch' && github.run_id || '' }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 60
|
|
|
|
name: Patch Test
|
|
|
|
services:
|
|
mysql:
|
|
image: mariadb:11.8
|
|
env:
|
|
MARIADB_ROOT_PASSWORD: 'root'
|
|
ports:
|
|
- 3306:3306
|
|
options: --health-cmd="mariadb-admin ping" --health-interval=5s --health-timeout=2s --health-retries=3
|
|
|
|
steps:
|
|
- name: Clone
|
|
uses: actions/checkout@v6
|
|
|
|
- name: Check for valid Python & Merge Conflicts
|
|
run: |
|
|
python -m compileall -fq "${GITHUB_WORKSPACE}"
|
|
if grep -lr --exclude-dir=node_modules "^<<<<<<< " "${GITHUB_WORKSPACE}"
|
|
then echo "Found merge conflicts"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Setup Python
|
|
uses: actions/setup-python@v6
|
|
with:
|
|
python-version: |
|
|
3.11
|
|
3.13
|
|
3.14
|
|
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v6
|
|
with:
|
|
node-version: 24
|
|
check-latest: true
|
|
|
|
- name: Add to Hosts
|
|
run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
|
|
|
|
# The v14 baseline backup is a fixed published file — cache it instead of re-downloading
|
|
# it from the GitHub release every run.
|
|
- name: Cache erpnext v14 backup
|
|
id: cache-v14
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ~/erpnext-v14.sql.gz
|
|
key: erpnext-v14-sql-gz
|
|
|
|
- name: Download erpnext v14 backup
|
|
if: steps.cache-v14.outputs.cache-hit != 'true'
|
|
run: |
|
|
curl -fSL --retry 5 --retry-all-errors --retry-delay 5 \
|
|
-o ~/erpnext-v14.sql.gz \
|
|
https://github.com/frappe/erpnext/releases/download/v14-baseline/erpnext-v14.sql.gz
|
|
|
|
- name: Cache pip
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ~/.cache/pip
|
|
key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-pip-
|
|
${{ runner.os }}-
|
|
|
|
- name: Cache node modules
|
|
uses: actions/cache@v4
|
|
env:
|
|
cache-name: cache-node-modules
|
|
with:
|
|
path: ~/.npm
|
|
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-build-${{ env.cache-name }}-
|
|
${{ runner.os }}-build-
|
|
${{ runner.os }}-
|
|
|
|
- name: Get yarn cache directory path
|
|
id: yarn-cache-dir-path
|
|
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
|
|
|
|
- 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: |
|
|
pip install frappe-bench
|
|
bash ${GITHUB_WORKSPACE}/.github/helper/install.sh
|
|
env:
|
|
DB: mariadb
|
|
TYPE: server
|
|
|
|
- name: Run Patch Tests
|
|
run: |
|
|
cd ~/frappe-bench/
|
|
bench remove-app payments --force
|
|
jq 'del(.install_apps)' ~/frappe-bench/sites/test_site/site_config.json > tmp.json
|
|
mv tmp.json ~/frappe-bench/sites/test_site/site_config.json
|
|
|
|
bench --site test_site --force restore ~/erpnext-v14.sql.gz
|
|
|
|
git -C "apps/frappe" remote set-url upstream https://github.com/frappe/frappe.git
|
|
git -C "apps/erpnext" remote set-url upstream https://github.com/frappe/erpnext.git
|
|
|
|
# Start every bench process except the background workers. If workers run during a
|
|
# migrate, they pick up the orphan-link cleanup jobs it enqueues and race its schema
|
|
# changes, which fails with MySQL 1412 "Table definition has changed". Redis and the
|
|
# other services stay up; the queued jobs simply wait and are harmless here.
|
|
function start_bench_without_workers() {
|
|
local procs
|
|
procs=$(awk -F: '/^[a-z_]+:/ && $1 !~ /worker/ {print $1}' ~/frappe-bench/Procfile)
|
|
honcho start -f ~/frappe-bench/Procfile $procs &>> ~/frappe-bench/bench_start.log &
|
|
}
|
|
|
|
function update_to_version() {
|
|
version=$1
|
|
|
|
branch_name="version-$version-hotfix"
|
|
echo "Updating to v$version"
|
|
|
|
# Fetch and checkout branches
|
|
git -C "apps/frappe" fetch --depth 1 upstream $branch_name:$branch_name
|
|
git -C "apps/erpnext" fetch --depth 1 upstream $branch_name:$branch_name
|
|
git -C "apps/frappe" checkout -q -f $branch_name
|
|
git -C "apps/erpnext" checkout -q -f $branch_name
|
|
|
|
# Resetup env and install apps
|
|
pgrep honcho | xargs kill
|
|
sleep 10
|
|
rm -rf ~/frappe-bench/env
|
|
bench -v setup env --python python$2
|
|
bench pip install -e ./apps/erpnext
|
|
start_bench_without_workers
|
|
|
|
bench --site test_site migrate
|
|
}
|
|
|
|
update_to_version 15 3.13
|
|
update_to_version 16 3.14
|
|
|
|
echo "Updating to latest version"
|
|
# a stacked PR's base is an erpnext feature branch with no counterpart in frappe,
|
|
# so fall back to the repository's default branch
|
|
base_ref="${GITHUB_BASE_REF:-${GITHUB_REF##*/}}"
|
|
git -C "apps/frappe" fetch --depth 1 upstream "$base_ref" \
|
|
|| git -C "apps/frappe" fetch --depth 1 upstream develop
|
|
git -C "apps/frappe" checkout -q -f FETCH_HEAD
|
|
git -C "apps/erpnext" checkout -q -f "$GITHUB_SHA"
|
|
|
|
pgrep honcho | xargs kill
|
|
rm -rf ~/frappe-bench/env
|
|
bench -v setup env
|
|
bench pip install -e ./apps/erpnext
|
|
start_bench_without_workers
|
|
|
|
bench --site test_site migrate
|
|
|
|
- name: Show bench output
|
|
if: ${{ always() }}
|
|
run: |
|
|
cd ~/frappe-bench
|
|
cat bench_start.log || true
|
|
cd logs
|
|
for f in ./*.log*; do
|
|
echo "Printing log: $f";
|
|
cat $f
|
|
done
|