@@ -377,6 +377,11 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
377377 state = createBuild .ProvisionerState
378378 }
379379
380+ var parameters []codersdk.WorkspaceBuildParameter
381+ if createBuild .RichParameterValues != nil {
382+ parameters = createBuild .RichParameterValues
383+ }
384+
380385 if createBuild .Orphan {
381386 if createBuild .Transition != codersdk .WorkspaceTransitionDelete {
382387 httpapi .Write (ctx , rw , http .StatusBadRequest , codersdk.Response {
@@ -449,6 +454,24 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
449454 state = priorHistory .ProvisionerState
450455 }
451456
457+ if parameters == nil {
458+ buildParameters , err := api .Database .GetWorkspaceBuildParameters (ctx , priorHistory .ID )
459+ if err != nil {
460+ httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
461+ Message : "Internal error fetching prior workspace build parameters." ,
462+ Detail : err .Error (),
463+ })
464+ return
465+ }
466+ parameters = make ([]codersdk.WorkspaceBuildParameter , 0 , len (buildParameters ))
467+ for _ , param := range buildParameters {
468+ parameters = append (parameters , codersdk.WorkspaceBuildParameter {
469+ Name : param .Name ,
470+ Value : param .Value ,
471+ })
472+ }
473+ }
474+
452475 var workspaceBuild database.WorkspaceBuild
453476 var provisionerJob database.ProvisionerJob
454477 // This must happen in a transaction to ensure history can be inserted, and
@@ -532,6 +555,21 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
532555 return xerrors .Errorf ("insert workspace build: %w" , err )
533556 }
534557
558+ names := make ([]string , 0 , len (parameters ))
559+ values := make ([]string , 0 , len (parameters ))
560+ for _ , param := range parameters {
561+ names = append (names , param .Name )
562+ values = append (values , param .Value )
563+ }
564+ err = db .InsertWorkspaceBuildParameters (ctx , database.InsertWorkspaceBuildParametersParams {
565+ WorkspaceBuildID : workspaceBuildID ,
566+ Name : names ,
567+ Value : values ,
568+ })
569+ if err != nil {
570+ return xerrors .Errorf ("insert workspace build parameter: %w" , err )
571+ }
572+
535573 return nil
536574 }, nil )
537575 if err != nil {
@@ -716,6 +754,42 @@ func (api *API) workspaceBuildResources(rw http.ResponseWriter, r *http.Request)
716754 api .provisionerJobResources (rw , r , job )
717755}
718756
757+ // @Summary Get build parameters for workspace build
758+ // @ID get-build-parameters-for-workspace-build
759+ // @Security CoderSessionToken
760+ // @Produce json
761+ // @Tags Builds
762+ // @Param workspacebuild path string true "Workspace build ID"
763+ // @Success 200 {array} codersdk.WorkspaceBuildParameter
764+ // @Router /workspacebuilds/{workspacebuild}/parameters [get]
765+ func (api * API ) workspaceBuildParameters (rw http.ResponseWriter , r * http.Request ) {
766+ ctx := r .Context ()
767+ workspaceBuild := httpmw .WorkspaceBuildParam (r )
768+ workspace , err := api .Database .GetWorkspaceByID (ctx , workspaceBuild .WorkspaceID )
769+ if err != nil {
770+ httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
771+ Message : "No workspace exists for this job." ,
772+ })
773+ return
774+ }
775+
776+ if ! api .Authorize (r , rbac .ActionRead , workspace ) {
777+ httpapi .ResourceNotFound (rw )
778+ return
779+ }
780+
781+ parameters , err := api .Database .GetWorkspaceBuildParameters (ctx , workspaceBuild .ID )
782+ if err != nil {
783+ httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
784+ Message : "Internal error fetching workspace build parameters." ,
785+ Detail : err .Error (),
786+ })
787+ return
788+ }
789+ apiParameters := convertWorkspaceBuildParameters (parameters )
790+ httpapi .Write (ctx , rw , http .StatusOK , apiParameters )
791+ }
792+
719793// @Summary Get workspace build logs
720794// @ID get-workspace-build-logs
721795// @Security CoderSessionToken
@@ -1084,3 +1158,16 @@ func convertWorkspaceStatus(jobStatus codersdk.ProvisionerJobStatus, transition
10841158 // return error status since we should never get here
10851159 return codersdk .WorkspaceStatusFailed
10861160}
1161+
1162+ func convertWorkspaceBuildParameters (parameters []database.WorkspaceBuildParameter ) []codersdk.WorkspaceBuildParameter {
1163+ var apiParameters = make ([]codersdk.WorkspaceBuildParameter , 0 , len (parameters ))
1164+
1165+ for _ , p := range parameters {
1166+ apiParameter := codersdk.WorkspaceBuildParameter {
1167+ Name : p .Name ,
1168+ Value : p .Value ,
1169+ }
1170+ apiParameters = append (apiParameters , apiParameter )
1171+ }
1172+ return apiParameters
1173+ }
0 commit comments