Skip to content

Commit cfea2b6

Browse files
committed
devcontainer scripts and timings
1 parent 179e2cc commit cfea2b6

File tree

3 files changed

+68
-43
lines changed

3 files changed

+68
-43
lines changed

agent/agent.go

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,15 +1115,32 @@ func (a *agent) handleManifest(manifestOK *checkpoint) func(ctx context.Context,
11151115
}
11161116
}
11171117

1118-
// Any defined Dev Containers may be autostarted after the start
1119-
// scripts have completed.
1120-
var postStartScripts []codersdk.WorkspaceAgentScript
1118+
var (
1119+
// Clone the scripts so we can remove the devcontainer scripts.
1120+
scripts = slices.Clone(manifest.Scripts)
1121+
// The post-start scripts are used to autostart Dev Containers
1122+
// after the start scripts have completed. This is necessary
1123+
// because the Dev Container may depend on the workspace being
1124+
// initialized (git clone, etc).
1125+
postStartScripts []codersdk.WorkspaceAgentScript
1126+
)
11211127
for _, dc := range manifest.Devcontainers {
1122-
dc = expandDevcontainerPaths(a.logger, dc)
11231128
// TODO(mafredri): Verify `@devcontainers/cli` presence.
11241129
// TODO(mafredri): Verify workspace folder exists.
11251130
// TODO(mafredri): If set, verify config path exists.
1126-
postStartScripts = append(postStartScripts, agentcontainers.DevcontainerStartupScript(dc))
1131+
dc = expandDevcontainerPaths(a.logger, dc)
1132+
1133+
for i, s := range scripts {
1134+
// The devcontainer scripts match the devcontainer ID for
1135+
// identification.
1136+
if s.ID == dc.ID {
1137+
scripts = slices.Delete(scripts, i, i+1)
1138+
if a.experimentalDevcontainersEnabled {
1139+
postStartScripts = append(postStartScripts, agentcontainers.DevcontainerStartupScript(dc, s))
1140+
}
1141+
break
1142+
}
1143+
}
11271144
}
11281145

