Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 30 additions & 4 deletions backend/controllers/github.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,18 @@ package controllers

import (
"context"
"log/slog"
"net/http"
"reflect"
"strconv"

"github.com/diggerhq/digger/backend/ci_backends"
"github.com/diggerhq/digger/backend/logging"
"github.com/diggerhq/digger/backend/middleware"
"github.com/diggerhq/digger/backend/models"
"github.com/diggerhq/digger/backend/utils"
"github.com/gin-gonic/gin"
"github.com/google/go-github/v61/github"
"log/slog"
"net/http"
"reflect"
"strconv"
)

type IssueCommentHook func(gh utils.GithubClientProvider, payload *github.IssueCommentEvent, ciBackendProvider ci_backends.CiBackendProvider) error
Expand Down Expand Up @@ -114,6 +115,31 @@ func (d DiggerController) GithubAppWebHook(c *gin.Context) {
handlePullRequestEvent(gh, event, d.CiBackendProvider, appId64)
}(c.Request.Context())

case *github.CheckRunEvent:
slog.Info("Processing CheckRunEvent",
"action", event.GetAction(),
"checkRunID", event.GetCheckRun().GetID(),
)

// Only care about button clicks:
if event.GetAction() != "requested_action" {
// e.g. "created", "completed", etc. – ignore for now
return
}

ra := event.GetRequestedAction()
if ra == nil {
slog.Warn("requested_action is nil in CheckRunEvent")
return
}

identifier := ra.Identifier
// run it as a goroutine to avoid timeouts
go func(ctx context.Context) {
defer logging.InheritRequestLogger(ctx)()
handleCheckRunActionEvent(gh, identifier, event, d.CiBackendProvider, appId64)
}(c.Request.Context())
slog.Info("Processing CheckRun requested_action", "identifier", identifier)
default:
slog.Debug("Unhandled event type", "eventType", reflect.TypeOf(event))
}
Expand Down
54 changes: 21 additions & 33 deletions backend/controllers/github_comment.go
Original file line number Diff line number Diff line change
Expand Up @@ -492,14 +492,16 @@ func handleIssueCommentEvent(gh utils.GithubClientProvider, payload *github.Issu
"command", *diggerCommand,
)
// This one is for aggregate reporting
err = utils.SetPRStatusForJobs(ghService, issueNumber, jobs)
//err = utils.SetPRCommitStatusForJobs(ghService, issueNumber, jobs)
_, _, err = utils.SetPRCheckForJobs(ghService, issueNumber, jobs, *commitSha, repoName, repoOwner)
return nil
}

// If we reach here then we have created a comment that would have led to more events
segment.Track(*org, repoOwner, vcsActorID, "github", "issue_digger_comment", map[string]string{"comment": commentBody})

