Skip to content

Commit 15f24ac

Browse files
committed
add new build reasons to track what triggers workspace builds
1 parent 0367dba commit 15f24ac

File tree

16 files changed

+235
-19
lines changed

16 files changed

+235
-19
lines changed

cli/parameter.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,11 @@ func parseParameterMapFile(parameterFile string) (map[string]string, error) {
145145
return parameterMap, nil
146146
}
147147

148-
// buildFlags contains options relating to troubleshooting provisioner jobs.
148+
// buildFlags contains options relating to troubleshooting provisioner jobs
149+
// and setting the reason for the workspace build.
149150
type buildFlags struct {
150151
provisionerLogDebug bool
152+
reason string
151153
}
152154

153155
func (bf *buildFlags) cliOptions() []serpent.Option {
@@ -160,5 +162,17 @@ This is useful for troubleshooting build issues.`,
160162
Value: serpent.BoolOf(&bf.provisionerLogDebug),
161163
Hidden: true,
162164
},
165+
{
166+
Flag: "reason",
167+
Description: `Sets the reason for the workspace build (cli, vscode_connection, jetbrains_connection).`,
168+
Value: serpent.EnumOf(
169+
&bf.reason,
170+
string(codersdk.BuildReasonCLI),
171+
string(codersdk.BuildReasonVSCodeConnection),
172+
string(codersdk.BuildReasonJetbrainsConnection),
173+
),
174+
Default: string(codersdk.BuildReasonCLI),
175+
Hidden: true,
176+
},
163177
}
164178
}

cli/ssh.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -873,7 +873,9 @@ func getWorkspaceAndAgent(ctx context.Context, inv *serpent.Invocation, client *
873873
// It's possible for a workspace build to fail due to the template requiring starting
874874
// workspaces with the active version.
875875
_, _ = fmt.Fprintf(inv.Stderr, "Workspace was stopped, starting workspace to allow connecting to %q...\n", workspace.Name)
876-
_, err = startWorkspace(inv, client, workspace, workspaceParameterFlags{}, buildFlags{}, WorkspaceStart)
876+
_, err = startWorkspace(inv, client, workspace, workspaceParameterFlags{}, buildFlags{
877+
reason: string(codersdk.BuildReasonSSHConnection),
878+
}, WorkspaceStart)
877879
if cerr, ok := codersdk.AsError(err); ok {
878880
switch cerr.StatusCode() {
879881
case http.StatusConflict:

cli/start.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ func buildWorkspaceStartRequest(inv *serpent.Invocation, client *codersdk.Client
169169
if buildFlags.provisionerLogDebug {
170170
wbr.LogLevel = codersdk.ProvisionerLogLevelDebug
171171
}
172+
if buildFlags.reason != "" {
173+
wbr.Reason = codersdk.CreateWorkspaceBuildReason(buildFlags.reason)
174+
}
172175

173176
return wbr, nil
174177
}

coderd/apidoc/docs.go

Lines changed: 44 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

Lines changed: 49 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
-- It's not possible to delete enum values.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
ALTER TYPE build_reason ADD VALUE IF NOT EXISTS 'dashboard';
2+
ALTER TYPE build_reason ADD VALUE IF NOT EXISTS 'cli';
3+
ALTER TYPE build_reason ADD VALUE IF NOT EXISTS 'ssh_connection';
4+
ALTER TYPE build_reason ADD VALUE IF NOT EXISTS 'vscode_connection';
5+
ALTER TYPE build_reason ADD VALUE IF NOT EXISTS 'jetbrains_connection';

coderd/workspacebuilds.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,10 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
343343
Experiments(api.Experiments).
344344
TemplateVersionPresetID(createBuild.TemplateVersionPresetID)
345345

346+
if createBuild.Reason != "" {
347+
builder = builder.Reason(database.BuildReason(createBuild.Reason))
348+
}
349+
346350
var (
347351
previousWorkspaceBuild database.WorkspaceBuild
348352
workspaceBuild *database.WorkspaceBuild

codersdk/workspacebuilds.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,16 @@ const (
4949
// BuildReasonDormancy "dormancy" is used when a build to stop a workspace is triggered due to inactivity (dormancy).
5050
// The initiator id/username in this case is the workspace owner and can be ignored.
5151
BuildReasonDormancy BuildReason = "dormancy"
52+
// BuildReasonDashboard "dashboard" is used when a build to start a workspace is triggered by the dashboard.
53+
BuildReasonDashboard BuildReason = "dashboard"
54+
// BuildReasonCLI "cli" is used when a build to start a workspace is triggered by the CLI.
55+
BuildReasonCLI BuildReason = "cli"
56+
// BuildReasonSSHConnection "ssh_connection" is used when a build to start a workspace is triggered by an SSH connection.
57+
BuildReasonSSHConnection BuildReason = "ssh_connection"
58+
// BuildReasonVSCodeConnection "vscode_connection" is used when a build to start a workspace is triggered by a VS Code connection.
59+
BuildReasonVSCodeConnection BuildReason = "vscode_connection"
60+
// BuildReasonJetbrainsConnection "jetbrains_connection" is used when a build to start a workspace is triggered by a JetBrains connection.
61+
BuildReasonJetbrainsConnection BuildReason = "jetbrains_connection"
5262
)
5363

5464
// WorkspaceBuild is an at-point representation of a workspace state.

codersdk/workspaces.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,16 @@ const (
9393
ProvisionerLogLevelDebug ProvisionerLogLevel = "debug"
9494
)
9595

96+
type CreateWorkspaceBuildReason string
97+
98+
const (
99+
CreateWorkspaceBuildReasonDashboard CreateWorkspaceBuildReason = "dashboard"
100+
CreateWorkspaceBuildReasonCLI CreateWorkspaceBuildReason = "cli"
101+
CreateWorkspaceBuildReasonSSHConnection CreateWorkspaceBuildReason = "ssh_connection"
102+
CreateWorkspaceBuildReasonVSCodeConnection CreateWorkspaceBuildReason = "vscode_connection"
103+
CreateWorkspaceBuildReasonJetbrainsConnection CreateWorkspaceBuildReason = "jetbrains_connection"
104+
)
105+
96106
// CreateWorkspaceBuildRequest provides options to update the latest workspace build.
97107
type CreateWorkspaceBuildRequest struct {
98108
TemplateVersionID uuid.UUID `json:"template_version_id,omitempty" format:"uuid"`
@@ -110,6 +120,8 @@ type CreateWorkspaceBuildRequest struct {
110120
LogLevel ProvisionerLogLevel `json:"log_level,omitempty" validate:"omitempty,oneof=debug"`
111121
// TemplateVersionPresetID is the ID of the template version preset to use for the build.
112122
TemplateVersionPresetID uuid.UUID `json:"template_version_preset_id,omitempty" format:"uuid"`
123+
// Reason sets the reason for the workspace build.
124+
Reason CreateWorkspaceBuildReason `json:"reason,omitempty" validate:"omitempty,oneof=dashboard cli ssh_connection vscode_connection jetbrains_connection"`
113125
}
114126

115127
type WorkspaceOptions struct {

0 commit comments

Comments
 (0)