8 Commits

Author SHA1 Message Date
jason bc1eb17c2f Add govulncheck to default go-workflow
Build and Push / build (push) Has been cancelled
Scan Go dependencies against the vulnerability database automatically
on every run, between vet and test. Fail fast on known CVEs before
spending time running the full test suite.
- rootfs/usr/local/bin/go-workflow: add govulncheck ./... as step 4; renumber build to step 6
- README.md: update default workflow diagram to include govulncheck

README.md
rootfs/usr/local/bin/go-workflow
2026-07-03 11:14:46 -04:00
jason db16b0807b ♻️ Make GO_MODE canonical; MODE becomes alias ♻️
GO_MODE fits the GO_* naming convention. MODE is kept as a convenience alias.
Resolution order: GO_MODE → MODE → GO_PROD=1 (legacy).
- rootfs/usr/local/bin/go-workflow: resolve _RESOLVED_MODE from GO_MODE with
MODE as fallback; warn message now references GO_MODE; logic otherwise unchanged
- README.md: rename MODE row to GO_MODE (canonical); add MODE row as alias;
update production mode section to use GO_MODE=prod

README.md
rootfs/usr/local/bin/go-workflow
2026-06-21 16:46:02 -04:00
jason f910225d3b Add MODE env var and document GOWORKDIR, GOOS, GOARCH
- rootfs/usr/local/bin/go-workflow: replace GO_PROD=1 check with MODE
resolution; MODE=prod|production enables -trimpath -ldflags=-s -w on
go build; MODE=dev|devel|development is the explicit development path;
GO_PROD=1 remains a legacy alias when MODE is unset; unknown MODE values
warn to stderr and default to development; print active mode on every run
- README.md: add GOWORKDIR, GOOS, GOARCH, MODE, GO_PROD to env vars table
- README.md: update production mode section to use MODE=prod; note GO_PROD
as legacy alias

README.md
rootfs/usr/local/bin/go-workflow
2026-06-21 16:44:18 -04:00
jason 373136fead Add GO_PROD=1 production build mode to go-workflow
When GO_PROD=1 is set at runtime, go build receives -trimpath and
-ldflags="-s -w" to strip source paths, symbol tables, and DWARF debug
info from compiled binaries. Applied to go build only — go test is
unaffected so stack traces remain readable during development.
Usage: docker run --env GO_PROD=1 --rm -v "$(pwd)":/app casjaysdev/go
- rootfs/usr/local/bin/go-workflow: add BUILD_FLAGS array populated when
GO_PROD=1; pass flags to go build step only; print mode notice when active

rootfs/usr/local/bin/go-workflow
2026-06-21 09:51:21 -04:00
jason 8dc2fd894b 🐛 Fix dead accumulator, multi-arg exec drop, and init placeholder 🐛
set -e in go-workflow made the retVal/GO_EXITCODE accumulator dead code —
any failing run_step call exits the script immediately via set -e before
retVal=$? is ever reached, so GO_EXITCODE only ever sums zeros.
Remove the accumulator and simplify run_step; set -e already propagates
failures naturally.
__exec_command in the *) and exec) cases only used the first element of its
arg array (local cmdExec="${arg:-}" expands to arg[0]), silently dropping
every subsequent word. "docker run casjaysdev/go go test ./..." ran just
"go" with no subcommand. Replace __exec_command with exec "$@" directly in
both cases; exec is correct (no extra process) and preserves all args.
00-go.sh exported CONTAINER_INIT and SERVICE_USES_PID inside a subshell
( source "$init" ) — those exports never propagated back to the parent
entrypoint. Move SERVICE_USES_PID="no" to go.sh (sourced by the parent
shell before __start_init_scripts runs) so the framework takes the explicit
"config service, no PID" path. Rewrite 00-go.sh as a documented placeholder
explaining why the file must still exist (init_count == 0 triggers an
infinite background keep-alive loop).
- rootfs/usr/local/bin/go-workflow: remove GO_EXITCODE/retVal accumulator;
simplify run_step to drop exitCode capture (always 0 with set -e)
- rootfs/usr/local/bin/entrypoint.sh: *) case uses exec "$@" / exec go-workflow;
exec) case uses exec "$@" with proper empty-arg error instead of broken
__exec_command fallback
- rootfs/usr/local/etc/docker/env/go.sh: add SERVICE_USES_PID="no"
- rootfs/usr/local/etc/docker/init.d/00-go.sh: remove dead exports; add
comment explaining placeholder purpose

