diff --git a/cli/create.go b/cli/create.go index 49002777cf04c..81a65772c26b3 100644 --- a/cli/create.go +++ b/cli/create.go @@ -370,8 +370,8 @@ type prepWorkspaceBuildArgs struct { LastBuildParameters []codersdk.WorkspaceBuildParameter SourceWorkspaceParameters []codersdk.WorkspaceBuildParameter - PromptBuildOptions bool - BuildOptions []codersdk.WorkspaceBuildParameter + PromptEphemeralParameters bool + EphemeralParameters []codersdk.WorkspaceBuildParameter PromptRichParameters bool RichParameters []codersdk.WorkspaceBuildParameter @@ -405,8 +405,8 @@ func prepWorkspaceBuild(inv *serpent.Invocation, client *codersdk.Client, args p resolver := new(ParameterResolver). WithLastBuildParameters(args.LastBuildParameters). WithSourceWorkspaceParameters(args.SourceWorkspaceParameters). - WithPromptBuildOptions(args.PromptBuildOptions). - WithBuildOptions(args.BuildOptions). + WithPromptEphemeralParameters(args.PromptEphemeralParameters). + WithEphemeralParameters(args.EphemeralParameters). WithPromptRichParameters(args.PromptRichParameters). WithRichParameters(args.RichParameters). WithRichParametersFile(parameterFile). diff --git a/cli/parameter.go b/cli/parameter.go index e674348fa1e06..02ff4e11f63e4 100644 --- a/cli/parameter.go +++ b/cli/parameter.go @@ -15,8 +15,9 @@ import ( // workspaceParameterFlags are used by commands processing rich parameters and/or build options. type workspaceParameterFlags struct { - promptBuildOptions bool - buildOptions []string + promptEphemeralParameters bool + + ephemeralParameters []string richParameterFile string richParameters []string @@ -26,23 +27,39 @@ type workspaceParameterFlags struct { } func (wpf *workspaceParameterFlags) allOptions() []serpent.Option { - options := append(wpf.cliBuildOptions(), wpf.cliParameters()...) + options := append(wpf.cliEphemeralParameters(), wpf.cliParameters()...) options = append(options, wpf.cliParameterDefaults()...) return append(options, wpf.alwaysPrompt()) } -func (wpf *workspaceParameterFlags) cliBuildOptions() []serpent.Option { +func (wpf *workspaceParameterFlags) cliEphemeralParameters() []serpent.Option { return serpent.OptionSet{ + // Deprecated - replaced with ephemeral-parameter { Flag: "build-option", Env: "CODER_BUILD_OPTION", Description: `Build option value in the format "name=value".`, - Value: serpent.StringArrayOf(&wpf.buildOptions), + UseInstead: []serpent.Option{{Flag: "ephemeral-parameter"}}, + Value: serpent.StringArrayOf(&wpf.ephemeralParameters), }, + // Deprecated - replaced with prompt-ephemeral-parameters { Flag: "build-options", Description: "Prompt for one-time build options defined with ephemeral parameters.", - Value: serpent.BoolOf(&wpf.promptBuildOptions), + UseInstead: []serpent.Option{{Flag: "prompt-ephemeral-parameters"}}, + Value: serpent.BoolOf(&wpf.promptEphemeralParameters), + }, + { + Flag: "ephemeral-parameter", + Env: "CODER_EPHEMERAL_PARAMETER", + Description: `Set the value of ephemeral parameters defined in the template. The format is "name=value".`, + Value: serpent.StringArrayOf(&wpf.ephemeralParameters), + }, + { + Flag: "prompt-ephemeral-parameters", + Env: "CODER_PROMPT_EPHEMERAL_PARAMETERS", + Description: "Prompt to set values of ephemeral parameters defined in the template. If a value has been set via --ephemeral-parameter, it will not be prompted for.", + Value: serpent.BoolOf(&wpf.promptEphemeralParameters), }, } } diff --git a/cli/parameterresolver.go b/cli/parameterresolver.go index 437b4bd407d75..41c61d5315a77 100644 --- a/cli/parameterresolver.go +++ b/cli/parameterresolver.go @@ -29,10 +29,10 @@ type ParameterResolver struct { richParameters []codersdk.WorkspaceBuildParameter richParametersDefaults map[string]string richParametersFile map[string]string - buildOptions []codersdk.WorkspaceBuildParameter + ephemeralParameters []codersdk.WorkspaceBuildParameter - promptRichParameters bool - promptBuildOptions bool + promptRichParameters bool + promptEphemeralParameters bool } func (pr *ParameterResolver) WithLastBuildParameters(params []codersdk.WorkspaceBuildParameter) *ParameterResolver { @@ -50,8 +50,8 @@ func (pr *ParameterResolver) WithRichParameters(params []codersdk.WorkspaceBuild return pr } -func (pr *ParameterResolver) WithBuildOptions(params []codersdk.WorkspaceBuildParameter) *ParameterResolver { - pr.buildOptions = params +func (pr *ParameterResolver) WithEphemeralParameters(params []codersdk.WorkspaceBuildParameter) *ParameterResolver { + pr.ephemeralParameters = params return pr } @@ -75,8 +75,8 @@ func (pr *ParameterResolver) WithPromptRichParameters(promptRichParameters bool) return pr } -func (pr *ParameterResolver) WithPromptBuildOptions(promptBuildOptions bool) *ParameterResolver { - pr.promptBuildOptions = promptBuildOptions +func (pr *ParameterResolver) WithPromptEphemeralParameters(promptEphemeralParameters bool) *ParameterResolver { + pr.promptEphemeralParameters = promptEphemeralParameters return pr } @@ -128,16 +128,16 @@ nextRichParameter: resolved = append(resolved, richParameter) } -nextBuildOption: - for _, buildOption := range pr.buildOptions { +nextEphemeralParameter: + for _, ephemeralParameter := range pr.ephemeralParameters { for i, r := range resolved { - if r.Name == buildOption.Name { - resolved[i].Value = buildOption.Value - continue nextBuildOption + if r.Name == ephemeralParameter.Name { + resolved[i].Value = ephemeralParameter.Value + continue nextEphemeralParameter } } - resolved = append(resolved, buildOption) + resolved = append(resolved, ephemeralParameter) } return resolved } @@ -209,8 +209,8 @@ func (pr *ParameterResolver) verifyConstraints(resolved []codersdk.WorkspaceBuil return templateVersionParametersNotFound(r.Name, templateVersionParameters) } - if tvp.Ephemeral && !pr.promptBuildOptions && findWorkspaceBuildParameter(tvp.Name, pr.buildOptions) == nil { - return xerrors.Errorf("ephemeral parameter %q can be used only with --build-options or --build-option flag", r.Name) + if tvp.Ephemeral && !pr.promptEphemeralParameters && findWorkspaceBuildParameter(tvp.Name, pr.ephemeralParameters) == nil { + return xerrors.Errorf("ephemeral parameter %q can be used only with --prompt-ephemeral-parameters or --ephemeral-parameter flag", r.Name) } if !tvp.Mutable && action != WorkspaceCreate { @@ -231,7 +231,7 @@ func (pr *ParameterResolver) resolveWithInput(resolved []codersdk.WorkspaceBuild firstTimeUse := pr.isFirstTimeUse(tvp.Name) promptParameterOption := pr.isLastBuildParameterInvalidOption(tvp) - if (tvp.Ephemeral && pr.promptBuildOptions) || + if (tvp.Ephemeral && pr.promptEphemeralParameters) || (action == WorkspaceCreate && tvp.Required) || (action == WorkspaceCreate && !tvp.Ephemeral) || (action == WorkspaceUpdate && promptParameterOption) || diff --git a/cli/restart_test.go b/cli/restart_test.go index d81169b8c4aba..a17a9ba2a25cb 100644 --- a/cli/restart_test.go +++ b/cli/restart_test.go @@ -60,7 +60,115 @@ func TestRestart(t *testing.T) { require.NoError(t, err, "execute failed") }) - t.Run("BuildOptions", func(t *testing.T) { + t.Run("PromptEphemeralParameters", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + workspace := coderdtest.CreateWorkspace(t, member, template.ID) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) + + inv, root := clitest.New(t, "restart", workspace.Name, "--prompt-ephemeral-parameters") + clitest.SetupConfig(t, member, root) + doneChan := make(chan struct{}) + pty := ptytest.New(t).Attach(inv) + go func() { + defer close(doneChan) + err := inv.Run() + assert.NoError(t, err) + }() + + matches := []string{ + ephemeralParameterDescription, ephemeralParameterValue, + "Restart workspace?", "yes", + "Stopping workspace", "", + "Starting workspace", "", + "workspace has been restarted", "", + } + for i := 0; i < len(matches); i += 2 { + match := matches[i] + value := matches[i+1] + pty.ExpectMatch(match) + + if value != "" { + pty.WriteLine(value) + } + } + <-doneChan + + // Verify if build option is set + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) + defer cancel() + + workspace, err := client.WorkspaceByOwnerAndName(ctx, memberUser.ID.String(), workspace.Name, codersdk.WorkspaceOptions{}) + require.NoError(t, err) + actualParameters, err := client.WorkspaceBuildParameters(ctx, workspace.LatestBuild.ID) + require.NoError(t, err) + require.Contains(t, actualParameters, codersdk.WorkspaceBuildParameter{ + Name: ephemeralParameterName, + Value: ephemeralParameterValue, + }) + }) + + t.Run("EphemeralParameterFlags", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + workspace := coderdtest.CreateWorkspace(t, member, template.ID) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) + + inv, root := clitest.New(t, "restart", workspace.Name, + "--ephemeral-parameter", fmt.Sprintf("%s=%s", ephemeralParameterName, ephemeralParameterValue)) + clitest.SetupConfig(t, member, root) + doneChan := make(chan struct{}) + pty := ptytest.New(t).Attach(inv) + go func() { + defer close(doneChan) + err := inv.Run() + assert.NoError(t, err) + }() + + matches := []string{ + "Restart workspace?", "yes", + "Stopping workspace", "", + "Starting workspace", "", + "workspace has been restarted", "", + } + for i := 0; i < len(matches); i += 2 { + match := matches[i] + value := matches[i+1] + pty.ExpectMatch(match) + + if value != "" { + pty.WriteLine(value) + } + } + <-doneChan + + // Verify if build option is set + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) + defer cancel() + + workspace, err := client.WorkspaceByOwnerAndName(ctx, memberUser.ID.String(), workspace.Name, codersdk.WorkspaceOptions{}) + require.NoError(t, err) + actualParameters, err := client.WorkspaceBuildParameters(ctx, workspace.LatestBuild.ID) + require.NoError(t, err) + require.Contains(t, actualParameters, codersdk.WorkspaceBuildParameter{ + Name: ephemeralParameterName, + Value: ephemeralParameterValue, + }) + }) + + t.Run("with deprecated build-options flag", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) @@ -114,7 +222,7 @@ func TestRestart(t *testing.T) { }) }) - t.Run("BuildOptionFlags", func(t *testing.T) { + t.Run("with deprecated build-option flag", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) diff --git a/cli/start.go b/cli/start.go index da2d394d12846..bca800471f28b 100644 --- a/cli/start.go +++ b/cli/start.go @@ -96,7 +96,7 @@ func buildWorkspaceStartRequest(inv *serpent.Invocation, client *codersdk.Client return codersdk.CreateWorkspaceBuildRequest{}, err } - buildOptions, err := asWorkspaceBuildParameters(parameterFlags.buildOptions) + ephemeralParameters, err := asWorkspaceBuildParameters(parameterFlags.ephemeralParameters) if err != nil { return codersdk.CreateWorkspaceBuildRequest{}, xerrors.Errorf("unable to parse build options: %w", err) } @@ -117,12 +117,12 @@ func buildWorkspaceStartRequest(inv *serpent.Invocation, client *codersdk.Client NewWorkspaceName: workspace.Name, LastBuildParameters: lastBuildParameters, - PromptBuildOptions: parameterFlags.promptBuildOptions, - BuildOptions: buildOptions, - PromptRichParameters: parameterFlags.promptRichParameters, - RichParameters: cliRichParameters, - RichParameterFile: parameterFlags.richParameterFile, - RichParameterDefaults: cliRichParameterDefaults, + PromptEphemeralParameters: parameterFlags.promptEphemeralParameters, + EphemeralParameters: ephemeralParameters, + PromptRichParameters: parameterFlags.promptRichParameters, + RichParameters: cliRichParameters, + RichParameterFile: parameterFlags.richParameterFile, + RichParameterDefaults: cliRichParameterDefaults, }) if err != nil { return codersdk.CreateWorkspaceBuildRequest{}, err diff --git a/cli/start_test.go b/cli/start_test.go index 404052745f00b..e9809ff4bc4ff 100644 --- a/cli/start_test.go +++ b/cli/start_test.go @@ -115,7 +115,7 @@ func TestStart(t *testing.T) { workspaceBuild := coderdtest.CreateWorkspaceBuild(t, client, workspace, database.WorkspaceTransitionStop) coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspaceBuild.ID) - inv, root := clitest.New(t, "start", workspace.Name, "--build-options") + inv, root := clitest.New(t, "start", workspace.Name, "--prompt-ephemeral-parameters") clitest.SetupConfig(t, member, root) doneChan := make(chan struct{}) pty := ptytest.New(t).Attach(inv) @@ -140,7 +140,7 @@ func TestStart(t *testing.T) { } <-doneChan - // Verify if build option is set + // Verify if ephemeral parameter is set ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) defer cancel() @@ -154,7 +154,7 @@ func TestStart(t *testing.T) { }) }) - t.Run("BuildOptionFlags", func(t *testing.T) { + t.Run("EphemeralParameterFlags", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) @@ -170,7 +170,7 @@ func TestStart(t *testing.T) { coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspaceBuild.ID) inv, root := clitest.New(t, "start", workspace.Name, - "--build-option", fmt.Sprintf("%s=%s", ephemeralParameterName, ephemeralParameterValue)) + "--ephemeral-parameter", fmt.Sprintf("%s=%s", ephemeralParameterName, ephemeralParameterValue)) clitest.SetupConfig(t, member, root) doneChan := make(chan struct{}) pty := ptytest.New(t).Attach(inv) @@ -183,7 +183,7 @@ func TestStart(t *testing.T) { pty.ExpectMatch("workspace has been started") <-doneChan - // Verify if build option is set + // Verify if ephemeral parameter is set ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) defer cancel() diff --git a/cli/testdata/coder_restart_--help.golden b/cli/testdata/coder_restart_--help.golden index 84d3e0f14996b..6208b733457ab 100644 --- a/cli/testdata/coder_restart_--help.golden +++ b/cli/testdata/coder_restart_--help.golden @@ -12,9 +12,15 @@ OPTIONS: --build-option string-array, $CODER_BUILD_OPTION Build option value in the format "name=value". + DEPRECATED: Use --ephemeral-parameter instead. --build-options bool Prompt for one-time build options defined with ephemeral parameters. + DEPRECATED: Use --prompt-ephemeral-parameters instead. + + --ephemeral-parameter string-array, $CODER_EPHEMERAL_PARAMETER + Set the value of ephemeral parameters defined in the template. The + format is "name=value". --parameter string-array, $CODER_RICH_PARAMETER Rich parameter value in the format "name=value". @@ -22,6 +28,11 @@ OPTIONS: --parameter-default string-array, $CODER_RICH_PARAMETER_DEFAULT Rich parameter default values in the format "name=value". + --prompt-ephemeral-parameters bool, $CODER_PROMPT_EPHEMERAL_PARAMETERS + Prompt to set values of ephemeral parameters defined in the template. + If a value has been set via --ephemeral-parameter, it will not be + prompted for. + --rich-parameter-file string, $CODER_RICH_PARAMETER_FILE Specify a file path with values for rich parameters defined in the template. The file should be in YAML format, containing key-value diff --git a/cli/testdata/coder_start_--help.golden b/cli/testdata/coder_start_--help.golden index a4c77e4fa9698..be40782eb5ebf 100644 --- a/cli/testdata/coder_start_--help.golden +++ b/cli/testdata/coder_start_--help.golden @@ -12,9 +12,15 @@ OPTIONS: --build-option string-array, $CODER_BUILD_OPTION Build option value in the format "name=value". + DEPRECATED: Use --ephemeral-parameter instead. --build-options bool Prompt for one-time build options defined with ephemeral parameters. + DEPRECATED: Use --prompt-ephemeral-parameters instead. + + --ephemeral-parameter string-array, $CODER_EPHEMERAL_PARAMETER + Set the value of ephemeral parameters defined in the template. The + format is "name=value". --parameter string-array, $CODER_RICH_PARAMETER Rich parameter value in the format "name=value". @@ -22,6 +28,11 @@ OPTIONS: --parameter-default string-array, $CODER_RICH_PARAMETER_DEFAULT Rich parameter default values in the format "name=value". + --prompt-ephemeral-parameters bool, $CODER_PROMPT_EPHEMERAL_PARAMETERS + Prompt to set values of ephemeral parameters defined in the template. + If a value has been set via --ephemeral-parameter, it will not be + prompted for. + --rich-parameter-file string, $CODER_RICH_PARAMETER_FILE Specify a file path with values for rich parameters defined in the template. The file should be in YAML format, containing key-value diff --git a/cli/testdata/coder_update_--help.golden b/cli/testdata/coder_update_--help.golden index 98537fade95f4..501447add29a7 100644 --- a/cli/testdata/coder_update_--help.golden +++ b/cli/testdata/coder_update_--help.golden @@ -14,9 +14,15 @@ OPTIONS: --build-option string-array, $CODER_BUILD_OPTION Build option value in the format "name=value". + DEPRECATED: Use --ephemeral-parameter instead. --build-options bool Prompt for one-time build options defined with ephemeral parameters. + DEPRECATED: Use --prompt-ephemeral-parameters instead. + + --ephemeral-parameter string-array, $CODER_EPHEMERAL_PARAMETER + Set the value of ephemeral parameters defined in the template. The + format is "name=value". --parameter string-array, $CODER_RICH_PARAMETER Rich parameter value in the format "name=value". @@ -24,6 +30,11 @@ OPTIONS: --parameter-default string-array, $CODER_RICH_PARAMETER_DEFAULT Rich parameter default values in the format "name=value". + --prompt-ephemeral-parameters bool, $CODER_PROMPT_EPHEMERAL_PARAMETERS + Prompt to set values of ephemeral parameters defined in the template. + If a value has been set via --ephemeral-parameter, it will not be + prompted for. + --rich-parameter-file string, $CODER_RICH_PARAMETER_FILE Specify a file path with values for rich parameters defined in the template. The file should be in YAML format, containing key-value diff --git a/cli/update.go b/cli/update.go index a123d5b7ade77..cf73992ea7ba4 100644 --- a/cli/update.go +++ b/cli/update.go @@ -29,7 +29,7 @@ func (r *RootCmd) update() *serpent.Command { if err != nil { return err } - if !workspace.Outdated && !parameterFlags.promptRichParameters && !parameterFlags.promptBuildOptions && len(parameterFlags.buildOptions) == 0 { + if !workspace.Outdated && !parameterFlags.promptRichParameters && !parameterFlags.promptEphemeralParameters && len(parameterFlags.ephemeralParameters) == 0 { _, _ = fmt.Fprintf(inv.Stdout, "Workspace is up-to-date.\n") return nil } diff --git a/cli/update_test.go b/cli/update_test.go index 887a787b1d36e..5344a35920653 100644 --- a/cli/update_test.go +++ b/cli/update_test.go @@ -160,7 +160,7 @@ func TestUpdateWithRichParameters(t *testing.T) { <-doneChan }) - t.Run("BuildOptions", func(t *testing.T) { + t.Run("PromptEphemeralParameters", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) @@ -186,7 +186,7 @@ func TestUpdateWithRichParameters(t *testing.T) { err := inv.Run() assert.NoError(t, err) - inv, root = clitest.New(t, "update", workspaceName, "--build-options") + inv, root = clitest.New(t, "update", workspaceName, "--prompt-ephemeral-parameters") clitest.SetupConfig(t, member, root) doneChan := make(chan struct{}) @@ -211,7 +211,7 @@ func TestUpdateWithRichParameters(t *testing.T) { } <-doneChan - // Verify if build option is set + // Verify if ephemeral parameter is set ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) defer cancel() @@ -225,7 +225,7 @@ func TestUpdateWithRichParameters(t *testing.T) { }) }) - t.Run("BuildOptionFlags", func(t *testing.T) { + t.Run("EphemeralParameterFlags", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) @@ -247,7 +247,7 @@ func TestUpdateWithRichParameters(t *testing.T) { assert.NoError(t, err) inv, root = clitest.New(t, "update", workspaceName, - "--build-option", fmt.Sprintf("%s=%s", ephemeralParameterName, ephemeralParameterValue)) + "--ephemeral-parameter", fmt.Sprintf("%s=%s", ephemeralParameterName, ephemeralParameterValue)) clitest.SetupConfig(t, member, root) doneChan := make(chan struct{}) @@ -261,7 +261,7 @@ func TestUpdateWithRichParameters(t *testing.T) { pty.ExpectMatch("Planning workspace") <-doneChan - // Verify if build option is set + // Verify if ephemeral parameter is set ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) defer cancel() diff --git a/docs/admin/templates/extending-templates/parameters.md b/docs/admin/templates/extending-templates/parameters.md index 0ce8f06f6a06e..ee72f4bbe2dc4 100644 --- a/docs/admin/templates/extending-templates/parameters.md +++ b/docs/admin/templates/extending-templates/parameters.md @@ -204,10 +204,11 @@ operational issue, but it is not advised to overuse this opportunity. ## Ephemeral parameters -Ephemeral parameters are introduced to users in the form of "build options." Use -ephemeral parameters to model specific behaviors in a Coder workspace, such as -reverting to a previous image, restoring from a volume snapshot, or building a -project without using cache. +Ephemeral parameters are introduced to users in order to model specific +behaviors in a Coder workspace, such as reverting to a previous image, restoring +from a volume snapshot, or building a project without using cache. These +parameters are only settable when starting, updating, or restarting a workspace +and do not persist after the workspace is stopped. Since these parameters are ephemeral in nature, subsequent builds proceed in the standard manner: diff --git a/docs/reference/cli/restart.md b/docs/reference/cli/restart.md index 33c8f94f27909..3b06efb6e4855 100644 --- a/docs/reference/cli/restart.md +++ b/docs/reference/cli/restart.md @@ -37,6 +37,24 @@ Build option value in the format "name=value". Prompt for one-time build options defined with ephemeral parameters. +### --ephemeral-parameter + +| | | +| ----------- | --------------------------------------- | +| Type | string-array | +| Environment | $CODER_EPHEMERAL_PARAMETER | + +Set the value of ephemeral parameters defined in the template. The format is "name=value". + +### --prompt-ephemeral-parameters + +| | | +| ----------- | ----------------------------------------------- | +| Type | bool | +| Environment | $CODER_PROMPT_EPHEMERAL_PARAMETERS | + +Prompt to set values of ephemeral parameters defined in the template. If a value has been set via --ephemeral-parameter, it will not be prompted for. + ### --parameter | | | diff --git a/docs/reference/cli/start.md b/docs/reference/cli/start.md index 7fa2f246846e7..9be64d5a83d85 100644 --- a/docs/reference/cli/start.md +++ b/docs/reference/cli/start.md @@ -37,6 +37,24 @@ Build option value in the format "name=value". Prompt for one-time build options defined with ephemeral parameters. +### --ephemeral-parameter + +| | | +| ----------- | --------------------------------------- | +| Type | string-array | +| Environment | $CODER_EPHEMERAL_PARAMETER | + +Set the value of ephemeral parameters defined in the template. The format is "name=value". + +### --prompt-ephemeral-parameters + +| | | +| ----------- | ----------------------------------------------- | +| Type | bool | +| Environment | $CODER_PROMPT_EPHEMERAL_PARAMETERS | + +Prompt to set values of ephemeral parameters defined in the template. If a value has been set via --ephemeral-parameter, it will not be prompted for. + ### --parameter | | | diff --git a/docs/reference/cli/update.md b/docs/reference/cli/update.md index 87665c79cd361..920fee20058b1 100644 --- a/docs/reference/cli/update.md +++ b/docs/reference/cli/update.md @@ -35,6 +35,24 @@ Build option value in the format "name=value". Prompt for one-time build options defined with ephemeral parameters. +### --ephemeral-parameter + +| | | +| ----------- | --------------------------------------- | +| Type | string-array | +| Environment | $CODER_EPHEMERAL_PARAMETER | + +Set the value of ephemeral parameters defined in the template. The format is "name=value". + +### --prompt-ephemeral-parameters + +| | | +| ----------- | ----------------------------------------------- | +| Type | bool | +| Environment | $CODER_PROMPT_EPHEMERAL_PARAMETERS | + +Prompt to set values of ephemeral parameters defined in the template. If a value has been set via --ephemeral-parameter, it will not be prompted for. + ### --parameter | | | diff --git a/docs/tutorials/example-guide.md b/docs/tutorials/example-guide.md index 0a16b5d830a03..b0a9de5e8dafd 100644 --- a/docs/tutorials/example-guide.md +++ b/docs/tutorials/example-guide.md @@ -1,9 +1,9 @@ # Guide Title (Only Visible in Github)
- + Your Name - +
December 13, 2023 @@ -11,15 +11,14 @@ December 13, 2023 --- This is a guide on how to make Coder guides, it is not listed on our -[official guides page](https://coder.com/docs/guides) in the docs. Intended for -those who don't frequently contribute documentation changes to the `coder/coder` +[official tutorials page](../tutorials/index.md) in the docs. Intended for those +who don't frequently contribute documentation changes to the `coder/coder` repository. ## Content -Defer to our -[Contributing/Documentation](https://coder.com/docs/contributing/documentation) -page for rules on technical writing. +Defer to our [Contributing/Documentation](../contributing/documentation.md) page +for rules on technical writing. ### Adding Photos