From bad7b4a304df00e8bcf5fc4a8aeeef18605f4ea7 Mon Sep 17 00:00:00 2001 From: Aykhan Shahsuvarov Date: Sat, 24 May 2025 18:30:21 +0400 Subject: [PATCH] Add version variables --- Makefile | 60 --------------------------- Taskfile.yml | 55 ++++++++++++++++++++----- cmd/api/Dockerfile | 2 +- cmd/api/main.go | 43 ++++++++++++++++++++ cmd/api/version.go | 3 ++ cmd/consumer/Dockerfile | 2 +- cmd/consumer/main.go | 78 ++++++++++++++++++++++-------------- cmd/consumer/version.go | 3 ++ cmd/feedgen/az/Dockerfile | 2 +- cmd/feedgen/az/main.go | 76 +++++++++++++++++++++-------------- cmd/feedgen/az/version.go | 3 ++ pkg/api/middleware/es256k.go | 2 - 12 files changed, 196 insertions(+), 133 deletions(-) delete mode 100644 Makefile create mode 100644 cmd/api/version.go create mode 100644 cmd/consumer/version.go create mode 100644 cmd/feedgen/az/version.go diff --git a/Makefile b/Makefile deleted file mode 100644 index ef9ea99..0000000 --- a/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -# Equivalent Makefile for Taskfile.yaml - -.PHONY: ftl fmt tidy lint run-consumer run-feedgen-az run-api run-manager generate-env - -# Default value for ARGS if not provided on the command line -ARGS ?= - -# Runs fmt, tidy, and lint sequentially -ftl: - $(MAKE) fmt - $(MAKE) tidy - $(MAKE) lint - -# Format Go code -fmt: - gofmt -w -d . - -# Tidy Go modules -tidy: - go mod tidy - -# Run golangci-lint -lint: - golangci-lint run - -# Run the consumer application, loading environment from dotenv files -run-consumer: - set -a; \ - . config/app/.consumer.env; \ - . config/app/.mongodb.env; \ - set +a; \ - go run cmd/consumer/main.go $(ARGS) - -# Run the feedgen-az application, loading environment from dotenv files -run-feedgen-az: - set -a; \ - . config/app/feedgen/.az.env; \ - . config/app/.mongodb.env; \ - set +a; \ - go run cmd/feedgen/az/main.go $(ARGS) - -# Run the api application, loading environment from dotenv files -run-api: - set -a; \ - . config/app/.api.env; \ - . config/app/.mongodb.env; \ - set +a; \ - go run cmd/api/main.go - -# Run the manager application with arguments (no dotenv) -run-manager: - go run cmd/manager/main.go $(ARGS) - -# Generate env files from templates -generate-env: - cp config/app/consumer.env.example config/app/.consumer.env - cp config/app/api.env.example config/app/.api.env - cp config/app/mongodb.env.example config/app/.mongodb.env - cp config/app/feedgen/az.env.example config/app/feedgen/.az.env - cp config/mongodb/env.example config/mongodb/.env diff --git a/Taskfile.yml b/Taskfile.yml index d5f1930..4724264 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -2,6 +2,9 @@ version: "3" +vars: + DOCKER_REGISTRY: "git.aykhans.me/bsky/" + tasks: ftl: cmds: @@ -16,19 +19,19 @@ tasks: lint: golangci-lint run run-consumer: - cmd: go run cmd/consumer/main.go {{.CLI_ARGS}} + cmd: go run ./cmd/consumer {{.CLI_ARGS}} dotenv: - config/app/.consumer.env - config/app/.mongodb.env run-feedgen-az: - cmd: go run cmd/feedgen/az/main.go {{.CLI_ARGS}} + cmd: go run ./cmd/feedgen/az {{.CLI_ARGS}} dotenv: - config/app/feedgen/.az.env - config/app/.mongodb.env run-api: - cmd: go run cmd/api/main.go + cmd: go run ./cmd/api {{.CLI_ARGS}} dotenv: - config/app/.api.env - config/app/.mongodb.env @@ -55,21 +58,55 @@ tasks: docker-publish-api: desc: Publish docker image for api service + vars: + GO_VERSION_FILE: ./cmd/api/version.go + IMAGE_NAME: feedgen-api + VERSION: + sh: grep -o 'const version = "[^"]*"' {{.GO_VERSION_FILE}} | grep -o '"[^"]*"' | tr -d '"' + VERSIONED_IMAGE: "{{.DOCKER_REGISTRY}}{{.IMAGE_NAME}}:{{.VERSION}}" + LATEST_IMAGE: "{{.DOCKER_REGISTRY}}{{.IMAGE_NAME}}:latest" + preconditions: + - test -f {{.GO_VERSION_FILE}} + - sh: '[ -n "{{.VERSION}}" ]' + msg: "Could not extract version from {{.GO_FILE}}" cmds: - - docker build -t git.aykhans.me/bsky/feedgen-api:latest -f ./cmd/api/Dockerfile . - - docker push git.aykhans.me/bsky/feedgen-api:latest + - docker build -t {{.VERSIONED_IMAGE}} -f ./cmd/api/Dockerfile . + - docker tag {{.VERSIONED_IMAGE}} {{.LATEST_IMAGE}} + - docker push {{.VERSIONED_IMAGE}} + - docker push {{.LATEST_IMAGE}} + - echo "Published {{.VERSIONED_IMAGE}} and {{.LATEST_IMAGE}}" docker-publish-consumer: desc: Publish docker image for consumer service + vars: + GO_VERSION_FILE: ./cmd/consumer/version.go + IMAGE_NAME: feedgen-consumer + VERSION: + sh: grep -o 'const version = "[^"]*"' {{.GO_VERSION_FILE}} | grep -o '"[^"]*"' | tr -d '"' + VERSIONED_IMAGE: "{{.DOCKER_REGISTRY}}{{.IMAGE_NAME}}:{{.VERSION}}" + LATEST_IMAGE: "{{.DOCKER_REGISTRY}}{{.IMAGE_NAME}}:latest" cmds: - - docker build -t git.aykhans.me/bsky/feedgen-consumer:latest -f ./cmd/consumer/Dockerfile . - - docker push git.aykhans.me/bsky/feedgen-consumer:latest + - docker build -t {{.VERSIONED_IMAGE}} -f ./cmd/consumer/Dockerfile . + - docker push {{.VERSIONED_IMAGE}} + - docker tag {{.VERSIONED_IMAGE}} {{.LATEST_IMAGE}} + - docker push {{.LATEST_IMAGE}} + - echo "Published {{.VERSIONED_IMAGE}} and {{.LATEST_IMAGE}}" docker-publish-feedgen-az: desc: Publish docker image for feedgen-az service + vars: + GO_VERSION_FILE: ./cmd/feedgen/az/version.go + IMAGE_NAME: feedgen-generator-az + VERSION: + sh: grep -o 'const version = "[^"]*"' {{.GO_VERSION_FILE}} | grep -o '"[^"]*"' | tr -d '"' + VERSIONED_IMAGE: "{{.DOCKER_REGISTRY}}{{.IMAGE_NAME}}:{{.VERSION}}" + LATEST_IMAGE: "{{.DOCKER_REGISTRY}}{{.IMAGE_NAME}}:latest" cmds: - - docker build -t git.aykhans.me/bsky/feedgen-generator-az:latest -f ./cmd/feedgen/az/Dockerfile . - - docker push git.aykhans.me/bsky/feedgen-generator-az:latest + - docker build -t {{.VERSIONED_IMAGE}} -f ./cmd/feedgen/az/Dockerfile . + - docker push {{.VERSIONED_IMAGE}} + - docker tag {{.VERSIONED_IMAGE}} {{.LATEST_IMAGE}} + - docker push {{.LATEST_IMAGE}} + - echo "Published {{.VERSIONED_IMAGE}} and {{.LATEST_IMAGE}}" docker-publish-manager: desc: Publish docker image for manager service diff --git a/cmd/api/Dockerfile b/cmd/api/Dockerfile index 2975eef..1f483d5 100644 --- a/cmd/api/Dockerfile +++ b/cmd/api/Dockerfile @@ -6,7 +6,7 @@ COPY go.mod go.sum ./ COPY ../../pkg ./pkg COPY ../../cmd/api ./cmd/api -RUN CGO_ENABLED=0 go build -ldflags "-s -w" -o api ./cmd/api/main.go +RUN CGO_ENABLED=0 go build -ldflags "-s -w" -o api ./cmd/api FROM gcr.io/distroless/static-debian12:latest diff --git a/cmd/api/main.go b/cmd/api/main.go index cb7b70d..73f9b87 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -2,8 +2,11 @@ package main import ( "context" + "flag" + "fmt" "os" "os/signal" + "strings" "syscall" "github.com/aykhans/bsky-feedgen/pkg/api" @@ -15,11 +18,21 @@ import ( _ "go.uber.org/automaxprocs" ) +type flags struct { + version bool +} + func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() go listenForTermination(func() { cancel() }) + flags := getFlags() + if flags.version == true { + fmt.Printf("API version: %v\n", version) + os.Exit(0) + } + apiConfig, errMap := config.NewAPIConfig() if errMap != nil { logger.Log.Error("API ENV error", "error", errMap.ToStringMap()) @@ -59,3 +72,33 @@ func listenForTermination(do func()) { <-sigChan do() } + +func getFlags() *flags { + flags := &flags{} + + flag.Usage = func() { + fmt.Println( + `Usage: + +consumer [flags] + +Flags: + -version version information + -h, -help Display this help message`) + } + + flag.BoolVar(&flags.version, "version", false, "print version information") + flag.Parse() + + if args := flag.Args(); len(args) > 0 { + if len(args) == 1 { + fmt.Printf("unexpected argument: %s\n\n", args[0]) + } else { + fmt.Printf("unexpected arguments: %v\n\n", strings.Join(args, ", ")) + } + flag.CommandLine.Usage() + os.Exit(1) + } + + return flags +} diff --git a/cmd/api/version.go b/cmd/api/version.go new file mode 100644 index 0000000..310674e --- /dev/null +++ b/cmd/api/version.go @@ -0,0 +1,3 @@ +package main + +const version = "0.1.0" diff --git a/cmd/consumer/Dockerfile b/cmd/consumer/Dockerfile index c6fea3e..f3ae25e 100644 --- a/cmd/consumer/Dockerfile +++ b/cmd/consumer/Dockerfile @@ -6,7 +6,7 @@ COPY go.mod go.sum ./ COPY ../../pkg ./pkg COPY ../../cmd/consumer ./cmd/consumer -RUN CGO_ENABLED=0 go build -ldflags "-s -w" -o consumer ./cmd/consumer/main.go +RUN CGO_ENABLED=0 go build -ldflags "-s -w" -o consumer ./cmd/consumer FROM gcr.io/distroless/static-debian12:latest diff --git a/cmd/consumer/main.go b/cmd/consumer/main.go index e0bc453..7e9f6be 100644 --- a/cmd/consumer/main.go +++ b/cmd/consumer/main.go @@ -20,42 +20,24 @@ import ( _ "go.uber.org/automaxprocs" ) +type flags struct { + version bool + cursorOption types.ConsumerCursor +} + func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() go listenForTermination(func() { cancel() }) - flag.Usage = func() { - fmt.Println( - `Usage: - -consumer [flags] - -Flags: - -h, -help Display this help message - -cursor string Specify the starting point for data consumption (default: last-consumed) - Options: - last-consumed: Resume from the last processed data in storage - first-stream: Start from the beginning of the firehose - current-stream: Start from the current position in the firehose stream`) + flags := getFlags() + if flags.version == true { + fmt.Printf("Consumer version: %v\n", version) + os.Exit(0) } - var cursorOption types.ConsumerCursor - flag.Var(&cursorOption, "cursor", "") - flag.Parse() - - if args := flag.Args(); len(args) > 0 { - if len(args) == 1 { - fmt.Printf("unexpected argument: %s\n\n", args[0]) - } else { - fmt.Printf("unexpected arguments: %v\n\n", strings.Join(args, ", ")) - } - flag.CommandLine.Usage() - os.Exit(1) - } - - if cursorOption == "" { - _ = cursorOption.Set("") + if flags.cursorOption == "" { + _ = flags.cursorOption.Set("") } consumerConfig, errMap := config.NewConsumerConfig() @@ -89,7 +71,7 @@ Flags: ctx, postCollection, "wss://bsky.network", - cursorOption, + flags.cursorOption, consumerConfig.PostMaxDate, // Save only posts created before PostMaxDate 10*time.Second, // Save consumed data to MongoDB every 10 seconds ) @@ -121,3 +103,39 @@ func listenForTermination(do func()) { <-sigChan do() } + +func getFlags() *flags { + flags := &flags{} + + flag.Usage = func() { + fmt.Println( + `Usage: + +consumer [flags] + +Flags: + -version version information + -h, -help Display this help message + -cursor string Specify the starting point for data consumption (default: last-consumed) + Options: + last-consumed: Resume from the last processed data in storage + first-stream: Start from the beginning of the firehose + current-stream: Start from the current position in the firehose stream`) + } + + flag.BoolVar(&flags.version, "version", false, "print version information") + flag.Var(&flags.cursorOption, "cursor", "Specify the starting point for data consumption") + flag.Parse() + + if args := flag.Args(); len(args) > 0 { + if len(args) == 1 { + fmt.Printf("unexpected argument: %s\n\n", args[0]) + } else { + fmt.Printf("unexpected arguments: %v\n\n", strings.Join(args, ", ")) + } + flag.CommandLine.Usage() + os.Exit(1) + } + + return flags +} diff --git a/cmd/consumer/version.go b/cmd/consumer/version.go new file mode 100644 index 0000000..310674e --- /dev/null +++ b/cmd/consumer/version.go @@ -0,0 +1,3 @@ +package main + +const version = "0.1.0" diff --git a/cmd/feedgen/az/Dockerfile b/cmd/feedgen/az/Dockerfile index de06684..1883786 100644 --- a/cmd/feedgen/az/Dockerfile +++ b/cmd/feedgen/az/Dockerfile @@ -6,7 +6,7 @@ COPY go.mod go.sum ./ COPY ../../pkg ./pkg COPY ../../cmd/feedgen/az ./cmd/feedgen/az -RUN CGO_ENABLED=0 go build -ldflags "-s -w" -o feedgen ./cmd/feedgen/az/main.go +RUN CGO_ENABLED=0 go build -ldflags "-s -w" -o feedgen ./cmd/feedgen/az FROM gcr.io/distroless/static-debian12:latest diff --git a/cmd/feedgen/az/main.go b/cmd/feedgen/az/main.go index 650da63..c2bb34b 100644 --- a/cmd/feedgen/az/main.go +++ b/cmd/feedgen/az/main.go @@ -20,41 +20,24 @@ import ( _ "go.uber.org/automaxprocs" ) +type flags struct { + version bool + cursorOption types.GeneratorCursor +} + func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() go listenForTermination(func() { cancel() }) - flag.Usage = func() { - fmt.Println( - `Usage: - -feedgen-az [flags] - -Flags: - -h, -help Display this help message - -cursor string Specify the starting point for feed data generation (default: last-generated) - Options: - last-generated: Resume from the last generated data in storage - first-post: Start from the beginning of the posts`) + flags := getFlags() + if flags.version == true { + fmt.Printf("Feedgen Az version: %v\n", version) + os.Exit(0) } - var cursorOption types.GeneratorCursor - flag.Var(&cursorOption, "cursor", "") - flag.Parse() - - if args := flag.Args(); len(args) > 0 { - if len(args) == 1 { - fmt.Printf("unexpected argument: %s\n\n", args[0]) - } else { - fmt.Printf("unexpected arguments: %v\n\n", strings.Join(args, ", ")) - } - flag.CommandLine.Usage() - os.Exit(1) - } - - if cursorOption == "" { - _ = cursorOption.Set("") + if flags.cursorOption == "" { + _ = flags.cursorOption.Set("") } feedGenAzConfig, errMap := config.NewFeedGenAzConfig() @@ -89,7 +72,7 @@ Flags: feedGeneratorAz := feedgenAz.NewGenerator(postCollection, feedAzCollection) - startCrons(ctx, feedGenAzConfig, feedGeneratorAz, feedAzCollection, cursorOption) + startCrons(ctx, feedGenAzConfig, feedGeneratorAz, feedAzCollection, flags.cursorOption) logger.Log.Info("Cron jobs started") <-ctx.Done() @@ -139,3 +122,38 @@ func listenForTermination(do func()) { <-sigChan do() } + +func getFlags() *flags { + flags := &flags{} + + flag.Usage = func() { + fmt.Println( + `Usage: + +feedgen-az [flags] + +Flags: + -version version information + -h, -help Display this help message + -cursor string Specify the starting point for feed data generation (default: last-generated) + Options: + last-generated: Resume from the last generated data in storage + first-post: Start from the beginning of the posts`) + } + + flag.BoolVar(&flags.version, "version", false, "print version information") + flag.Var(&flags.cursorOption, "cursor", "Specify the starting point for feed data generation") + flag.Parse() + + if args := flag.Args(); len(args) > 0 { + if len(args) == 1 { + fmt.Printf("unexpected argument: %s\n\n", args[0]) + } else { + fmt.Printf("unexpected arguments: %v\n\n", strings.Join(args, ", ")) + } + flag.CommandLine.Usage() + os.Exit(1) + } + + return flags +} diff --git a/cmd/feedgen/az/version.go b/cmd/feedgen/az/version.go new file mode 100644 index 0000000..310674e --- /dev/null +++ b/cmd/feedgen/az/version.go @@ -0,0 +1,3 @@ +package main + +const version = "0.1.0" diff --git a/pkg/api/middleware/es256k.go b/pkg/api/middleware/es256k.go index 994dc06..e096e9b 100644 --- a/pkg/api/middleware/es256k.go +++ b/pkg/api/middleware/es256k.go @@ -5,7 +5,6 @@ package middleware import ( "crypto" "errors" - "fmt" atcrypto "github.com/bluesky-social/indigo/atproto/crypto" "github.com/golang-jwt/jwt/v5" @@ -44,7 +43,6 @@ func init() { jwt.RegisterSigningMethod(SigningMethodES256.Alg(), func() jwt.SigningMethod { return SigningMethodES256 }) - fmt.Println("init Completed") } // Errors returned on different problems.