2026-05-31 13:55:58 -04:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
# shellcheck shell=bash
|
|
|
|
|
# Default Go workflow: tidy → fmt → vet → test → build
|
|
|
|
|
# Runs automatically when `docker run casjaysdev/go` is called with no args.
|
|
|
|
|
# Working directory is expected to be a Go module root (go.mod must exist).
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
|
|
|
|
# Resolve the working directory — prefer /app if mounted, else cwd
|
|
|
|
|
WORK_DIR="${GOWORKDIR:-${PWD}}"
|
|
|
|
|
cd "$WORK_DIR"
|
|
|
|
|
|
|
|
|
|
# Require a go.mod so we fail fast with a clear message instead of cryptic go errors
|
|
|
|
|
if [ ! -f "go.mod" ]; then
|
|
|
|
|
echo "Error: no go.mod found in ${WORK_DIR}" >&2
|
|
|
|
|
echo "Mount your project with: docker run --rm -v \"\$(pwd)\":/app casjaysdev/go" >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
MODULE="$(awk '/^module /{print $2}' go.mod)"
|
|
|
|
|
echo ""
|
|
|
|
|
echo "▶ Go workflow: ${MODULE}"
|
|
|
|
|
echo " Working dir: ${WORK_DIR}"
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
run_step() {
|
|
|
|
|
local label="$1"; shift
|
|
|
|
|
echo "── ${label}"
|
|
|
|
|
"$@"
|
|
|
|
|
echo ""
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-21 16:46:02 -04:00
|
|
|
# Resolve build mode. Resolution order (first non-empty value wins):
|
|
|
|
|
# GO_MODE — canonical name; prod|production or dev|devel|development
|
|
|
|
|
# MODE — alias for GO_MODE (accepted for convenience)
|
|
|
|
|
# GO_PROD — legacy flag; GO_PROD=1 maps to production mode
|
|
|
|
|
# -trimpath -ldflags=-s -w applied to go build only; go test is unaffected.
|
|
|
|
|
_RESOLVED_MODE="${GO_MODE:-${MODE:-}}"
|
2026-06-21 16:44:18 -04:00
|
|
|
_IS_PROD=0
|
2026-06-21 16:46:02 -04:00
|
|
|
case "${_RESOLVED_MODE}" in
|
2026-06-21 16:44:18 -04:00
|
|
|
prod | production) _IS_PROD=1 ;;
|
|
|
|
|
dev | devel | development) _IS_PROD=0 ;;
|
|
|
|
|
"")
|
|
|
|
|
[ "${GO_PROD:-0}" = "1" ] && _IS_PROD=1
|
|
|
|
|
;;
|
|
|
|
|
*)
|
2026-06-21 16:46:02 -04:00
|
|
|
echo "Warning: unknown GO_MODE '${_RESOLVED_MODE}' — expected prod|production|dev|devel|development; defaulting to development" >&2
|
2026-06-21 16:44:18 -04:00
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
|
2026-06-21 09:51:21 -04:00
|
|
|
BUILD_FLAGS=()
|
2026-06-21 16:44:18 -04:00
|
|
|
if [ "$_IS_PROD" = "1" ]; then
|
|
|
|
|
echo " (mode: production — -trimpath -ldflags=-s -w)"
|
2026-06-21 09:51:21 -04:00
|
|
|
BUILD_FLAGS=(-trimpath -ldflags="-s -w")
|
2026-06-21 16:44:18 -04:00
|
|
|
else
|
|
|
|
|
echo " (mode: development)"
|
2026-06-21 09:51:21 -04:00
|
|
|
fi
|
|
|
|
|
|
2026-05-31 13:55:58 -04:00
|
|
|
# 1. Sync module graph and go.sum before anything reads them
|
|
|
|
|
run_step "go mod tidy" go mod tidy
|
|
|
|
|
# 2. Format all Go source files in place
|
|
|
|
|
run_step "gofmt -w ." gofmt -w .
|
|
|
|
|
# 3. Catch suspicious constructs
|
|
|
|
|
run_step "go vet ./..." go vet ./...
|
|
|
|
|
# 4. Run tests — fail fast before wasting time on a build
|
|
|
|
|
run_step "go test ./..." go test ./...
|
|
|
|
|
# 5. Build all main packages; output lands alongside source in each package dir
|
2026-06-21 09:51:21 -04:00
|
|
|
run_step "go build ./..." go build "${BUILD_FLAGS[@]}" ./...
|
2026-05-31 13:55:58 -04:00
|
|
|
|
|
|
|
|
echo "✅ Done."
|
2026-06-12 14:10:04 -04:00
|
|
|
|