feat: extend workspace build reasons to track connection types (#18827)

This PR introduces new build reason values to identify what type of
connection triggered a workspace build, helping to troubleshoot
workspace-related issues.

## Database Migration
Added migration 000349_extend_workspace_build_reason.up.sql that extends
the build_reason enum with new values:
```
dashboard, cli, ssh_connection, vscode_connection, jetbrains_connection
```

## Implementation
The build reason is specified through the API when creating new
workspace builds:

- Dashboard: Automatically sets reason to `dashboard` when users start
workspaces via the web interface
- CLI `start` command: Sets reason to `cli` when workspaces are started
via the command line
- CLI `ssh` command: Sets reason to ssh_connection when workspaces are
started due to SSH connections
- VS Code connections: Will be set to `vscode_connection` by the VS Code
extension through CLI hidden flag
(https://github.com/coder/vscode-coder/pull/550)
- JetBrains connections: Will be set to `jetbrains_connection` by the
Jetbrains Toolbox
(https://github.com/coder/coder-jetbrains-toolbox/pull/150) and
Jetbrains Gateway extension
(https://github.com/coder/jetbrains-coder/pull/561)

## UI Changes:
* Tooltip with reason in Build history
<img width="309" height="457" alt="image"
src="https://github.com/user-attachments/assets/bde8440b-bf3b-49a1-a244-ed7e8eb9763c"
/>

* Reason in Audit Logs Row tooltip
<img width="906" height="237" alt="image"
src="https://github.com/user-attachments/assets/ebbb62c7-cf07-4398-afbf-323c83fb6426"
/>

<img width="909" height="188" alt="image"
src="https://github.com/user-attachments/assets/1ddbab07-44bf-4dee-8867-b4e2cd56ae96"
/>
This commit is contained in:
Kacper Sawicki
2025-07-22 13:11:27 +02:00
committed by GitHub
parent 0ebd4356a0
commit 482463c51a
25 changed files with 388 additions and 36 deletions
+6 -1
View File
@@ -51,7 +51,12 @@ CREATE TYPE build_reason AS ENUM (
'autostop',
'dormancy',
'failedstop',
'autodelete'
'autodelete',
'dashboard',
'cli',
'ssh_connection',
'vscode_connection',
'jetbrains_connection'
);
CREATE TYPE connection_status AS ENUM (
@@ -0,0 +1 @@
-- It's not possible to delete enum values.
@@ -0,0 +1,5 @@
ALTER TYPE build_reason ADD VALUE IF NOT EXISTS 'dashboard';
ALTER TYPE build_reason ADD VALUE IF NOT EXISTS 'cli';
ALTER TYPE build_reason ADD VALUE IF NOT EXISTS 'ssh_connection';
ALTER TYPE build_reason ADD VALUE IF NOT EXISTS 'vscode_connection';
ALTER TYPE build_reason ADD VALUE IF NOT EXISTS 'jetbrains_connection';
+22 -7
View File
@@ -349,12 +349,17 @@ func AllAutomaticUpdatesValues() []AutomaticUpdates {
type BuildReason string
const (
BuildReasonInitiator BuildReason = "initiator"
BuildReasonAutostart BuildReason = "autostart"
BuildReasonAutostop BuildReason = "autostop"
BuildReasonDormancy BuildReason = "dormancy"
BuildReasonFailedstop BuildReason = "failedstop"
BuildReasonAutodelete BuildReason = "autodelete"
BuildReasonInitiator BuildReason = "initiator"
BuildReasonAutostart BuildReason = "autostart"
BuildReasonAutostop BuildReason = "autostop"
BuildReasonDormancy BuildReason = "dormancy"
BuildReasonFailedstop BuildReason = "failedstop"
BuildReasonAutodelete BuildReason = "autodelete"
BuildReasonDashboard BuildReason = "dashboard"
BuildReasonCli BuildReason = "cli"
BuildReasonSshConnection BuildReason = "ssh_connection"
BuildReasonVscodeConnection BuildReason = "vscode_connection"
BuildReasonJetbrainsConnection BuildReason = "jetbrains_connection"
)
func (e *BuildReason) Scan(src interface{}) error {
@@ -399,7 +404,12 @@ func (e BuildReason) Valid() bool {
BuildReasonAutostop,
BuildReasonDormancy,
BuildReasonFailedstop,
BuildReasonAutodelete:
BuildReasonAutodelete,
BuildReasonDashboard,
BuildReasonCli,
BuildReasonSshConnection,
BuildReasonVscodeConnection,
BuildReasonJetbrainsConnection:
return true
}
return false
@@ -413,6 +423,11 @@ func AllBuildReasonValues() []BuildReason {
BuildReasonDormancy,
BuildReasonFailedstop,
BuildReasonAutodelete,
BuildReasonDashboard,
BuildReasonCli,
BuildReasonSshConnection,
BuildReasonVscodeConnection,
BuildReasonJetbrainsConnection,
}
}