dx/dxkit/commands/build.command.sh

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
}