feat: add build-stamped version with --version flag and TUI header

Introduce tui.Version (defaults to "dev"), stamped at build time via a
VERSION_LDFLAG in the Makefile (-X .../internal/tui.Version=$(VERSION))
across all build targets. main.go handles "--version"/"-v" before
launching the TUI, and the version is shown next to the title in the
header. Docs updated (README + CLAUDE).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
jb
2026-06-19 14:57:05 -03:00
co-authored by Claude Opus 4.8
parent 920fa5e904
commit ef126eaf61
6 changed files with 43 additions and 7 deletions
+8
View File
@@ -145,6 +145,14 @@ make push S3_BUCKET=<bucket> VERSION=<v> # sync dist/ to S3 (version + late
make release S3_BUCKET=<bucket> VERSION=<v> # per-binary copy with OS/arch naming make release S3_BUCKET=<bucket> VERSION=<v> # per-binary copy with OS/arch naming
``` ```
**Versioning:** `tui.Version` ([internal/tui/version.go](internal/tui/version.go))
defaults to `"dev"` and is stamped at build time via `VERSION_LDFLAG`
(`-X .../internal/tui.Version=$(VERSION)`) in the Makefile. `installer --version`
(or `-v`) prints it and exits before the TUI starts; it is also shown in the TUI
header. A plain `go build` leaves it as `"dev"`. The Makefile build rules have no
source deps, so `make build` will not rebuild existing `dist/` artifacts — run
`make clean` first when re-stamping a new VERSION.
Tests (`go test ./...`) cover the pure logic in Tests (`go test ./...`) cover the pure logic in
[config_test.go](internal/tui/config_test.go) (config.toml/envs generation + numeric [config_test.go](internal/tui/config_test.go) (config.toml/envs generation + numeric
validation) and [form_test.go](internal/tui/form_test.go) (`FormStep.Values()`). The validation) and [form_test.go](internal/tui/form_test.go) (`FormStep.Values()`). The
+9 -6
View File
@@ -1,33 +1,36 @@
.PHONY: build clean push release help .PHONY: build clean push release help
VERSION ?= 1.0.0 VERSION ?= 1.0.0
S3_BUCKET ?= S3_BUCKET ?=
BINARY_NAME ?= installer BINARY_NAME ?= installer
BUILD_DIR := ./dist BUILD_DIR := ./dist
MODULE := git.davinti.com.br/davinTI/app-dono/tui
VERSION_LDFLAG := -X $(MODULE)/internal/tui.Version=$(VERSION)
ARCHS := linux/amd64 linux/arm64 darwin/amd64 darwin/arm64 windows/amd64 ARCHS := linux/amd64 linux/arm64 darwin/amd64 darwin/arm64 windows/amd64
build: $(addprefix $(BUILD_DIR)/$(BINARY_NAME)-, $(subst /,-,$(ARCHS))) build: $(addprefix $(BUILD_DIR)/$(BINARY_NAME)-, $(subst /,-,$(ARCHS)))
$(BUILD_DIR)/$(BINARY_NAME)-linux-amd64: $(BUILD_DIR)/$(BINARY_NAME)-linux-amd64:
@mkdir -p $(BUILD_DIR) @mkdir -p $(BUILD_DIR)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-extldflags -static" -o $@ ./cmd CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-extldflags -static $(VERSION_LDFLAG)" -o $@ ./cmd
$(BUILD_DIR)/$(BINARY_NAME)-linux-arm64: $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64:
@mkdir -p $(BUILD_DIR) @mkdir -p $(BUILD_DIR)
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-extldflags -static" -o $@ ./cmd CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-extldflags -static $(VERSION_LDFLAG)" -o $@ ./cmd
$(BUILD_DIR)/$(BINARY_NAME)-darwin-amd64: $(BUILD_DIR)/$(BINARY_NAME)-darwin-amd64:
@mkdir -p $(BUILD_DIR) @mkdir -p $(BUILD_DIR)
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o $@ ./cmd CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="$(VERSION_LDFLAG)" -o $@ ./cmd
$(BUILD_DIR)/$(BINARY_NAME)-darwin-arm64: $(BUILD_DIR)/$(BINARY_NAME)-darwin-arm64:
@mkdir -p $(BUILD_DIR) @mkdir -p $(BUILD_DIR)
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -o $@ ./cmd CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="$(VERSION_LDFLAG)" -o $@ ./cmd
$(BUILD_DIR)/$(BINARY_NAME)-windows-amd64: $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64:
@mkdir -p $(BUILD_DIR) @mkdir -p $(BUILD_DIR)
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o $@ ./cmd CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="$(VERSION_LDFLAG)" -o $@ ./cmd
clean: clean:
rm -rf $(BUILD_DIR) rm -rf $(BUILD_DIR)
+9
View File
@@ -200,6 +200,15 @@ go build -o installer ./cmd
./installer ./installer
``` ```
A versão é gravada no binário em tempo de build (`make build VERSION=1.2.0`) e pode ser
consultada sem abrir a interface:
```bash
./installer --version # ex.: app-dono installer 1.2.0
```
Um `go build` simples (sem o `Makefile`) deixa a versão como `dev`.
## Documentação adicional ## Documentação adicional
- [docs/fluxo.md](docs/fluxo.md) — detalhamento de cada etapa do assistente. - [docs/fluxo.md](docs/fluxo.md) — detalhamento de cada etapa do assistente.
+8
View File
@@ -9,6 +9,14 @@ import (
) )
func main() { func main() {
if len(os.Args) > 1 {
switch os.Args[1] {
case "--version", "-v":
fmt.Println("app-dono installer", tui.Version)
return
}
}
p := tea.NewProgram(tui.InitialModel()) p := tea.NewProgram(tui.InitialModel())
if _, err := p.Run(); err != nil { if _, err := p.Run(); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err) fmt.Fprintf(os.Stderr, "error: %v\n", err)
+6
View File
@@ -0,0 +1,6 @@
package tui
// Version is the installer version. It is stamped at build time via
// -ldflags "-X git.davinti.com.br/davinTI/app-dono/tui/internal/tui.Version=<v>"
// (see the Makefile) and defaults to "dev" for local builds.
var Version = "dev"
+3 -1
View File
@@ -114,8 +114,10 @@ func (m Model) View() tea.View {
help := HelpStyle.Render(helpMsg) help := HelpStyle.Render(helpMsg)
title := TitleStyle.Render(header) + HelpStyle.Render(" v"+Version)
v := tea.NewView(fmt.Sprintf("\n%s%s\n\n%s\n\n%s%s\n", v := tea.NewView(fmt.Sprintf("\n%s%s\n\n%s\n\n%s%s\n",
pad, TitleStyle.Render(header), pad, title,
body, body,
pad, help, pad, help,
)) ))