@@ -5,9 +5,11 @@ import (
5
5
"encoding/base64"
6
6
"encoding/json"
7
7
"fmt"
8
+ "github.com/diggerhq/digger/backend/locking"
8
9
"github.com/diggerhq/digger/backend/segment"
9
10
"github.com/diggerhq/digger/backend/services"
10
11
comment_updater "github.com/diggerhq/digger/libs/comment_utils/reporting"
12
+ dg_locking "github.com/diggerhq/digger/libs/locking"
11
13
orchestrator_scheduler "github.com/diggerhq/digger/libs/orchestrator/scheduler"
12
14
"github.com/google/uuid"
13
15
"log"
@@ -24,7 +26,7 @@ import (
24
26
"github.com/diggerhq/digger/backend/models"
25
27
"github.com/diggerhq/digger/backend/utils"
26
28
dg_configuration "github.com/diggerhq/digger/libs/digger_config"
27
- orchestrator "github.com/diggerhq/digger/libs/orchestrator"
29
+ "github.com/diggerhq/digger/libs/orchestrator"
28
30
dg_github "github.com/diggerhq/digger/libs/orchestrator/github"
29
31
"github.com/dominikbraun/graph"
30
32
"github.com/gin-gonic/gin"
@@ -469,12 +471,45 @@ func handlePullRequestEvent(gh utils.GithubClientProvider, payload *github.PullR
469
471
return nil
470
472
}
471
473
474
+ diggerCommand , err := orchestrator .GetCommandFromJob (jobsForImpactedProjects [0 ])
475
+ if err != nil {
476
+ log .Printf ("could not determine digger command from job: %v" , jobsForImpactedProjects [0 ].Commands )
477
+ utils .InitCommentReporter (ghService , prNumber , fmt .Sprintf (":x: could not determine digger command from job: %v" , err ))
478
+ return fmt .Errorf ("unkown digger command in comment %v" , err )
479
+ }
480
+
472
481
commentReporter , err := utils .InitCommentReporter (ghService , prNumber , ":construction_worker: Digger starting..." )
473
482
if err != nil {
474
483
log .Printf ("Error initializing comment reporter: %v" , err )
475
484
return fmt .Errorf ("error initializing comment reporter" )
476
485
}
477
486
487
+ // perform locking/unlocking in backend
488
+ for _ , project := range impactedProjects {
489
+ prLock := dg_locking.PullRequestLock {
490
+ InternalLock : locking.BackendDBLock {
491
+ OrgId : organisationId ,
492
+ },
493
+ CIService : ghService ,
494
+ Reporter : comment_updater.NoopReporter {},
495
+ ProjectName : project .Name ,
496
+ ProjectNamespace : repoFullName ,
497
+ PrNumber : prNumber ,
498
+ }
499
+ err = PerformLockingActionFromCommand (prLock , * diggerCommand )
500
+ if err != nil {
501
+ utils .InitCommentReporter (ghService , prNumber , fmt .Sprintf (":x: Failed perform lock action on project: %v %v" , project .Name , err ))
502
+ return fmt .Errorf ("failed to perform lock action on project: %v, %v" , project .Name , err )
503
+ }
504
+ }
505
+
506
+ // if commands are locking or unlocking we don't need to trigger any jobs
507
+ if * diggerCommand == orchestrator .DiggerCommandUnlock ||
508
+ * diggerCommand == orchestrator .DiggerCommandLock {
509
+ utils .InitCommentReporter (ghService , prNumber , fmt .Sprintf (":white_check_mark: Command %v completed successfully" , * diggerCommand ))
510
+ return nil
511
+ }
512
+
478
513
err = utils .ReportInitialJobsStatus (commentReporter , jobsForImpactedProjects )
479
514
if err != nil {
480
515
log .Printf ("Failed to comment initial status for jobs: %v" , err )
@@ -499,7 +534,7 @@ func handlePullRequestEvent(gh utils.GithubClientProvider, payload *github.PullR
499
534
impactedJobsMap [j .ProjectName ] = j
500
535
}
501
536
502
- batchId , _ , err := utils .ConvertJobsToDiggerJobs (orchestrator . DiggerCommandPlan , organisationId , impactedJobsMap , impactedProjectsMap , projectsGraph , installationId , * branch , prNumber , repoOwner , repoName , repoFullName , commentReporter .CommentId , diggerYmlStr )
537
+ batchId , _ , err := utils .ConvertJobsToDiggerJobs (* diggerCommand , organisationId , impactedJobsMap , impactedProjectsMap , projectsGraph , installationId , * branch , prNumber , repoOwner , repoName , repoFullName , commentReporter .CommentId , diggerYmlStr )
503
538
if err != nil {
504
539
log .Printf ("ConvertJobsToDiggerJobs error: %v" , err )
505
540
utils .InitCommentReporter (ghService , prNumber , fmt .Sprintf (":x: ConvertJobsToDiggerJobs error: %v" , err ))
@@ -664,7 +699,7 @@ func handleIssueCommentEvent(gh utils.GithubClientProvider, payload *github.Issu
664
699
}
665
700
666
701
if ! config .AllowDraftPRs && isDraft {
667
- log .Printf ("AllowDraftPRs is enabled , skipping PR: %v" , issueNumber )
702
+ log .Printf ("AllowDraftPRs is disabled , skipping PR: %v" , issueNumber )
668
703
return nil
669
704
}
670
705
@@ -696,9 +731,30 @@ func handleIssueCommentEvent(gh utils.GithubClientProvider, payload *github.Issu
696
731
}
697
732
log .Printf ("GitHub IssueComment event processed successfully\n " )
698
733
699
- if err != nil {
700
- log .Printf ("GetGithubService error: %v" , err )
701
- return fmt .Errorf ("error getting github prservice" )
734
+ // perform unlocking in backend
735
+ for _ , project := range impactedProjects {
736
+ prLock := dg_locking.PullRequestLock {
737
+ InternalLock : locking.BackendDBLock {
738
+ OrgId : orgId ,
739
+ },
740
+ CIService : ghService ,
741
+ Reporter : comment_updater.NoopReporter {},
742
+ ProjectName : project .Name ,
743
+ ProjectNamespace : repoFullName ,
744
+ PrNumber : issueNumber ,
745
+ }
746
+ err = PerformLockingActionFromCommand (prLock , * diggerCommand )
747
+ if err != nil {
748
+ utils .InitCommentReporter (ghService , issueNumber , fmt .Sprintf (":x: Failed perform lock action on project: %v %v" , project .Name , err ))
749
+ return fmt .Errorf ("failed perform lock action on project: %v %v" , project .Name , err )
750
+ }
751
+ }
752
+
753
+ // if commands are locking or unlocking we don't need to trigger any jobs
754
+ if * diggerCommand == orchestrator .DiggerCommandUnlock ||
755
+ * diggerCommand == orchestrator .DiggerCommandLock {
756
+ utils .InitCommentReporter (ghService , issueNumber , fmt .Sprintf (":white_check_mark: Command %v completed successfully" , * diggerCommand ))
757
+ return nil
702
758
}
703
759
704
760
jobs , _ , err := dg_github .ConvertGithubIssueCommentEventToJobs (payload , impactedProjects , requestedProject , config .Workflows , prBranchName )
@@ -787,6 +843,33 @@ func handleIssueCommentEvent(gh utils.GithubClientProvider, payload *github.Issu
787
843
return nil
788
844
}
789
845
846
+ func PerformLockingActionFromCommand (prLock dg_locking.PullRequestLock , command orchestrator.DiggerCommand ) error {
847
+ var err error
848
+ switch command {
849
+ case orchestrator .DiggerCommandUnlock :
850
+ _ , err = prLock .Unlock ()
851
+ if err != nil {
852
+ err = fmt .Errorf ("failed to unlock project: %v" , err )
853
+ }
854
+ case orchestrator .DiggerCommandPlan :
855
+ _ , err = prLock .Lock ()
856
+ if err != nil {
857
+ err = fmt .Errorf ("failed to lock project: %v" , err )
858
+ }
859
+ case orchestrator .DiggerCommandApply :
860
+ _ , err = prLock .Lock ()
861
+ if err != nil {
862
+ err = fmt .Errorf ("failed to lock project: %v" , err )
863
+ }
864
+ case orchestrator .DiggerCommandLock :
865
+ _ , err = prLock .Lock ()
866
+ if err != nil {
867
+ err = fmt .Errorf ("failed to lock project: %v" , err )
868
+ }
869
+ }
870
+ return err
871
+ }
872
+
790
873
func TriggerDiggerJobs (client * github.Client , repoOwner string , repoName string , batchId * uuid.UUID , prNumber int , prService * dg_github.GithubService ) error {
791
874
_ , err := models .DB .GetDiggerBatch (batchId )
792
875
if err != nil {
0 commit comments