diff --git a/.github/workflows/images.yml b/.github/workflows/images.yml index 81ac5eaffa..7d152aa8c3 100644 --- a/.github/workflows/images.yml +++ b/.github/workflows/images.yml @@ -73,7 +73,7 @@ jobs: - name: Push Docker Image for Operator working-directory: ./operator - run: CUSTOM_IMAGE_TAG=${{ steps.docker-tag.outputs.value }} make docker-build-and-push-prod + run: CUSTOM_IMAGE_TAG=${{ steps.docker-tag.outputs.value }} make RELEASE_TAG="${{ github.event.inputs.docker-tag }}" docker-build-and-push-prod - name: Push Docker Image for Seldon Cli working-directory: ./operator @@ -81,11 +81,11 @@ jobs: - name: Push Docker Images for Scheduler working-directory: ./scheduler - run: CUSTOM_IMAGE_TAG=${{ steps.docker-tag.outputs.value }} make docker-build-and-push-prod-all + run: CUSTOM_IMAGE_TAG=${{ steps.docker-tag.outputs.value }} make RELEASE_TAG="${{ github.event.inputs.docker-tag }}" docker-build-and-push-prod-all - name: Push Docker Images for Hodometer working-directory: ./hodometer - run: BUILD_VERSION=${{ steps.docker-tag.outputs.value }} IMAGE_TAG=${{ steps.docker-tag.outputs.value }} make build-and-push-prod-hodometer-docker + run: BUILD_VERSION=${{ steps.docker-tag.outputs.value }} IMAGE_TAG=${{ steps.docker-tag.outputs.value }} make build-and-push-prod-hodometer-docker - name: Push Docker Image for k6 Load Testing working-directory: ./tests/k6 diff --git a/operator/Dockerfile b/operator/Dockerfile index 8b03b62c84..55ed668f17 100644 --- a/operator/Dockerfile +++ b/operator/Dockerfile @@ -1,12 +1,14 @@ # Build the manager binary FROM golang:1.24 as builder +ARG RELEASE_TAG + WORKDIR /workspace COPY . . # Build the binary RUN apt-get install make -RUN make -C operator build +RUN make -C operator RELEASE_TAG="$RELEASE_TAG" build FROM registry.access.redhat.com/ubi9/ubi-micro:9.6 WORKDIR / diff --git a/operator/Makefile b/operator/Makefile index 6439da828b..5f097a0539 100644 --- a/operator/Makefile +++ b/operator/Makefile @@ -14,6 +14,7 @@ KUSTOMIZE_VERSION = v5.2.1 SETUP_ENVTEST_VERSION = release-0.21 KIND_NAME=seldon NAMESPACE ?= seldon-mesh +RELEASE_TAG=$(shell git describe --tags --always --dirty) # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) ifeq (,$(shell go env GOBIN)) @@ -94,7 +95,7 @@ test: manifests generate fmt vet envtest ## Run tests. .PHONY: build build: generate fmt vet ## Build manager binary. - go build -trimpath -ldflags="-w" -o bin/manager main.go + go build -trimpath -ldflags "-w -X github.com/seldonio/seldon-core/operator/v2/version.Tag=$(RELEASE_TAG)" -o bin/manager main.go .PHONY: run run: manifests generate fmt vet ## Run a controller from your host. @@ -114,7 +115,7 @@ generate-cli-docs: .PHONY: docker-build docker-build: ## Build docker image with the manager. - docker build -t ${IMG} -f Dockerfile .. + docker build --build-arg RELEASE_TAG="$(RELEASE_TAG)" -t ${IMG} -f Dockerfile .. .PHONY: docker-build-cli docker-build-cli: ## Build docker image with seldon cli. @@ -122,7 +123,7 @@ docker-build-cli: ## Build docker image with seldon cli. .PHONY: docker-build-and-push-prod docker-build-and-push-prod: ## Build operator docker image and push, including sbom. - docker buildx build --provenance=true -t ${IMG} --attest type=sbom,generator=docker/scout-sbom-indexer:latest --push -f Dockerfile .. + docker buildx build --build-arg RELEASE_TAG="$(RELEASE_TAG)" --provenance=true -t ${IMG} --attest type=sbom,generator=docker/scout-sbom-indexer:latest --push -f Dockerfile .. .PHONY: docker-build-and-push-prod-cli docker-build-and-push-prod-cli: ## Build seldon cli docker image and push, including sbom. diff --git a/operator/main.go b/operator/main.go index 2586ef781e..52bf944985 100644 --- a/operator/main.go +++ b/operator/main.go @@ -11,6 +11,7 @@ package main import ( "flag" + "fmt" "os" "strings" "time" @@ -34,6 +35,7 @@ import ( "github.com/seldonio/seldon-core/operator/v2/apis/mlops/v1alpha1" mlopscontrollers "github.com/seldonio/seldon-core/operator/v2/controllers/mlops" "github.com/seldonio/seldon-core/operator/v2/scheduler" + "github.com/seldonio/seldon-core/operator/v2/version" ) var ( @@ -94,6 +96,7 @@ func getWatchNamespaceConfig(namespace, watchNamespaces string, clusterwide bool func main() { var ( + displayVersion bool metricsAddr string enableLeaderElection bool probeAddr string @@ -104,6 +107,7 @@ func main() { useDeploymentsForServers bool ) + flag.BoolVar(&displayVersion, "version", false, "display version and exit") flag.StringVar(&metricsAddr, "metrics-bind-address", ":4000", "The address the metric endpoint binds to.") flag.StringVar(&probeAddr, "health-probe-bind-address", ":4001", "The address the probe endpoint binds to.") flag.StringVar(&namespace, "namespace", "", "The namespace to restrict the operator.") @@ -125,11 +129,15 @@ func main() { opts.BindFlags(flag.CommandLine) flag.Parse() + setupLog.Info("Setting log level", "level", logLevel) opts.Level = getLogLevel(logLevel) - logger := zap.New(zap.UseFlagOptions(&opts)) + logger := zap.New(zap.UseFlagOptions(&opts)).WithValues("version", version.Tag) ctrl.SetLogger(logger) - setupLog.Info("Setting log level", "level", logLevel) + if displayVersion { + logger.Info(fmt.Sprintf("Version %s", version.Tag)) + os.Exit(0) + } watchNamespaceConfig := getWatchNamespaceConfig(namespace, watchNamespaces, clusterwide) mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ @@ -232,6 +240,8 @@ func main() { os.Exit(1) } + setupLog.Info("Started controller manager") + if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { setupLog.Error(err, "problem running manager") os.Exit(1) diff --git a/operator/version/version.go b/operator/version/version.go new file mode 100644 index 0000000000..cd3c42ce7e --- /dev/null +++ b/operator/version/version.go @@ -0,0 +1,13 @@ +/* +Copyright (c) 2024 Seldon Technologies Ltd. + +Use of this software is governed BY +(1) the license included in the LICENSE file or +(2) if the license included in the LICENSE file is the Business Source License 1.1, +the Change License after the Change Date as each is defined in accordance with the LICENSE file. +*/ + +package version + +// Tag set via GitHub release worfkflow +var Tag = "" diff --git a/scheduler/Dockerfile.agent b/scheduler/Dockerfile.agent index 6c3d4c138d..bd0054e0ed 100644 --- a/scheduler/Dockerfile.agent +++ b/scheduler/Dockerfile.agent @@ -1,11 +1,13 @@ FROM golang:1.24-alpine as builder +ARG RELEASE_TAG + WORKDIR /build COPY . . # Build the binary RUN apk add --no-cache make -RUN make -C scheduler -o test-go build-agent +RUN make -C scheduler RELEASE_TAG="$RELEASE_TAG" build-agent # Copy binary FROM registry.access.redhat.com/ubi9/ubi-micro:9.6 diff --git a/scheduler/Dockerfile.dataflow b/scheduler/Dockerfile.dataflow index 6be709ff04..c16911accc 100644 --- a/scheduler/Dockerfile.dataflow +++ b/scheduler/Dockerfile.dataflow @@ -1,5 +1,7 @@ FROM azul/zulu-openjdk-alpine:17-latest AS builder +ARG RELEASE_TAG + COPY --from=gradle:8.5.0-jdk17-alpine /opt/gradle /opt/gradle RUN ln -s /opt/gradle/bin/gradle /usr/bin/gradle @@ -9,7 +11,7 @@ COPY scheduler/data-flow src/data-flow # TODO - build with Gradle image, with Zulu added in WORKDIR src/data-flow -RUN gradle build --no-daemon --info +RUN gradle build --no-daemon -Prelease_tag="$RELEASE_TAG" --info ################################################################################ diff --git a/scheduler/Dockerfile.modelgateway b/scheduler/Dockerfile.modelgateway index aa6d241da2..afa991f909 100644 --- a/scheduler/Dockerfile.modelgateway +++ b/scheduler/Dockerfile.modelgateway @@ -1,11 +1,13 @@ FROM golang:1.24-bullseye as builder +ARG RELEASE_TAG + WORKDIR /build COPY . . # Build the binary RUN apt-get install make -RUN make -C scheduler -o test-go build-modelgateway +RUN make -C scheduler RELEASE_TAG="$RELEASE_TAG" build-modelgateway # We add public trust bundle so Kafka can work with e.g. Let's Encrypt certificates FROM registry.access.redhat.com/ubi9/ubi-minimal as certs diff --git a/scheduler/Dockerfile.pipelinegateway b/scheduler/Dockerfile.pipelinegateway index 3af16d1df0..b11fd69026 100644 --- a/scheduler/Dockerfile.pipelinegateway +++ b/scheduler/Dockerfile.pipelinegateway @@ -1,11 +1,13 @@ FROM golang:1.24-bullseye as builder +ARG RELEASE_TAG + WORKDIR /build COPY . . # Build the binary RUN apt-get install make -RUN make -C scheduler -o test-go build-pipelinegateway +RUN make -C scheduler RELEASE_TAG="$RELEASE_TAG" build-pipelinegateway # We add public trust bundle so Kafka can work with e.g. Let's Encrypt certificates FROM registry.access.redhat.com/ubi9/ubi-minimal as certs diff --git a/scheduler/Dockerfile.scheduler b/scheduler/Dockerfile.scheduler index db6c696fdc..6f8083b900 100644 --- a/scheduler/Dockerfile.scheduler +++ b/scheduler/Dockerfile.scheduler @@ -1,11 +1,13 @@ FROM golang:1.24-bullseye as builder +ARG RELEASE_TAG + WORKDIR /build COPY . . # Build the binary RUN apt-get install make -RUN make -C scheduler -o test-go build-scheduler +RUN make -C scheduler RELEASE_TAG="$RELEASE_TAG" build-scheduler # Kafka dependencies necessitate leaving CGo enabled and using a base image with C dependencies FROM registry.access.redhat.com/ubi9/ubi-micro:9.6 diff --git a/scheduler/Makefile b/scheduler/Makefile index 19423e034b..65a378d671 100644 --- a/scheduler/Makefile +++ b/scheduler/Makefile @@ -24,6 +24,8 @@ GID ?= $(shell id -g) KIND_NAME=seldon +RELEASE_TAG=$(shell git describe --tags --always --dirty) + GO_LDFLAGS := -w $(patsubst %,-X %, $(GO_BUILD_VARS)) ##################################### @@ -31,24 +33,24 @@ GO_LDFLAGS := -w $(patsubst %,-X %, $(GO_BUILD_VARS)) ##################################### .PHONY: build-scheduler -build-scheduler: test-go - go build -trimpath -ldflags="-w" -buildvcs=false -o bin/scheduler ./cmd/scheduler +build-scheduler: + go build -trimpath -ldflags "-w -X github.com/seldonio/seldon-core/scheduler/v2/version.Tag=$(RELEASE_TAG)" -buildvcs=false -o bin/scheduler ./cmd/scheduler .PHONY: build-proxy build-proxy: test-go CGO_ENABLED=0 go build -trimpath -ldflags="-w" -o bin/proxy ./cmd/proxy .PHONY: build-agent -build-agent: test-go - CGO_ENABLED=0 go build -trimpath -ldflags="-w" -buildvcs=false -o bin/agent ./cmd/agent +build-agent: + CGO_ENABLED=0 go build -trimpath -ldflags "-w -X github.com/seldonio/seldon-core/scheduler/v2/version.Tag=$(RELEASE_TAG)" -buildvcs=false -o bin/agent ./cmd/agent .PHONY: build-modelgateway -build-modelgateway: test-go - go build -trimpath -ldflags="-w" -o bin/modelgateway -v ./cmd/modelgateway +build-modelgateway: + go build -trimpath -ldflags "-w -X github.com/seldonio/seldon-core/scheduler/v2/version.Tag=$(RELEASE_TAG)" -o bin/modelgateway -v ./cmd/modelgateway .PHONY: build-pipelinegateway -build-pipelinegateway: test-go - go build -trimpath -ldflags="-w" -o bin/pipelinegateway -v ./cmd/pipelinegateway +build-pipelinegateway: + go build -trimpath -ldflags "-w -X github.com/seldonio/seldon-core/scheduler/v2/version.Tag=$(RELEASE_TAG)" -o bin/pipelinegateway -v ./cmd/pipelinegateway .PHONY: build-dataflow-producer build-dataflow-producer: test-jvm @@ -60,7 +62,7 @@ build-dataflow-consumer: .PHONY: build-dataflow-engine build-dataflow-engine: - cd data-flow; ./gradlew clean build -x test --no-daemon + cd data-flow; ./gradlew clean build -Prelease_tag=$(RELEASE_TAG) -x test --no-daemon .PHONY: build-go build-go: build-scheduler build-agent build-proxy build-modelgateway build-pipelinegateway @@ -128,7 +130,7 @@ mockgen-scheduler-client: mock-install .PHONY: docker-build-scheduler docker-build-scheduler: copy-components - docker build -t ${SCHEDULER_IMG} -f Dockerfile.scheduler .. + docker build --build-arg RELEASE_TAG="$(RELEASE_TAG)" -t ${SCHEDULER_IMG} -f Dockerfile.scheduler .. .PHONY: docker-push-scheduler docker-push-scheduler: @@ -136,7 +138,7 @@ docker-push-scheduler: .PHONY: docker-build-and-push-prod-scheduler docker-build-and-push-prod-scheduler: copy-components - docker buildx build --provenance=true -t ${SCHEDULER_IMG} --attest type=sbom,generator=docker/scout-sbom-indexer:latest --push -f Dockerfile.scheduler .. + docker buildx build --build-arg RELEASE_TAG="$(RELEASE_TAG)" --provenance=true -t ${SCHEDULER_IMG} --attest type=sbom,generator=docker/scout-sbom-indexer:latest --push -f Dockerfile.scheduler .. .PHONY: copy-components copy-components: @@ -145,7 +147,7 @@ copy-components: .PHONY: docker-build-agent docker-build-agent: - docker build -t ${AGENT_IMG} -f Dockerfile.agent .. + docker build --build-arg RELEASE_TAG="$(RELEASE_TAG)" -t ${AGENT_IMG} -f Dockerfile.agent .. .PHONY: docker-push-agent docker-push-agent: @@ -153,7 +155,7 @@ docker-push-agent: .PHONY: docker-build-and-push-prod-agent docker-build-and-push-prod-agent: - docker buildx build --provenance=true -t ${AGENT_IMG} --attest type=sbom,generator=docker/scout-sbom-indexer:latest --push -f Dockerfile.agent .. + docker buildx build --build-arg RELEASE_TAG="$(RELEASE_TAG)" --provenance=true -t ${AGENT_IMG} --attest type=sbom,generator=docker/scout-sbom-indexer:latest --push -f Dockerfile.agent .. .PHONY: docker-build-rclone docker-build-rclone: @@ -169,7 +171,7 @@ docker-build-and-push-prod-rclone: .PHONY: docker-build-modelgateway docker-build-modelgateway: copy-components - docker build -t ${MODELGATEWAY_IMG} -f Dockerfile.modelgateway .. + docker build --build-arg RELEASE_TAG="$(RELEASE_TAG)" -t ${MODELGATEWAY_IMG} -f Dockerfile.modelgateway .. .PHONY: docker-push-modelgateway docker-push-modelgateway: @@ -177,11 +179,11 @@ docker-push-modelgateway: .PHONY: docker-build-and-push-prod-modelgateway docker-build-and-push-prod-modelgateway: copy-components - docker buildx build --provenance=true -t ${MODELGATEWAY_IMG} --attest type=sbom,generator=docker/scout-sbom-indexer:latest --push -f Dockerfile.modelgateway .. + docker buildx build --build-arg RELEASE_TAG="$(RELEASE_TAG)" --provenance=true -t ${MODELGATEWAY_IMG} --attest type=sbom,generator=docker/scout-sbom-indexer:latest --push -f Dockerfile.modelgateway .. .PHONY: docker-build-pipelinegateway docker-build-pipelinegateway: - docker build -t ${PIPELINEGATEWAY_IMG} -f Dockerfile.pipelinegateway .. + docker build --build-arg RELEASE_TAG="$(RELEASE_TAG)" -t ${PIPELINEGATEWAY_IMG} -f Dockerfile.pipelinegateway .. .PHONY: docker-push-pipelinegateway docker-push-pipelinegateway: @@ -189,7 +191,7 @@ docker-push-pipelinegateway: .PHONY: docker-build-and-push-prod-pipelinegateway docker-build-and-push-prod-pipelinegateway: - docker buildx build --provenance=true -t ${PIPELINEGATEWAY_IMG} --attest type=sbom,generator=docker/scout-sbom-indexer:latest --push -f Dockerfile.pipelinegateway .. + docker buildx build --build-arg RELEASE_TAG="$(RELEASE_TAG)" --provenance=true -t ${PIPELINEGATEWAY_IMG} --attest type=sbom,generator=docker/scout-sbom-indexer:latest --push -f Dockerfile.pipelinegateway .. .PHONY: docker-build-envoy docker-build-envoy: @@ -205,7 +207,7 @@ docker-build-and-push-prod-envoy: .PHONY: docker-build-dataflow docker-build-dataflow: data-flow/opentelemetry-javaagent.jar - docker build -t ${DATAFLOW_IMG} -f Dockerfile.dataflow .. + docker build --build-arg RELEASE_TAG="$(RELEASE_TAG)" -t ${DATAFLOW_IMG} -f Dockerfile.dataflow .. .PHONY: docker-push-dataflow docker-push-dataflow: @@ -213,7 +215,7 @@ docker-push-dataflow: .PHONY: docker-build-and-push-prod-dataflow docker-build-and-push-prod-dataflow: data-flow/opentelemetry-javaagent.jar - docker buildx build --provenance=true -t ${DATAFLOW_IMG} --attest type=sbom,generator=docker/scout-sbom-indexer:latest --push -f Dockerfile.dataflow .. + docker buildx build --build-arg RELEASE_TAG="$(RELEASE_TAG)" --provenance=true -t ${DATAFLOW_IMG} --attest type=sbom,generator=docker/scout-sbom-indexer:latest --push -f Dockerfile.dataflow .. .PHONY: docker-build-grafana docker-build-grafana: diff --git a/scheduler/cmd/agent/cli/cli.go b/scheduler/cmd/agent/cli/cli.go index 9e7b43152a..09a497e757 100644 --- a/scheduler/cmd/agent/cli/cli.go +++ b/scheduler/cmd/agent/cli/cli.go @@ -55,6 +55,7 @@ const ( envUnloadGraceSeconds = "SELDON_UNLOAD_GRACE_PERIOD_SECONDS" envuseDeploymentsForServers = "SELDON_USE_DEPLOYMENTS_FOR_SERVERS" + flagVersion = "version" flagSchedulerHost = "scheduler-host" flagSchedulerPlaintxtPort = "scheduler-port" flagSchedulerTlsPort = "scheduler-tls-port" @@ -117,6 +118,7 @@ const ( ) var ( + DisplayVersion bool agentHost string ServerName string ReplicaIdx uint diff --git a/scheduler/cmd/agent/cli/flags.go b/scheduler/cmd/agent/cli/flags.go index aeece41690..dd508ee9bf 100644 --- a/scheduler/cmd/agent/cli/flags.go +++ b/scheduler/cmd/agent/cli/flags.go @@ -20,6 +20,7 @@ import ( ) func makeArgs() { + flag.BoolVar(&DisplayVersion, flagVersion, false, "display version and exit") flag.StringVar(&agentHost, "agent-host", "0.0.0.0", "Agent hostname") flag.StringVar(&ServerName, flagServerName, "mlserver", "Server name") flag.UintVar(&ReplicaIdx, "server-idx", 0, "Server index") diff --git a/scheduler/cmd/agent/main.go b/scheduler/cmd/agent/main.go index 8fa58799de..de46c393ea 100644 --- a/scheduler/cmd/agent/main.go +++ b/scheduler/cmd/agent/main.go @@ -40,6 +40,7 @@ import ( "github.com/seldonio/seldon-core/scheduler/v2/pkg/agent/repository/triton" "github.com/seldonio/seldon-core/scheduler/v2/pkg/metrics" "github.com/seldonio/seldon-core/scheduler/v2/pkg/tracing" + "github.com/seldonio/seldon-core/scheduler/v2/version" ) const ( @@ -124,13 +125,19 @@ func main() { autoScalingEnabled := false logger := log.New() + if cli.DisplayVersion { + logger.Infof("Version %s", version.Tag) + os.Exit(0) + } + logger.Infof("Version %s", version.Tag) cli.UpdateArgs() logIntLevel, err := log.ParseLevel(cli.LogLevel) if err != nil { logger.WithError(err).Fatalf("Failed to set log level %s", cli.LogLevel) } + logger.Infof("Version %s", version.Tag) logger.Infof("Setting log level to %s", cli.LogLevel) logger.SetLevel(logIntLevel) diff --git a/scheduler/cmd/modelgateway/main.go b/scheduler/cmd/modelgateway/main.go index c27fca9c7a..cb4af25b0f 100644 --- a/scheduler/cmd/modelgateway/main.go +++ b/scheduler/cmd/modelgateway/main.go @@ -31,6 +31,7 @@ import ( "github.com/seldonio/seldon-core/scheduler/v2/pkg/kafka/gateway" "github.com/seldonio/seldon-core/scheduler/v2/pkg/kafka/schema" "github.com/seldonio/seldon-core/scheduler/v2/pkg/tracing" + "github.com/seldonio/seldon-core/scheduler/v2/version" ) const ( @@ -49,6 +50,7 @@ const ( ) var ( + displayVersion bool schedulerHost string schedulerPlaintxtPort int schedulerTlsPort int @@ -64,7 +66,7 @@ var ( ) func init() { - + flag.BoolVar(&displayVersion, "version", false, "display version and exit") flag.StringVar(&schedulerHost, flagSchedulerHost, "0.0.0.0", "Scheduler host") flag.IntVar(&schedulerPlaintxtPort, flagSchedulerPlaintxtPort, defaultSchedulerPlaintxtPort, "Scheduler plaintxt port") flag.IntVar(&schedulerTlsPort, flagSchedulerTlsPort, defaultSchedulerTLSPort, "Scheduler TLS port") @@ -111,10 +113,16 @@ func main() { logger := log.New() flag.Parse() + if displayVersion { + logger.Infof("Version %s", version.Tag) + os.Exit(0) + } + logIntLevel, err := log.ParseLevel(logLevel) if err != nil { logger.WithError(err).Fatalf("Failed to set log level %s", logLevel) } + logger.Infof("Version %s", version.Tag) logger.Infof("Setting log level to %s", logLevel) logger.SetLevel(logIntLevel) diff --git a/scheduler/cmd/pipelinegateway/main.go b/scheduler/cmd/pipelinegateway/main.go index d0c7fcc7e3..dc72defb1d 100644 --- a/scheduler/cmd/pipelinegateway/main.go +++ b/scheduler/cmd/pipelinegateway/main.go @@ -38,6 +38,7 @@ import ( "github.com/seldonio/seldon-core/scheduler/v2/pkg/metrics" "github.com/seldonio/seldon-core/scheduler/v2/pkg/tracing" "github.com/seldonio/seldon-core/scheduler/v2/pkg/util" + "github.com/seldonio/seldon-core/scheduler/v2/version" ) const ( @@ -66,6 +67,7 @@ const ( ) var ( + displayVersion bool httpPort int grpcPort int metricsPort int @@ -84,7 +86,7 @@ var ( ) func init() { - + flag.BoolVar(&displayVersion, "version", false, "display version and exit") flag.IntVar(&httpPort, flagHttpPort, defaultHttpPort, "http-port") flag.IntVar(&grpcPort, flagGrpcPort, defaultGrpcPort, "grpc-port") flag.IntVar(&metricsPort, flagMetricsPort, defaultMetricsPort, "metrics-port") @@ -136,10 +138,16 @@ func main() { logger := log.New() flag.Parse() + if displayVersion { + logger.Infof("Version %s", version.Tag) + os.Exit(0) + } + logIntLevel, err := log.ParseLevel(logLevel) if err != nil { logger.WithError(err).Fatalf("Failed to set log level %s", logLevel) } + logger.Infof("Version %s", version.Tag) logger.Infof("Setting log level to %s", logLevel) logger.SetLevel(logIntLevel) diff --git a/scheduler/cmd/scheduler/main.go b/scheduler/cmd/scheduler/main.go index f1d1560257..b30cdc989c 100644 --- a/scheduler/cmd/scheduler/main.go +++ b/scheduler/cmd/scheduler/main.go @@ -48,9 +48,11 @@ import ( "github.com/seldonio/seldon-core/scheduler/v2/pkg/synchroniser" "github.com/seldonio/seldon-core/scheduler/v2/pkg/tracing" "github.com/seldonio/seldon-core/scheduler/v2/pkg/util" + "github.com/seldonio/seldon-core/scheduler/v2/version" ) var ( + displayVersion bool envoyPort uint agentPort uint agentMtlsPort uint @@ -101,6 +103,8 @@ const ( func init() { rand.New(rand.NewSource(time.Now().UnixNano())) + flag.BoolVar(&displayVersion, "version", false, "display version and exit") + // The envoyPort that this xDS server listens on flag.UintVar(&envoyPort, "envoy-port", 9002, "xDS management server port") @@ -212,12 +216,19 @@ func parseFlags() { } func main() { - logger := log.New() parseFlags() + logger := log.New() + + if displayVersion { + logger.Infof("Version %s", version.Tag) + os.Exit(0) + } + logIntLevel, err := log.ParseLevel(logLevel) if err != nil { logger.WithError(err).Fatalf("Failed to set log level %s", logLevel) } + logger.Infof("Version %s", version.Tag) logger.Infof("Setting log level to %s", logLevel) logger.SetLevel(logIntLevel) diff --git a/scheduler/data-flow/Makefile b/scheduler/data-flow/Makefile index 574b239324..a296e0d4cd 100644 --- a/scheduler/data-flow/Makefile +++ b/scheduler/data-flow/Makefile @@ -1,3 +1,4 @@ +RELEASE_TAG=$(shell git describe --tags --always --dirty) .PHONY: licenses licenses: @@ -22,4 +23,4 @@ test: .PHONY: build build: - ./gradlew build --no-daemon --no-build-cache + ./gradlew build --no-daemon --no-build-cache -Prelease_tag=$(RELEASE_TAG) diff --git a/scheduler/data-flow/build.gradle.kts b/scheduler/data-flow/build.gradle.kts index c1ba740ecf..67e72399f2 100644 --- a/scheduler/data-flow/build.gradle.kts +++ b/scheduler/data-flow/build.gradle.kts @@ -71,14 +71,38 @@ dependencies { testImplementation("org.assertj:assertj-core:3.25.1") } +val generatedSourceDir = layout.buildDirectory.dir("generated/source/buildinfo") + sourceSets { main { java { srcDirs("src/main/kotlin") + srcDir(generatedSourceDir) } } } +val generateBuildInfo by tasks.registering { + val outputDir = generatedSourceDir.get().asFile + outputs.dir(outputDir) + + doLast { + val buildInfoFile = File(outputDir, "io/seldon/dataflow/BuildInfo.kt") + buildInfoFile.parentFile.mkdirs() + val releaseTag = project.findProperty("release_tag")?.toString() ?: "unknown" + + buildInfoFile.writeText( + """ + package io.seldon.dataflow + + object BuildInfo { + const val VERSION = "$releaseTag" + } + """.trimIndent(), + ) + } +} + tasks.test { useJUnitPlatform() testLogging { @@ -93,6 +117,7 @@ java { } tasks.withType { + dependsOn(generateBuildInfo) kotlinOptions { jvmTarget = "17" freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn" @@ -114,11 +139,20 @@ downloadLicenses { dependencyConfiguration = "compileClasspath" } +tasks.withType { + dependsOn(generateBuildInfo) +} + +tasks.withType { + dependsOn(generateBuildInfo) +} + ktlint { verbose = true debug = true // Ignore generated code from proto filter { exclude { element -> element.file.path.contains("apis/mlops") } + exclude { element -> element.file.path.contains("generated/source/buildinfo") } } } diff --git a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/Main.kt b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/Main.kt index cb41fa3a8a..b9152780dc 100644 --- a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/Main.kt +++ b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/Main.kt @@ -36,6 +36,7 @@ object Main { fun main(args: Array) { Logging.configure() + println("Version: ${BuildInfo.VERSION}") val config = Cli.configWith(args) Logging.configure( appLevel = config[Cli.logLevelApplication], diff --git a/scheduler/version/version.go b/scheduler/version/version.go new file mode 100644 index 0000000000..cd3c42ce7e --- /dev/null +++ b/scheduler/version/version.go @@ -0,0 +1,13 @@ +/* +Copyright (c) 2024 Seldon Technologies Ltd. + +Use of this software is governed BY +(1) the license included in the LICENSE file or +(2) if the license included in the LICENSE file is the Business Source License 1.1, +the Change License after the Change Date as each is defined in accordance with the LICENSE file. +*/ + +package version + +// Tag set via GitHub release worfkflow +var Tag = ""