Skip to content

Commit 13f558b

Browse files
authored
[envsec] Add environment flag (#1679)
## Summary Adds new `--environment` flag that gets passed in to envsec. A few notes: * This flag is present in any command that allows a custom config path. The idea is that in the future users can add per environment configuration to their `devbox.json` * This PR validates in devbox.Open instead of CLI. This can probably be moved up to CLI code but this would have bloated this PR. * Related, the way we pass options to devbox.Open is very brittle. It involves a lot of copy paste that is easy to mess up. We should look to refactor that, maybe in a follow up. ## How was it tested? ``` devbox run --environment prod echo $SECRET ```
1 parent 76e1488 commit 13f558b

File tree

18 files changed

+98
-50
lines changed

18 files changed

+98
-50
lines changed

internal/boxcli/add.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,9 @@ func addCmd() *cobra.Command {
7373

7474
func addCmdFunc(cmd *cobra.Command, args []string, flags addCmdFlags) error {
7575
box, err := devbox.Open(&devopt.Opts{
76-
Dir: flags.config.path,
77-
Stderr: cmd.ErrOrStderr(),
76+
Dir: flags.config.path,
77+
Environment: flags.config.environment,
78+
Stderr: cmd.ErrOrStderr(),
7879
})
7980
if err != nil {
8081
return errors.WithStack(err)

internal/boxcli/cloud.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,9 @@ func runCloudShellCmd(cmd *cobra.Command, flags *cloudShellCmdFlags) error {
141141
}
142142

143143
box, err := devbox.Open(&devopt.Opts{
144-
Dir: flags.config.path,
145-
Stderr: cmd.ErrOrStderr(),
144+
Dir: flags.config.path,
145+
Environment: flags.config.environment,
146+
Stderr: cmd.ErrOrStderr(),
146147
})
147148
if err != nil {
148149
return errors.WithStack(err)
@@ -157,8 +158,9 @@ func runCloudInit(cmd *cobra.Command, flags *cloudShellCmdFlags) error {
157158
}
158159

159160
box, err := devbox.Open(&devopt.Opts{
160-
Dir: flags.config.path,
161-
Stderr: cmd.ErrOrStderr(),
161+
Dir: flags.config.path,
162+
Environment: flags.config.environment,
163+
Stderr: cmd.ErrOrStderr(),
162164
})
163165
if err != nil {
164166
return errors.WithStack(err)

internal/boxcli/config.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,28 @@ import (
99

1010
// to be composed into xyzCmdFlags structs
1111
type configFlags struct {
12-
path string
12+
path string
13+
environment string
1314
}
1415

1516
func (flags *configFlags) register(cmd *cobra.Command) {
1617
cmd.Flags().StringVarP(
1718
&flags.path, "config", "c", "", "path to directory containing a devbox.json config file",
1819
)
20+
cmd.Flags().StringVar(
21+
&flags.environment, "environment", "dev", "environment to use, when supported (e.g. envsec supports dev, prod, preview.)",
22+
)
1923
}
2024

2125
func (flags *configFlags) registerPersistent(cmd *cobra.Command) {
2226
cmd.PersistentFlags().StringVarP(
2327
&flags.path, "config", "c", "", "path to directory containing a devbox.json config file",
2428
)
29+
cmd.PersistentFlags().StringVar(
30+
&flags.environment, "environment", "dev", "environment to use, when supported (e.g. envsec supports dev, prod, preview.)",
31+
)
32+
}
33+
34+
func (flags *configFlags) Environment() string {
35+
return flags.environment
2536
}

internal/boxcli/generate.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,9 @@ func sshConfigCmd() *cobra.Command {
138138
func runGenerateCmd(cmd *cobra.Command, flags *generateCmdFlags) error {
139139
// Check the directory exists.
140140
box, err := devbox.Open(&devopt.Opts{
141-
Dir: flags.config.path,
142-
Stderr: cmd.ErrOrStderr(),
141+
Dir: flags.config.path,
142+
Environment: flags.config.environment,
143+
Stderr: cmd.ErrOrStderr(),
143144
})
144145
if err != nil {
145146
return errors.WithStack(err)
@@ -166,8 +167,9 @@ func runGenerateDirenvCmd(cmd *cobra.Command, flags *generateCmdFlags) error {
166167
}
167168

168169
box, err := devbox.Open(&devopt.Opts{
169-
Dir: flags.config.path,
170-
Stderr: cmd.ErrOrStderr(),
170+
Dir: flags.config.path,
171+
Environment: flags.config.environment,
172+
Stderr: cmd.ErrOrStderr(),
171173
})
172174
if err != nil {
173175
return errors.WithStack(err)

internal/boxcli/info.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ func infoCmd() *cobra.Command {
3737

3838
func infoCmdFunc(cmd *cobra.Command, pkg string, flags infoCmdFlags) error {
3939
box, err := devbox.Open(&devopt.Opts{
40-
Dir: flags.config.path,
41-
Stderr: cmd.ErrOrStderr(),
40+
Dir: flags.config.path,
41+
Environment: flags.config.environment,
42+
Stderr: cmd.ErrOrStderr(),
4243
})
4344
if err != nil {
4445
return errors.WithStack(err)

internal/boxcli/install.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ func installCmd() *cobra.Command {
3333
func installCmdFunc(cmd *cobra.Command, flags runCmdFlags) error {
3434
// Check the directory exists.
3535
box, err := devbox.Open(&devopt.Opts{
36-
Dir: flags.config.path,
37-
Stderr: cmd.ErrOrStderr(),
36+
Dir: flags.config.path,
37+
Environment: flags.config.environment,
38+
Stderr: cmd.ErrOrStderr(),
3839
})
3940
if err != nil {
4041
return errors.WithStack(err)

internal/boxcli/pull.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,9 @@ func pullCmd() *cobra.Command {
5050

5151
func pullCmdFunc(cmd *cobra.Command, url string, flags *pullCmdFlags) error {
5252
box, err := devbox.Open(&devopt.Opts{
53-
Dir: flags.config.path,
54-
Stderr: cmd.ErrOrStderr(),
53+
Dir: flags.config.path,
54+
Environment: flags.config.environment,
55+
Stderr: cmd.ErrOrStderr(),
5556
})
5657
if err != nil {
5758
return errors.WithStack(err)

internal/boxcli/push.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@ func pushCmd() *cobra.Command {
3636

3737
func pushCmdFunc(cmd *cobra.Command, url string, flags pushCmdFlags) error {
3838
box, err := devbox.Open(&devopt.Opts{
39-
Dir: flags.config.path,
40-
Stderr: cmd.ErrOrStderr(),
39+
Dir: flags.config.path,
40+
Environment: flags.config.environment,
41+
Stderr: cmd.ErrOrStderr(),
4142
})
4243
if err != nil {
4344
return errors.WithStack(err)

internal/boxcli/rm.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@ func removeCmd() *cobra.Command {
3232

3333
func runRemoveCmd(cmd *cobra.Command, args []string, flags removeCmdFlags) error {
3434
box, err := devbox.Open(&devopt.Opts{
35-
Dir: flags.config.path,
36-
Stderr: cmd.ErrOrStderr(),
35+
Dir: flags.config.path,
36+
Environment: flags.config.environment,
37+
Stderr: cmd.ErrOrStderr(),
3738
})
3839
if err != nil {
3940
return errors.WithStack(err)

internal/boxcli/run.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ func runCmd() *cobra.Command {
5959
func listScripts(cmd *cobra.Command, flags runCmdFlags) []string {
6060
box, err := devbox.Open(&devopt.Opts{
6161
Dir: flags.config.path,
62+
Environment: flags.config.environment,
6263
Stderr: cmd.ErrOrStderr(),
6364
Pure: flags.pure,
6465
IgnoreWarnings: true,
@@ -99,10 +100,11 @@ func runScriptCmd(cmd *cobra.Command, args []string, flags runCmdFlags) error {
99100

100101
// Check the directory exists.
101102
box, err := devbox.Open(&devopt.Opts{
102-
Dir: path,
103-
Stderr: cmd.ErrOrStderr(),
104-
Pure: flags.pure,
105-
Env: env,
103+
Dir: path,
104+
Environment: flags.config.environment,
105+
Stderr: cmd.ErrOrStderr(),
106+
Pure: flags.pure,
107+
Env: env,
106108
})
107109
if err != nil {
108110
return redact.Errorf("error reading devbox.json: %w", err)

internal/boxcli/services.go

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,9 @@ func servicesCmd(persistentPreRunE ...cobraFunc) *cobra.Command {
131131

132132
func listServices(cmd *cobra.Command, flags servicesCmdFlags) error {
133133
box, err := devbox.Open(&devopt.Opts{
134-
Dir: flags.config.path,
135-
Stderr: cmd.ErrOrStderr(),
134+
Dir: flags.config.path,
135+
Environment: flags.config.environment,
136+
Stderr: cmd.ErrOrStderr(),
136137
})
137138
if err != nil {
138139
return errors.WithStack(err)
@@ -147,9 +148,10 @@ func startServices(cmd *cobra.Command, services []string, flags servicesCmdFlags
147148
return err
148149
}
149150
box, err := devbox.Open(&devopt.Opts{
150-
Dir: flags.config.path,
151-
Env: env,
152-
Stderr: cmd.ErrOrStderr(),
151+
Dir: flags.config.path,
152+
Environment: flags.config.environment,
153+
Env: env,
154+
Stderr: cmd.ErrOrStderr(),
153155
})
154156
if err != nil {
155157
return errors.WithStack(err)
@@ -169,9 +171,10 @@ func stopServices(
169171
return err
170172
}
171173
box, err := devbox.Open(&devopt.Opts{
172-
Dir: servicesFlags.config.path,
173-
Env: env,
174-
Stderr: cmd.ErrOrStderr(),
174+
Dir: servicesFlags.config.path,
175+
Environment: servicesFlags.config.environment,
176+
Env: env,
177+
Stderr: cmd.ErrOrStderr(),
175178
})
176179
if err != nil {
177180
return errors.WithStack(err)
@@ -193,9 +196,10 @@ func restartServices(
193196
return err
194197
}
195198
box, err := devbox.Open(&devopt.Opts{
196-
Dir: flags.config.path,
197-
Env: env,
198-
Stderr: cmd.ErrOrStderr(),
199+
Dir: flags.config.path,
200+
Environment: flags.config.environment,
201+
Env: env,
202+
Stderr: cmd.ErrOrStderr(),
199203
})
200204
if err != nil {
201205
return errors.WithStack(err)
@@ -217,6 +221,7 @@ func startProcessManager(
217221
box, err := devbox.Open(&devopt.Opts{
218222
Dir: servicesFlags.config.path,
219223
Env: env,
224+
Environment: servicesFlags.config.environment,
220225
CustomProcessComposeFile: flags.processComposeFile,
221226
Stderr: cmd.ErrOrStderr(),
222227
})

internal/boxcli/shell.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,11 @@ func runShellCmd(cmd *cobra.Command, flags shellCmdFlags) error {
5454
}
5555
// Check the directory exists.
5656
box, err := devbox.Open(&devopt.Opts{
57-
Dir: flags.config.path,
58-
Env: env,
59-
Pure: flags.pure,
60-
Stderr: cmd.ErrOrStderr(),
57+
Dir: flags.config.path,
58+
Env: env,
59+
Environment: flags.config.environment,
60+
Pure: flags.pure,
61+
Stderr: cmd.ErrOrStderr(),
6162
})
6263
if err != nil {
6364
return errors.WithStack(err)

internal/boxcli/shellenv.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ func shellEnvFunc(
7878
}
7979
box, err := devbox.Open(&devopt.Opts{
8080
Dir: flags.config.path,
81+
Environment: flags.config.environment,
8182
Stderr: cmd.ErrOrStderr(),
8283
PreservePathStack: flags.preservePathStack,
8384
Pure: flags.pure,

internal/boxcli/update.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ func updateCmdFunc(cmd *cobra.Command, args []string, flags *updateCmdFlags) err
6666
}
6767

6868
box, err := devbox.Open(&devopt.Opts{
69-
Dir: flags.config.path,
70-
Stderr: cmd.ErrOrStderr(),
69+
Dir: flags.config.path,
70+
Environment: flags.config.environment,
71+
Stderr: cmd.ErrOrStderr(),
7172
})
7273
if err != nil {
7374
return errors.WithStack(err)

internal/devconfig/env.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ import (
1111

1212
func (c *Config) ComputedEnv(
1313
ctx context.Context,
14-
projectDir string,
14+
projectDir, environment string,
1515
) (map[string]string, error) {
1616
env := map[string]string{}
1717
var err error
1818
if c.IsEnvsecEnabled() {
19-
env, err = envsec.Env(ctx, projectDir)
19+
env, err = envsec.Env(ctx, projectDir, environment)
2020
if err != nil {
2121
ux.Fwarning(os.Stderr, "Error reading secrets from envsec: %s\n\n", err)
2222
env = map[string]string{}

internal/impl/devbox.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ const (
5959
type Devbox struct {
6060
cfg *devconfig.Config
6161
env map[string]string
62+
environment string
6263
lockfile *lock.File
6364
nix nix.Nixer
6465
projectDir string
@@ -84,9 +85,15 @@ func Open(opts *devopt.Opts) (*Devbox, error) {
8485
return nil, errors.WithStack(err)
8586
}
8687

88+
environment, err := validateEnvironment(opts.Environment)
89+
if err != nil {
90+
return nil, err
91+
}
92+
8793
box := &Devbox{
8894
cfg: cfg,
8995
env: opts.Env,
96+
environment: environment,
9097
nix: &nix.Nix{},
9198
projectDir: projectDir,
9299
pluginManager: plugin.NewManager(),
@@ -1089,7 +1096,7 @@ func (d *Devbox) configEnvs(
10891096
ctx context.Context,
10901097
existingEnv map[string]string,
10911098
) (map[string]string, error) {
1092-
env, err := d.cfg.ComputedEnv(ctx, d.ProjectDir())
1099+
env, err := d.cfg.ComputedEnv(ctx, d.ProjectDir(), d.environment)
10931100
if err != nil {
10941101
return nil, err
10951102
}
@@ -1245,3 +1252,13 @@ func (d *Devbox) RunXPaths(ctx context.Context) (string, error) {
12451252
}
12461253
return runxBinPath, nil
12471254
}
1255+
1256+
func validateEnvironment(environment string) (string, error) {
1257+
if environment == "" {
1258+
return "dev", nil
1259+
}
1260+
if environment == "dev" || environment == "prod" || environment == "preview" {
1261+
return environment, nil
1262+
}
1263+
return "", usererr.New("invalid environment %q", environment)
1264+
}

internal/impl/devopt/devboxopts.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
type Opts struct {
88
Dir string
99
Env map[string]string
10+
Environment string
1011
PreservePathStack bool
1112
Pure bool
1213
IgnoreWarnings bool

internal/integrations/envsec/envsec.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ var (
1818
binPathCache string
1919
)
2020

21-
func Env(ctx context.Context, projectDir string) (map[string]string, error) {
21+
func Env(ctx context.Context, projectDir, environment string) (map[string]string, error) {
2222
defer debug.FunctionTimer().End()
2323

2424
if envCache != nil {
@@ -29,8 +29,7 @@ func Env(ctx context.Context, projectDir string) (map[string]string, error) {
2929
return nil, err
3030
}
3131

32-
var err error
33-
envCache, err = envsecList(ctx, projectDir)
32+
envCache, err := envsecList(ctx, projectDir, environment)
3433

3534
return envCache, err
3635
}
@@ -76,7 +75,7 @@ func EnsureInitialized(ctx context.Context, projectDir string) error {
7675

7776
func envsecList(
7877
ctx context.Context,
79-
projectDir string,
78+
projectDir, environment string,
8079
) (map[string]string, error) {
8180
binPath, err := EnsureInstalled(ctx)
8281
if err != nil {
@@ -85,7 +84,7 @@ func envsecList(
8584
cmd := exec.Command(
8685
binPath, "ls", "--show",
8786
"--format", "json",
88-
"--environment", "dev",
87+
"--environment", environment,
8988
"--json-errors")
9089
cmd.Dir = projectDir
9190
var bufErr bytes.Buffer

0 commit comments

Comments
 (0)