@@ -83,10 +83,10 @@ type Logger func(level codersdk.LogLevel, format string, args ...any)
83
83
type DockerConfig configfile.ConfigFile
84
84
85
85
// Run runs the envbuilder.
86
- // Logger is the logger to use for all operations.
86
+ // Logger is the logf to use for all operations.
87
87
// Filesystem is the filesystem to use for all operations.
88
88
// Defaults to the host filesystem.
89
- func Run (ctx context.Context , options Options , fs billy.Filesystem , logger Logger ) error {
89
+ func Run (ctx context.Context , options Options , fs billy.Filesystem , logf Logger ) error {
90
90
// Default to the shell!
91
91
initArgs := []string {"-c" , options .InitScript }
92
92
if options .InitArgs != "" {
@@ -113,14 +113,14 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
113
113
now := time .Now ()
114
114
stageNum := stageNumber
115
115
stageNumber ++
116
- logger (codersdk .LogLevelInfo , "#%d: %s" , stageNum , fmt .Sprintf (format , args ... ))
116
+ logf (codersdk .LogLevelInfo , "#%d: %s" , stageNum , fmt .Sprintf (format , args ... ))
117
117
118
118
return func (format string , args ... any ) {
119
- logger (codersdk .LogLevelInfo , "#%d: %s [%s]" , stageNum , fmt .Sprintf (format , args ... ), time .Since (now ))
119
+ logf (codersdk .LogLevelInfo , "#%d: %s [%s]" , stageNum , fmt .Sprintf (format , args ... ), time .Since (now ))
120
120
}
121
121
}
122
122
123
- logger (codersdk .LogLevelInfo , "%s - Build development environments from repositories in a container" , newColor (color .Bold ).Sprintf ("envbuilder" ))
123
+ logf (codersdk .LogLevelInfo , "%s - Build development environments from repositories in a container" , newColor (color .Bold ).Sprintf ("envbuilder" ))
124
124
125
125
var caBundle []byte
126
126
if options .SSLCertBase64 != "" {
@@ -182,7 +182,7 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
182
182
if line == "" {
183
183
continue
184
184
}
185
- logger (codersdk .LogLevelInfo , "#1: %s" , strings .TrimSpace (line ))
185
+ logf (codersdk .LogLevelInfo , "#1: %s" , strings .TrimSpace (line ))
186
186
}
187
187
}
188
188
}()
@@ -220,8 +220,8 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
220
220
endStage ("📦 The repository already exists!" )
221
221
}
222
222
} else {
223
- logger (codersdk .LogLevelError , "Failed to clone repository: %s" , fallbackErr .Error ())
224
- logger (codersdk .LogLevelError , "Falling back to the default image..." )
223
+ logf (codersdk .LogLevelError , "Failed to clone repository: %s" , fallbackErr .Error ())
224
+ logf (codersdk .LogLevelError , "Falling back to the default image..." )
225
225
}
226
226
}
227
227
@@ -259,10 +259,10 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
259
259
if options .DockerfilePath == "" {
260
260
// Only look for a devcontainer if a Dockerfile wasn't specified.
261
261
// devcontainer is a standard, so it's reasonable to be the default.
262
- devcontainerPath , devcontainerDir , err := findDevcontainerJSON (options , fs , logger )
262
+ devcontainerPath , devcontainerDir , err := findDevcontainerJSON (options , fs , logf )
263
263
if err != nil {
264
- logger (codersdk .LogLevelError , "Failed to locate devcontainer.json: %s" , err .Error ())
265
- logger (codersdk .LogLevelError , "Falling back to the default image..." )
264
+ logf (codersdk .LogLevelError , "Failed to locate devcontainer.json: %s" , err .Error ())
265
+ logf (codersdk .LogLevelError , "Falling back to the default image..." )
266
266
} else {
267
267
// We know a devcontainer exists.
268
268
// Let's parse it and use it!
@@ -283,7 +283,7 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
283
283
if err != nil {
284
284
return fmt .Errorf ("no Dockerfile or image found: %w" , err )
285
285
}
286
- logger (codersdk .LogLevelInfo , "No Dockerfile or image specified; falling back to the default image..." )
286
+ logf (codersdk .LogLevelInfo , "No Dockerfile or image specified; falling back to the default image..." )
287
287
fallbackDockerfile = defaultParams .DockerfilePath
288
288
}
289
289
buildParams , err = devContainer .Compile (fs , devcontainerDir , MagicDir , fallbackDockerfile , options .WorkspaceFolder , false )
@@ -292,8 +292,8 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
292
292
}
293
293
scripts = devContainer .LifecycleScripts
294
294
} else {
295
- logger (codersdk .LogLevelError , "Failed to parse devcontainer.json: %s" , err .Error ())
296
- logger (codersdk .LogLevelError , "Falling back to the default image..." )
295
+ logf (codersdk .LogLevelError , "Failed to parse devcontainer.json: %s" , err .Error ())
296
+ logf (codersdk .LogLevelError , "Falling back to the default image..." )
297
297
}
298
298
}
299
299
} else {
@@ -304,8 +304,8 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
304
304
// not defined, show a warning
305
305
dockerfileDir := filepath .Dir (dockerfilePath )
306
306
if dockerfileDir != filepath .Clean (options .WorkspaceFolder ) && options .BuildContextPath == "" {
307
- logger (codersdk .LogLevelWarn , "given dockerfile %q is below %q and no custom build context has been defined" , dockerfilePath , options .WorkspaceFolder )
308
- logger (codersdk .LogLevelWarn , "\t -> set BUILD_CONTEXT_PATH to %q to fix" , dockerfileDir )
307
+ logf (codersdk .LogLevelWarn , "given dockerfile %q is below %q and no custom build context has been defined" , dockerfilePath , options .WorkspaceFolder )
308
+ logf (codersdk .LogLevelWarn , "\t -> set BUILD_CONTEXT_PATH to %q to fix" , dockerfileDir )
309
309
}
310
310
311
311
dockerfile , err := fs .Open (dockerfilePath )
@@ -334,7 +334,7 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
334
334
335
335
HijackLogrus (func (entry * logrus.Entry ) {
336
336
for _ , line := range strings .Split (entry .Message , "\r " ) {
337
- logger (codersdk .LogLevelInfo , "#2: %s" , color .HiBlackString (line ))
337
+ logf (codersdk .LogLevelInfo , "#2: %s" , color .HiBlackString (line ))
338
338
}
339
339
})
340
340
@@ -373,15 +373,15 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
373
373
go func () {
374
374
err := srv .Serve (listener )
375
375
if err != nil && ! errors .Is (err , http .ErrServerClosed ) {
376
- logger (codersdk .LogLevelError , "Failed to serve registry: %s" , err .Error ())
376
+ logf (codersdk .LogLevelError , "Failed to serve registry: %s" , err .Error ())
377
377
}
378
378
}()
379
379
closeAfterBuild = func () {
380
380
_ = srv .Close ()
381
381
_ = listener .Close ()
382
382
}
383
383
if options .CacheRepo != "" {
384
- logger (codersdk .LogLevelWarn , "Overriding cache repo with local registry..." )
384
+ logf (codersdk .LogLevelWarn , "Overriding cache repo with local registry..." )
385
385
}
386
386
options .CacheRepo = fmt .Sprintf ("localhost:%d/local/cache" , tcpAddr .Port )
387
387
}
@@ -444,13 +444,13 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
444
444
go func () {
445
445
scanner := bufio .NewScanner (stdoutReader )
446
446
for scanner .Scan () {
447
- logger (codersdk .LogLevelInfo , "%s" , scanner .Text ())
447
+ logf (codersdk .LogLevelInfo , "%s" , scanner .Text ())
448
448
}
449
449
}()
450
450
go func () {
451
451
scanner := bufio .NewScanner (stderrReader )
452
452
for scanner .Scan () {
453
- logger (codersdk .LogLevelInfo , "%s" , scanner .Text ())
453
+ logf (codersdk .LogLevelInfo , "%s" , scanner .Text ())
454
454
}
455
455
}()
456
456
cacheTTL := time .Hour * 24 * 7
@@ -530,13 +530,13 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
530
530
fallback = true
531
531
fallbackErr = err
532
532
case strings .Contains (err .Error (), "unexpected status code 401 Unauthorized" ):
533
- logger (codersdk .LogLevelError , "Unable to pull the provided image. Ensure your registry credentials are correct!" )
533
+ logf (codersdk .LogLevelError , "Unable to pull the provided image. Ensure your registry credentials are correct!" )
534
534
}
535
535
if ! fallback || options .ExitOnBuildFailure {
536
536
return err
537
537
}
538
- logger (codersdk .LogLevelError , "Failed to build: %s" , err )
539
- logger (codersdk .LogLevelError , "Falling back to the default image..." )
538
+ logf (codersdk .LogLevelError , "Failed to build: %s" , err )
539
+ logf (codersdk .LogLevelError , "Falling back to the default image..." )
540
540
buildParams , err = defaultBuildParams ()
541
541
if err != nil {
542
542
return err
@@ -579,10 +579,10 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
579
579
if err != nil {
580
580
return fmt .Errorf ("unmarshal metadata: %w" , err )
581
581
}
582
- logger (codersdk .LogLevelInfo , "#3: 👀 Found devcontainer.json label metadata in image..." )
582
+ logf (codersdk .LogLevelInfo , "#3: 👀 Found devcontainer.json label metadata in image..." )
583
583
for _ , container := range devContainer {
584
584
if container .RemoteUser != "" {
585
- logger (codersdk .LogLevelInfo , "#3: 🧑 Updating the user to %q!" , container .RemoteUser )
585
+ logf (codersdk .LogLevelInfo , "#3: 🧑 Updating the user to %q!" , container .RemoteUser )
586
586
587
587
configFile .Config .User = container .RemoteUser
588
588
}
@@ -677,7 +677,7 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
677
677
username = buildParams .User
678
678
}
679
679
if username == "" {
680
- logger (codersdk .LogLevelWarn , "#3: no user specified, using root" )
680
+ logf (codersdk .LogLevelWarn , "#3: no user specified, using root" )
681
681
}
682
682
683
683
userInfo , err := getUser (username )
@@ -719,7 +719,7 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
719
719
// exec systemd as the init command, but that doesn't mean we should
720
720
// run the lifecycle scripts as root.
721
721
os .Setenv ("HOME" , userInfo .user .HomeDir )
722
- if err := execLifecycleScripts (ctx , options , logger , scripts , skippedRebuild , userInfo ); err != nil {
722
+ if err := execLifecycleScripts (ctx , options , logf , scripts , skippedRebuild , userInfo ); err != nil {
723
723
return err
724
724
}
725
725
@@ -732,7 +732,7 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
732
732
// We execute the initialize script as the root user!
733
733
os .Setenv ("HOME" , "/root" )
734
734
735
- logger (codersdk .LogLevelInfo , "=== Running the setup command %q as the root user..." , options .SetupScript )
735
+ logf (codersdk .LogLevelInfo , "=== Running the setup command %q as the root user..." , options .SetupScript )
736
736
737
737
envKey := "ENVBUILDER_ENV"
738
738
envFile := filepath .Join ("/" , MagicDir , "environ" )
@@ -759,7 +759,7 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
759
759
go func () {
760
760
scanner := bufio .NewScanner (& buf )
761
761
for scanner .Scan () {
762
- logger (codersdk .LogLevelInfo , "%s" , scanner .Text ())
762
+ logf (codersdk .LogLevelInfo , "%s" , scanner .Text ())
763
763
}
764
764
}()
765
765
@@ -825,7 +825,7 @@ func Run(ctx context.Context, options Options, fs billy.Filesystem, logger Logge
825
825
return fmt .Errorf ("set uid: %w" , err )
826
826
}
827
827
828
- logger (codersdk .LogLevelInfo , "=== Running the init command %s %+v as the %q user..." , options .InitCommand , initArgs , userInfo .user .Username )
828
+ logf (codersdk .LogLevelInfo , "=== Running the init command %s %+v as the %q user..." , options .InitCommand , initArgs , userInfo .user .Username )
829
829
830
830
err = syscall .Exec (options .InitCommand , append ([]string {options .InitCommand }, initArgs ... ), os .Environ ())
831
831
if err != nil {
@@ -898,17 +898,17 @@ func findUser(nameOrID string) (*user.User, error) {
898
898
899
899
func execOneLifecycleScript (
900
900
ctx context.Context ,
901
- logger func (level codersdk.LogLevel , format string , args ... any ),
901
+ logf func (level codersdk.LogLevel , format string , args ... any ),
902
902
s devcontainer.LifecycleScript ,
903
903
scriptName string ,
904
904
userInfo userInfo ,
905
905
) error {
906
906
if s .IsEmpty () {
907
907
return nil
908
908
}
909
- logger (codersdk .LogLevelInfo , "=== Running %s as the %q user..." , scriptName , userInfo .user .Username )
909
+ logf (codersdk .LogLevelInfo , "=== Running %s as the %q user..." , scriptName , userInfo .user .Username )
910
910
if err := s .Execute (ctx , userInfo .uid , userInfo .gid ); err != nil {
911
- logger (codersdk .LogLevelError , "Failed to run %s: %v" , scriptName , err )
911
+ logf (codersdk .LogLevelError , "Failed to run %s: %v" , scriptName , err )
912
912
return err
913
913
}
914
914
return nil
@@ -917,7 +917,7 @@ func execOneLifecycleScript(
917
917
func execLifecycleScripts (
918
918
ctx context.Context ,
919
919
options Options ,
920
- logger Logger ,
920
+ logf Logger ,
921
921
scripts devcontainer.LifecycleScripts ,
922
922
skippedRebuild bool ,
923
923
userInfo userInfo ,
@@ -927,16 +927,16 @@ func execLifecycleScripts(
927
927
}
928
928
929
929
if ! skippedRebuild {
930
- if err := execOneLifecycleScript (ctx , logger , scripts .OnCreateCommand , "onCreateCommand" , userInfo ); err != nil {
930
+ if err := execOneLifecycleScript (ctx , logf , scripts .OnCreateCommand , "onCreateCommand" , userInfo ); err != nil {
931
931
// skip remaining lifecycle commands
932
932
return nil
933
933
}
934
934
}
935
- if err := execOneLifecycleScript (ctx , logger , scripts .UpdateContentCommand , "updateContentCommand" , userInfo ); err != nil {
935
+ if err := execOneLifecycleScript (ctx , logf , scripts .UpdateContentCommand , "updateContentCommand" , userInfo ); err != nil {
936
936
// skip remaining lifecycle commands
937
937
return nil
938
938
}
939
- if err := execOneLifecycleScript (ctx , logger , scripts .PostCreateCommand , "postCreateCommand" , userInfo ); err != nil {
939
+ if err := execOneLifecycleScript (ctx , logf , scripts .PostCreateCommand , "postCreateCommand" , userInfo ); err != nil {
940
940
// skip remaining lifecycle commands
941
941
return nil
942
942
}
@@ -948,7 +948,7 @@ func execLifecycleScripts(
948
948
return fmt .Errorf ("failed to create post-start script: %w" , err )
949
949
}
950
950
} else {
951
- _ = execOneLifecycleScript (ctx , logger , scripts .PostStartCommand , "postStartCommand" , userInfo )
951
+ _ = execOneLifecycleScript (ctx , logf , scripts .PostStartCommand , "postStartCommand" , userInfo )
952
952
}
953
953
}
954
954
return nil
@@ -1001,7 +1001,7 @@ func (fs *osfsWithChmod) Chmod(name string, mode os.FileMode) error {
1001
1001
return os .Chmod (name , mode )
1002
1002
}
1003
1003
1004
- func findDevcontainerJSON (options Options , fs billy.Filesystem , logger Logger ) (string , string , error ) {
1004
+ func findDevcontainerJSON (options Options , fs billy.Filesystem , logf Logger ) (string , string , error ) {
1005
1005
// 0. Check if custom devcontainer directory or path is provided.
1006
1006
if options .DevcontainerDir != "" || options .DevcontainerJSONPath != "" {
1007
1007
devcontainerDir := options .DevcontainerDir
@@ -1052,13 +1052,13 @@ func findDevcontainerJSON(options Options, fs billy.Filesystem, logger Logger) (
1052
1052
1053
1053
for _ , fileInfo := range fileInfos {
1054
1054
if ! fileInfo .IsDir () {
1055
- logger (codersdk .LogLevelDebug , `%s is a file` , fileInfo .Name ())
1055
+ logf (codersdk .LogLevelDebug , `%s is a file` , fileInfo .Name ())
1056
1056
continue
1057
1057
}
1058
1058
1059
1059
location := filepath .Join (devcontainerDir , fileInfo .Name (), "devcontainer.json" )
1060
1060
if _ , err := fs .Stat (location ); err != nil {
1061
- logger (codersdk .LogLevelDebug , `stat %s failed: %s` , location , err .Error ())
1061
+ logf (codersdk .LogLevelDebug , `stat %s failed: %s` , location , err .Error ())
1062
1062
continue
1063
1063
}
1064
1064
0 commit comments