@@ -543,6 +543,28 @@ func (s *server) acquireProtoJob(ctx context.Context, job database.ProvisionerJo
543543return nil ,failJob (fmt .Sprintf ("convert workspace transition: %s" ,err ))
544544}
545545
546+ // A previous workspace build exists
547+ var lastWorkspaceBuildParameters []database.WorkspaceBuildParameter
548+ if workspaceBuild .BuildNumber > 1 {
549+ // TODO: Should we fetch the last build that succeeded? This fetches the
550+ // previous build regardless of the status of the build.
551+ buildNum := workspaceBuild .BuildNumber - 1
552+ previous ,err := s .Database .GetWorkspaceBuildByWorkspaceIDAndBuildNumber (ctx , database.GetWorkspaceBuildByWorkspaceIDAndBuildNumberParams {
553+ WorkspaceID :workspaceBuild .WorkspaceID ,
554+ BuildNumber :buildNum ,
555+ })
556+ if err != nil && ! xerrors .Is (err ,sql .ErrNoRows ) {
557+ return nil ,xerrors .Errorf ("get last build with number=%d: %w" ,buildNum ,err )
558+ }
559+
560+ if err == nil {
561+ lastWorkspaceBuildParameters ,err = s .Database .GetWorkspaceBuildParameters (ctx ,previous .ID )
562+ if err != nil {
563+ return nil ,xerrors .Errorf ("get last build parameters %q: %w" ,previous .ID ,err )
564+ }
565+ }
566+ }
567+
546568workspaceBuildParameters ,err := s .Database .GetWorkspaceBuildParameters (ctx ,workspaceBuild .ID )
547569if err != nil {
548570return nil ,failJob (fmt .Sprintf ("get workspace build parameters: %s" ,err ))
@@ -619,12 +641,13 @@ func (s *server) acquireProtoJob(ctx context.Context, job database.ProvisionerJo
619641
620642protoJob .Type = & proto.AcquiredJob_WorkspaceBuild_ {
621643WorkspaceBuild :& proto.AcquiredJob_WorkspaceBuild {
622- WorkspaceBuildId :workspaceBuild .ID .String (),
623- WorkspaceName :workspace .Name ,
624- State :workspaceBuild .ProvisionerState ,
625- RichParameterValues :convertRichParameterValues (workspaceBuildParameters ),
626- VariableValues :asVariableValues (templateVariables ),
627- ExternalAuthProviders :externalAuthProviders ,
644+ WorkspaceBuildId :workspaceBuild .ID .String (),
645+ WorkspaceName :workspace .Name ,
646+ State :workspaceBuild .ProvisionerState ,
647+ RichParameterValues :convertRichParameterValues (workspaceBuildParameters ),
648+ PreviousParameterValues :convertRichParameterValues (lastWorkspaceBuildParameters ),
649+ VariableValues :asVariableValues (templateVariables ),
650+ ExternalAuthProviders :externalAuthProviders ,
628651Metadata :& sdkproto.Metadata {
629652CoderUrl :s .AccessURL .String (),
630653WorkspaceTransition :transition ,