@@ -125,6 +125,12 @@ extension Application {
125125
126126 var secrets : [ String : SecretType ] = [ : ]
127127
128+ @Option (
129+ name: . long,
130+ help: ArgumentHelp ( " Forward SSH agent authentication to the build (format: default) " , valueName: " default " )
131+ )
132+ var ssh : String = " "
133+
128134 @Option ( name: [ . short, . customLong( " tag " ) ] , help: ArgumentHelp ( " Name for the built image " , valueName: " name " ) )
129135 var targetImageNames : [ String ] = {
130136 [ UUID ( ) . uuidString. lowercased ( ) ]
@@ -165,12 +171,26 @@ extension Application {
165171 progress. set ( description: " Dialing builder " )
166172
167173 let dnsNameservers = self . dns. nameservers
168- let builder : Builder ? = try await withThrowingTaskGroup ( of: Builder . self) { [ vsockPort, cpus, memory, dnsNameservers] group in
174+
175+ // Ensure the builder is started (or restarted) with the correct SSH configuration
176+ // before attempting to dial. This handles the case where the builder is already
177+ // running but was not started with SSH forwarding enabled.
178+ try await BuilderStart . start (
179+ cpus: cpus,
180+ memory: memory,
181+ log: log,
182+ ssh: ssh == " default " ,
183+ dnsNameservers: dnsNameservers,
184+ progressUpdate: progress. handler,
185+ containerSystemConfig: containerSystemConfig,
186+ )
187+
188+ let builder : Builder ? = try await withThrowingTaskGroup ( of: Builder . self) { [ vsockPort, cpus, memory, dnsNameservers, ssh] group in
169189 defer {
170190 group. cancelAll ( )
171191 }
172192
173- group. addTask { [ vsockPort, cpus, memory, log, dnsNameservers] in
193+ group. addTask { [ vsockPort, cpus, memory, log, dnsNameservers, ssh ] in
174194 let client = ContainerClient ( )
175195 while true {
176196 do {
@@ -192,6 +212,7 @@ extension Application {
192212 cpus: cpus,
193213 memory: memory,
194214 log: log,
215+ ssh: ssh == " default " ,
195216 dnsNameservers: dnsNameservers,
196217 progressUpdate: progress. handler,
197218 containerSystemConfig: containerSystemConfig,
@@ -349,13 +370,15 @@ extension Application {
349370 } ( )
350371 group. addTask {
351372 [
352- terminal, buildArg, secretsData, contextDir, ignoreFileData, label, noCache, target, quiet, cacheIn, cacheOut, pull, exports, imageNames, tempURL, log,
373+ terminal, buildArg, secretsData, ssh, contextDir, ignoreFileData, label, noCache, target, quiet, cacheIn, cacheOut, pull, exports, imageNames, tempURL,
374+ log
353375 ] in
354376 let config = Builder . BuildConfig (
355377 buildID: buildID,
356378 contentStore: RemoteContentStoreClient ( ) ,
357379 buildArgs: buildArg,
358380 secrets: secretsData,
381+ ssh: ssh,
359382 contextDir: contextDir,
360383 dockerfile: buildFileData,
361384 dockerignore: ignoreFileData,
@@ -510,6 +533,17 @@ extension Application {
510533 throw ValidationError ( " secret bad value \( parts [ 1 ] ) " )
511534 }
512535 }
536+
537+ switch ssh {
538+ case " " :
539+ break
540+ case " default " where ProcessInfo . processInfo. environment [ " SSH_AUTH_SOCK " ] != nil :
541+ break
542+ case " default " :
543+ throw ValidationError ( " --ssh default requires SSH_AUTH_SOCK to be set " )
544+ default :
545+ throw ValidationError ( " only --ssh default is currently supported " )
546+ }
513547 }
514548 }
515549}
0 commit comments