@@ -982,12 +982,18 @@ func (s *server) FailJob(ctx context.Context, failJob *proto.FailedJob) (*proto.
982
982
}
983
983
984
984
var build database.WorkspaceBuild
985
+ var workspace database.Workspace
985
986
err = s .Database .InTx (func (db database.Store ) error {
986
987
build , err = db .GetWorkspaceBuildByID (ctx , input .WorkspaceBuildID )
987
988
if err != nil {
988
989
return xerrors .Errorf ("get workspace build: %w" , err )
989
990
}
990
991
992
+ workspace , err = db .GetWorkspaceByID (ctx , build .WorkspaceID )
993
+ if err != nil {
994
+ return xerrors .Errorf ("get workspace: %w" , err )
995
+ }
996
+
991
997
if jobType .WorkspaceBuild .State != nil {
992
998
err = db .UpdateWorkspaceBuildProvisionerStateByID (ctx , database.UpdateWorkspaceBuildProvisionerStateByIDParams {
993
999
ID : input .WorkspaceBuildID ,
@@ -1014,6 +1020,8 @@ func (s *server) FailJob(ctx context.Context, failJob *proto.FailedJob) (*proto.
1014
1020
return nil , err
1015
1021
}
1016
1022
1023
+ s .notifyWorkspaceBuildFailed (ctx , workspace , build )
1024
+
1017
1025
err = s .Pubsub .Publish (codersdk .WorkspaceNotifyChannel (build .WorkspaceID ), []byte {})
1018
1026
if err != nil {
1019
1027
return nil , xerrors .Errorf ("update workspace: %w" , err )
@@ -1087,6 +1095,25 @@ func (s *server) FailJob(ctx context.Context, failJob *proto.FailedJob) (*proto.
1087
1095
return & proto.Empty {}, nil
1088
1096
}
1089
1097
1098
+ func (s * server ) notifyWorkspaceBuildFailed (ctx context.Context , workspace database.Workspace , build database.WorkspaceBuild ) {
1099
+ var reason string
1100
+ if build .Reason .Valid () && build .Reason == database .BuildReasonInitiator {
1101
+ return // failed workspace builds initiated by a user should not notify
1102
+ }
1103
+
1104
+ if _ , err := s .NotificationEnqueuer .Enqueue (ctx , workspace .OwnerID , notifications .WorkspaceAutobuildFailed ,
1105
+ map [string ]string {
1106
+ "name" : workspace .Name ,
1107
+ "initiator" : build .InitiatorByUsername ,
1108
+ "reason" : reason ,
1109
+ }, "provisionerdserver" ,
1110
+ // Associate this notification with all the related entities.
1111
+ workspace .ID , workspace .OwnerID , workspace .TemplateID , workspace .OrganizationID ,
1112
+ ); err != nil {
1113
+ s .Logger .Warn (ctx , "failed to notify of failed workspace autobuild" , slog .Error (err ))
1114
+ }
1115
+ }
1116
+
1090
1117
// CompleteJob is triggered by a provision daemon to mark a provisioner job as completed.
1091
1118
func (s * server ) CompleteJob (ctx context.Context , completed * proto.CompletedJob ) (* proto.Empty , error ) {
1092
1119
ctx , span := s .startTrace (ctx , tracing .FuncName ())
0 commit comments