mirror of
https://github.com/frappe/bench.git
synced 2025-01-08 16:14:12 +00:00
feat: easy-install.py to build custom images
This commit is contained in:
parent
af8ed34201
commit
1f3f68cbb6
3
.github/workflows/easy-install.yml
vendored
3
.github/workflows/easy-install.yml
vendored
@ -28,7 +28,8 @@ jobs:
|
|||||||
|
|
||||||
- name: Perform production easy install
|
- name: Perform production easy install
|
||||||
run: |
|
run: |
|
||||||
python3 ${GITHUB_WORKSPACE}/easy-install.py -p -n actions_test --email test@frappe.io
|
python3 ${GITHUB_WORKSPACE}/easy-install.py build
|
||||||
|
python3 ${GITHUB_WORKSPACE}/easy-install.py -p -n actions_test --email test@frappe.io --image custom-apps:latest
|
||||||
docker compose -p actions_test exec backend bench version --format json
|
docker compose -p actions_test exec backend bench version --format json
|
||||||
docker compose -p actions_test exec backend bench --site site1.localhost list-apps --format json
|
docker compose -p actions_test exec backend bench --site site1.localhost list-apps --format json
|
||||||
result=$(curl -H "Host: site1.localhost" -sk https://127.0.0.1/api/method/ping | jq -r ."message")
|
result=$(curl -H "Host: site1.localhost" -sk https://127.0.0.1/api/method/ping | jq -r ."message")
|
||||||
|
130
easy-install.py
130
easy-install.py
@ -1,6 +1,7 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
import base64
|
||||||
import fileinput
|
import fileinput
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
@ -316,8 +317,123 @@ def create_site(
|
|||||||
cprint(f"Bench Site creation failed for {sitename}\n", e)
|
cprint(f"Bench Site creation failed for {sitename}\n", e)
|
||||||
|
|
||||||
|
|
||||||
|
def add_build_parser(argparser: argparse.ArgumentParser):
|
||||||
|
subparsers = argparser.add_subparsers(dest='subcommand')
|
||||||
|
build = subparsers.add_parser('build', help='Build Custom Images')
|
||||||
|
build.add_argument(
|
||||||
|
"-p",
|
||||||
|
"--push",
|
||||||
|
help="Push the built image to registry",
|
||||||
|
action="store_true",
|
||||||
|
)
|
||||||
|
build.add_argument(
|
||||||
|
"-r",
|
||||||
|
"--frappe-path",
|
||||||
|
help="Frappe Repository to use, default: https://github.com/frappe/frappe", # noqa: E501
|
||||||
|
default="https://github.com/frappe/frappe",
|
||||||
|
)
|
||||||
|
build.add_argument(
|
||||||
|
"-b",
|
||||||
|
"--frappe-branch",
|
||||||
|
help="Frappe branch to use, default: version-15",
|
||||||
|
default="version-15",
|
||||||
|
)
|
||||||
|
build.add_argument(
|
||||||
|
"-j",
|
||||||
|
"--apps-json",
|
||||||
|
help="Path to apps json, default: frappe_docker/development/apps-example.json",
|
||||||
|
default="frappe_docker/development/apps-example.json",
|
||||||
|
)
|
||||||
|
build.add_argument(
|
||||||
|
"-i",
|
||||||
|
"--image-name",
|
||||||
|
help="Full Image Name, default: custom-apps:latest",
|
||||||
|
default="custom-apps:latest",
|
||||||
|
)
|
||||||
|
build.add_argument(
|
||||||
|
"-c",
|
||||||
|
"--containerfile",
|
||||||
|
help="Path to Containerfile: images/layered/Containerfile",
|
||||||
|
default="images/layered/Containerfile",
|
||||||
|
)
|
||||||
|
build.add_argument(
|
||||||
|
"-y",
|
||||||
|
"--python-version",
|
||||||
|
help="Python Version, default: 3.11.6",
|
||||||
|
default="3.11.6",
|
||||||
|
)
|
||||||
|
build.add_argument(
|
||||||
|
"-n",
|
||||||
|
"--node-version",
|
||||||
|
help="NodeJS Version, default: 18.18.2",
|
||||||
|
default="18.18.2",
|
||||||
|
)
|
||||||
|
|
||||||
|
def build_image(
|
||||||
|
push: bool,
|
||||||
|
frappe_path: str,
|
||||||
|
frappe_branch: str,
|
||||||
|
containerfile_path: str,
|
||||||
|
apps_json_path: str,
|
||||||
|
image_name: str,
|
||||||
|
python_version: str,
|
||||||
|
node_version: str,
|
||||||
|
):
|
||||||
|
if not check_repo_exists():
|
||||||
|
clone_frappe_docker_repo()
|
||||||
|
install_docker()
|
||||||
|
apps_json_base64 = None
|
||||||
|
try:
|
||||||
|
with open(apps_json_path, "rb") as file_text:
|
||||||
|
file_read = file_text.read()
|
||||||
|
apps_json_base64 = (
|
||||||
|
base64.encodebytes(file_read).decode("utf-8").replace("\n", "")
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error("Unable to base64 encode apps.json", exc_info=True)
|
||||||
|
cprint("\nUnable to base64 encode apps.json\n\n", "[ERROR]: ", e, level=1)
|
||||||
|
|
||||||
|
command = [
|
||||||
|
which("docker"),
|
||||||
|
"build",
|
||||||
|
"--progress=plain",
|
||||||
|
f"--tag={image_name}",
|
||||||
|
f"--file={containerfile_path}",
|
||||||
|
f"--build-arg=FRAPPE_PATH={frappe_path}",
|
||||||
|
f"--build-arg=FRAPPE_BRANCH={frappe_branch}",
|
||||||
|
f"--build-arg=PYTHON_VERSION={python_version}",
|
||||||
|
f"--build-arg=NODE_VERSION={node_version}",
|
||||||
|
f"--build-arg=APPS_JSON_BASE64={apps_json_base64}",
|
||||||
|
".",
|
||||||
|
]
|
||||||
|
|
||||||
|
try:
|
||||||
|
subprocess.run(
|
||||||
|
command,
|
||||||
|
check=True,
|
||||||
|
cwd='frappe_docker',
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error("Image build failed", exc_info=True)
|
||||||
|
cprint("\nImage build failed\n\n", "[ERROR]: ", e, level=1)
|
||||||
|
|
||||||
|
if push:
|
||||||
|
try:
|
||||||
|
subprocess.run(
|
||||||
|
[which("docker"), "push", image_name],
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error("Image push failed", exc_info=True)
|
||||||
|
cprint("\nImage push failed\n\n", "[ERROR]: ", e, level=1)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
parser = argparse.ArgumentParser(description="Install Frappe with Docker")
|
parser = argparse.ArgumentParser(description="Install Frappe with Docker")
|
||||||
|
|
||||||
|
# Build command
|
||||||
|
add_build_parser(parser)
|
||||||
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-p", "--prod", help="Setup Production System", action="store_true"
|
"-p", "--prod", help="Setup Production System", action="store_true"
|
||||||
)
|
)
|
||||||
@ -341,6 +457,20 @@ if __name__ == "__main__":
|
|||||||
"-v", "--version", help="ERPNext version to install, defaults to latest stable"
|
"-v", "--version", help="ERPNext version to install, defaults to latest stable"
|
||||||
)
|
)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if args.subcommand == 'build':
|
||||||
|
build_image(
|
||||||
|
push=args.push,
|
||||||
|
frappe_path=args.frappe_path,
|
||||||
|
frappe_branch=args.frappe_branch,
|
||||||
|
apps_json_path=args.apps_json,
|
||||||
|
image_name=args.image_name,
|
||||||
|
containerfile_path=args.containerfile,
|
||||||
|
python_version=args.python_version,
|
||||||
|
node_version=args.node_version,
|
||||||
|
)
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
if args.dev:
|
if args.dev:
|
||||||
cprint("\nSetting Up Development Instance\n", level=2)
|
cprint("\nSetting Up Development Instance\n", level=2)
|
||||||
logging.info("Running Development Setup")
|
logging.info("Running Development Setup")
|
||||||
|
Loading…
Reference in New Issue
Block a user