mirror of
https://github.com/frappe/erpnext.git
synced 2026-08-11 13:41:47 +00:00
- Wire up warm-bench: set BENCH_CACHE_DIR on the setup job so the bench-base cache actually activates (was inert with no dir set, so every run did a full bench init). Lives on the node-local bench-staging hostPath; any miss/failure still falls back to a full init. - run_ci_step: capture the timeout exit code under `set -e` (the previous `timeout ...` + `ec=$?` aborted at the timeout line on failure, skipping ::endgroup:: and the exit-code return). - Raise the per-step timeout 600s -> 1800s so a contended reinstall isn't killed before the 40-min job timeout. - Propagate DB through the su re-exec in start-db.sh / hydrate.sh so a DB=postgres invocation can't silently fall back to the mariadb branch. - Simplify the coverage job `if` to the equivalent plain non-PR gate.
80 lines
3.6 KiB
Bash
Executable File
80 lines
3.6 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Run MariaDB INSIDE the runner container, on a datadir we control. Because the datadir can be
|
|
# packaged into the bench artifact, test shards start an already-loaded server instead of
|
|
# replaying a SQL dump (the ~60s hydrate restore). Each shard gets its own copy → isolation kept.
|
|
#
|
|
# CI_DB_DATADIR picks the path:
|
|
# - setup job: /home/ci/db-data (OUTSIDE the bench, so install.sh's `rm -rf ~/frappe-bench`
|
|
# doesn't wipe it; it's moved into the bench just before packaging)
|
|
# - test shard: ~/frappe-bench/mariadb-data (where the artifact untar'd it)
|
|
#
|
|
# Idempotent: inits a fresh datadir if absent (setup), else starts on the existing one (shards).
|
|
#
|
|
set -e
|
|
|
|
ci_user="${ERPNEXT_CI_USER:-frappe}"
|
|
|
|
# Re-exec as the ci user so mariadbd and the datadir are owned consistently (root mariadbd is
|
|
# refused anyway). Mirrors install.sh's user switch.
|
|
if [ "$(id -u)" = "0" ] && [ "${SKIP_SYSTEM_SETUP:-0}" = "1" ] && [ "$ci_user" != "root" ]; then
|
|
exec su -m "$ci_user" -s /bin/bash -c \
|
|
"ERPNEXT_CI_USER='$ci_user' CI_DB_DATADIR='${CI_DB_DATADIR:-}' DB='${DB:-}' bash '$0'"
|
|
fi
|
|
|
|
# --- PostgreSQL (GitHub-hosted CI): run in-runner on a PGDATA so it bakes into the artifact,
|
|
# same idea as the mariadb datadir. Trust auth (throwaway CI) skips password setup; durability
|
|
# off for speed. Postgres is preinstalled on ubuntu-latest under /usr/lib/postgresql/<ver>/bin.
|
|
if [ "${DB:-mariadb}" = "postgres" ]; then
|
|
PG_BIN=$(ls -d /usr/lib/postgresql/*/bin 2>/dev/null | sort -V | tail -1)
|
|
[ -n "$PG_BIN" ] && export PATH="$PG_BIN:$PATH"
|
|
PGDATA="${CI_DB_DATADIR:-$HOME/frappe-bench/pgdata}"
|
|
if [ ! -d "$PGDATA/base" ]; then
|
|
initdb -D "$PGDATA" -U postgres --auth-local=trust --auth-host=trust >/dev/null
|
|
echo "host all all 127.0.0.1/32 trust" >> "$PGDATA/pg_hba.conf"
|
|
fi
|
|
pg_ctl -D "$PGDATA" -w -o "-p 5432 -c listen_addresses=127.0.0.1 -c unix_socket_directories=$PGDATA -c fsync=off -c synchronous_commit=off -c full_page_writes=off" start
|
|
echo "PostgreSQL up in-runner (pgdata=$PGDATA)"
|
|
exit 0
|
|
fi
|
|
|
|
# --- MariaDB ---
|
|
DATADIR="${CI_DB_DATADIR:-$HOME/frappe-bench/mariadb-data}"
|
|
SOCK="$DATADIR/mysqld.sock"
|
|
fresh=0
|
|
|
|
if [ ! -d "$DATADIR/mysql" ]; then
|
|
mkdir -p "$DATADIR"
|
|
mariadb-install-db --no-defaults --datadir="$DATADIR" \
|
|
--auth-root-authentication-method=normal --skip-test-db >/dev/null 2>&1
|
|
fresh=1
|
|
fi
|
|
|
|
# Throwaway-CI durability off; bind TCP 127.0.0.1:3306 so bench/install.sh connect as usual.
|
|
mariadbd --no-defaults --datadir="$DATADIR" --socket="$SOCK" --pid-file="$DATADIR/mysqld.pid" \
|
|
--port=3306 --bind-address=127.0.0.1 \
|
|
--innodb-flush-log-at-trx-commit=0 --sync-binlog=0 --skip-log-bin \
|
|
> "$HOME/mariadb.log" 2>&1 &
|
|
|
|
up=0
|
|
for _ in $(seq 1 60); do
|
|
if mariadb-admin --socket="$SOCK" ping --silent 2>/dev/null; then up=1; break; fi
|
|
sleep 1
|
|
done
|
|
# Fail loudly instead of letting the loop fall through (exit 0 of the last `sleep`) into SQL that
|
|
# would error with a vague socket-connection failure.
|
|
[ "$up" = "1" ] || { echo "mariadbd did not come up on $SOCK"; cat "$HOME/mariadb.log" 2>/dev/null; exit 1; }
|
|
|
|
if [ "$fresh" = "1" ]; then
|
|
# A fresh datadir has only a password-less root@localhost. Give it the password install.sh
|
|
# uses, plus a TCP-reachable root@127.0.0.1, so the rest of install.sh works unchanged.
|
|
mariadb --no-defaults --socket="$SOCK" -u root <<'SQL'
|
|
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
|
|
CREATE USER IF NOT EXISTS 'root'@'127.0.0.1' IDENTIFIED BY 'root';
|
|
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
|
|
FLUSH PRIVILEGES;
|
|
SQL
|
|
fi
|
|
|
|
echo "MariaDB up in-container (datadir=$DATADIR, fresh=$fresh)"
|