err = utils.SetPRStatusForJobs(ghService, issueNumber, jobs)
//err = utils.SetPRCommitStatusForJobs(ghService, issueNumber, jobs)
batchCheckRunData, jobCheckRunDataMap, err := utils.SetPRCheckForJobs(ghService, issueNumber, jobs, *commitSha, repoName, repoOwner)
if err != nil {
slog.Error("Error setting status for PR",
"issueNumber", issueNumber,
Expand Down Expand Up @@ -551,34 +553,19 @@ func handleIssueCommentEvent(gh utils.GithubClientProvider, payload *github.Issu
slog.Debug("Created AI summary comment", "commentId", aiSummaryCommentId)
}


reporterType := "lazy"
if config.Reporting.CommentsEnabled == false {
reporterType = "noop"
}

slog.Info("Converting jobs to Digger jobs",
"issueNumber", issueNumber,
"command", *diggerCommand,
"jobCount", len(impactedProjectsJobMap),
)

batchId, _, err := utils.ConvertJobsToDiggerJobs(
*diggerCommand,
"github",
orgId,
impactedProjectsJobMap,
impactedProjectsMap,
projectsGraph,
installationId,
*prSourceBranch,
issueNumber,
repoOwner,
repoName,
repoFullName,
*commitSha,
reporterCommentId,
diggerYmlStr,
0,
aiSummaryCommentId,
config.ReportTerraformOutputs,
coverAllImpactedProjects,
nil,
)
batchId, _, err := utils.ConvertJobsToDiggerJobs(*diggerCommand, reporterType, "github", orgId, impactedProjectsJobMap, impactedProjectsMap, projectsGraph, installationId, *prSourceBranch, issueNumber, repoOwner, repoName, repoFullName, *commitSha, &reporterCommentId, diggerYmlStr, 0, aiSummaryCommentId, config.ReportTerraformOutputs, coverAllImpactedProjects, nil, batchCheckRunData, jobCheckRunDataMap)
if err != nil {
slog.Error("Error converting jobs to Digger jobs",
"issueNumber", issueNumber,
Expand All @@ -593,6 +580,16 @@ func handleIssueCommentEvent(gh utils.GithubClientProvider, payload *github.Issu
"batchId", batchId,
)

batch, err := models.DB.GetDiggerBatch(batchId)
if err != nil {
slog.Error("Error getting Digger batch",
"batchId", batchId,
"error", err,
)
commentReporterManager.UpdateComment(fmt.Sprintf(":x: Could not retrieve created batch: %v", err))
return fmt.Errorf("error getting digger batch")
}

if config.CommentRenderMode == digger_config.CommentRenderModeGroupByModule &&
(*diggerCommand == scheduler.DiggerCommandPlan || *diggerCommand == scheduler.DiggerCommandApply) {

Expand All @@ -608,15 +605,6 @@ func handleIssueCommentEvent(gh utils.GithubClientProvider, payload *github.Issu
return fmt.Errorf("error posting initial comments")
}

batch, err := models.DB.GetDiggerBatch(batchId)
if err != nil {
slog.Error("Error getting Digger batch",
"batchId", batchId,
"error", err,
)
commentReporterManager.UpdateComment(fmt.Sprintf(":x: PostInitialSourceComments error: %v", err))
return fmt.Errorf("error getting digger batch")
}

batch.SourceDetails, err = json.Marshal(sourceDetails)
if err != nil {
Expand Down
21 changes: 10 additions & 11 deletions backend/controllers/github_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@ import (
"encoding/json"
"errors"
"fmt"
"log/slog"
"net/http"
"os"
"path/filepath"
"slices"
"strings"

"github.com/diggerhq/digger/backend/ci_backends"
"github.com/diggerhq/digger/backend/models"
"github.com/diggerhq/digger/backend/services"
Expand All @@ -19,12 +26,6 @@ import (
"github.com/google/uuid"
"golang.org/x/oauth2"
"gorm.io/gorm"
"log/slog"
"net/http"
"os"
"path/filepath"
"slices"
"strings"
)

// why this validation is needed: https://roadie.io/blog/avoid-leaking-github-org-data/
Expand Down Expand Up @@ -664,9 +665,7 @@ func GetDiggerConfigForBranchWithGracefulHandling(gh utils.GithubClientProvider,
}
}

diggerYmlStr, ghService, config, dependencyGraph, err := GetDiggerConfigForBranch(
gh, installationId, repoFullName, repoOwner, repoName, cloneUrl, branch, changedFiles, taConfig,
)
diggerYmlStr, ghService, config, dependencyGraph, err := GetDiggerConfigForBranchOrSha(gh, installationId, repoFullName, repoOwner, repoName, cloneUrl, branch, "", changedFiles, taConfig)

if err != nil {
errMsg := err.Error()
Expand Down Expand Up @@ -837,7 +836,7 @@ func getDiggerConfigForPR(gh utils.GithubClientProvider, orgId uint, prLabels []
return diggerYmlStr, ghService, config, dependencyGraph, &prBranch, &prCommitSha, changedFiles, nil
}

func GetDiggerConfigForBranch(gh utils.GithubClientProvider, installationId int64, repoFullName string, repoOwner string, repoName string, cloneUrl string, branch string, changedFiles []string, taConfig *tac.AtlantisConfig) (string, *github2.GithubService, *digger_config.DiggerConfig, graph.Graph[string, digger_config.Project], error) {
func GetDiggerConfigForBranchOrSha(gh utils.GithubClientProvider, installationId int64, repoFullName string, repoOwner string, repoName string, cloneUrl string, branch string, commitSha string, changedFiles []string, taConfig *tac.AtlantisConfig) (string, *github2.GithubService, *digger_config.DiggerConfig, graph.Graph[string, digger_config.Project], error) {
slog.Info("Getting Digger config for branch",
slog.Group("repository",
slog.String("fullName", repoFullName),
Expand All @@ -863,7 +862,7 @@ func GetDiggerConfigForBranch(gh utils.GithubClientProvider, installationId int6
var diggerYmlStr string
var dependencyGraph graph.Graph[string, digger_config.Project]

err = git_utils.CloneGitRepoAndDoAction(cloneUrl, branch, "", *token, "", func(dir string) error {
err = git_utils.CloneGitRepoAndDoAction(cloneUrl, branch, commitSha, *token, "", func(dir string) error {
slog.Debug("Reading Digger config from cloned repository", "directory", dir)

diggerYmlStr, err = digger_config.ReadDiggerYmlFileContents(dir)
Expand Down
53 changes: 19 additions & 34 deletions backend/controllers/github_pull_request.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ func handlePullRequestEvent(gh utils.GithubClientProvider, payload *github.PullR
// This one is for aggregate reporting
commentReporterManager.UpdateComment(":construction_worker: No projects impacted")
}
err = utils.SetPRStatusForJobs(ghService, prNumber, jobsForImpactedProjects)
_, _, err = utils.SetPRCheckForJobs(ghService, prNumber, jobsForImpactedProjects, commitSha, repoName, repoOwner)
return nil
}

Expand Down Expand Up @@ -376,7 +376,8 @@ func handlePullRequestEvent(gh utils.GithubClientProvider, payload *github.PullR
return fmt.Errorf("error initializing comment reporter")
}

err = utils.SetPRStatusForJobs(ghService, prNumber, jobsForImpactedProjects)
//err = utils.SetPRCommitStatusForJobs(ghService, prNumber, jobsForImpactedProjects)
batchCheckRunData, jobsCheckRunIdsMap, err := utils.SetPRCheckForJobs(ghService, prNumber, jobsForImpactedProjects, commitSha, repoName, repoOwner)
if err != nil {
slog.Error("Error setting status for PR",
"prNumber", prNumber,
Expand Down Expand Up @@ -464,6 +465,10 @@ func handlePullRequestEvent(gh utils.GithubClientProvider, payload *github.PullR
slog.Debug("Created AI summary comment", "commentId", aiSummaryCommentId)
}

reporterType := "lazy"
if config.Reporting.CommentsEnabled == false {
reporterType = "noop"
}
slog.Info("Converting jobs to Digger jobs",
"prNumber", prNumber,
"command", *diggerCommand,
Expand All @@ -473,28 +478,8 @@ func handlePullRequestEvent(gh utils.GithubClientProvider, payload *github.PullR
if config.RespectLayers {

}
batchId, _, err := utils.ConvertJobsToDiggerJobs(
*diggerCommand,
models.DiggerVCSGithub,
organisationId,
impactedJobsMap,
impactedProjectsMap,
projectsGraph,
installationId,
branch,
prNumber,
repoOwner,
repoName,
repoFullName,
commitSha,
commentId,
diggerYmlStr,
0,
aiSummaryCommentId,
config.ReportTerraformOutputs,
coverAllImpactedProjects,
nil,
)

batchId, _, err := utils.ConvertJobsToDiggerJobs(*diggerCommand, reporterType, models.DiggerVCSGithub, organisationId, impactedJobsMap, impactedProjectsMap, projectsGraph, installationId, branch, prNumber, repoOwner, repoName, repoFullName, commitSha, &commentId, diggerYmlStr, 0, aiSummaryCommentId, config.ReportTerraformOutputs, coverAllImpactedProjects, nil, batchCheckRunData, jobsCheckRunIdsMap)
if err != nil {
slog.Error("Error converting jobs to Digger jobs",
"prNumber", prNumber,
Expand All @@ -510,6 +495,16 @@ func handlePullRequestEvent(gh utils.GithubClientProvider, payload *github.PullR
"batchId", batchId,
)

batch, err := models.DB.GetDiggerBatch(batchId)
if err != nil {
slog.Error("Error getting Digger batch",
"batchId", batchId,
"error", err,
)
commentReporterManager.UpdateComment(fmt.Sprintf(":x: Could not retrieve created batch: %v", err))
return fmt.Errorf("error getting digger batch")
}

if config.CommentRenderMode == digger_config.CommentRenderModeGroupByModule {
slog.Info("Using GroupByModule render mode for comments", "prNumber", prNumber)

Expand All @@ -523,16 +518,6 @@ func handlePullRequestEvent(gh utils.GithubClientProvider, payload *github.PullR
return fmt.Errorf("error posting initial comments")
}

batch, err := models.DB.GetDiggerBatch(batchId)
if err != nil {
slog.Error("Error getting Digger batch",
"batchId", batchId,
"error", err,
)
commentReporterManager.UpdateComment(fmt.Sprintf(":x: PostInitialSourceComments error: %v", err))
return fmt.Errorf("error getting digger batch")
}

batch.SourceDetails, err = json.Marshal(sourceDetails)
if err != nil {
slog.Error("Error marshalling source details",
Expand Down
12 changes: 8 additions & 4 deletions backend/controllers/github_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -724,7 +724,8 @@ func TestJobsTreeWithOneJobsAndTwoProjects(t *testing.T) {
graph, err := configuration.CreateProjectDependencyGraph(projects)
assert.NoError(t, err)

_, result, err := utils.ConvertJobsToDiggerJobs("", "github", 1, jobs, projectMap, graph, 41584295, "", 2, "diggerhq", "parallel_jobs_demo", "diggerhq/parallel_jobs_demo", "", 123, "test", 0, "", false, true, nil)
var commentId int64 = 123
_, result, err := utils.ConvertJobsToDiggerJobs("", "lazy", "github", 1, jobs, projectMap, graph, 41584295, "", 2, "diggerhq", "parallel_jobs_demo", "diggerhq/parallel_jobs_demo", "", &commentId, "test", 0, "", false, true, nil, nil, nil)

assert.NoError(t, err)
assert.Equal(t, 1, len(result))
Expand Down Expand Up @@ -754,7 +755,8 @@ func TestJobsTreeWithTwoDependantJobs(t *testing.T) {
projectMap["dev"] = project1
projectMap["prod"] = project2

_, result, err := utils.ConvertJobsToDiggerJobs("", "github", 1, jobs, projectMap, graph, 123, "", 2, "", "", "test", "", 123, "test", 0, "", false, true, nil)
var commentId int64 = 123
_, result, err := utils.ConvertJobsToDiggerJobs("", "lazy", "github", 1, jobs, projectMap, graph, 123, "", 2, "", "", "test", "", &commentId, "test", 0, "", false, true, nil, nil, nil)

assert.NoError(t, err)
assert.Equal(t, 2, len(result))
Expand Down Expand Up @@ -788,7 +790,8 @@ func TestJobsTreeWithTwoIndependentJobs(t *testing.T) {
projectMap["dev"] = project1
projectMap["prod"] = project2

_, result, err := utils.ConvertJobsToDiggerJobs("", "github", 1, jobs, projectMap, graph, 123, "", 2, "", "", "test", "", 123, "test", 0, "", false, true, nil)
var commentId int64 = 123
_, result, err := utils.ConvertJobsToDiggerJobs("", "lazy", "github", 1, jobs, projectMap, graph, 123, "", 2, "", "", "test", "", &commentId, "test", 0, "", false, true, nil, nil, nil)

assert.NoError(t, err)
assert.Equal(t, 2, len(result))
Expand Down Expand Up @@ -834,7 +837,8 @@ func TestJobsTreeWithThreeLevels(t *testing.T) {
projectMap["555"] = project5
projectMap["666"] = project6

_, result, err := utils.ConvertJobsToDiggerJobs("", "github", 1, jobs, projectMap, graph, 123, "", 2, "", "", "test", "", 123, "test", 0, "", false, true, nil)
var commentId int64 = 123
_, result, err := utils.ConvertJobsToDiggerJobs("", "lazy", "github", 1, jobs, projectMap, graph, 123, "", 2, "", "", "test", "", &commentId, "test", 0, "", false, true, nil, nil, nil)

assert.NoError(t, err)
assert.Equal(t, 6, len(result))
Expand Down
Loading
Loading