rootfs/usr/local/bin/entrypoint.sh
rootfs/usr/local/bin/go-workflow
rootfs/usr/local/etc/docker/env/go.sh
rootfs/usr/local/etc/docker/init.d/00-go.sh
2026-06-20 07:42:42 -04:00
jason dad20b0a43 🐛 Fix three entrypoint bugs 🐛
- CONTAINER_NAME was hardcoded to "alpine" instead of "go"; the startup
message said "alpine" for the same reason
- HEALTH_ENABLED was hard-assigned to "yes" after env files were sourced,
silently overriding the HEALTH_ENABLED="no" set in env/go.sh; changed
to ${HEALTH_ENABLED:-yes} so the env file value is respected
- go-workflow used retval (lowercase) to capture the go vet exit code but
then read retVal (uppercase) in the accumulator; the vet failure was
silently dropped and the gofmt exit code was summed twice instead
- rootfs/usr/local/bin/entrypoint.sh: fix CONTAINER_NAME default, startup
message label, and HEALTH_ENABLED hard-override
- rootfs/usr/local/bin/go-workflow: fix retval/retVal case mismatch so
go vet exit code is correctly propagated

rootfs/usr/local/bin/entrypoint.sh
rootfs/usr/local/bin/go-workflow
2026-06-19 23:14:44 -04:00
jason 4b8f035091 🔧 track exit codes and fix entrypoint invocation 🔧
- `go-workflow`: accumulate step exit codes into `GO_EXITCODE` and `exit $GO_EXITCODE` so failures propagate to the caller
- `run_step`: capture and return each step's exit code instead of silently swallowing it
- `entrypoint.sh`: replace `__exec_command go-workflow` with direct `go-workflow "$@"` so the process and args are passed correctly
- Strip trailing whitespace from `@@Other` and `@@Resource` header fields

rootfs/usr/local/bin/entrypoint.sh
rootfs/usr/local/bin/go-workflow
2026-06-12 14:10:04 -04:00
jason 4a5c802368 Default workflow: no-args runs tidy→fmt→vet→test→build
Replace the service-lifecycle init script with a lean Go-native
default workflow. Running the container with no arguments now
automatically formats, vets, tests, and builds the mounted project.
- rootfs/usr/local/etc/docker/init.d/00-go.sh: stripped from 979
lines of daemon-lifecycle boilerplate to 3 lines that export
CONTAINER_INIT=yes and SERVICE_USES_PID=no, telling the init
framework this is a configuration-only container (no daemon, no
keep-alive loop)
- rootfs/usr/local/bin/go-workflow: new script — runs the canonical
Go workflow in order: go mod tidy → gofmt -w . → go vet ./... →
go test ./... → go build ./...; exits 1 with a clear usage message
if no go.mod is found in /app
- rootfs/usr/local/bin/entrypoint.sh: no-args path in both the init
block and the * case now exec go-workflow instead of __no_exit;
verified: default workflow, explicit commands, sh -c passthrough,
and missing go.mod error all behave correctly
- README.md: document the default workflow prominently; update
one-shot examples; add golangci-lint --timeout note; add tail null
long-running pattern

README.md
rootfs/usr/local/bin/entrypoint.sh
rootfs/usr/local/bin/go-workflow
rootfs/usr/local/etc/docker/init.d/00-go.sh
2026-05-31 13:55:58 -04:00