Add provision job metadata to identify prebuilds

Signed-off-by: Danny Kopping <danny@coder.com>
This commit is contained in:
Danny Kopping
2025-01-28 09:20:08 +00:00
parent b7c43f663e
commit a59a03d5f4
7 changed files with 23 additions and 1 deletions

View File

@ -323,7 +323,8 @@ func (c Controller) provision(ctx context.Context, db database.Store, prebuildID
Reason(database.BuildReasonInitiator).
Initiator(PrebuildOwnerUUID).
ActiveVersion().
VersionID(template.ActiveVersionID)
VersionID(template.ActiveVersionID).
MarkPrebuild()
// RichParameterValues(req.RichParameterValues) // TODO: fetch preset's params
_, provisionerJob, _, err := builder.Build(

View File

@ -621,6 +621,7 @@ func (s *server) acquireProtoJob(ctx context.Context, job database.ProvisionerJo
WorkspaceOwnerSshPrivateKey: ownerSSHPrivateKey,
WorkspaceBuildId: workspaceBuild.ID.String(),
WorkspaceOwnerLoginType: string(owner.LoginType),
IsPrebuild: input.IsPrebuild,
},
LogLevel: input.LogLevel,
},
@ -2345,6 +2346,7 @@ type TemplateVersionImportJob struct {
type WorkspaceProvisionJob struct {
WorkspaceBuildID uuid.UUID `json:"workspace_build_id"`
DryRun bool `json:"dry_run"`
IsPrebuild bool `json:"is_prebuild,omitempty"`
LogLevel string `json:"log_level,omitempty"`
}

View File

@ -72,6 +72,7 @@ type Builder struct {
lastBuildJob *database.ProvisionerJob
parameterNames *[]string
parameterValues *[]string
prebuild bool
verifyNoLegacyParametersOnce bool
}
@ -168,6 +169,12 @@ func (b Builder) RichParameterValues(p []codersdk.WorkspaceBuildParameter) Build
return b
}
func (b Builder) MarkPrebuild() Builder {
// nolint: revive
b.prebuild = true
return b
}
// SetLastWorkspaceBuildInTx prepopulates the Builder's cache with the last workspace build. This allows us
// to avoid a repeated database query when the Builder's caller also needs the workspace build, e.g. auto-start &
// auto-stop.
@ -295,6 +302,7 @@ func (b *Builder) buildTx(authFunc func(action policy.Action, object rbac.Object
input, err := json.Marshal(provisionerdserver.WorkspaceProvisionJob{
WorkspaceBuildID: workspaceBuildID,
LogLevel: b.logLevel,
IsPrebuild: b.prebuild,
})
if err != nil {
return nil, nil, nil, BuildError{

View File

@ -262,6 +262,9 @@ func provisionEnv(
"CODER_WORKSPACE_TEMPLATE_VERSION="+metadata.GetTemplateVersion(),
"CODER_WORKSPACE_BUILD_ID="+metadata.GetWorkspaceBuildId(),
)
if metadata.GetIsPrebuild() {
env = append(env, "CODER_WORKSPACE_IS_PREBUILD=true")
}
for key, value := range provisionersdk.AgentScriptEnv() {
env = append(env, key+"="+value)
}
@ -278,6 +281,7 @@ func provisionEnv(
// The idea behind using TF_LOG=JSON instead of TF_LOG=debug is ensuring the proper log format.
env = append(env, "TF_LOG=JSON")
}
return env, nil
}

View File

@ -355,6 +355,7 @@ func (p *Server) acquireAndRunOne(client proto.DRPCProvisionerDaemonClient) {
slog.F("workspace_build_id", build.WorkspaceBuildId),
slog.F("workspace_id", build.Metadata.WorkspaceId),
slog.F("workspace_name", build.WorkspaceName),
slog.F("is_prebuild", build.Metadata.IsPrebuild),
)
span.SetAttributes(
@ -364,6 +365,7 @@ func (p *Server) acquireAndRunOne(client proto.DRPCProvisionerDaemonClient) {
attribute.String("workspace_owner_id", build.Metadata.WorkspaceOwnerId),
attribute.String("workspace_owner", build.Metadata.WorkspaceOwner),
attribute.String("workspace_transition", build.Metadata.WorkspaceTransition.String()),
attribute.Bool("is_prebuild", build.Metadata.IsPrebuild),
)
}

View File

@ -275,6 +275,7 @@ message Metadata {
string workspace_owner_ssh_private_key = 16;
string workspace_build_id = 17;
string workspace_owner_login_type = 18;
bool is_prebuild = 19;
}
// Config represents execution configuration shared by all subsequent requests in the Session

View File

@ -289,6 +289,7 @@ export interface Metadata {
workspaceOwnerSshPrivateKey: string;
workspaceBuildId: string;
workspaceOwnerLoginType: string;
isPrebuild: boolean;
}
/** Config represents execution configuration shared by all subsequent requests in the Session */
@ -961,6 +962,9 @@ export const Metadata = {
if (message.workspaceOwnerLoginType !== "") {
writer.uint32(146).string(message.workspaceOwnerLoginType);
}
if (message.isPrebuild === true) {
writer.uint32(152).bool(message.isPrebuild);
}
return writer;
},
};