11291146
err = a.scriptRunner.Init(

agent/agentcontainers/devcontainer.go

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,14 @@ package agentcontainers
33
import (
44
"fmt"
55

6-
"github.com/google/uuid"
7-
86
"github.com/coder/coder/v2/codersdk"
97
)
108

11-
func DevcontainerStartupScript(dc codersdk.WorkspaceAgentDevcontainer) codersdk.WorkspaceAgentScript {
12-
script := fmt.Sprintf("devcontainer up --workspace-folder %q", dc.WorkspaceFolder)
9+
func DevcontainerStartupScript(dc codersdk.WorkspaceAgentDevcontainer, script codersdk.WorkspaceAgentScript) codersdk.WorkspaceAgentScript {
10+
cmd := fmt.Sprintf("devcontainer up --workspace-folder %q", dc.WorkspaceFolder)
1311
if dc.ConfigPath != "" {
14-
script = fmt.Sprintf("%s --config %q", script, dc.ConfigPath)
15-
}
16-
return codersdk.WorkspaceAgentScript{
17-
ID: uuid.New(),
18-
LogSourceID: uuid.Nil, // TODO(mafredri): Add a devcontainer log source?
19-
LogPath: "",
20-
Script: script,
21-
Cron: "",
22-
Timeout: 0,
23-
DisplayName: fmt.Sprintf("Dev Container (%s)", dc.WorkspaceFolder),
12+
cmd = fmt.Sprintf("%s --config %q", cmd, dc.ConfigPath)
2413
}
14+
script.Script = cmd
15+
return script
2516
}

coderd/provisionerdserver/provisionerdserver.go

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2039,6 +2039,31 @@ func InsertWorkspaceResource(ctx context.Context, db database.Store, jobID uuid.
20392039
}
20402040
}
20412041

2042+
var (
2043+
devcontainers = prAgent.GetDevcontainers()
2044+
devcontainerIDs = make([]uuid.UUID, 0, len(devcontainers))
2045+
devcontainerWorkspaceFolders = make([]string, 0, len(devcontainers))
2046+
devcontainerConfigPaths = make([]string, 0, len(devcontainers))
2047+
)
2048+
if len(devcontainers) > 0 {
2049+
for _, dc := range devcontainers {
2050+
devcontainerIDs = append(devcontainerIDs, uuid.New())
2051+
devcontainerWorkspaceFolders = append(devcontainerWorkspaceFolders, dc.WorkspaceFolder)
2052+
devcontainerConfigPaths = append(devcontainerConfigPaths, dc.ConfigPath)
2053+
}
2054+
2055+
_, err = db.InsertWorkspaceAgentDevcontainers(ctx, database.InsertWorkspaceAgentDevcontainersParams{
2056+
WorkspaceAgentID: agentID,
2057+
CreatedAt: dbtime.Now(),
2058+
ID: devcontainerIDs,
2059+
WorkspaceFolder: devcontainerWorkspaceFolders,
2060+
ConfigPath: devcontainerConfigPaths,
2061+
})
2062+
if err != nil {
2063+
return xerrors.Errorf("insert agent devcontainer: %w", err)
2064+
}
2065+
}
2066+
20422067
logSourceIDs := make([]uuid.UUID, 0, len(prAgent.Scripts))
20432068
logSourceDisplayNames := make([]string, 0, len(prAgent.Scripts))
20442069
logSourceIcons := make([]string, 0, len(prAgent.Scripts))
@@ -2066,6 +2091,22 @@ func InsertWorkspaceResource(ctx context.Context, db database.Store, jobID uuid.
20662091
scriptRunOnStart = append(scriptRunOnStart, script.RunOnStart)
20672092
scriptRunOnStop = append(scriptRunOnStop, script.RunOnStop)
20682093
}
2094+
// Add a log source and script for each devcontainer so we can
2095+
// track logs and timings for each.
2096+
for _, id := range devcontainerIDs {
2097+
logSourceIDs = append(logSourceIDs, uuid.New())
2098+
logSourceDisplayNames = append(logSourceDisplayNames, "Dev Container")
2099+
logSourceIcons = append(logSourceIcons, "/emojis/1f4e6.png") // Emoji package. Or perhaps /icon/container.svg?
2100+
scriptIDs = append(scriptIDs, id) // Re-use the devcontainer ID as the script ID for identification.
2101+
scriptDisplayName = append(scriptDisplayName, "Dev Container") // TODO(mafredri): Make it unique? Grab from id used in TF?
2102+
scriptLogPaths = append(scriptLogPaths, "")
2103+
scriptSources = append(scriptSources, "")
2104+
scriptCron = append(scriptCron, "")
2105+
scriptTimeout = append(scriptTimeout, 0)
2106+
scriptStartBlocksLogin = append(scriptStartBlocksLogin, false)
2107+
scriptRunOnStart = append(scriptRunOnStart, false)
2108+
scriptRunOnStop = append(scriptRunOnStop, false)
2109+
}
20692110

20702111
_, err = db.InsertWorkspaceAgentLogSources(ctx, database.InsertWorkspaceAgentLogSourcesParams{
20712112
WorkspaceAgentID: agentID,
@@ -2096,30 +2137,6 @@ func InsertWorkspaceResource(ctx context.Context, db database.Store, jobID uuid.
20962137
return xerrors.Errorf("insert agent scripts: %w", err)
20972138
}
20982139

2099-
if devcontainers := prAgent.GetDevcontainers(); len(devcontainers) > 0 {
2100-
var (
2101-
devContainerIDs = make([]uuid.UUID, 0, len(devcontainers))
2102-
devContainerWorkspaceFolders = make([]string, 0, len(devcontainers))
2103-
devContainerConfigPaths = make([]string, 0, len(devcontainers))
2104-
)
2105-
for _, dc := range devcontainers {
2106-
devContainerIDs = append(devContainerIDs, uuid.New())
2107-
devContainerWorkspaceFolders = append(devContainerWorkspaceFolders, dc.WorkspaceFolder)
2108-
devContainerConfigPaths = append(devContainerConfigPaths, dc.ConfigPath)
2109-
}
2110-
2111-
_, err = db.InsertWorkspaceAgentDevcontainers(ctx, database.InsertWorkspaceAgentDevcontainersParams{
2112-
WorkspaceAgentID: agentID,
2113-
CreatedAt: dbtime.Now(),
2114-
ID: devContainerIDs,
2115-
WorkspaceFolder: devContainerWorkspaceFolders,
2116-
ConfigPath: devContainerConfigPaths,
2117-
})
2118-
if err != nil {
2119-
return xerrors.Errorf("insert agent devcontainer: %w", err)
2120-
}
2121-
}
2122-
21232140
for _, app := range prAgent.Apps {
21242141
// Similar logic is duplicated in terraform/resources.go.
21252142
slug := app.Slug

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy