From 506e2e12a6b540e5148a6434ad0108fd726b9bfb Mon Sep 17 00:00:00 2001 From: hkfires <10558748+hkfires@users.noreply.github.com> Date: Sat, 6 Sep 2025 09:41:27 +0800 Subject: [PATCH] feat(server): inject build metadata into application logs and container image --- Dockerfile | 6 ++++-- cmd/server/main.go | 8 ++++++-- docker-build.ps1 | 36 ++++++++++++++++++++++++++++++++++++ docker-build.sh | 41 +++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 4 ++++ 5 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 docker-build.ps1 create mode 100644 docker-build.sh diff --git a/Dockerfile b/Dockerfile index edd642d9..8cedb065 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,9 +8,11 @@ RUN go mod download COPY . . -ARG APP_VERSION="dev" +ARG VERSION=dev +ARG COMMIT=none +ARG BUILD_DATE=unknown -RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-X 'main.Version=${APP_VERSION}'" -o ./CLIProxyAPI ./cmd/server/ +RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w -X 'main.Version=${VERSION}' -X 'main.Commit=${COMMIT}' -X 'main.BuildDate=${BUILD_DATE}'" -o ./CLIProxyAPI ./cmd/server/ FROM alpine:3.22.0 diff --git a/cmd/server/main.go b/cmd/server/main.go index fe106d06..c5341cbf 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -17,7 +17,11 @@ import ( log "github.com/sirupsen/logrus" ) -var Version = "dev" +var ( + Version = "dev" + Commit = "none" + BuildDate = "unknown" +) // LogFormatter defines a custom log format for logrus. // This formatter adds timestamp, log level, and source location information @@ -60,7 +64,7 @@ func init() { // It parses command-line flags, loads configuration, and starts the appropriate // service based on the provided flags (login, codex-login, or server mode). func main() { - log.Infof("CLIProxyAPI Version: %v", Version) + log.Infof("CLIProxyAPI Version: %s, Commit: %s, BuiltAt: %s", Version, Commit, BuildDate) // Command-line flags to control the application's behavior. var login bool diff --git a/docker-build.ps1 b/docker-build.ps1 new file mode 100644 index 00000000..caed5b45 --- /dev/null +++ b/docker-build.ps1 @@ -0,0 +1,36 @@ +# build.ps1 - Windows PowerShell Build Script +# +# This script automates the process of building and running the Docker container +# with version information dynamically injected at build time. + +# Stop script execution on any error +$ErrorActionPreference = "Stop" + +# --- Step 1: Get Version Information --- +# Get the latest git tag or commit hash as the version string. +$VERSION = (git describe --tags --always --dirty) + +# Get the short commit hash. +$COMMIT = (git rev-parse --short HEAD) + +# Get the current UTC date and time in ISO 8601 format. +$BUILD_DATE = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ") + +Write-Host "--- Building with the following info ---" +Write-Host "Version: $VERSION" +Write-Host "Commit: $COMMIT" +Write-Host "Build Date: $BUILD_DATE" +Write-Host "----------------------------------------" + +# --- Step 2: Build the Docker Image --- +# Pass the version information as build arguments to 'docker compose build'. +# These arguments are then used by the Dockerfile to inject them into the Go binary. +docker compose build --build-arg VERSION=$VERSION --build-arg COMMIT=$COMMIT --build-arg BUILD_DATE=$BUILD_DATE + +# --- Step 3: Start the Services --- +# Start the services in detached mode using the newly built image. +# '--remove-orphans' cleans up any containers for services that are no longer defined. +docker compose up -d --remove-orphans + +Write-Host "Build complete. Services are starting." +Write-Host "Run 'docker compose logs -f' to see the logs." \ No newline at end of file diff --git a/docker-build.sh b/docker-build.sh new file mode 100644 index 00000000..8a92f3b7 --- /dev/null +++ b/docker-build.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# +# build.sh - Linux/macOS Build Script +# +# This script automates the process of building and running the Docker container +# with version information dynamically injected at build time. + +# Exit immediately if a command exits with a non-zero status. +set -euo pipefail + +# --- Step 1: Get Version Information --- +# Get the latest git tag or commit hash as the version string. +VERSION="$(git describe --tags --always --dirty)" + +# Get the short commit hash. +COMMIT="$(git rev-parse --short HEAD)" + +# Get the current UTC date and time in ISO 8601 format. +BUILD_DATE="$(date -u +%Y-%m-%dT%H:%M:%SZ)" + +echo "--- Building with the following info ---" +echo "Version: ${VERSION}" +echo "Commit: ${COMMIT}" +echo "Build Date: ${BUILD_DATE}" +echo "----------------------------------------" + +# --- Step 2: Build the Docker Image --- +# Pass the version information as build arguments to 'docker compose build'. +# These arguments are then used by the Dockerfile to inject them into the Go binary. +docker compose build \ + --build-arg VERSION="${VERSION}" \ + --build-arg COMMIT="${COMMIT}" \ + --build-arg BUILD_DATE="${BUILD_DATE}" + +# --- Step 3: Start the Services --- +# Start the services in detached mode using the newly built image. +# '--remove-orphans' cleans up any containers for services that are no longer defined. +docker compose up -d --remove-orphans + +echo "Build complete. Services are starting." +echo "Run 'docker compose logs -f' to see the logs." \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index c1673171..299748f4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,6 +3,10 @@ services: build: context: . dockerfile: Dockerfile + args: + VERSION: ${VERSION:-dev} + COMMIT: ${COMMIT:-none} + BUILD_DATE: ${BUILD_DATE:-unknown} image: cli-proxy-api:latest container_name: cli-proxy-api ports: