devbox adjust

This commit is contained in:
jacobHu 2025-04-30 16:37:11 +08:00
parent 4939eb9c13
commit 349611baed

View File

@ -121,6 +121,7 @@ devbox_init_guidance() {
use_local_component=false
use_custom_repository=""
freeleaps_components=""
git_branch="main"
# Ask user for Freeleaps.com username and password
read -p "Enter your Freeleaps.com username: " freeleaps_username
@ -130,11 +131,18 @@ devbox_init_guidance() {
if [[ $choose_local_component == "y" ]]; then
use_local_component=true
fi
# Ask user for git branch
read -p "Enter git branch to checkout (default: main): " input_git_branch
if [[ -n $input_git_branch ]]; then
git_branch=$input_git_branch
fi
add_arg "--freeleaps-username" "$freeleaps_username"
add_arg "--freeleaps-password" "$freeleaps_password"
add_arg "--use-local-component" "$use_local_component"
add_arg "--use-custom-repository" "$use_custom_repository"
add_arg "--git-branch" "$git_branch"
;;
2)
# Check if product_id is empty
@ -151,8 +159,15 @@ devbox_init_guidance() {
read -s -p "Enter your Freeleaps.com password: " freeleaps_password
echo
# Ask user for git branch
read -p "Enter git branch to checkout (default: main): " git_branch
if [[ -z $git_branch ]]; then
git_branch="main"
fi
add_arg "--freeleaps-username" "$freeleaps_username"
add_arg "--freeleaps-password" "$freeleaps_password"
add_arg "--git-branch" "$git_branch"
ENCODING_FREELEAPS_USERNAME=$(url_encode "$freeleaps_username")
ENCODEING_FREELEAPS_PASSWORD=$(url_encode "$freeleaps_password")
@ -229,15 +244,16 @@ devbox_init_usage() {
printf " --working-home -w [Optional] : Specifies the working home of DevBox CLI. Default: %s/devbox\n" "$HOME"
printf " --devbox-container-name -n [Optional] : Specifies the DevBox container name. Default: devbox.\n"
printf " --devbox-container-port -p [Optional] : Specifies the container port for DevBox SSH access. Default: 22222.\n"
printf " --devbox-nginx-port [Optional] : Specifies the host port for Nginx reverse proxy access. Default: 8080.\n" # add Nginx port description
printf " --devbox-backend-port -b [Optional] : Specifies the container port for DevBox backend access. Default: 8002.\n"
printf " --devbox-image-repo -r [Optional] : Specifies the DevBox container image repository. Default: docker.io/freeleaps.\n"
printf " --devbox-image-name -i [Optional] : Specifies the DevBox container image name. Default: devbox.\n"
printf " --devbox-image-tag -t [Optional] : Specifies the DevBox container image tag. Default: latest.\n"
printf " --devbox-frontend-port -q [Optional] : Specifies the container port for DevBox frontend access. Default: 5173.\n"
printf " --devbox-backend-port -b [Optional] : Specifies the container port for DevBox backend access. Default: 8002.\n"
printf " --freeleaps-username -u [Optional] : Specifies the Freeleaps.com repository username.\n"
printf " --freeleaps-password -x [Optional] : Specifies the Freeleaps.com repository password.\n"
printf " --use-local-component -l [Optional] : Check if using local component or online dev environment. Default: false.\n"
printf " --use-custom-repository -c [Optional] : Specifies the custom git repository for source code.\n"
printf " --git-branch -g [Optional] : Specifies the git branch to checkout. Default: main.\n"
printf " --freeleaps-components -m [Optional] : Specifies the Freeleaps.com components to start in the DevBox container.\n"
printf " --force -f [Optional] : Force initialization even if resources already exist.\n\n"
@ -249,6 +265,8 @@ devbox_init_usage() {
printf " devbox init --os linux --arch arm64 --freeleaps-username alice --freeleaps-password secret\n"
printf " Initialize with custom container settings:\n"
printf " devbox init --devbox-container-name custom-devbox --devbox-container-port 22222 --freeleaps-username alice --freeleaps-password secret\n"
printf " Initialize with a specific git branch:\n"
printf " devbox init --git-branch develop --freeleaps-username alice --freeleaps-password secret\n"
else
printf "devbox init - Initialize the local development environment based on DevBox container.\n\n"
fi
@ -639,6 +657,7 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
export USE_LOCAL_COMPONENT_VAL="${USE_LOCAL_COMPONENT_VAL}"
export DEVBOX_BACKEND_PORT="${DEVBOX_BACKEND_PORT}"
export DEVBOX_FRONTEND_PORT="${DEVBOX_FRONTEND_PORT}"
export DEVBOX_NGINX_PORT="${DEVBOX_NGINX_PORT}" # export Nginx port (if internal use)
echo "[INIT] \$(date '+%Y-%m-%d %H:%M:%S') USE_LOCAL_COMPONENT_VAL: ${USE_LOCAL_COMPONENT_VAL}"
# Check if the working home directory exists, if not, create it. [:COMPONENT_SETTINGS]
@ -808,6 +827,36 @@ if true ; then
popd > /dev/null
# Create the logs directory if it does not exist
mkdir -p /home/devbox/logs
# Install Nginx and net-tools
echo "[INIT] \$(date '+%Y-%m-%d %H:%M:%S') Installing Nginx and net-tools..."
sudo apt-get update
sudo apt-get install -y nginx net-tools
# Stop nginx if it started automatically after installation
if sudo service nginx status > /dev/null 2>&1; then
echo "[INIT] \$(date '+%Y-%m-%d %H:%M:%S') Stopping Nginx service after installation..."
sudo service nginx stop
fi
# Configure Nginx
echo "[INIT] \$(date '+%Y-%m-%d %H:%M:%S') Configuring Nginx..."
if [ -f "/home/devbox/freeleaps/frontend/devbox_nginx.conf" ]; then
# overwrite the default configuration
sudo cp /home/devbox/freeleaps/frontend/devbox_nginx.conf /etc/nginx/nginx.conf
if sudo nginx -t; then
echo "[INIT] \$(date '+%Y-%m-%d %H:%M:%S') Nginx configuration syntax check successful."
else
echo "[ERROR] \$(date '+%Y-%m-%d %H:%M:%S') Nginx configuration syntax error. Please check /home/devbox/freeleaps/frontend/devbox_nginx.conf." >&2
exit 1
fi
else
echo "[WARN] \$(date '+%Y-%m-%d %H:%M:%S') Nginx configuration file /home/devbox/freeleaps/frontend/devbox_nginx.conf not found. Skipping Nginx configuration."
fi
fi
EOF
@ -837,14 +886,23 @@ stop_frontend_service() {
DEVBOX_NAME=$(cat "$devbox_container_id_file_path")
docker exec -i "$DEVBOX_NAME" bash <<EOF
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Stopping frontend service..."
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Stopping frontend service (pnpm run dev)..."
if [ -f /home/devbox/.frontend.pid ]; then
FRONTEND_PID=\$(cat /home/devbox/.frontend.pid)
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Killing frontend service PID: \$FRONTEND_PID"
kill -9 \$FRONTEND_PID
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Killing frontend process PID: \$FRONTEND_PID"
# use kill -9 to stop the pnpm run dev process
kill -9 \$FRONTEND_PID 2>/dev/null || true
rm -f /home/devbox/.frontend.pid
else
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Frontend service is not running."
else
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Frontend process PID file not found or process not running."
fi
echo "[NGINX] \$(date '+%Y-%m-%d %H:%M:%S') Stopping Nginx service..."
if sudo service nginx status > /dev/null 2>&1; then
sudo service nginx stop
echo "[NGINX] \$(date '+%Y-%m-%d %H:%M:%S') Nginx stopped."
else
echo "[NGINX] \$(date '+%Y-%m-%d %H:%M:%S') Nginx service is not running."
fi
EOF
@ -1133,28 +1191,36 @@ fi
DEVBOX_NAME=$(cat "$devbox_container_id_file_path")
DEVBOX_FRONTEND_PORT=$(cat "$WORKING_HOME/.devbox-frontend-port")
DEVBOX_NGINX_HOST_PORT=$(cat "$WORKING_HOME/.devbox-nginx-port") # Nginx Host Port
docker exec -i "$DEVBOX_NAME" bash <<EOF
# Check if /home/devbox/.frontend.pid exits
# Check if Nginx or frontend process is already running
nginx_running=false
if sudo service nginx status > /dev/null 2>&1; then
nginx_running=true
fi
frontend_running=false
if [ -f /home/devbox/.frontend.pid ]; then
frontend_pid=\$(cat /home/devbox/.frontend.pid)
if [ -n "\$frontend_pid" ]; then
# Check if the frontend service is running
if ps -p "\$frontend_pid" > /dev/null; then
echo
echo "============================================================================================"
echo
echo "[FRONTEND] [WARNING] Frontend service is running with PID: \$frontend_pid, if you want to restart, please stop it first or run devbox restart -e frontend."
echo
echo "============================================================================================"
echo
exit 1
fi
if [ -n "\$frontend_pid" ] && ps -p "\$frontend_pid" > /dev/null; then
frontend_running=true
fi
fi
if [[ "\$nginx_running" == "true" || "\$frontend_running" == "true" ]]; then
echo
echo "============================================================================================"
echo
echo "[FRONTEND/NGINX] [WARNING] Frontend process (PID: \${frontend_pid:-N/A}) or Nginx is already running."
echo "[FRONTEND/NGINX] [WARNING] If you want to restart, please stop it first (devbox stop -e frontend) or run devbox restart -e frontend."
echo
echo "============================================================================================"
echo
exit 1
fi
USE_LOCAL_COMPONENT_FLAG="/home/devbox/.use-local-component"
USE_LOCAL_COMPONENT_VAL="false"
@ -1280,33 +1346,119 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Starting frontend compilation and startup..."
# Start the frontend service
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Start frontend service..."
# Start the frontend service (pnpm run dev starts both Vue and Nuxt)
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Starting frontend applications (Vue & Nuxt) via pnpm run dev..."
# make sure the output of pnpm run dev is redirected to the log file
nohup pnpm run dev > /home/devbox/logs/frontend.logs 2>&1 &
PNPM_PID=\$! # get the PID of the pnpm run dev process
echo "\$PNPM_PID" > /home/devbox/.frontend.pid # save the PID of the pnpm run dev process
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Frontend applications started (PID: \$PNPM_PID). Logs: /home/devbox/logs/frontend.logs"
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Frontend service started. Logs: /home/devbox/logs/frontend.logs"
# Check the health of the frontend service: poll to detect HTTP status
MAX_ATTEMPTS=30
# Check the health of the frontend services (check Nginx endpoint after starting it)
# Health check now needs to wait for Nginx to be up and proxying correctly
MAX_ATTEMPTS=25
ATTEMPT=0
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Checking frontend service startup..."
APPS_READY=false
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Waiting for frontend applications to become ready..."
# poll the internal port
VUE_PORT=5173
NUXT_PORT=3001
VUE_READY=false
NUXT_READY=false
while [ \$ATTEMPT -lt \$MAX_ATTEMPTS ]; do
HTTP_CODE=\$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:${DEVBOX_FRONTEND_PORT}/")
if [ "\$HTTP_CODE" -eq 200 ]; then
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Service started successfully (HTTP \$HTTP_CODE)"
# check the Vue port
if ! \$VUE_READY && curl --output /dev/null --silent --head --fail http://localhost:\${VUE_PORT}; then
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Vue app (port \${VUE_PORT}) seems ready."
VUE_READY=true
fi
# check the Nuxt port
if ! \$NUXT_READY && curl --output /dev/null --silent --head --fail http://localhost:\${NUXT_PORT}/home/; then
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Nuxt app (port \${NUXT_PORT}) seems ready."
NUXT_READY=true
fi
# Get the backend service PID by checking the process port with netstat -tulnp | grep ${DEVBOX_FRONTEND_PORT}
FRONTEND_PID=\$(netstat -tulnp 2>/dev/null | grep "${DEVBOX_FRONTEND_PORT}" | awk '{print \$7}' | awk -F'/' '{print \$1}')
if \$VUE_READY && \$NUXT_READY; then
APPS_READY=true
break
fi
echo "\$FRONTEND_PID" > /home/devbox/.frontend.pid
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Waiting for apps... Vue Ready: \$VUE_READY, Nuxt Ready: \$NUXT_READY (Attempt \$((ATTEMPT+1))/\$MAX_ATTEMPTS)"
ATTEMPT=\$((ATTEMPT+1))
sleep 5
done
if [ "\$APPS_READY" = false ]; then
echo
echo "============================================================================================"
echo
echo "[FRONTEND] [ERROR] Frontend applications (Vue/Nuxt) did not become ready within the time limit."
echo "[FRONTEND] [ERROR] Please check the logs: /home/devbox/logs/frontend.logs"
echo
echo "============================================================================================"
echo
# stop the already started pnpm process
kill -9 \$PNPM_PID 2>/dev/null || true
rm -f /home/devbox/.frontend.pid
exit 1
fi
# Start Nginx service
echo "[NGINX] \$(date '+%Y-%m-%d %H:%M:%S') Starting Nginx service..."
if sudo service nginx start; then
echo "[NGINX] \$(date '+%Y-%m-%d %H:%M:%S') Nginx started successfully."
sleep 2 # wait for Nginx to be fully started
else
echo
echo "============================================================================================"
echo
echo "[NGINX] [ERROR] Failed to start Nginx service. Check Nginx logs (/var/log/nginx/) and configuration."
echo
echo "============================================================================================"
echo
# stop the already started pnpm process
kill -9 \$PNPM_PID 2>/dev/null || true
rm -f /home/devbox/.frontend.pid
exit 1
fi
# Check Nginx health (check port 80 inside container)
MAX_ATTEMPTS_NGINX=10
ATTEMPT_NGINX=0
NGINX_READY=false
echo "[NGINX] \$(date '+%Y-%m-%d %H:%M:%S') Checking Nginx service health..."
while [ \$ATTEMPT_NGINX -lt \$MAX_ATTEMPTS_NGINX ]; do
HTTP_CODE=\$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:80/") # check the Nginx internal port 80
if [ "\$HTTP_CODE" -eq 200 ] || [ "\$HTTP_CODE" -eq 404 ]; then # 200 or 404 (if the root path proxy application is not fully started) are considered OK
echo "[NGINX] \$(date '+%Y-%m-%d %H:%M:%S') Nginx service responding (HTTP \$HTTP_CODE)"
NGINX_READY=true
break
else
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Waiting for frontend service... Attempt \$((ATTEMPT+1))"
ATTEMPT=\$((ATTEMPT+1))
sleep 10
echo "[NGINX] \$(date '+%Y-%m-%d %H:%M:%S') Waiting for Nginx service... Attempt \$((ATTEMPT_NGINX+1)) (HTTP \$HTTP_CODE)"
ATTEMPT_NGINX=\$((ATTEMPT_NGINX+1))
sleep 3
fi
done
if [ "\$NGINX_READY" = false ]; then
echo
echo "============================================================================================"
echo
echo "[NGINX] [ERROR] Nginx service startup failed or did not respond correctly."
echo "[NGINX] [ERROR] Please check Nginx logs (/var/log/nginx/) and frontend logs (/home/devbox/logs/frontend.logs)."
echo
echo "============================================================================================"
echo
# stop the already started pnpm process and Nginx
sudo service nginx stop 2>/dev/null || true
kill -9 \$PNPM_PID 2>/dev/null || true
rm -f /home/devbox/.frontend.pid
exit 1
fi
# if /tmp/pnpm-lock.yaml.bak exists, restore it
if [ -f "/tmp/pnpm-lock.yaml.bak" ];
then
@ -1345,20 +1497,13 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
exit 1
fi
# Frontend environment variable settings. [:COMPONENT_SETTINGS]
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') USE_LOCAL_COMPONENT_VAL: \$USE_LOCAL_COMPONENT_VAL"
if [[ "\$USE_LOCAL_COMPONENT_VAL" == "true" ]]; then
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Use local component dev environment."
sed -i 's#VITE_PROXY_WEBSOCKET_CHAT_URL=.*#VITE_PROXY_WEBSOCKET_CHAT_URL=ws://chat:8012#g' /home/devbox/freeleaps/frontend/freeleaps/.env.development
sed -i 's#VITE_PROXY_API_CHAT_URL=.*#VITE_PROXY_API_CHAT_URL=http://chat:8012#g' /home/devbox/freeleaps/frontend/freeleaps/.env.development
else
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Use online component dev environment."
sed -i "s|VITE_PROXY_WEBSOCKET_CHAT_URL=.*|VITE_PROXY_WEBSOCKET_CHAT_URL=wss://freeleaps-alpha.com|g" /home/devbox/freeleaps/frontend/freeleaps/.env.development
sed -i "s|VITE_PROXY_API_CHAT_URL=.*|VITE_PROXY_API_CHAT_URL=https://freeleaps-alpha.com|g" /home/devbox/freeleaps/frontend/freeleaps/.env.development
fi
popd > /dev/null
echo
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Frontend compilation and startup completed."
echo "[FRONTEND/NGINX] \$(date '+%Y-%m-%d %H:%M:%S') Frontend applications and Nginx proxy started successfully."
echo "[FRONTEND/NGINX] \$(date '+%Y-%m-%d %H:%M:%S') Access via host port: ${DEVBOX_NGINX_HOST_PORT}"
echo "[FRONTEND/NGINX] \$(date '+%Y-%m-%d %H:%M:%S') - Vue App: http://localhost:${DEVBOX_NGINX_HOST_PORT}/"
echo "[FRONTEND/NGINX] \$(date '+%Y-%m-%d %H:%M:%S') - Nuxt App: http://localhost:${DEVBOX_NGINX_HOST_PORT}/home/"
echo
# Check frontend git checkout status
@ -1449,6 +1594,10 @@ devbox_init_command() {
local FREELEAPS_COMPONENTS="$args_freeleaps_components" # --freeleaps-components
local USE_CUSTOM_REPOSITORY="$args_use_custom_repository" # --use-custom-repository
local GIT_BRANCH="$args_git_branch" # --git-branch
local DEVBOX_NGINX_PORT="$(get_arg '--devbox-nginx-port')" # --devbox-nginx-port
# --force flag to overwrite existing resources
local FORCE_INIT="${args_force}"
@ -1469,6 +1618,7 @@ devbox_init_command() {
local FREELEAPS_COMPONENTS="$(get_arg '--freeleaps-components')"
local USE_CUSTOM_REPOSITORY="$(get_arg '--use-custom-repository')"
local GIT_BRANCH="$(get_arg '--git-branch')"
local FORCE_INIT="$(get_arg '--force')"
@ -1543,6 +1693,8 @@ devbox_init_command() {
log_info " USE_LOCAL_COMPONENT= $USE_LOCAL_COMPONENT"
log_info " FREELEAPS_COMPONENTS= ${start_components[@]}"
log_info " FORCE_INIT = $FORCE_INIT"
log_info " DEVBOX_NGINX_PORT = $DEVBOX_NGINX_PORT (Host Port for Nginx)"
log_info " DEVBOX_FRONTEND_PORT = $DEVBOX_FRONTEND_PORT (Internal Vue3 Port)"
echo
# -------------------------------------------------------------------
@ -1722,7 +1874,7 @@ devbox_init_command() {
local devbox_full_image="${DEVBOX_REPO}/${DEVBOX_IMAGE}:${DEVBOX_TAG}"
# Check local and remote version. User doesnt need to rebuild devbox if local version is consistent with remote version
# Check local and remote version. User doesn't need to rebuild devbox if local version is consistent with remote version
if [[ -n "$DEVBOX_REPO" && -n "$DEVBOX_IMAGE" && -n "$DEVBOX_TAG" ]]; then
if docker images --format '{{.Repository}}:{{.Tag}}' | grep -q "^${DEVBOX_REPO}/${DEVBOX_IMAGE}:${DEVBOX_TAG}\$"; then
log_info "DevBox image $devbox_full_image already exists."
@ -1823,8 +1975,8 @@ devbox_init_command() {
docker run -d \
--name "$DEVBOX_NAME" \
-p "${DEVBOX_PORT}:22" \
-p "${DEVBOX_FRONTEND_PORT}:5173" \
-p "${DEVBOX_BACKEND_PORT}:8002" \
-p "0.0.0.0:${DEVBOX_NGINX_PORT}:80" \
-p "0.0.0.0:${DEVBOX_BACKEND_PORT}:8002" \
-v "$WORKING_HOME:/home/devbox" \
-v /var/run/docker.sock:/var/run/docker.sock \
--network "$DEVBOX_FREELEAPS2_NETWORK" \
@ -1839,6 +1991,7 @@ devbox_init_command() {
echo "$container_id" > "$WORKING_HOME/.devbox-instance"
echo "$DEVBOX_FRONTEND_PORT" > "$WORKING_HOME/.devbox-frontend-port"
echo "$DEVBOX_BACKEND_PORT" > "$WORKING_HOME/.devbox-backend-port"
echo "$DEVBOX_NGINX_PORT" > "$WORKING_HOME/.devbox-nginx-port"
DOVBOX_CLI_DIR=$(pwd)
@ -1862,6 +2015,16 @@ devbox_init_command() {
log_info "Git cloning gitea.freeleaps.mathmast.com/products/freeleaps.git to $FREELEAPS_DIR"
git clone --depth 5 $FRONTEND_GIT_URL
# Checkout the specified branch
if [[ -n "$GIT_BRANCH" && "$GIT_BRANCH" != "main" ]]; then
pushd "$FREELEAPS_DIR" > /dev/null
log_info "Checking out branch: $GIT_BRANCH"
if ! git checkout $GIT_BRANCH; then
log_warn "Failed to checkout branch $GIT_BRANCH, falling back to main branch"
git checkout main
fi
popd > /dev/null
fi
else
pushd "$FREELEAPS_DIR" > /dev/null
# Check $WORKING_HOME/freeleaps exists and it is a git repository, if not git clone it
@ -1877,9 +2040,38 @@ devbox_init_command() {
sudo chown -R ${uid}:${gid} "$WORKING_HOME"
git clone --depth 5 "$FRONTEND_GIT_URL"
# Checkout the specified branch
if [[ -n "$GIT_BRANCH" && "$GIT_BRANCH" != "main" ]]; then
pushd "$FREELEAPS_DIR" > /dev/null
log_info "Checking out branch: $GIT_BRANCH"
if ! git checkout $GIT_BRANCH; then
log_warn "Failed to checkout branch $GIT_BRANCH, falling back to main branch"
git checkout main
fi
popd > /dev/null
fi
else
log_info "Git pulling gitea.freeleaps.mathmast.com/products/freeleaps.git"
git pull
git fetch --all
# Checkout the specified branch
if [[ -n "$GIT_BRANCH" ]]; then
log_info "Checking out branch: $GIT_BRANCH"
# try to checkout the local branch directly
if git checkout $GIT_BRANCH 2>/dev/null; then
log_info "Checked out local branch: $GIT_BRANCH"
git pull origin $GIT_BRANCH
# if the local branch does not exist, try to create and checkout the remote branch
elif git checkout -b $GIT_BRANCH origin/$GIT_BRANCH 2>/dev/null; then
log_info "Checked out remote branch: $GIT_BRANCH"
else
log_warn "Failed to checkout branch $GIT_BRANCH, falling back to main branch"
git checkout main
fi
else
git pull
fi
fi
popd > /dev/null
@ -1905,6 +2097,17 @@ devbox_init_command() {
pushd "$WORKING_HOME" > /dev/null
log_info "Git cloning custom repository: $ECHO_USE_CUSTOM_REPOSITORY"
git clone --depth 5 "$USE_CUSTOM_REPOSITORY"
# Checkout the specified branch
if [[ -n "$GIT_BRANCH" && "$GIT_BRANCH" != "main" ]]; then
pushd "$CUSTOM_DIR" > /dev/null
log_info "Checking out branch: $GIT_BRANCH"
if ! git checkout $GIT_BRANCH; then
log_warn "Failed to checkout branch $GIT_BRANCH, falling back to main branch"
git checkout main
fi
popd > /dev/null
fi
else
pushd "$CUSTOM_DIR" > /dev/null
# Check $WORKING_HOME/custom exists and it is a git repository, if not git clone it
@ -1920,9 +2123,33 @@ devbox_init_command() {
sudo chown -R ${uid}:${gid} "$WORKING_HOME"
git clone --depth 5 "$USE_CUSTOM_REPOSITORY"
# Checkout the specified branch
if [[ -n "$GIT_BRANCH" && "$GIT_BRANCH" != "main" ]]; then
pushd "$CUSTOM_DIR" > /dev/null
log_info "Checking out branch: $GIT_BRANCH"
if ! git checkout $GIT_BRANCH; then
log_warn "Failed to checkout branch $GIT_BRANCH, falling back to main branch"
git checkout main
fi
popd > /dev/null
fi
else
log_info "Git pulling custom repository"
git pull
git fetch
# Checkout the specified branch
if [[ -n "$GIT_BRANCH" ]]; then
log_info "Checking out branch: $GIT_BRANCH"
if ! git checkout $GIT_BRANCH; then
log_warn "Failed to checkout branch $GIT_BRANCH, falling back to main branch"
git checkout main
else
git pull origin $GIT_BRANCH
fi
else
git pull
fi
fi
popd > /dev/null
@ -2152,15 +2379,21 @@ reset_freeleaps_repo
echo "DevBox init completed successfully!"
echo "DevBox Environment Details:"
echo "1. Code repository is located at: ${WORKING_HOME}/freeleaps"
echo "2. Open up the frontend by visiting: http://localhost:${DEVBOX_FRONTEND_PORT}"
echo "2. Access frontend applications via Nginx proxy:"
echo " - Vue3 App (Default): http://localhost:${DEVBOX_NGINX_PORT}/"
echo " - Nuxt App (/home): http://localhost:${DEVBOX_NGINX_PORT}/home/"
echo "3. Log files can be viewed at:"
echo " - Backend logs: ${WORKING_HOME}/logs/backend.logs"
echo " - Frontend logs: ${WORKING_HOME}/logs/frontend.logs"
echo " - Backend logs: ${WORKING_HOME}/logs/backend.logs"
echo " - Frontend logs: ${WORKING_HOME}/logs/frontend.logs (Contains output from pnpm run dev for both apps)"
echo " - Nginx logs inside container: /var/log/nginx/"
echo "DevBox container ID: $WORKING_HOME/.devbox-instance"
echo "Backend PID: $WORKING_HOME/.backend.pid"
echo "Frontend PID: $WORKING_HOME/.frontend.pid"
echo "Frontend Process PID: $WORKING_HOME/.frontend.pid (pnpm run dev process)"
echo "==========================================================="
echo
# Save $GIT_BRANCH to .git-branch file
echo "$GIT_BRANCH" > "$WORKING_HOME/.git-branch"
}
# :command.function
@ -3169,7 +3402,7 @@ devbox_init_parse_requirements() {
add_arg '--devbox-frontend-port' "$2"
shift 2
else
printf "%s\n" "--devbox-frontend-port requires an argument: --devbox-frontend-port DEVBOX_FRONTEND_PORT" >&2
printf "%s\n" "--devbox-frontend-port requires an argument: --devbox-frontend-port DEVBOX_FRONTEND_PORT (Internal Vue3 Port)" >&2
exit 1
fi
;;
@ -3283,6 +3516,26 @@ devbox_init_parse_requirements() {
add_arg '--force' '1'
shift
;;
# :flag.case
--git-branch | -g)
if [[ -n ${2+x} ]]; then
add_arg '--git-branch' "$2"
shift 2
else
printf "%s\n" "--git-branch requires an argument: --git-branch GIT_BRANCH" >&2
exit 1
fi
;;
--devbox-nginx-port)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
add_arg '--devbox-nginx-port' "$2"
shift 2
else
printf "%s\n" "--devbox-nginx-port requires an argument: --devbox-nginx-port DEVBOX_NGINX_PORT (Host Port)" >&2
exit 1
fi
;;
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
@ -3361,6 +3614,13 @@ devbox_init_parse_requirements() {
if [ -z "$(get_arg '--use-local-component')" ]; then
add_arg '--use-local-component' "false"
fi
if [ -z "$(get_arg '--git-branch')" ]; then
add_arg '--git-branch' "main"
fi
if [ -z "$(get_arg '--devbox-nginx-port')" ]; then
add_arg '--devbox-nginx-port' "8888"
fi
}