From 3857968441f9239d20f9705f3289269e24c73029 Mon Sep 17 00:00:00 2001 From: Yavolte Date: Tue, 10 Jun 2025 16:38:49 +0800 Subject: [PATCH] add generate tool --- go.mod | 3 + go.sum | 8 +++ tools/gen/internal/generator/generator.go | 41 +++++++------ tools/gen/internal/generator/template.go | 47 ++++++++++++++- tools/gen/internal/types/types.go | 1 + tools/gen/main.go | 70 ++++++++++++++++++----- 6 files changed, 137 insertions(+), 33 deletions(-) diff --git a/go.mod b/go.mod index 58cb5ab..3d49e1a 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/google/uuid v1.6.0 github.com/mattn/go-runewidth v0.0.16 github.com/peterh/liner v1.2.2 + github.com/spf13/cobra v1.9.1 go.etcd.io/etcd/api/v3 v3.6.0 go.etcd.io/etcd/client/v3 v3.6.0 golang.org/x/sync v0.12.0 @@ -36,6 +37,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -46,6 +48,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/rivo/uniseg v0.2.0 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect go.etcd.io/etcd/client/pkg/v3 v3.6.0 // indirect diff --git a/go.sum b/go.sum index 471df25..742bcd2 100644 --- a/go.sum +++ b/go.sum @@ -10,6 +10,7 @@ github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -49,6 +50,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= @@ -87,6 +90,11 @@ github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= diff --git a/tools/gen/internal/generator/generator.go b/tools/gen/internal/generator/generator.go index 64b44ae..8a3b7f1 100644 --- a/tools/gen/internal/generator/generator.go +++ b/tools/gen/internal/generator/generator.go @@ -15,15 +15,17 @@ import ( var ( fileMap = map[string]string{ - "cmd/main.go": MainTemp, - "internal/scope/scope.go": ScopeTemp, - "internal/service/service.go": ServiceLoaderTemp, - "api/v1/pb/greeter.proto": GreeterTemp, - "version/version.go": VersionTemp, - "Makefile": MakefileTemp, - ".gitignore": GitIgnoreTemp, - "README.md": ReadmeTemp, - "go.mod": GoModTemp, + "cmd/main.go": MainTemp, + "internal/scope/scope.go": ScopeTemp, + "internal/service/service.go": ServiceLoaderTemp, + "api/v1/pb/greeter.proto": GreeterTemp, + "version/version.go": VersionTemp, + "Makefile": MakefileTemp, + ".gitignore": GitIgnoreTemp, + "README.md": ReadmeTemp, + "go.mod": GoModTemp, + "webhook.yaml": WebhookTemp, + "deploy/docker/deployment.yaml": DeploymentTemp, } ) @@ -34,10 +36,11 @@ var ( type ( TemplateData struct { - ShortName string - PackageName string - Datetime string - Version string + ShortName string + PackageName string + Datetime string + Version string + ImageRegistry string } ) @@ -78,10 +81,14 @@ func scanDir(s embed.FS, dirname string, callback func(file string) error) (err func Geerate(app *types.Applicetion) (err error) { shortName := app.ShortName() data := TemplateData{ - ShortName: shortName, - PackageName: app.Package, - Version: "v0.0.1", - Datetime: time.Now().Format(time.DateTime), + ShortName: shortName, + PackageName: app.Package, + Version: app.Version, + ImageRegistry: "{{IMAGE_REGISTRY_URL}}", + Datetime: time.Now().Format(time.DateTime), + } + if data.Version == "" { + data.Version = "v0.0.1" } var t *template.Template writer := bytes.NewBuffer(nil) diff --git a/tools/gen/internal/generator/template.go b/tools/gen/internal/generator/template.go index cb34128..5c6378f 100644 --- a/tools/gen/internal/generator/template.go +++ b/tools/gen/internal/generator/template.go @@ -32,8 +32,8 @@ func main() { os.Exit(0) } app := aeus.New( - aeus.WithName("{{.ShortName}}"), - aeus.WithVersion("{{.Version}}"), + aeus.WithName(version.ProductName), + aeus.WithVersion(version.Version), aeus.WithServer( http.New(), grpc.New(), @@ -137,11 +137,19 @@ proto-clean: rm -rf $(PROTO_OUT_DIR)/*.pb.go rm -rf $(PROTO_OUT_DIR)/*.pb.validate.go +.PHONY: docker +docker: + docker build . -t $(IMAGE_REGISTRY_URL) + +.PHONY: deploy +deploy: + dkctl apply -f deployment.yaml + .PHONY: build build: go mod tidy go mod vendor - go build -ldflags "-s -w -X '{{.PackageName}}/version.Version=$(VERSION)' -X '{{.PackageName}}/version.BuildDate=$(DATETIME)'" -o bin/{{.ShortName}} cmd/main.go + CGO_ENABLED=0 go build -a -installsuffix cgo -ldflags "-s -w -X '{{.PackageName}}/version.Version=$(VERSION)' -X '{{.PackageName}}/version.BuildDate=$(DATETIME)'" -o bin/{{.ShortName}} cmd/main.go ` GreeterTemp = ` @@ -226,5 +234,38 @@ _test module {{.PackageName}} go 1.23.0 +` + WebhookTemp = ` +name: {{.ShortName}} +steps: + - name: build + run: "make build" + - name: docker + run: "make docker" + - name: deploy + run: "make deploy" +replacements: + - src: deploy/docker/deployment.yaml + dst: deployment.yaml +` + DeploymentTemp = ` +name: {{.ShortName}} +image: {{.ImageRegistry}} +command: ["{{.ShortName}}"] + +network: + name: employ + ip: 10.5.10.2 + +env: + - name: TZ + value: "Asia/Shanghai" + - name: APP_NAME + value: "{{.ShortName}}" + +volume: + - name: config + path: /etc/{{.ShortName}}/ + hostPath: /apps/{{.ShortName}}/conf/ ` ) diff --git a/tools/gen/internal/types/types.go b/tools/gen/internal/types/types.go index cfb0352..ee6636e 100644 --- a/tools/gen/internal/types/types.go +++ b/tools/gen/internal/types/types.go @@ -4,6 +4,7 @@ import "strings" type Applicetion struct { Package string + Version string } func (app *Applicetion) ShortName() string { diff --git a/tools/gen/main.go b/tools/gen/main.go index c4202e6..c780fe2 100644 --- a/tools/gen/main.go +++ b/tools/gen/main.go @@ -1,25 +1,69 @@ package main import ( - "flag" + "context" "fmt" "os" + "os/signal" + "syscall" "git.nobla.cn/golang/aeus/tools/gen/internal/generator" "git.nobla.cn/golang/aeus/tools/gen/internal/types" + "github.com/spf13/cobra" ) -var ( - packageFlag = flag.String("package", "", "package name") -) - -func main() { - flag.Parse() - app := &types.Applicetion{ - Package: *packageFlag, - } - if err := generator.Geerate(app); err != nil { - fmt.Println(err) - os.Exit(1) +func waitingSignal(ctx context.Context, cancelFunc context.CancelFunc) { + ch := make(chan os.Signal, 1) + signals := []os.Signal{syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGKILL} + signal.Notify(ch, signals...) + select { + case <-ctx.Done(): + case <-ch: + cancelFunc() + close(ch) } } + +func createCommand() *cobra.Command { + var ( + version string + ) + cmd := &cobra.Command{ + Use: "new", + Short: "Create microservice application", + Long: "Create microservice application", + RunE: func(cmd *cobra.Command, args []string) (err error) { + if len(args) == 0 { + return fmt.Errorf("Please specify the package name") + } + if version, err = cmd.Flags().GetString("version"); err != nil { + return + } + return generator.Geerate(&types.Applicetion{ + Package: args[0], + Version: version, + }) + }, + } + cmd.Flags().StringP("version", "v", "v0.0.1", "Application version") + return cmd +} + +func main() { + var ( + err error + ) + ctx, cancelFunc := context.WithCancel(context.Background()) + cmd := &cobra.Command{ + Use: "aeus", + Short: "aeus is a tool for manager microservices", + Long: "aeus is a tool for manager microservice application", + SilenceErrors: true, + } + go waitingSignal(ctx, cancelFunc) + cmd.AddCommand(createCommand()) + if err = cmd.ExecuteContext(ctx); err != nil { + fmt.Println(err.Error()) + } + cancelFunc() +}