diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index be4d878..8cccf07 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,6 +25,7 @@ jobs: id: get_version run: | echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT + echo "BUILD_DATE=$(date -u '+%Y-%m-%d %H:%M:%S UTC')" >> $GITHUB_OUTPUT echo "Version: ${GITHUB_REF#refs/tags/}" - name: Build binaries for multiple platforms @@ -32,19 +33,19 @@ jobs: mkdir -p dist # Linux AMD64 - GOOS=linux GOARCH=amd64 go build -o dist/relspec-linux-amd64 -ldflags "-X main.version=${{ steps.get_version.outputs.VERSION }}" ./cmd/relspec + GOOS=linux GOARCH=amd64 go build -o dist/relspec-linux-amd64 -ldflags "-X 'main.version=${{ steps.get_version.outputs.VERSION }}' -X 'main.buildDate=${{ steps.get_version.outputs.BUILD_DATE }}'" ./cmd/relspec # Linux ARM64 - GOOS=linux GOARCH=arm64 go build -o dist/relspec-linux-arm64 -ldflags "-X main.version=${{ steps.get_version.outputs.VERSION }}" ./cmd/relspec + GOOS=linux GOARCH=arm64 go build -o dist/relspec-linux-arm64 -ldflags "-X 'main.version=${{ steps.get_version.outputs.VERSION }}' -X 'main.buildDate=${{ steps.get_version.outputs.BUILD_DATE }}'" ./cmd/relspec # macOS AMD64 - GOOS=darwin GOARCH=amd64 go build -o dist/relspec-darwin-amd64 -ldflags "-X main.version=${{ steps.get_version.outputs.VERSION }}" ./cmd/relspec + GOOS=darwin GOARCH=amd64 go build -o dist/relspec-darwin-amd64 -ldflags "-X 'main.version=${{ steps.get_version.outputs.VERSION }}' -X 'main.buildDate=${{ steps.get_version.outputs.BUILD_DATE }}'" ./cmd/relspec # macOS ARM64 (Apple Silicon) - GOOS=darwin GOARCH=arm64 go build -o dist/relspec-darwin-arm64 -ldflags "-X main.version=${{ steps.get_version.outputs.VERSION }}" ./cmd/relspec + GOOS=darwin GOARCH=arm64 go build -o dist/relspec-darwin-arm64 -ldflags "-X 'main.version=${{ steps.get_version.outputs.VERSION }}' -X 'main.buildDate=${{ steps.get_version.outputs.BUILD_DATE }}'" ./cmd/relspec # Windows AMD64 - GOOS=windows GOARCH=amd64 go build -o dist/relspec-windows-amd64.exe -ldflags "-X main.version=${{ steps.get_version.outputs.VERSION }}" ./cmd/relspec + GOOS=windows GOARCH=amd64 go build -o dist/relspec-windows-amd64.exe -ldflags "-X 'main.version=${{ steps.get_version.outputs.VERSION }}' -X 'main.buildDate=${{ steps.get_version.outputs.BUILD_DATE }}'" ./cmd/relspec # Create checksums cd dist diff --git a/Makefile b/Makefile index b526f4e..29dd9e7 100644 --- a/Makefile +++ b/Makefile @@ -14,6 +14,11 @@ GOGET=$(GOCMD) get GOMOD=$(GOCMD) mod GOCLEAN=$(GOCMD) clean +# Version information +VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev") +BUILD_DATE := $(shell date -u +"%Y-%m-%d %H:%M:%S UTC") +LDFLAGS := -X 'main.version=$(VERSION)' -X 'main.buildDate=$(BUILD_DATE)' + # Auto-detect container runtime (Docker or Podman) CONTAINER_RUNTIME := $(shell \ if command -v podman > /dev/null 2>&1; then \ @@ -37,9 +42,9 @@ COMPOSE_CMD := $(shell \ all: lint test build ## Run linting, tests, and build build: deps ## Build the binary - @echo "Building $(BINARY_NAME)..." + @echo "Building $(BINARY_NAME) $(VERSION)..." @mkdir -p $(BUILD_DIR) - $(GOBUILD) -o $(BUILD_DIR)/$(BINARY_NAME) ./cmd/relspec + $(GOBUILD) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME) ./cmd/relspec @echo "Build complete: $(BUILD_DIR)/$(BINARY_NAME)" test: test-unit ## Run all unit tests (alias for test-unit) @@ -91,8 +96,8 @@ clean: ## Clean build artifacts @echo "Clean complete" install: ## Install the binary to $GOPATH/bin - @echo "Installing $(BINARY_NAME)..." - $(GOCMD) install ./cmd/relspec + @echo "Installing $(BINARY_NAME) $(VERSION)..." + $(GOCMD) install -ldflags "$(LDFLAGS)" ./cmd/relspec @echo "Install complete" deps: ## Download dependencies diff --git a/cmd/relspec/root.go b/cmd/relspec/root.go index af42efd..239d88a 100644 --- a/cmd/relspec/root.go +++ b/cmd/relspec/root.go @@ -1,9 +1,17 @@ package main import ( + "fmt" + "github.com/spf13/cobra" ) +var ( + // Version information, set via ldflags during build + version = "dev" + buildDate = "unknown" +) + var rootCmd = &cobra.Command{ Use: "relspec", Short: "RelSpec - Database schema conversion and analysis tool", @@ -13,6 +21,9 @@ bidirectional conversion between various database schema formats. It reads database schemas from multiple sources (live databases, DBML, DCTX, DrawDB, etc.) and writes them to various formats (GORM, Bun, JSON, YAML, SQL, etc.).`, + PersistentPreRun: func(cmd *cobra.Command, args []string) { + fmt.Printf("RelSpec %s (built: %s)\n\n", version, buildDate) + }, } func init() { @@ -24,4 +35,5 @@ func init() { rootCmd.AddCommand(editCmd) rootCmd.AddCommand(mergeCmd) rootCmd.AddCommand(splitCmd) + rootCmd.AddCommand(versionCmd) } diff --git a/cmd/relspec/version.go b/cmd/relspec/version.go new file mode 100644 index 0000000..0ef38f8 --- /dev/null +++ b/cmd/relspec/version.go @@ -0,0 +1,16 @@ +package main + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +var versionCmd = &cobra.Command{ + Use: "version", + Short: "Print version information", + Run: func(cmd *cobra.Command, args []string) { + fmt.Printf("RelSpec %s\n", version) + fmt.Printf("Built: %s\n", buildDate) + }, +}