@@ -36,6 +36,7 @@ import (
3636 "github.com/arduino/arduino-app-cli/internal/orchestrator/app"
3737 "github.com/arduino/arduino-app-cli/internal/orchestrator/bricksindex"
3838 "github.com/arduino/arduino-app-cli/internal/orchestrator/config"
39+ "github.com/arduino/arduino-app-cli/internal/orchestrator/secrets"
3940 "github.com/arduino/arduino-app-cli/internal/store"
4041)
4142
@@ -67,11 +68,13 @@ type service struct {
6768 Labels map [string ]string `yaml:"labels,omitempty"`
6869 Environment map [string ]string `yaml:"environment,omitempty"`
6970 Logging * logging `yaml:"logging,omitempty"`
71+ Secrets []string `yaml:"secrets,omitempty"`
7072}
7173
7274type Provision struct {
7375 docker command.Cli
7476 pythonImage string
77+ idProvider * app.IDProvider
7578}
7679
7780func isDevelopmentMode (cfg config.Configuration ) bool {
@@ -81,10 +84,12 @@ func isDevelopmentMode(cfg config.Configuration) bool {
8184func NewProvision (
8285 docker command.Cli ,
8386 cfg config.Configuration ,
87+ idProvider * app.IDProvider ,
8488) (* Provision , error ) {
8589 provision := & Provision {
8690 docker : docker ,
8791 pythonImage : cfg .PythonImage ,
92+ idProvider : idProvider ,
8893 }
8994
9095 dynamicProvisionDir := cfg .AssetsDir ().Join (cfg .UsedPythonImageTag )
@@ -119,6 +124,7 @@ func (p *Provision) App(
119124 cfg config.Configuration ,
120125 mapped_env map [string ]string ,
121126 staticStore * store.StaticStore ,
127+ idProvider * app.IDProvider ,
122128) error {
123129 if arduinoApp == nil {
124130 return fmt .Errorf ("provisioning failed: arduinoApp is nil" )
@@ -130,7 +136,7 @@ func (p *Provision) App(
130136 }
131137 }
132138
133- return generateMainComposeFile (arduinoApp , bricksIndex , p .pythonImage , cfg , mapped_env , staticStore )
139+ return generateMainComposeFile (arduinoApp , idProvider , bricksIndex , p .pythonImage , cfg , mapped_env , staticStore )
134140}
135141
136142func (p * Provision ) init (
@@ -207,6 +213,7 @@ const (
207213
208214func generateMainComposeFile (
209215 app * app.ArduinoApp ,
216+ idProvider * app.IDProvider ,
210217 bricksIndex * bricksindex.BricksIndex ,
211218 pythonImage string ,
212219 cfg config.Configuration ,
@@ -288,10 +295,14 @@ func generateMainComposeFile(
288295 type mainService struct {
289296 Main service `yaml:"main"`
290297 }
298+ type secretObj struct {
299+ File string `yaml:"file"`
300+ }
291301 var mainAppCompose struct {
292- Name string `yaml:"name"`
293- Include []string `yaml:"include,omitempty"`
294- Services * mainService `yaml:"services,omitempty"`
302+ Name string `yaml:"name"`
303+ Include []string `yaml:"include,omitempty"`
304+ Services * mainService `yaml:"services,omitempty"`
305+ Secrets map [string ]secretObj `yaml:"secrets,omitempty"`
295306 }
296307 // Merge compose
297308 composeProjectName , err := getAppComposeProjectNameFromApp (* app , cfg )
@@ -356,6 +367,22 @@ func generateMainComposeFile(
356367 }
357368 }
358369
370+ // Add secrets (if defined)
371+ appID , err := idProvider .IDFromPath (app .FullPath )
372+ if err != nil {
373+ return fmt .Errorf ("failed to retrieve app id from path %s: %w" , app .FullPath .String (), err )
374+ }
375+ secrets , err := secrets .GetSecrets (cfg , appID )
376+ if err != nil {
377+ slog .Error ("Failed to retrieve secrets for app" , slog .String ("app_path" , app .FullPath .String ()), slog .String ("app_id" , appID .String ()), slog .Any ("error" , err ))
378+ }
379+ secretsList := make ([]string , 0 , len (secrets ))
380+ mainAppCompose .Secrets = make (map [string ]secretObj , len (secrets ))
381+ for _ , secret := range secrets {
382+ secretsList = append (secretsList , secret .Name )
383+ mainAppCompose .Secrets [secret .Name ] = secretObj {File : secret .Path }
384+ }
385+
359386 mainAppCompose .Services = & mainService {
360387 Main : service {
361388 Image : pythonImage ,
@@ -380,6 +407,7 @@ func generateMainComposeFile(
380407 "max-file" : "2" ,
381408 },
382409 },
410+ Secrets : secretsList ,
383411 },
384412 }
385413
0 commit comments