Thanks to visit codestin.com
Credit goes to github.com

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

+22-5
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

+5-14
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

+41-24
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)