From 6b686ec29aa4c39b96cffc4d95befe6a5d8fc112 Mon Sep 17 00:00:00 2001 From: Dmitry Kovba Date: Wed, 20 May 2026 17:10:25 -0700 Subject: [PATCH 1/2] Keep `CVersion` in the `vminitd` package --- Package.swift | 14 -------------- vminitd/Package.swift | 14 ++++++++++++++ vminitd/Sources/VminitdCore/AgentCommand.swift | 13 ++++--------- vminitd/Sources/vminitd/Application.swift | 14 ++++++++++++++ 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/Package.swift b/Package.swift index 720fc37c..df498005 100644 --- a/Package.swift +++ b/Package.swift @@ -21,10 +21,6 @@ import CompilerPluginSupport import Foundation import PackageDescription -let gitCommit = ProcessInfo.processInfo.environment["GIT_COMMIT"] ?? "unspecified" -let gitTag = ProcessInfo.processInfo.environment["GIT_TAG"] ?? "" -let buildTime = ProcessInfo.processInfo.environment["BUILD_TIME"] ?? "unspecified" - let package = Package( name: "containerization", platforms: [.macOS("15.0")], @@ -264,15 +260,6 @@ let package = Package( .target( name: "CShim" ), - .target( - name: "CVersion", - path: "vminitd/Sources/CVersion", - cSettings: [ - .define("GIT_COMMIT", to: "\"\(gitCommit)\""), - .define("GIT_TAG", to: "\"\(gitTag)\""), - .define("BUILD_TIME", to: "\"\(buildTime)\""), - ] - ), .target( name: "LCShim", path: "vminitd/Sources/LCShim" @@ -303,7 +290,6 @@ let package = Package( .product(name: "GRPCNIOTransportHTTP2", package: "grpc-swift-nio-transport"), .product(name: "GRPCProtobuf", package: "grpc-swift-protobuf"), "LCShim", - "CVersion", "Cgroup", ], path: "vminitd/Sources/VminitdCore" diff --git a/vminitd/Package.swift b/vminitd/Package.swift index e97b55f7..673a48c6 100644 --- a/vminitd/Package.swift +++ b/vminitd/Package.swift @@ -17,8 +17,13 @@ // The swift-tools-version declares the minimum version of Swift required to build this package. +import Foundation import PackageDescription +let gitCommit = ProcessInfo.processInfo.environment["GIT_COMMIT"] ?? "unspecified" +let gitTag = ProcessInfo.processInfo.environment["GIT_TAG"] ?? "" +let buildTime = ProcessInfo.processInfo.environment["BUILD_TIME"] ?? "unspecified" + let package = Package( name: "swift-vminitd", platforms: [.macOS("15")], @@ -33,6 +38,14 @@ let package = Package( .package(name: "containerization", path: "../"), ], targets: [ + .target( + name: "CVersion", + cSettings: [ + .define("GIT_COMMIT", to: "\"\(gitCommit)\""), + .define("GIT_TAG", to: "\"\(gitTag)\""), + .define("BUILD_TIME", to: "\"\(buildTime)\""), + ] + ), .executableTarget( name: "vminitd", dependencies: [ @@ -40,6 +53,7 @@ let package = Package( .product(name: "ContainerizationOS", package: "containerization"), .product(name: "Logging", package: "swift-log"), .product(name: "VminitdCore", package: "containerization"), + "CVersion", ] ), .executableTarget( diff --git a/vminitd/Sources/VminitdCore/AgentCommand.swift b/vminitd/Sources/VminitdCore/AgentCommand.swift index 234ae56b..a7faafbe 100644 --- a/vminitd/Sources/VminitdCore/AgentCommand.swift +++ b/vminitd/Sources/VminitdCore/AgentCommand.swift @@ -17,7 +17,6 @@ #if os(Linux) import ArgumentParser -import CVersion import Cgroup import Containerization import ContainerizationError @@ -27,6 +26,7 @@ import GRPCCore import Logging import NIOCore import NIOPosix +import Synchronization #if os(Linux) #if canImport(Musl) @@ -46,6 +46,8 @@ public struct AgentCommand: AsyncParsableCommand { private static let foregroundEnvVar = "FOREGROUND" public static let vsockPort = 1024 + public static let versionMetadata = Mutex([:]) + @OptionGroup var options: LogLevelOption public init() {} @@ -79,14 +81,7 @@ public struct AgentCommand: AsyncParsableCommand { signal(SIGPIPE, SIG_IGN) - let gitCommit = String(cString: CZ_get_git_commit()) - let gitTag = String(cString: CZ_get_git_tag()) - let buildTime = String(cString: CZ_get_build_time()) - var metadata: Logger.Metadata = ["commit": "\(gitCommit)", "built": "\(buildTime)"] - if !gitTag.isEmpty { - metadata["tag"] = "\(gitTag)" - } - log.info("vminitd booting", metadata: metadata) + log.info("vminitd booting", metadata: Self.versionMetadata.withLock { $0 }) // Set of mounts necessary to be mounted prior to taking any RPCs. // 1. /proc as the sysctl rpc wouldn't make sense if it wasn't there (NOTE: This is done before this method diff --git a/vminitd/Sources/vminitd/Application.swift b/vminitd/Sources/vminitd/Application.swift index 6ca8e2fe..51a6102c 100644 --- a/vminitd/Sources/vminitd/Application.swift +++ b/vminitd/Sources/vminitd/Application.swift @@ -15,6 +15,7 @@ //===----------------------------------------------------------------------===// import ArgumentParser +import CVersion import ContainerizationOS import Foundation import Logging @@ -35,6 +36,8 @@ struct Application: AsyncParsableCommand { ) static func main() async throws { + AgentCommand.versionMetadata.withLock { $0 = Self.versionMetadata() } + // Busybox-style: if invoked as .cz-init, run init mode directly. let invoked = CommandLine.arguments.first?.split(separator: "/").last.map(String.init) ?? "" if invoked == ".cz-init" { @@ -57,6 +60,17 @@ struct Application: AsyncParsableCommand { } } + private static func versionMetadata() -> Logger.Metadata { + let gitCommit = String(cString: CZ_get_git_commit()) + let gitTag = String(cString: CZ_get_git_tag()) + let buildTime = String(cString: CZ_get_build_time()) + var metadata: Logger.Metadata = ["commit": "\(gitCommit)", "built": "\(buildTime)"] + if !gitTag.isEmpty { + metadata["tag"] = "\(gitTag)" + } + return metadata + } + private static func mountProc() throws { if isProcMounted() { return From 0c91962c0e7b6e19712e8e2810e440d071ecc27a Mon Sep 17 00:00:00 2001 From: Dmitry Kovba Date: Wed, 20 May 2026 18:09:23 -0700 Subject: [PATCH 2/2] Drop the version metadata `Mutex` from `AgentCommand` --- vminitd/Sources/VminitdCore/AgentCommand.swift | 5 +---- vminitd/Sources/VminitdCore/Logging.swift | 10 ++++++++++ vminitd/Sources/vminitd/Application.swift | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/vminitd/Sources/VminitdCore/AgentCommand.swift b/vminitd/Sources/VminitdCore/AgentCommand.swift index a7faafbe..28c8a4ea 100644 --- a/vminitd/Sources/VminitdCore/AgentCommand.swift +++ b/vminitd/Sources/VminitdCore/AgentCommand.swift @@ -26,7 +26,6 @@ import GRPCCore import Logging import NIOCore import NIOPosix -import Synchronization #if os(Linux) #if canImport(Musl) @@ -46,8 +45,6 @@ public struct AgentCommand: AsyncParsableCommand { private static let foregroundEnvVar = "FOREGROUND" public static let vsockPort = 1024 - public static let versionMetadata = Mutex([:]) - @OptionGroup var options: LogLevelOption public init() {} @@ -81,7 +78,7 @@ public struct AgentCommand: AsyncParsableCommand { signal(SIGPIPE, SIG_IGN) - log.info("vminitd booting", metadata: Self.versionMetadata.withLock { $0 }) + log.info("vminitd booting", metadata: versionMetadata()) // Set of mounts necessary to be mounted prior to taking any RPCs. // 1. /proc as the sysctl rpc wouldn't make sense if it wasn't there (NOTE: This is done before this method diff --git a/vminitd/Sources/VminitdCore/Logging.swift b/vminitd/Sources/VminitdCore/Logging.swift index 7a634909..6c56da09 100644 --- a/vminitd/Sources/VminitdCore/Logging.swift +++ b/vminitd/Sources/VminitdCore/Logging.swift @@ -50,6 +50,16 @@ public struct LogLevelOption: ParsableArguments { } private let _loggingBootstrapped = Mutex(false) +private let _versionMetadata = Mutex([:]) + +/// Set the version metadata logged on boot. +public func setVersionMetadata(_ metadata: Logger.Metadata) { + _versionMetadata.withLock { $0 = metadata } +} + +func versionMetadata() -> Logger.Metadata { + _versionMetadata.withLock { $0 } +} func makeLogger(label: String, level: Logger.Level) -> Logger { _loggingBootstrapped.withLock { bootstrapped in diff --git a/vminitd/Sources/vminitd/Application.swift b/vminitd/Sources/vminitd/Application.swift index 51a6102c..21009062 100644 --- a/vminitd/Sources/vminitd/Application.swift +++ b/vminitd/Sources/vminitd/Application.swift @@ -36,7 +36,7 @@ struct Application: AsyncParsableCommand { ) static func main() async throws { - AgentCommand.versionMetadata.withLock { $0 = Self.versionMetadata() } + setVersionMetadata(Self.versionMetadata()) // Busybox-style: if invoked as .cz-init, run init mode directly. let invoked = CommandLine.arguments.first?.split(separator: "/").last.map(String.init) ?? ""