diff --git a/coderd/prebuilds/controller.go b/coderd/prebuilds/controller.go index 2ad2137a58..2c16981863 100644 --- a/coderd/prebuilds/controller.go +++ b/coderd/prebuilds/controller.go @@ -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( diff --git a/coderd/provisionerdserver/provisionerdserver.go b/coderd/provisionerdserver/provisionerdserver.go index 2a58aa421f..071d1daaa1 100644 --- a/coderd/provisionerdserver/provisionerdserver.go +++ b/coderd/provisionerdserver/provisionerdserver.go @@ -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"` } diff --git a/coderd/wsbuilder/wsbuilder.go b/coderd/wsbuilder/wsbuilder.go index a31e5eff46..275fea0f1c 100644 --- a/coderd/wsbuilder/wsbuilder.go +++ b/coderd/wsbuilder/wsbuilder.go @@ -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{ diff --git a/provisioner/terraform/provision.go b/provisioner/terraform/provision.go index 3025e5de36..f3d9e41296 100644 --- a/provisioner/terraform/provision.go +++ b/provisioner/terraform/provision.go @@ -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 } diff --git a/provisionerd/provisionerd.go b/provisionerd/provisionerd.go index e3b8da8bfe..c8a3da9eca 100644 --- a/provisionerd/provisionerd.go +++ b/provisionerd/provisionerd.go @@ -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), ) } diff --git a/provisionersdk/proto/provisioner.proto b/provisionersdk/proto/provisioner.proto index 2e44292d8a..843aec3f04 100644 --- a/provisionersdk/proto/provisioner.proto +++ b/provisionersdk/proto/provisioner.proto @@ -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 diff --git a/site/e2e/provisionerGenerated.ts b/site/e2e/provisionerGenerated.ts index 6943c54a30..20dae86ac7 100644 --- a/site/e2e/provisionerGenerated.ts +++ b/site/e2e/provisionerGenerated.ts @@ -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; }, };