mirror of
https://github.com/frappe/frappe_docker.git
synced 2024-11-08 14:21:05 +00:00
Cypress UI Test service and updates to installer.py (#1250)
* #1247 #1248 Feat: Cypress UI testing + Postgres Arg for installer * #1247 #1248 Feat: Cypress UI testing + Postgres Arg for installer * #1247 #1248 Feat: Cypress UI testing + Postgres Arg for installer * #1247 #1248 Feat: Cypress UI testing + Postgres Arg for installer * #1247 #1248 Feat: Cypress UI testing + Postgres Arg for installer * #1247 #1248 Feat: Cypress UI testing + Postgres Arg for installer * #1247 #1248 Feat: Cypress UI testing + Postgres Arg for installer
This commit is contained in:
parent
122927662c
commit
ead5438ebb
@ -1,7 +1,7 @@
|
||||
version: "3.7"
|
||||
services:
|
||||
mariadb:
|
||||
image: mariadb:10.6
|
||||
image: docker.io/mariadb:10.6
|
||||
command:
|
||||
- --character-set-server=utf8mb4
|
||||
- --collation-server=utf8mb4_unicode_ci
|
||||
@ -21,13 +21,13 @@ services:
|
||||
# - postgresql-data:/var/lib/postgresql/data
|
||||
|
||||
redis-cache:
|
||||
image: redis:alpine
|
||||
image: docker.io/redis:alpine
|
||||
|
||||
redis-queue:
|
||||
image: redis:alpine
|
||||
image: docker.io/redis:alpine
|
||||
|
||||
frappe:
|
||||
image: frappe/bench:latest
|
||||
image: docker.io/frappe/bench:latest
|
||||
command: sleep infinity
|
||||
environment:
|
||||
- SHELL=/bin/bash
|
||||
@ -39,7 +39,33 @@ services:
|
||||
ports:
|
||||
- 8000-8005:8000-8005
|
||||
- 9000-9005:9000-9005
|
||||
|
||||
# enable the below service if you need Cypress UI Tests to be executed
|
||||
# Before enabling ensure install_x11_deps.sh has been executed and display variable is exported.
|
||||
# Run install_x11_deps.sh again if DISPLAY is not set
|
||||
# ui-tester:
|
||||
# # pass custom command to start Cypress otherwise it will use the entrypoint
|
||||
# # specified in the Cypress Docker image.
|
||||
# # also pass "--project <folder>" so that when Cypress opens
|
||||
# # it can find file "cypress.json" and show integration specs
|
||||
# # https://on.cypress.io/command-line#cypress-open
|
||||
# entrypoint: 'sleep infinity'
|
||||
# image: "docker.io/cypress/included:latest"
|
||||
# environment:
|
||||
# - SHELL=/bin/bash
|
||||
# # get the IP address of the host machine and allow X11 to accept
|
||||
# # incoming connections from that IP address
|
||||
# # IP=$(ipconfig getifaddr en0) or mac or \
|
||||
# # IP=$($(hostname -I | awk '{print $1}') ) for Ubuntu
|
||||
# # /usr/X11/bin/xhost + $IP
|
||||
# # then pass the environment variable DISPLAY to show Cypress GUI on the host system
|
||||
# # DISPLAY=$IP:0
|
||||
# - DISPLAY
|
||||
# volumes:
|
||||
# # for Cypress to communicate with the X11 server pass this socket file
|
||||
# # in addition to any other mapped volumes
|
||||
# - /tmp/.X11-unix:/tmp/.X11-unix
|
||||
# - ..:/workspace:z,cached
|
||||
# network_mode: "host"
|
||||
volumes:
|
||||
mariadb-data:
|
||||
postgresql-data:
|
||||
#postgresql-data:
|
||||
|
@ -105,6 +105,14 @@ def get_args_parser():
|
||||
help="admin password for site, default: admin", # noqa: E501
|
||||
default="admin",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-d",
|
||||
"--db-type",
|
||||
action="store",
|
||||
type=str,
|
||||
help="Database type to use (e.g., mariadb or postgres)",
|
||||
default="mariadb", # Set your default database type here
|
||||
)
|
||||
return parser
|
||||
|
||||
|
||||
@ -112,7 +120,6 @@ def init_bench_if_not_exist(args):
|
||||
if os.path.exists(args.bench_name):
|
||||
cprint("Bench already exists. Only site will be created", level=3)
|
||||
return
|
||||
|
||||
try:
|
||||
env = os.environ.copy()
|
||||
if args.py_version:
|
||||
@ -137,11 +144,14 @@ def init_bench_if_not_exist(args):
|
||||
]
|
||||
subprocess.call(command, env=env, cwd=os.getcwd())
|
||||
cprint("Configuring Bench ...", level=2)
|
||||
cprint("Set db_host to mariadb", level=3)
|
||||
subprocess.call(
|
||||
["bench", "set-config", "-g", "db_host", "mariadb"],
|
||||
cwd=os.getcwd() + "/" + args.bench_name,
|
||||
)
|
||||
cprint("Set db_host", level=3)
|
||||
if args.db_type:
|
||||
cprint(f"Setting db_type to {args.db_type}", level=3)
|
||||
subprocess.call(
|
||||
["bench", "set-config", "-g", "db_type", args.db_type],
|
||||
cwd=os.path.join(os.getcwd(), args.bench_name),
|
||||
)
|
||||
|
||||
cprint("Set redis_cache to redis://redis-cache:6379", level=3)
|
||||
subprocess.call(
|
||||
[
|
||||
@ -188,20 +198,40 @@ def init_bench_if_not_exist(args):
|
||||
|
||||
|
||||
def create_site_in_bench(args):
|
||||
new_site_cmd = [
|
||||
"bench",
|
||||
"new-site",
|
||||
"--no-mariadb-socket",
|
||||
"--mariadb-root-password=123",
|
||||
f"--admin-password={args.admin_password}",
|
||||
]
|
||||
if "mariadb" == args.db_type:
|
||||
cprint("Set db_host", level=3)
|
||||
subprocess.call(
|
||||
["bench", "set-config", "-g", "db_host", "mariadb"],
|
||||
cwd=os.getcwd() + "/" + args.bench_name,
|
||||
)
|
||||
new_site_cmd = [
|
||||
"bench",
|
||||
"new-site",
|
||||
f"--db-host=mariadb", # Should match the compose service name
|
||||
f"--db-type={args.db_type}", # Add the selected database type
|
||||
f"--no-mariadb-socket",
|
||||
f"--db-root-password=123", # Replace with your MariaDB password
|
||||
f"--admin-password={args.admin_password}",
|
||||
]
|
||||
else:
|
||||
cprint("Set db_host", level=3)
|
||||
subprocess.call(
|
||||
["bench", "set-config", "-g", "db_host", "postgresql"],
|
||||
cwd=os.getcwd() + "/" + args.bench_name,
|
||||
)
|
||||
new_site_cmd = [
|
||||
"bench",
|
||||
"new-site",
|
||||
f"--db-host=postgresql", # Should match the compose service name
|
||||
f"--db-type={args.db_type}", # Add the selected database type
|
||||
f"--db-root-password=123", # Replace with your PostgreSQL password
|
||||
f"--admin-password={args.admin_password}",
|
||||
]
|
||||
apps = os.listdir(f"{os.getcwd()}/{args.bench_name}/apps")
|
||||
apps.remove("frappe")
|
||||
for app in apps:
|
||||
new_site_cmd.append(f"--install-app={app}")
|
||||
|
||||
new_site_cmd.append(args.site_name)
|
||||
|
||||
cprint(f"Creating Site {args.site_name} ...", level=2)
|
||||
subprocess.call(
|
||||
new_site_cmd,
|
||||
|
@ -241,14 +241,14 @@ Sample `apps-example.json` is used by default, it installs erpnext on current st
|
||||
> You may have apps in private repos which may require ssh access. You may use SSH from your home directory on linux (configurable in docker-compose.yml).
|
||||
|
||||
```shell
|
||||
python installer.py
|
||||
python installer.py #pass --db-type postgres for postgresdb
|
||||
```
|
||||
|
||||
For command help
|
||||
|
||||
```shell
|
||||
python installer.py --help
|
||||
usage: installer.py [-h] [-j APPS_JSON] [-b BENCH_NAME] [-s SITE_NAME] [-r FRAPPE_REPO] [-t FRAPPE_BRANCH] [-p PY_VERSION] [-n NODE_VERSION] [-v]
|
||||
usage: installer.py [-h] [-j APPS_JSON] [-b BENCH_NAME] [-s SITE_NAME] [-r FRAPPE_REPO] [-t FRAPPE_BRANCH] [-p PY_VERSION] [-n NODE_VERSION] [-v] [-a ADMIN_PASSWORD] [-d DB_TYPE]
|
||||
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
@ -261,7 +261,7 @@ options:
|
||||
-r FRAPPE_REPO, --frappe-repo FRAPPE_REPO
|
||||
frappe repo to use, default: https://github.com/frappe/frappe
|
||||
-t FRAPPE_BRANCH, --frappe-branch FRAPPE_BRANCH
|
||||
frappe repo to use, default: version-14
|
||||
frappe repo to use, default: version-15
|
||||
-p PY_VERSION, --py-version PY_VERSION
|
||||
python version, default: Not Set
|
||||
-n NODE_VERSION, --node-version NODE_VERSION
|
||||
@ -269,6 +269,8 @@ options:
|
||||
-v, --verbose verbose output
|
||||
-a ADMIN_PASSWORD, --admin-password ADMIN_PASSWORD
|
||||
admin password for site, default: admin
|
||||
-d DB_TYPE, --db-type DB_TYPE
|
||||
Database type to use (e.g., mariadb or postgres)
|
||||
```
|
||||
|
||||
A new bench and / or site is created for the client with following defaults.
|
||||
@ -276,6 +278,8 @@ A new bench and / or site is created for the client with following defaults.
|
||||
- MariaDB root password: `123`
|
||||
- Admin password: `admin`
|
||||
|
||||
> To use Postegres DB, comment the mariabdb service and uncomment postegres service.
|
||||
|
||||
### Start Frappe with Visual Studio Code Python Debugging
|
||||
|
||||
To enable Python debugging inside Visual Studio Code, you must first install the `ms-python.python` extension inside the container. This should have already happened automatically, but depending on your VSCode config, you can force it by:
|
||||
@ -380,3 +384,25 @@ volumes:
|
||||
```
|
||||
|
||||
Access the service by service name from the `frappe` development container. The above service will be accessible via hostname `postgresql`. If ports are published on to host, access it via `localhost:5432`.
|
||||
|
||||
## Using Cypress UI tests
|
||||
|
||||
To run cypress based UI tests in a docker environment, follow the below steps:
|
||||
|
||||
1. Install and setup X11 tooling on VM using the script `install_x11_deps.sh`
|
||||
|
||||
```shell
|
||||
sudo bash ./install_x11_deps.sh
|
||||
```
|
||||
|
||||
This script will install required deps, enable X11Forwarding and restart SSH daemon and export `DISPLAY` variable.
|
||||
|
||||
2. Run X11 service `startx` or `xquartz`
|
||||
3. Start docker compose services.
|
||||
4. SSH into ui-tester service using `docker exec..` command
|
||||
5. Export CYPRESS_baseUrl and other required env variables
|
||||
6. Start Cypress UI console by issuing `cypress run command`
|
||||
|
||||
> More references : [Cypress Official Documentation](https://www.cypress.io/blog/2019/05/02/run-cypress-with-a-single-docker-command)
|
||||
|
||||
> Ensure DISPLAY environment is always exported.
|
||||
|
104
install_x11_deps.sh
Executable file
104
install_x11_deps.sh
Executable file
@ -0,0 +1,104 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
# This script configures X11 forwarding for Linux and macOS systems.
|
||||
# It installs X11, Openbox (on Linux), and checks for XQuartz (on macOS).
|
||||
# It also updates the sshd_config file to enable X11Forwarding and restarts the SSH service.
|
||||
|
||||
# Check if the script is running with root privileges
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "Error: This script requires root privileges. Please run it as a superuser"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Function to restart SSH service (Linux)
|
||||
restart_ssh_linux() {
|
||||
if command -v service >/dev/null 2>&1; then
|
||||
sudo service ssh restart
|
||||
else
|
||||
sudo systemctl restart ssh
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to restart SSH service (macOS)
|
||||
restart_ssh_macos() {
|
||||
launchctl stop com.openssh.sshd
|
||||
launchctl start com.openssh.sshd
|
||||
}
|
||||
|
||||
update_x11_forwarding() {
|
||||
if grep -q "X11Forwarding yes" /etc/ssh/sshd_config; then
|
||||
echo "X11Forwarding is already set to 'yes' in ssh_config."
|
||||
else
|
||||
if [[ "$OSTYPE" == "linux-gnu" ]]; then
|
||||
# Linux: Use sed for Linux
|
||||
sudo sed -i 's/#\?X11Forwarding.*/X11Forwarding yes/' /etc/ssh/sshd_config
|
||||
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# macOS: Use sed for macOS
|
||||
sudo sed -i -E 's/#X11Forwarding.*/X11Forwarding yes/' /etc/ssh/sshd_config
|
||||
restart_ssh_macos
|
||||
fi
|
||||
if [[ "$OSTYPE" == "linux-gnu" ]]; then
|
||||
restart_ssh_linux
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Determine the operating system
|
||||
if [[ "$OSTYPE" == "linux-gnu" ]]; then
|
||||
# Linux
|
||||
if command -v startx >/dev/null 2>&1; then
|
||||
echo "X11 is already installed."
|
||||
else
|
||||
# Check which package manager is available
|
||||
if command -v apt-get >/dev/null 2>&1; then
|
||||
install_command="sudo apt-get update && sudo apt-get install xorg openbox"
|
||||
elif command -v dnf >/dev/null 2>&1; then
|
||||
install_command="sudo dnf install xorg-x11-server-Xorg openbox"
|
||||
else
|
||||
echo "Error: Unable to determine the package manager. Manual installation required."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
# Check if the installation command is defined
|
||||
if [ -n "$install_command" ]; then
|
||||
# Execute the installation command
|
||||
if $install_command; then
|
||||
echo "X11 and Openbox have been successfully installed."
|
||||
else
|
||||
echo "Error: Failed to install X11 and Openbox."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "Error: Unsupported package manager."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Call the function to update X11Forwarding
|
||||
update_x11_forwarding
|
||||
|
||||
# Get the IP address of the host dynamically
|
||||
host_ip=$(hostname -I | awk '{print $1}')
|
||||
xhost + "$host_ip" && xhost + local:
|
||||
# Set the DISPLAY variable to the host IP
|
||||
export DISPLAY="$host_ip:0.0"
|
||||
echo "DISPLAY variable set to $DISPLAY"
|
||||
|
||||
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# macOS
|
||||
if command -v xquartz >/dev/null 2>&1; then
|
||||
echo "XQuartz is already installed."
|
||||
else
|
||||
echo "Error: XQuartz is required for X11 forwarding on macOS. Please install XQuartz manually."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Call the function to update X11Forwarding
|
||||
update_x11_forwarding
|
||||
|
||||
# Export the DISPLAY variable for macOS
|
||||
export DISPLAY=:0
|
||||
echo "DISPLAY variable set to $DISPLAY"
|
||||
else
|
||||
echo "Error: Unsupported operating system."
|
||||
exit 1
|
||||
fi
|
Loading…
Reference in New Issue
Block a user