177 lines
No EOL
4.6 KiB
Bash
177 lines
No EOL
4.6 KiB
Bash
#!/usr/bin/env bash
|
|
# commands/build.command.sh
|
|
#
|
|
# Builds the Docker image and compose stack for a given environment.
|
|
#
|
|
# Usage:
|
|
# dx build [flags]
|
|
#
|
|
# Flags:
|
|
# --dev / --qly / --prd Target environment (default: dev)
|
|
# --project=NAME Override project name
|
|
# --port=PORT Override app port (e.g. 8082, auto:8080)
|
|
# --db=TYPE Override DB engine (mysql | mssql)
|
|
# --db-port=PORT Override DB port
|
|
# --sync-hosts Sync domain to /etc/hosts (requires root)
|
|
# --no-vhosts Skip Apache vhost generation
|
|
# --no-interact Non-interactive mode
|
|
# --debug Enable shell trace (set -x)
|
|
|
|
# ============================================
|
|
# Lifecycle
|
|
# ============================================
|
|
|
|
function cmd::build::on_load() {
|
|
load_module template
|
|
load_module apache
|
|
|
|
flag::register \
|
|
--sync-hosts \
|
|
--no-vhosts \
|
|
--no-interact \
|
|
--scaffold \
|
|
--framework \
|
|
--debug
|
|
}
|
|
|
|
# ============================================
|
|
# Public entrypoint
|
|
# ============================================
|
|
|
|
function cmd::build::run() {
|
|
local flags=()
|
|
|
|
for arg in "$@"; do
|
|
flags+=("$arg")
|
|
done
|
|
|
|
if ! flag::parse "${flags[@]+"${flags[@]}"}"; then
|
|
cmd::build::help
|
|
return 1
|
|
fi
|
|
|
|
# CLI overrides — applied after env files so flags win
|
|
[[ -n "${PROJECT_NAME_OVERRIDE:-}" ]] && export PROJECT_NAME="$PROJECT_NAME_OVERRIDE"
|
|
[[ -n "${APP_PORT_OVERRIDE:-}" ]] && export APP_PORT="$APP_PORT_OVERRIDE"
|
|
[[ -n "${DB_ENGINE_OVERRIDE:-}" ]] && export DB_ENGINE="$DB_ENGINE_OVERRIDE"
|
|
[[ -n "${DB_PORT_OVERRIDE:-}" ]] && export DB_PORT="$DB_PORT_OVERRIDE"
|
|
|
|
# ============================================
|
|
# Project scaffolding
|
|
# ============================================
|
|
|
|
if ! app::exists || flag::enabled --scaffold; then
|
|
app::scaffold "$(ctx::root)"
|
|
fi
|
|
|
|
# ============================================
|
|
# Runtime artifacts
|
|
# ============================================
|
|
|
|
artifact::init
|
|
|
|
# ============================================
|
|
# Network & Virtual Hosts
|
|
# ============================================
|
|
|
|
network::ports::prepare
|
|
|
|
if flag::enabled --sync-hosts && ! flag::enabled --no-interact; then
|
|
load_command hosts
|
|
hosts::sync
|
|
fi
|
|
|
|
if ! flag::enabled --no-vhosts; then
|
|
apache::generate_vhosts
|
|
fi
|
|
|
|
# ============================================
|
|
# Docker image
|
|
# ============================================
|
|
|
|
runtime::run_if BUILD_IMAGE docker::image::generate || {
|
|
log::error "Failed to generate Docker image (${APP_IMAGE}:${ENVIRONMENT})"
|
|
return 1
|
|
}
|
|
|
|
runtime::run_if BUILD_IMAGE docker::image::build || {
|
|
log::error "Failed to build Docker image (${APP_IMAGE}:${ENVIRONMENT})"
|
|
return 1
|
|
}
|
|
|
|
# ============================================
|
|
# Docker compose stack
|
|
# ============================================
|
|
|
|
runtime::run_if BUILD_STACK docker::compose::generate || {
|
|
log::error "Failed to generate compose stack (${ENVIRONMENT})"
|
|
return 1
|
|
}
|
|
|
|
runtime::run_if BUILD_STACK docker::compose::build || {
|
|
log::error "Failed to build compose stack (${ENVIRONMENT})"
|
|
return 1
|
|
}
|
|
|
|
# ============================================
|
|
# Done
|
|
# ============================================
|
|
|
|
cmd::build::_show_networking
|
|
log::success "Build complete!"
|
|
|
|
flag::scaffold_defaults_file
|
|
cmd::build::_hint_next_steps
|
|
}
|
|
|
|
# ============================================
|
|
# Help
|
|
# ============================================
|
|
|
|
function cmd::build::help() {
|
|
cat <<EOF
|
|
Usage: dx build [flags]
|
|
|
|
Generates and builds the Docker image and compose stack.
|
|
|
|
Flags:
|
|
--dev / --qly / --prd Target environment (default: dev)
|
|
--project=NAME Override project name
|
|
--port=PORT Override app port
|
|
--db=TYPE Override DB engine (mysql | mssql)
|
|
--db-port=PORT Override DB port
|
|
--sync-hosts Sync domain to /etc/hosts
|
|
--no-vhosts Skip vhost generation
|
|
--no-interact Non-interactive mode
|
|
--debug Shell trace
|
|
|
|
Examples:
|
|
dx build
|
|
dx build --qly
|
|
dx build --port=8082
|
|
dx build --sync-hosts
|
|
dx build --project=myapp --db=mssql
|
|
EOF
|
|
}
|
|
|
|
# ============================================
|
|
# Private
|
|
# ============================================
|
|
|
|
function cmd::build::_show_networking() {
|
|
printf "\n🌐 Accessible on: http://%s\n\n" "$DOMAIN"
|
|
echo "🔌 Ports:"
|
|
echo " App: ${APP_PORT}"
|
|
echo " DB: $(docker::db::external_port)"
|
|
printf "\n"
|
|
}
|
|
|
|
function cmd::build::_hint_next_steps() {
|
|
cat <<EOF
|
|
|
|
Next steps:
|
|
dx init Initialize environment
|
|
dx up Start the stack
|
|
|
|
EOF
|
|
} |