mirror of
https://github.com/frappe/erpnext.git
synced 2026-08-04 10:14:39 +00:00
GITHUB_REF is already the fully qualified ref for both branch and tag events, so reconstructing refs/heads/$GITHUB_REF_NAME and refs/tags/$GITHUB_REF_NAME just risks the two drifting apart. Keep the type check, since it still decides whether the develop fallback applies, and take the ref verbatim.
219 lines
7.1 KiB
YAML
219 lines
7.1 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"
|
|
fallback_to_develop=0
|
|
if [ -n "${GITHUB_BASE_REF:-}" ]; then
|
|
frappe_ref="refs/heads/$GITHUB_BASE_REF"
|
|
fallback_to_develop=1
|
|
elif [ "${GITHUB_REF_TYPE:-}" = "branch" ]; then
|
|
frappe_ref="$GITHUB_REF"
|
|
fallback_to_develop=1
|
|
elif [ "${GITHUB_REF_TYPE:-}" = "tag" ]; then
|
|
frappe_ref="$GITHUB_REF"
|
|
else
|
|
echo "Unsupported GitHub ref type: '${GITHUB_REF_TYPE:-unset}'"
|
|
exit 1
|
|
fi
|
|
|
|
ls_remote_status=0
|
|
git -C "apps/frappe" ls-remote --exit-code upstream "$frappe_ref" >/dev/null \
|
|
|| ls_remote_status=$?
|
|
if [ "$ls_remote_status" -eq 2 ] && [ "$fallback_to_develop" -eq 1 ]; then
|
|
echo "frappe has no '$frappe_ref'; falling back to develop"
|
|
frappe_ref=refs/heads/develop
|
|
elif [ "$ls_remote_status" -ne 0 ]; then
|
|
exit "$ls_remote_status"
|
|
fi
|
|
git -C "apps/frappe" fetch --depth 1 upstream "$frappe_ref"
|
|
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
|