From f4971dec6e9924dfcb1c27758aecdd63c8dd7e8d Mon Sep 17 00:00:00 2001 From: alexey Date: Thu, 18 May 2023 14:02:26 +0100 Subject: [PATCH 01/32] check for CI_MERGE_REQUEST_IID parameter --- cmd/digger/main.go | 5 +++++ pkg/ci/main.go | 2 ++ pkg/gitlab/gitlab.go | 14 ++++---------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/cmd/digger/main.go b/cmd/digger/main.go index 67622f46f..594ae47a1 100644 --- a/cmd/digger/main.go +++ b/cmd/digger/main.go @@ -130,6 +130,11 @@ func gitLabCI(lock utils.Lock) { os.Exit(4) } + if gitLabContext.MergeRequestIId == nil { + fmt.Println("value for CI_MERGE_REQUEST_IID is not found") + os.Exit(4) + } + gitlabService, err := gitlab.NewGitLabService(gitlabToken, gitLabContext) if err != nil { fmt.Printf("failed to initialise GitLab service, %v", err) diff --git a/pkg/ci/main.go b/pkg/ci/main.go index 76c2a8669..2adc3cfcd 100644 --- a/pkg/ci/main.go +++ b/pkg/ci/main.go @@ -3,6 +3,8 @@ package ci type CIService interface { GetChangedFiles(prNumber int) ([]string, error) PublishComment(prNumber int, comment string) + + // SetStatus set status of specified pull/merge request, status could be: "pending", "failure", "success" SetStatus(prNumber int, status string, statusContext string) error GetCombinedPullRequestStatus(prNumber int) (string, error) MergePullRequest(prNumber int) error diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index a6c09e260..484c8ae2f 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -88,8 +88,7 @@ func ProcessGitLabEvent(gitlabContext *GitLabContext, diggerConfig *configuratio var impactedProjects []configuration.Project if gitlabContext.MergeRequestIId == nil { - println("Merge Request ID is not found.") - return nil, nil + return nil, fmt.Errorf("value for 'Merge Request ID' parameter is not found") } mergeRequestId := gitlabContext.MergeRequestIId @@ -148,11 +147,13 @@ func (gitlabService GitLabService) PublishComment(mergeRequestID int, comment st } } +// SetStatus GitLab implementation is using https://docs.gitlab.com/15.11/ee/api/status_checks.html (external status checks) +// https://docs.gitlab.com/ee/user/project/merge_requests/status_checks.html#add-a-status-check-service +// only supported by 'Ultimate' plan func (gitlabService GitLabService) SetStatus(mergeRequestID int, status string, statusContext string) error { //TODO implement me fmt.Printf("SetStatus: mergeRequest: %d, status: %s, statusContext: %s\n", mergeRequestID, status, statusContext) return nil - //panic("SetStatus: implement me") } func (gitlabService GitLabService) GetCombinedPullRequestStatus(mergeRequestID int) (string, error) { @@ -297,13 +298,6 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex if strings.Contains(gitLabContext.DiggerCommand, command) { for _, project := range impactedProjects { workspace := project.Workspace - //workspaceOverride, err := parseWorkspace(gitLabContext.DiggerCommand) - //if err != nil { - // return []digger.ProjectCommand{}, err - //} - //if workspaceOverride != "" { - // workspace = workspaceOverride - //} commandsPerProject = append(commandsPerProject, digger.ProjectCommand{ ProjectName: project.Name, ProjectDir: project.Dir, From 13a778930eea4827986d75482761d15b1572c4cc Mon Sep 17 00:00:00 2001 From: alexey Date: Fri, 19 May 2023 16:17:37 +0100 Subject: [PATCH 02/32] update gitlab events --- cmd/digger/main.go | 6 +++--- pkg/github/github.go | 2 +- pkg/gitlab/gitlab.go | 33 ++++++++++++----------------- pkg/integration/integration_test.go | 8 +++---- 4 files changed, 21 insertions(+), 28 deletions(-) diff --git a/cmd/digger/main.go b/cmd/digger/main.go index 594ae47a1..460150253 100644 --- a/cmd/digger/main.go +++ b/cmd/digger/main.go @@ -59,7 +59,7 @@ func gitHubCI(lock utils.Lock) { eventName := parsedGhContext.EventName splitRepositoryName := strings.Split(parsedGhContext.Repository, "/") repoOwner, repositoryName := splitRepositoryName[0], splitRepositoryName[1] - githubPrService := dg_github.NewGithubPullRequestService(ghToken, repositoryName, repoOwner) + githubPrService := dg_github.NewGitHubService(ghToken, repositoryName, repoOwner) impactedProjects, requestedProject, prNumber, err := digger.ProcessGitHubEvent(ghEvent, diggerConfig, githubPrService) if err != nil { @@ -131,8 +131,8 @@ func gitLabCI(lock utils.Lock) { } if gitLabContext.MergeRequestIId == nil { - fmt.Println("value for CI_MERGE_REQUEST_IID is not found") - os.Exit(4) + fmt.Println("No merge request found.") + os.Exit(0) } gitlabService, err := gitlab.NewGitLabService(gitlabToken, gitLabContext) diff --git a/pkg/github/github.go b/pkg/github/github.go index 956d3c7f7..43271a4b7 100644 --- a/pkg/github/github.go +++ b/pkg/github/github.go @@ -9,7 +9,7 @@ import ( "github.com/google/go-github/v51/github" ) -func NewGithubPullRequestService(ghToken string, repoName string, owner string) ci.CIService { +func NewGitHubService(ghToken string, repoName string, owner string) ci.CIService { client := github.NewTokenClient(context.Background(), ghToken) return &GithubService{ Client: client, diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index 484c8ae2f..3d5cdaba4 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -228,9 +228,16 @@ func (e GitLabEventType) String() string { } const ( - MergeRequestOpened = GitLabEventType("merge_request_opened") - MergeRequestUpdated = GitLabEventType("merge_request_updated") - MergeRequestClosed = GitLabEventType("merge_request_closed") + MergeRequestOpened = GitLabEventType("merge_request_opened") + MergeRequestClosed = GitLabEventType("merge_request_closed") + MergeRequestReopened = GitLabEventType("merge_request_reopened") + MergeRequestUpdated = GitLabEventType("merge_request_updated") + MergeRequestApproved = GitLabEventType("merge_request_approved") + MergeRequestUnapproved = GitLabEventType("merge_request_unapproved") + MergeRequestApproval = GitLabEventType("merge_request_approval") + MergeRequestUnapproval = GitLabEventType("merge_request_unapproval") + MergeRequestMerged = GitLabEventType("merge_request_merge") + MergeRequestComment = GitLabEventType("merge_request_commented") ) @@ -239,23 +246,7 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex switch event.EventType { case MergeRequestOpened: - for _, project := range impactedProjects { - workflow, ok := workflows[project.Workflow] - if !ok { - workflow = workflows["default"] - } - - commandsPerProject = append(commandsPerProject, digger.ProjectCommand{ - ProjectName: project.Name, - ProjectDir: project.Dir, - ProjectWorkspace: project.Workspace, - Terragrunt: project.Terragrunt, - Commands: workflow.Configuration.OnPullRequestPushed, - ApplyStage: workflow.Apply, - PlanStage: workflow.Plan, - }) - } - return commandsPerProject, nil + case MergeRequestReopened: case MergeRequestUpdated: for _, project := range impactedProjects { workflow, ok := workflows[project.Workflow] @@ -275,6 +266,7 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex } return commandsPerProject, nil case MergeRequestClosed: + case MergeRequestMerged: for _, project := range impactedProjects { workflow, ok := workflows[project.Workflow] if !ok { @@ -313,6 +305,7 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex default: return []digger.ProjectCommand{}, fmt.Errorf("unsupported GitLab event type: %v", event) } + return nil, nil } func RunCommandsPerProject(commandsPerProject []digger.ProjectCommand, gitLabContext GitLabContext, diggerConfig *configuration.DiggerConfig, service ci.CIService, lock utils.Lock, planStorage utils.PlanStorage, workingDir string) (bool, error) { diff --git a/pkg/integration/integration_test.go b/pkg/integration/integration_test.go index 21c61d982..7d0ad1d7a 100644 --- a/pkg/integration/integration_test.go +++ b/pkg/integration/integration_test.go @@ -40,7 +40,7 @@ func getProjectLockForTests() (error, *utils.ProjectLockImpl) { repoOwner := "diggerhq" repositoryName := "test_dynamodb_lock" ghToken := "token" - githubPrService := dg_github.NewGithubPullRequestService(ghToken, repositoryName, repoOwner) + githubPrService := dg_github.NewGitHubService(ghToken, repositoryName, repoOwner) projectLock := &utils.ProjectLockImpl{ InternalLock: &dynamoDbLock, @@ -381,7 +381,7 @@ func TestHappyPath(t *testing.T) { eventName := parsedNewPullRequestContext.EventName repoOwner := parsedNewPullRequestContext.RepositoryOwner repositoryName := parsedNewPullRequestContext.Repository - githubPrService := dg_github.NewGithubPullRequestService(ghToken, repositoryName, repoOwner) + githubPrService := dg_github.NewGitHubService(ghToken, repositoryName, repoOwner) assert.Equal(t, "pull_request", parsedNewPullRequestContext.EventName) @@ -532,7 +532,7 @@ func TestMultiEnvHappyPath(t *testing.T) { eventName := parsedNewPullRequestContext.EventName repoOwner := parsedNewPullRequestContext.RepositoryOwner repositoryName := parsedNewPullRequestContext.Repository - githubPrService := dg_github.NewGithubPullRequestService(ghToken, repositoryName, repoOwner) + githubPrService := dg_github.NewGitHubService(ghToken, repositoryName, repoOwner) assert.Equal(t, "pull_request", parsedNewPullRequestContext.EventName) @@ -747,7 +747,7 @@ workflows: eventName := parsedNewPullRequestContext.EventName repoOwner := parsedNewPullRequestContext.RepositoryOwner repositoryName := parsedNewPullRequestContext.Repository - githubPrService := dg_github.NewGithubPullRequestService(ghToken, repositoryName, repoOwner) + githubPrService := dg_github.NewGitHubService(ghToken, repositoryName, repoOwner) assert.Equal(t, "pull_request", parsedNewPullRequestContext.EventName) From cb620046d85dffe9fe3a081a13e320afed566a98 Mon Sep 17 00:00:00 2001 From: alexey Date: Fri, 19 May 2023 16:32:32 +0100 Subject: [PATCH 03/32] add more debugging --- pkg/gitlab/gitlab.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index 3d5cdaba4..49d493aa0 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -7,6 +7,7 @@ import ( "digger/pkg/terraform" "digger/pkg/utils" "fmt" + "github.com/davecgh/go-spew/spew" "log" "path" "strings" @@ -250,6 +251,10 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex case MergeRequestUpdated: for _, project := range impactedProjects { workflow, ok := workflows[project.Workflow] + + fmt.Printf("ConvertGitLabEventToCommands, project.Workflow\n") + spew.Dump(project.Workflow) + fmt.Println() if !ok { workflow = workflows["default"] } From 583f08959b3265035bb5c610242daf736e4f9e58 Mon Sep 17 00:00:00 2001 From: alexey Date: Fri, 19 May 2023 17:06:24 +0100 Subject: [PATCH 04/32] add default workflow --- pkg/configuration/digger_config.go | 41 +++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/pkg/configuration/digger_config.go b/pkg/configuration/digger_config.go index 6c8679607..ab10ce7ce 100644 --- a/pkg/configuration/digger_config.go +++ b/pkg/configuration/digger_config.go @@ -193,11 +193,50 @@ func (s *Step) extract(stepMap map[string]interface{}, action string) { } } +// duplicate copied from digger.go +func defaultWorkflow() *Workflow { + return &Workflow{ + Configuration: &WorkflowConfiguration{ + OnCommitToDefault: []string{"digger unlock"}, + OnPullRequestPushed: []string{"digger plan"}, + OnPullRequestClosed: []string{"digger unlock"}, + }, + Plan: &Stage{ + Steps: []Step{ + { + Action: "init", ExtraArgs: []string{}, + }, + { + Action: "plan", ExtraArgs: []string{}, + }, + }, + }, + Apply: &Stage{ + Steps: []Step{ + { + Action: "init", ExtraArgs: []string{}, + }, + { + Action: "apply", ExtraArgs: []string{}, + }, + }, + }, + } +} + func ConvertDiggerYamlToConfig(diggerYaml *DiggerConfigYaml, workingDir string, walker DirWalker) (*DiggerConfig, error) { var diggerConfig DiggerConfig diggerConfig.AutoMerge = diggerYaml.AutoMerge - diggerConfig.Workflows = diggerYaml.Workflows + + if diggerYaml.Workflows != nil { + diggerConfig.Workflows = diggerYaml.Workflows + } else { + workflow := *defaultWorkflow() + diggerConfig.Workflows = make(map[string]Workflow) + diggerConfig.Workflows["default"] = workflow + } + diggerConfig.Projects = diggerYaml.Projects diggerConfig.CollectUsageData = diggerYaml.CollectUsageData From bee5bd1c0449a5956d636920f33702bc7a69061c Mon Sep 17 00:00:00 2001 From: alexey Date: Mon, 22 May 2023 15:42:01 +0100 Subject: [PATCH 05/32] add more logs --- cmd/digger/main.go | 13 +++++++----- pkg/gitlab/gitlab.go | 50 +------------------------------------------- 2 files changed, 9 insertions(+), 54 deletions(-) diff --git a/cmd/digger/main.go b/cmd/digger/main.go index 460150253..d510fdd1e 100644 --- a/cmd/digger/main.go +++ b/cmd/digger/main.go @@ -106,6 +106,7 @@ func gitHubCI(lock utils.Lock) { func gitLabCI(lock utils.Lock) { println("Using GitLab.") projectNamespace := os.Getenv("CI_PROJECT_NAMESPACE") + projectName := os.Getenv("CI_PROJECT_NAME") gitlabToken := os.Getenv("GITLAB_TOKEN") if gitlabToken == "" { fmt.Println("GITLAB_TOKEN is empty") @@ -161,8 +162,7 @@ func gitLabCI(lock utils.Lock) { fmt.Printf("command: %s, project: %s\n", strings.Join(v.Commands, ", "), v.ProjectName) } - //planStorage := newPlanStorage(ghToken, repoOwner, repositoryName, prNumber) - var planStorage utils.PlanStorage + planStorage := newPlanStorage(gitlabToken, projectNamespace, projectName, *gitLabContext.MergeRequestIId) result, err := gitlab.RunCommandsPerProject(commandsToRunPerProject, *gitLabContext, diggerConfig, gitlabService, lock, planStorage, currentDir) if err != nil { @@ -222,7 +222,8 @@ func main() { func newPlanStorage(ghToken string, repoOwner string, repositoryName string, prNumber int) utils.PlanStorage { var planStorage utils.PlanStorage - if os.Getenv("PLAN_UPLOAD_DESTINATION") == "github" { + uploadDestination := strings.ToLower(os.Getenv("PLAN_UPLOAD_DESTINATION")) + if uploadDestination == "github" { zipManager := utils.Zipper{} planStorage = &utils.GithubPlanStorage{ Client: github.NewTokenClient(context.Background(), ghToken), @@ -231,9 +232,8 @@ func newPlanStorage(ghToken string, repoOwner string, repositoryName string, prN PullRequestNumber: prNumber, ZipManager: zipManager, } - } else if os.Getenv("PLAN_UPLOAD_DESTINATION") == "gcp" { + } else if uploadDestination == "gcp" { ctx, client := gcp.GetGoogleStorageClient() - bucketName := strings.ToLower(os.Getenv("GOOGLE_STORAGE_BUCKET")) if bucketName == "" { reportErrorAndExit(repoOwner, fmt.Sprintf("GOOGLE_STORAGE_BUCKET is not defined"), 9) @@ -244,7 +244,10 @@ func newPlanStorage(ghToken string, repoOwner string, repositoryName string, prN Bucket: bucket, Context: ctx, } + } else if uploadDestination == "gitlab" { + //TODO implement me } + return planStorage } diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index 49d493aa0..9ca086ab2 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -272,6 +272,7 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex return commandsPerProject, nil case MergeRequestClosed: case MergeRequestMerged: + fmt.Println("Merge request closed or merged.") for _, project := range impactedProjects { workflow, ok := workflows[project.Workflow] if !ok { @@ -330,7 +331,6 @@ func RunCommandsPerProject(commandsPerProject []digger.ProjectCommand, gitLabCon var terraformExecutor terraform.TerraformExecutor projectPath := path.Join(workingDir, projectCommands.ProjectDir) - fmt.Printf("pprojectPath: %s\n\n", projectPath) if projectCommands.Terragrunt { terraformExecutor = terraform.Terragrunt{WorkingDir: path.Join(workingDir, projectCommands.ProjectDir)} } else { @@ -406,52 +406,4 @@ func RunCommandsPerProject(commandsPerProject []digger.ProjectCommand, gitLabCon } } return allAppliesSuccess, nil - /* - - lockAcquisitionSuccess := true - for _, projectCommands := range commandsPerProject { - for _, command := range projectCommands.Commands { - projectLock := &utils.ProjectLockImpl{ - InternalLock: lock, - CIService: service, - ProjectName: projectCommands.ProjectName, - RepoName: gitLabContext.ProjectName, - RepoOwner: gitLabContext.ProjectNamespace, - } - diggerExecutor := digger.DiggerExecutor{ - workingDir, - projectCommands.ProjectWorkspace, - gitLabContext.ProjectNamespace, - projectCommands.ProjectName, - projectCommands.ProjectDir, - gitLabContext.ProjectName, - projectCommands.Terragrunt, - service, - projectLock, - diggerConfig, - } - switch command { - case "digger plan": - utils.SendUsageRecord(gitLabContext.ProjectNamespace, gitLabContext.EventType.String(), "plan") - diggerExecutor.Plan(*gitLabContext.MergeRequestIId) - case "digger apply": - utils.SendUsageRecord(gitLabContext.ProjectName, gitLabContext.EventType.String(), "apply") - diggerExecutor.Apply(*gitLabContext.MergeRequestIId) - case "digger unlock": - utils.SendUsageRecord(gitLabContext.ProjectNamespace, gitLabContext.EventType.String(), "unlock") - diggerExecutor.Unlock(*gitLabContext.MergeRequestIId) - case "digger lock": - utils.SendUsageRecord(gitLabContext.ProjectNamespace, gitLabContext.EventType.String(), "lock") - lockAcquisitionSuccess = diggerExecutor.Lock(*gitLabContext.MergeRequestIId) - } - } - } - - if !lockAcquisitionSuccess { - os.Exit(1) - } - return nil - - */ - } From 83a34fd3ef6f2d88560d6a34f8da0fc54b5bb0c4 Mon Sep 17 00:00:00 2001 From: alexey Date: Mon, 22 May 2023 15:57:36 +0100 Subject: [PATCH 06/32] add more logs --- pkg/gitlab/gitlab.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index 9ca086ab2..f9339dc3f 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -245,6 +245,7 @@ const ( func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContext, impactedProjects []configuration.Project, workflows map[string]configuration.Workflow) ([]digger.ProjectCommand, error) { commandsPerProject := make([]digger.ProjectCommand, 0) + fmt.Printf("ConvertGitLabEventToCommands, event.EventType: %s\n", event.EventType) switch event.EventType { case MergeRequestOpened: case MergeRequestReopened: @@ -252,7 +253,7 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex for _, project := range impactedProjects { workflow, ok := workflows[project.Workflow] - fmt.Printf("ConvertGitLabEventToCommands, project.Workflow\n") + fmt.Printf("ConvertGitLabEventToCommands, project.Workflow: ") spew.Dump(project.Workflow) fmt.Println() if !ok { From 71dfaed34b1742245cbebbe6ba7c328d50ef4de3 Mon Sep 17 00:00:00 2001 From: alexey Date: Mon, 22 May 2023 16:09:45 +0100 Subject: [PATCH 07/32] add more logs --- pkg/gitlab/gitlab.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index f9339dc3f..395be08e0 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -272,6 +272,7 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex } return commandsPerProject, nil case MergeRequestClosed: + fmt.Println("Merge request closed.") case MergeRequestMerged: fmt.Println("Merge request closed or merged.") for _, project := range impactedProjects { From 00b8609e2f8b9e742136de48ef43a77c596952ff Mon Sep 17 00:00:00 2001 From: alexey Date: Mon, 22 May 2023 16:20:40 +0100 Subject: [PATCH 08/32] fix switch/case --- pkg/gitlab/gitlab.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index 395be08e0..a5802036e 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -247,9 +247,7 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex fmt.Printf("ConvertGitLabEventToCommands, event.EventType: %s\n", event.EventType) switch event.EventType { - case MergeRequestOpened: - case MergeRequestReopened: - case MergeRequestUpdated: + case MergeRequestOpened, MergeRequestReopened, MergeRequestUpdated: for _, project := range impactedProjects { workflow, ok := workflows[project.Workflow] @@ -271,9 +269,7 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex }) } return commandsPerProject, nil - case MergeRequestClosed: - fmt.Println("Merge request closed.") - case MergeRequestMerged: + case MergeRequestClosed, MergeRequestMerged: fmt.Println("Merge request closed or merged.") for _, project := range impactedProjects { workflow, ok := workflows[project.Workflow] From 08149e07c4fdb740f92cffe877144b98d8172bd0 Mon Sep 17 00:00:00 2001 From: alexey Date: Mon, 22 May 2023 16:37:22 +0100 Subject: [PATCH 09/32] add logs --- pkg/gitlab/gitlab.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index a5802036e..cc4a70df8 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -10,6 +10,7 @@ import ( "github.com/davecgh/go-spew/spew" "log" "path" + "runtime/debug" "strings" "github.com/caarlos0/env/v7" @@ -139,8 +140,10 @@ func (gitlabService GitLabService) PublishComment(mergeRequestID int, comment st mergeRequestIID := *gitlabService.Context.MergeRequestIId commentOpt := &go_gitlab.AddMergeRequestDiscussionNoteOptions{Body: &comment} - fmt.Printf("PublishComment mergeRequestID : %d, projectId: %d, mergeRequestIID: %d, \n", mergeRequestID, projectId, mergeRequestIID) - + fmt.Printf("PublishComment mergeRequestID : %d, projectId: %d, mergeRequestIID: %d, discussionId: %s \n", mergeRequestID, projectId, mergeRequestIID, discussionId) + fmt.Println("+++++") + debug.PrintStack() + fmt.Println("=====") _, _, err := gitlabService.Client.Discussions.AddMergeRequestDiscussionNote(projectId, mergeRequestIID, discussionId, commentOpt) if err != nil { fmt.Printf("Failed to publish a comment. %v\n", err) From 4e9f6e18cb64c4d50fe6a2d722d6460f1842717f Mon Sep 17 00:00:00 2001 From: alexey Date: Mon, 22 May 2023 16:57:21 +0100 Subject: [PATCH 10/32] create gitlab discussion if it doesn't exist --- pkg/gitlab/gitlab.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index cc4a70df8..520c23f8e 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -144,6 +144,16 @@ func (gitlabService GitLabService) PublishComment(mergeRequestID int, comment st fmt.Println("+++++") debug.PrintStack() fmt.Println("=====") + + if discussionId == "" { + commentOpt := &go_gitlab.CreateMergeRequestDiscussionOptions{Body: &comment} + discussion, _, err := gitlabService.Client.Discussions.CreateMergeRequestDiscussion(projectId, mergeRequestIID, commentOpt) + if err != nil { + fmt.Printf("Failed to publish a comment. %v\n", err) + print(err.Error()) + } + discussionId = discussion.ID + } _, _, err := gitlabService.Client.Discussions.AddMergeRequestDiscussionNote(projectId, mergeRequestIID, discussionId, commentOpt) if err != nil { fmt.Printf("Failed to publish a comment. %v\n", err) From b38332dd19c9433c1f39648e7a0046d46a6c8972 Mon Sep 17 00:00:00 2001 From: alexey Date: Mon, 22 May 2023 17:49:59 +0100 Subject: [PATCH 11/32] remove some logs used for debugging --- pkg/gitlab/gitlab.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index 520c23f8e..c92b96293 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -10,7 +10,6 @@ import ( "github.com/davecgh/go-spew/spew" "log" "path" - "runtime/debug" "strings" "github.com/caarlos0/env/v7" @@ -141,9 +140,6 @@ func (gitlabService GitLabService) PublishComment(mergeRequestID int, comment st commentOpt := &go_gitlab.AddMergeRequestDiscussionNoteOptions{Body: &comment} fmt.Printf("PublishComment mergeRequestID : %d, projectId: %d, mergeRequestIID: %d, discussionId: %s \n", mergeRequestID, projectId, mergeRequestIID, discussionId) - fmt.Println("+++++") - debug.PrintStack() - fmt.Println("=====") if discussionId == "" { commentOpt := &go_gitlab.CreateMergeRequestDiscussionOptions{Body: &comment} From 52eea86bfc7f967b5f776bb6494a3c541d36ee0a Mon Sep 17 00:00:00 2001 From: alexey Date: Wed, 24 May 2023 16:02:23 +0100 Subject: [PATCH 12/32] resolve merge request threads automatically --- pkg/gitlab/gitlab.go | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index c92b96293..e7ccf1779 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -179,10 +179,35 @@ func (gitlabService GitLabService) MergePullRequest(mergeRequestID int) error { fmt.Printf("MergePullRequest mergeRequestID : %d, projectId: %d, mergeRequestIID: %d, \n", mergeRequestID, projectId, mergeRequestIID) - _, _, err := gitlabService.Client.MergeRequests.AcceptMergeRequest(projectId, mergeRequestIID, opt) + // check if there are any unresolved discussions in the merge request and resolve them + /* + discussionsOpt := &go_gitlab.ListMergeRequestDiscussionsOptions{} + discussions, _, err := gitlabService.Client.Discussions.ListMergeRequestDiscussions(projectId, mergeRequestIID, discussionsOpt) + if err != nil { + log.Fatal(err) + } + + for _, d := range discussions { + discussion, err := gitlabService.Client.Discussions.UpdateMergeRequestDiscussionNote(projectId, mergeRequestIID, d) + if err != nil { + log.Fatal(err) + } + if discussion. + } + */ + + resolved := true + resolveOpt := &go_gitlab.ResolveMergeRequestDiscussionOptions{Resolved: &resolved} + _, _, err := gitlabService.Client.Discussions.ResolveMergeRequestDiscussion(projectId, mergeRequestIID, gitlabService.Context.DiscussionID, resolveOpt) + if err != nil { + fmt.Printf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) + return fmt.Errorf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) + } + + _, _, err = gitlabService.Client.MergeRequests.AcceptMergeRequest(projectId, mergeRequestIID, opt) if err != nil { fmt.Printf("Failed to merge Merge Request. %v\n", err) - return err + return fmt.Errorf("Failed to merge Merge Request. %v\n", err) } return nil } From ba6e4504a1e7ca6a1026ab08954e70d6c4a9e030 Mon Sep 17 00:00:00 2001 From: alexey Date: Wed, 24 May 2023 16:09:41 +0100 Subject: [PATCH 13/32] resolve merge request threads automatically --- pkg/gitlab/gitlab.go | 36 ++++++++++-------------------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index e7ccf1779..2e401efed 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -179,32 +179,7 @@ func (gitlabService GitLabService) MergePullRequest(mergeRequestID int) error { fmt.Printf("MergePullRequest mergeRequestID : %d, projectId: %d, mergeRequestIID: %d, \n", mergeRequestID, projectId, mergeRequestIID) - // check if there are any unresolved discussions in the merge request and resolve them - /* - discussionsOpt := &go_gitlab.ListMergeRequestDiscussionsOptions{} - discussions, _, err := gitlabService.Client.Discussions.ListMergeRequestDiscussions(projectId, mergeRequestIID, discussionsOpt) - if err != nil { - log.Fatal(err) - } - - for _, d := range discussions { - discussion, err := gitlabService.Client.Discussions.UpdateMergeRequestDiscussionNote(projectId, mergeRequestIID, d) - if err != nil { - log.Fatal(err) - } - if discussion. - } - */ - - resolved := true - resolveOpt := &go_gitlab.ResolveMergeRequestDiscussionOptions{Resolved: &resolved} - _, _, err := gitlabService.Client.Discussions.ResolveMergeRequestDiscussion(projectId, mergeRequestIID, gitlabService.Context.DiscussionID, resolveOpt) - if err != nil { - fmt.Printf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) - return fmt.Errorf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) - } - - _, _, err = gitlabService.Client.MergeRequests.AcceptMergeRequest(projectId, mergeRequestIID, opt) + _, _, err := gitlabService.Client.MergeRequests.AcceptMergeRequest(projectId, mergeRequestIID, opt) if err != nil { fmt.Printf("Failed to merge Merge Request. %v\n", err) return fmt.Errorf("Failed to merge Merge Request. %v\n", err) @@ -216,6 +191,15 @@ func (gitlabService GitLabService) IsMergeable(mergeRequestID int) (bool, error) projectId := *gitlabService.Context.ProjectId mergeRequestIID := *gitlabService.Context.MergeRequestIId + // check if there are any unresolved discussions in the merge request and resolve them + resolved := true + resolveOpt := &go_gitlab.ResolveMergeRequestDiscussionOptions{Resolved: &resolved} + _, _, err := gitlabService.Client.Discussions.ResolveMergeRequestDiscussion(projectId, mergeRequestIID, gitlabService.Context.DiscussionID, resolveOpt) + if err != nil { + fmt.Printf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) + return false, fmt.Errorf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) + } + fmt.Printf("IsMergeable mergeRequestIID : %d, projectId: %d \n", mergeRequestIID, projectId) opt := &go_gitlab.GetMergeRequestsOptions{} From 8c7d3252ef00a2c6272089f517ad533761ddf90b Mon Sep 17 00:00:00 2001 From: alexey Date: Wed, 24 May 2023 16:56:45 +0100 Subject: [PATCH 14/32] add more logs --- cmd/digger/main.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmd/digger/main.go b/cmd/digger/main.go index d510fdd1e..a7ac54037 100644 --- a/cmd/digger/main.go +++ b/cmd/digger/main.go @@ -10,6 +10,7 @@ import ( "digger/pkg/models" "digger/pkg/utils" "fmt" + "github.com/davecgh/go-spew/spew" "github.com/google/go-github/v51/github" "log" "os" @@ -131,6 +132,9 @@ func gitLabCI(lock utils.Lock) { os.Exit(4) } + fmt.Println("GitlabContext:") + spew.Dump(gitLabContext) + if gitLabContext.MergeRequestIId == nil { fmt.Println("No merge request found.") os.Exit(0) From 5ec93eeba05aa38806302fca839cee7a5ed5cce3 Mon Sep 17 00:00:00 2001 From: alexey Date: Wed, 24 May 2023 17:18:10 +0100 Subject: [PATCH 15/32] add more logs --- cmd/digger/main.go | 4 ---- pkg/gitlab/gitlab.go | 18 ++++++++++-------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/cmd/digger/main.go b/cmd/digger/main.go index a7ac54037..d510fdd1e 100644 --- a/cmd/digger/main.go +++ b/cmd/digger/main.go @@ -10,7 +10,6 @@ import ( "digger/pkg/models" "digger/pkg/utils" "fmt" - "github.com/davecgh/go-spew/spew" "github.com/google/go-github/v51/github" "log" "os" @@ -132,9 +131,6 @@ func gitLabCI(lock utils.Lock) { os.Exit(4) } - fmt.Println("GitlabContext:") - spew.Dump(gitLabContext) - if gitLabContext.MergeRequestIId == nil { fmt.Println("No merge request found.") os.Exit(0) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index 2e401efed..e3e9f8138 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -191,14 +191,16 @@ func (gitlabService GitLabService) IsMergeable(mergeRequestID int) (bool, error) projectId := *gitlabService.Context.ProjectId mergeRequestIID := *gitlabService.Context.MergeRequestIId - // check if there are any unresolved discussions in the merge request and resolve them - resolved := true - resolveOpt := &go_gitlab.ResolveMergeRequestDiscussionOptions{Resolved: &resolved} - _, _, err := gitlabService.Client.Discussions.ResolveMergeRequestDiscussion(projectId, mergeRequestIID, gitlabService.Context.DiscussionID, resolveOpt) - if err != nil { - fmt.Printf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) - return false, fmt.Errorf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) - } + /* + // check if there are any unresolved discussions in the merge request and resolve them + resolved := true + resolveOpt := &go_gitlab.ResolveMergeRequestDiscussionOptions{Resolved: &resolved} + _, _, err := gitlabService.Client.Discussions.ResolveMergeRequestDiscussion(projectId, mergeRequestIID, gitlabService.Context.DiscussionID, resolveOpt) + if err != nil { + fmt.Printf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) + return false, fmt.Errorf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) + } + */ fmt.Printf("IsMergeable mergeRequestIID : %d, projectId: %d \n", mergeRequestIID, projectId) opt := &go_gitlab.GetMergeRequestsOptions{} From b89a662ef28cfaa93dd56f4d404aa46e74a94c2b Mon Sep 17 00:00:00 2001 From: alexey Date: Thu, 25 May 2023 11:55:53 +0100 Subject: [PATCH 16/32] add more logs --- pkg/gitlab/gitlab.go | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index e3e9f8138..c8e6c10e9 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -191,18 +191,16 @@ func (gitlabService GitLabService) IsMergeable(mergeRequestID int) (bool, error) projectId := *gitlabService.Context.ProjectId mergeRequestIID := *gitlabService.Context.MergeRequestIId - /* - // check if there are any unresolved discussions in the merge request and resolve them - resolved := true - resolveOpt := &go_gitlab.ResolveMergeRequestDiscussionOptions{Resolved: &resolved} - _, _, err := gitlabService.Client.Discussions.ResolveMergeRequestDiscussion(projectId, mergeRequestIID, gitlabService.Context.DiscussionID, resolveOpt) - if err != nil { - fmt.Printf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) - return false, fmt.Errorf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) - } - */ + // check if there are any unresolved discussions in the merge request and resolve them + resolved := true + resolveOpt := &go_gitlab.ResolveMergeRequestDiscussionOptions{Resolved: &resolved} + _, _, err := gitlabService.Client.Discussions.ResolveMergeRequestDiscussion(projectId, mergeRequestIID, gitlabService.Context.DiscussionID, resolveOpt) + if err != nil { + fmt.Printf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) + return false, fmt.Errorf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) + } - fmt.Printf("IsMergeable mergeRequestIID : %d, projectId: %d \n", mergeRequestIID, projectId) + fmt.Printf("IsMergeable mergeRequestIID : %d, projectId: %d , discussionId: %s\n", mergeRequestIID, projectId, gitlabService.Context.DiscussionID) opt := &go_gitlab.GetMergeRequestsOptions{} mergeRequest, _, err := gitlabService.Client.MergeRequests.GetMergeRequest(projectId, mergeRequestIID, opt) From e275483067bfcc8225561782ab39357ce55d7f28 Mon Sep 17 00:00:00 2001 From: alexey Date: Thu, 25 May 2023 12:02:00 +0100 Subject: [PATCH 17/32] add more logs --- pkg/gitlab/gitlab.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index c8e6c10e9..49f936802 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -191,14 +191,16 @@ func (gitlabService GitLabService) IsMergeable(mergeRequestID int) (bool, error) projectId := *gitlabService.Context.ProjectId mergeRequestIID := *gitlabService.Context.MergeRequestIId - // check if there are any unresolved discussions in the merge request and resolve them - resolved := true - resolveOpt := &go_gitlab.ResolveMergeRequestDiscussionOptions{Resolved: &resolved} - _, _, err := gitlabService.Client.Discussions.ResolveMergeRequestDiscussion(projectId, mergeRequestIID, gitlabService.Context.DiscussionID, resolveOpt) - if err != nil { - fmt.Printf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) - return false, fmt.Errorf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) - } + /* + // check if there are any unresolved discussions in the merge request and resolve them + resolved := true + resolveOpt := &go_gitlab.ResolveMergeRequestDiscussionOptions{Resolved: &resolved} + _, _, err := gitlabService.Client.Discussions.ResolveMergeRequestDiscussion(projectId, mergeRequestIID, gitlabService.Context.DiscussionID, resolveOpt) + if err != nil { + fmt.Printf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) + return false, fmt.Errorf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) + } + */ fmt.Printf("IsMergeable mergeRequestIID : %d, projectId: %d , discussionId: %s\n", mergeRequestIID, projectId, gitlabService.Context.DiscussionID) opt := &go_gitlab.GetMergeRequestsOptions{} From 2140793c403bedefc465910b6719822bc79ec981 Mon Sep 17 00:00:00 2001 From: alexey Date: Thu, 25 May 2023 12:46:59 +0100 Subject: [PATCH 18/32] add more logs --- pkg/gitlab/gitlab.go | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index 49f936802..3c6616bf5 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -191,17 +191,6 @@ func (gitlabService GitLabService) IsMergeable(mergeRequestID int) (bool, error) projectId := *gitlabService.Context.ProjectId mergeRequestIID := *gitlabService.Context.MergeRequestIId - /* - // check if there are any unresolved discussions in the merge request and resolve them - resolved := true - resolveOpt := &go_gitlab.ResolveMergeRequestDiscussionOptions{Resolved: &resolved} - _, _, err := gitlabService.Client.Discussions.ResolveMergeRequestDiscussion(projectId, mergeRequestIID, gitlabService.Context.DiscussionID, resolveOpt) - if err != nil { - fmt.Printf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) - return false, fmt.Errorf("error resolving discussion %s, \n%v \n", gitlabService.Context.DiscussionID, err) - } - */ - fmt.Printf("IsMergeable mergeRequestIID : %d, projectId: %d , discussionId: %s\n", mergeRequestIID, projectId, gitlabService.Context.DiscussionID) opt := &go_gitlab.GetMergeRequestsOptions{} @@ -212,6 +201,8 @@ func (gitlabService GitLabService) IsMergeable(mergeRequestID int) (bool, error) print(err.Error()) } + fmt.Printf("mergeRequest.DetailedMergeStatus: %s\n", mergeRequest.DetailedMergeStatus) + if mergeRequest.DetailedMergeStatus == "mergeable" { return true, nil } From a5613f6986778ca90fa8de2cb201e9825eee9b8b Mon Sep 17 00:00:00 2001 From: alexey Date: Thu, 25 May 2023 17:05:00 +0100 Subject: [PATCH 19/32] read isMeargeable from env vars --- pkg/gitlab/gitlab.go | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index 3c6616bf5..82b889314 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -34,6 +34,7 @@ type GitLabContext struct { Token string `env:"GITLAB_TOKEN"` DiggerCommand string `env:"DIGGER_COMMAND"` DiscussionID string `env:"DISCUSSION_ID"` + IsMeargeable bool `env:"IS_MERGEABLE"` } type PipelineSourceType string @@ -188,25 +189,30 @@ func (gitlabService GitLabService) MergePullRequest(mergeRequestID int) error { } func (gitlabService GitLabService) IsMergeable(mergeRequestID int) (bool, error) { - projectId := *gitlabService.Context.ProjectId - mergeRequestIID := *gitlabService.Context.MergeRequestIId + //projectId := *gitlabService.Context.ProjectId + //mergeRequestIID := *gitlabService.Context.MergeRequestIId - fmt.Printf("IsMergeable mergeRequestIID : %d, projectId: %d , discussionId: %s\n", mergeRequestIID, projectId, gitlabService.Context.DiscussionID) - opt := &go_gitlab.GetMergeRequestsOptions{} + return gitlabService.Context.IsMeargeable, nil - mergeRequest, _, err := gitlabService.Client.MergeRequests.GetMergeRequest(projectId, mergeRequestIID, opt) + /* + fmt.Printf("IsMergeable mergeRequestIID : %d, projectId: %d , discussionId: %s\n", mergeRequestIID, projectId, gitlabService.Context.DiscussionID) + opt := &go_gitlab.GetMergeRequestsOptions{} - if err != nil { - fmt.Printf("Failed to get a MergeRequest: %d, %v \n", mergeRequestIID, err) - print(err.Error()) - } + mergeRequest, _, err := gitlabService.Client.MergeRequests.GetMergeRequest(projectId, mergeRequestIID, opt) - fmt.Printf("mergeRequest.DetailedMergeStatus: %s\n", mergeRequest.DetailedMergeStatus) + if err != nil { + fmt.Printf("Failed to get a MergeRequest: %d, %v \n", mergeRequestIID, err) + print(err.Error()) + } - if mergeRequest.DetailedMergeStatus == "mergeable" { - return true, nil - } - return false, nil + fmt.Printf("mergeRequest.DetailedMergeStatus: %s\n", mergeRequest.DetailedMergeStatus) + + if mergeRequest.DetailedMergeStatus == "mergeable" { + return true, nil + } + return false, nil + + */ } func (gitlabService GitLabService) IsClosed(mergeRequestID int) (bool, error) { From 13bebebb4916a8affe6ee5d63037bb495bab22c4 Mon Sep 17 00:00:00 2001 From: alexey Date: Thu, 25 May 2023 17:17:59 +0100 Subject: [PATCH 20/32] merge MR automatically --- cmd/digger/main.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/cmd/digger/main.go b/cmd/digger/main.go index d510fdd1e..72f854265 100644 --- a/cmd/digger/main.go +++ b/cmd/digger/main.go @@ -164,14 +164,26 @@ func gitLabCI(lock utils.Lock) { planStorage := newPlanStorage(gitlabToken, projectNamespace, projectName, *gitLabContext.MergeRequestIId) - result, err := gitlab.RunCommandsPerProject(commandsToRunPerProject, *gitLabContext, diggerConfig, gitlabService, lock, planStorage, currentDir) + allAppliesSuccess, err := gitlab.RunCommandsPerProject(commandsToRunPerProject, *gitLabContext, diggerConfig, gitlabService, lock, planStorage, currentDir) if err != nil { fmt.Printf("failed to execute command, %v", err) os.Exit(8) } - print(result) + + if diggerConfig.AutoMerge && allAppliesSuccess { + digger.MergePullRequest(gitlabService, *gitLabContext.MergeRequestIId) + println("PR merged successfully") + } println("Commands executed successfully") + + reportErrorAndExit(projectName, "Digger finished successfully", 0) + + defer func() { + if r := recover(); r != nil { + reportErrorAndExit(projectName, fmt.Sprintf("Panic occurred. %s", r), 1) + } + }() } /* From af0bf73f9ebbd9fa2d376af002412c220b06c6fc Mon Sep 17 00:00:00 2001 From: alexey Date: Thu, 25 May 2023 17:28:57 +0100 Subject: [PATCH 21/32] merge MR automatically --- pkg/gitlab/gitlab.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index 82b889314..609ba14e2 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -170,7 +170,7 @@ func (gitlabService GitLabService) SetStatus(mergeRequestID int, status string, func (gitlabService GitLabService) GetCombinedPullRequestStatus(mergeRequestID int) (string, error) { //TODO implement me - panic("GetCombinedPullRequestStatus: implement me") + return "success", nil } func (gitlabService GitLabService) MergePullRequest(mergeRequestID int) error { From e352c7d1abfc281043bd04de0e5af5467838c784 Mon Sep 17 00:00:00 2001 From: alexey Date: Fri, 26 May 2023 12:22:44 +0100 Subject: [PATCH 22/32] merge MR automatically --- pkg/gitlab/gitlab.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index 609ba14e2..ff7b194b0 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -176,7 +176,8 @@ func (gitlabService GitLabService) GetCombinedPullRequestStatus(mergeRequestID i func (gitlabService GitLabService) MergePullRequest(mergeRequestID int) error { projectId := *gitlabService.Context.ProjectId mergeRequestIID := *gitlabService.Context.MergeRequestIId - opt := &go_gitlab.AcceptMergeRequestOptions{} + mergeWhenPipelineSucceeds := true + opt := &go_gitlab.AcceptMergeRequestOptions{MergeWhenPipelineSucceeds: &mergeWhenPipelineSucceeds} fmt.Printf("MergePullRequest mergeRequestID : %d, projectId: %d, mergeRequestIID: %d, \n", mergeRequestID, projectId, mergeRequestIID) From d2cea31ee9bb25e0f56f206c7070af1a416f6c07 Mon Sep 17 00:00:00 2001 From: alexey Date: Fri, 26 May 2023 13:26:02 +0100 Subject: [PATCH 23/32] merge MR automatically --- cmd/digger/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/digger/main.go b/cmd/digger/main.go index 72f854265..560baedaf 100644 --- a/cmd/digger/main.go +++ b/cmd/digger/main.go @@ -172,7 +172,7 @@ func gitLabCI(lock utils.Lock) { if diggerConfig.AutoMerge && allAppliesSuccess { digger.MergePullRequest(gitlabService, *gitLabContext.MergeRequestIId) - println("PR merged successfully") + println("Merge request has been sent successfully") } println("Commands executed successfully") From 446b0a95b098e6a42e73bddbca7d9b49e7741c91 Mon Sep 17 00:00:00 2001 From: alexey Date: Fri, 26 May 2023 17:24:29 +0100 Subject: [PATCH 24/32] add logs for debugging --- cmd/digger/main.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cmd/digger/main.go b/cmd/digger/main.go index 560baedaf..9bef037c5 100644 --- a/cmd/digger/main.go +++ b/cmd/digger/main.go @@ -105,6 +105,14 @@ func gitHubCI(lock utils.Lock) { func gitLabCI(lock utils.Lock) { println("Using GitLab.") + + fmt.Println("DEBUG: print env vars") + for _, e := range os.Environ() { + pair := strings.SplitN(e, "=", 2) + fmt.Println(pair[0]) + } + fmt.Println("env vars end") + projectNamespace := os.Getenv("CI_PROJECT_NAMESPACE") projectName := os.Getenv("CI_PROJECT_NAME") gitlabToken := os.Getenv("GITLAB_TOKEN") From 5a07473de65f34bc410dc85df4c16d0ebe099180 Mon Sep 17 00:00:00 2001 From: alexey Date: Fri, 26 May 2023 17:35:44 +0100 Subject: [PATCH 25/32] add logs for debugging --- cmd/digger/main.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmd/digger/main.go b/cmd/digger/main.go index 9bef037c5..3fa8cadea 100644 --- a/cmd/digger/main.go +++ b/cmd/digger/main.go @@ -108,8 +108,7 @@ func gitLabCI(lock utils.Lock) { fmt.Println("DEBUG: print env vars") for _, e := range os.Environ() { - pair := strings.SplitN(e, "=", 2) - fmt.Println(pair[0]) + fmt.Println(e) } fmt.Println("env vars end") From 489e4931969adc793224f1bcf9e8a6925e7537ff Mon Sep 17 00:00:00 2001 From: alexey Date: Fri, 26 May 2023 17:43:55 +0100 Subject: [PATCH 26/32] add logs for debugging --- cmd/digger/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/digger/main.go b/cmd/digger/main.go index 3fa8cadea..dfe657cb9 100644 --- a/cmd/digger/main.go +++ b/cmd/digger/main.go @@ -291,7 +291,7 @@ func logCommands(projectCommands []digger.ProjectCommand) { } func reportErrorAndExit(repoOwner string, message string, exitCode int) { - fmt.Printf(message) + fmt.Println(message) err := utils.SendLogRecord(repoOwner, message) if err != nil { fmt.Printf("Failed to send log record. %s\n", err) From 60026c42e003734f522b1aebbebcf70fa9c671f1 Mon Sep 17 00:00:00 2001 From: alexey Date: Tue, 30 May 2023 11:42:14 +0100 Subject: [PATCH 27/32] check for CI_OPEN_MERGE_REQUESTS parameter --- cmd/digger/main.go | 8 +------- pkg/gitlab/gitlab.go | 1 + 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/cmd/digger/main.go b/cmd/digger/main.go index dfe657cb9..33ce96426 100644 --- a/cmd/digger/main.go +++ b/cmd/digger/main.go @@ -106,12 +106,6 @@ func gitHubCI(lock utils.Lock) { func gitLabCI(lock utils.Lock) { println("Using GitLab.") - fmt.Println("DEBUG: print env vars") - for _, e := range os.Environ() { - fmt.Println(e) - } - fmt.Println("env vars end") - projectNamespace := os.Getenv("CI_PROJECT_NAMESPACE") projectName := os.Getenv("CI_PROJECT_NAME") gitlabToken := os.Getenv("GITLAB_TOKEN") @@ -138,7 +132,7 @@ func gitLabCI(lock utils.Lock) { os.Exit(4) } - if gitLabContext.MergeRequestIId == nil { + if gitLabContext.MergeRequestIId == nil || len(gitLabContext.OpenMergeRequests) == 0 { fmt.Println("No merge request found.") os.Exit(0) } diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index 438e9d962..ff85cc2a1 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -31,6 +31,7 @@ type GitLabContext struct { ProjectNamespace string `env:"CI_PROJECT_NAMESPACE"` ProjectId *int `env:"CI_PROJECT_ID"` ProjectNamespaceId *int `env:"CI_PROJECT_NAMESPACE_ID"` + OpenMergeRequests []string `env:"CI_OPEN_MERGE_REQUESTS"` Token string `env:"GITLAB_TOKEN"` DiggerCommand string `env:"DIGGER_COMMAND"` DiscussionID string `env:"DISCUSSION_ID"` From 7907a116fef00a0c70026a1a5390eabf4f6c5414 Mon Sep 17 00:00:00 2001 From: alexey Date: Tue, 30 May 2023 13:00:58 +0100 Subject: [PATCH 28/32] fix log messages --- cmd/digger/main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/digger/main.go b/cmd/digger/main.go index 33ce96426..c6e0f7cad 100644 --- a/cmd/digger/main.go +++ b/cmd/digger/main.go @@ -159,6 +159,7 @@ func gitLabCI(lock utils.Lock) { } println("GitLab event converted to commands successfully") + println("Digger commands to be executed:") for _, v := range commandsToRunPerProject { fmt.Printf("command: %s, project: %s\n", strings.Join(v.Commands, ", "), v.ProjectName) } @@ -173,7 +174,7 @@ func gitLabCI(lock utils.Lock) { if diggerConfig.AutoMerge && allAppliesSuccess { digger.MergePullRequest(gitlabService, *gitLabContext.MergeRequestIId) - println("Merge request has been sent successfully") + println("Merge request changes has been applied successfully") } println("Commands executed successfully") From 1ca42f320070fb39f645de2fae2905b96a4155ef Mon Sep 17 00:00:00 2001 From: alexey Date: Tue, 30 May 2023 14:47:51 +0100 Subject: [PATCH 29/32] check for merge_request_merge event --- cmd/digger/main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/digger/main.go b/cmd/digger/main.go index c6e0f7cad..5f888b560 100644 --- a/cmd/digger/main.go +++ b/cmd/digger/main.go @@ -132,7 +132,8 @@ func gitLabCI(lock utils.Lock) { os.Exit(4) } - if gitLabContext.MergeRequestIId == nil || len(gitLabContext.OpenMergeRequests) == 0 { + // it's ok to not have merge request info if it has been merged + if (gitLabContext.MergeRequestIId == nil || len(gitLabContext.OpenMergeRequests) == 0) && gitLabContext.EventType != "merge_request_merge" { fmt.Println("No merge request found.") os.Exit(0) } From fce1cf22e4d35219a2d92745f8002b7c6cd9f444 Mon Sep 17 00:00:00 2001 From: alexey Date: Wed, 31 May 2023 12:20:52 +0100 Subject: [PATCH 30/32] fix PublishComment in GitLab --- pkg/gitlab/gitlab.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index ff85cc2a1..898d0f56e 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -151,11 +151,12 @@ func (gitlabService GitLabService) PublishComment(mergeRequestID int, comment st print(err.Error()) } discussionId = discussion.ID - } - _, _, err := gitlabService.Client.Discussions.AddMergeRequestDiscussionNote(projectId, mergeRequestIID, discussionId, commentOpt) - if err != nil { - fmt.Printf("Failed to publish a comment. %v\n", err) - print(err.Error()) + } else { + _, _, err := gitlabService.Client.Discussions.AddMergeRequestDiscussionNote(projectId, mergeRequestIID, discussionId, commentOpt) + if err != nil { + fmt.Printf("Failed to publish a comment. %v\n", err) + print(err.Error()) + } } } From 08cdc28ed8e35f0a831c8462dcd871bad63ea1d8 Mon Sep 17 00:00:00 2001 From: alexey Date: Thu, 1 Jun 2023 09:39:38 +0100 Subject: [PATCH 31/32] remove commented out code and logs used for debugging --- pkg/gitlab/gitlab.go | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index 898d0f56e..3c0f7558d 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -7,7 +7,6 @@ import ( "digger/pkg/terraform" "digger/pkg/utils" "fmt" - "github.com/davecgh/go-spew/spew" "log" "path" "strings" @@ -192,30 +191,7 @@ func (gitlabService GitLabService) MergePullRequest(mergeRequestID int) error { } func (gitlabService GitLabService) IsMergeable(mergeRequestID int) (bool, error) { - //projectId := *gitlabService.Context.ProjectId - //mergeRequestIID := *gitlabService.Context.MergeRequestIId - return gitlabService.Context.IsMeargeable, nil - - /* - fmt.Printf("IsMergeable mergeRequestIID : %d, projectId: %d , discussionId: %s\n", mergeRequestIID, projectId, gitlabService.Context.DiscussionID) - opt := &go_gitlab.GetMergeRequestsOptions{} - - mergeRequest, _, err := gitlabService.Client.MergeRequests.GetMergeRequest(projectId, mergeRequestIID, opt) - - if err != nil { - fmt.Printf("Failed to get a MergeRequest: %d, %v \n", mergeRequestIID, err) - print(err.Error()) - } - - fmt.Printf("mergeRequest.DetailedMergeStatus: %s\n", mergeRequest.DetailedMergeStatus) - - if mergeRequest.DetailedMergeStatus == "mergeable" { - return true, nil - } - return false, nil - - */ } func (gitlabService GitLabService) IsClosed(mergeRequestID int) (bool, error) { @@ -271,9 +247,6 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex for _, project := range impactedProjects { workflow, ok := workflows[project.Workflow] - fmt.Printf("ConvertGitLabEventToCommands, project.Workflow: ") - spew.Dump(project.Workflow) - fmt.Println() if !ok { workflow = workflows["default"] } From 9ad4fb37fc752a80eb1e69374100942e969a0879 Mon Sep 17 00:00:00 2001 From: alexey Date: Thu, 1 Jun 2023 09:43:00 +0100 Subject: [PATCH 32/32] remove commented out code and logs used for debugging --- pkg/gitlab/gitlab.go | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/pkg/gitlab/gitlab.go b/pkg/gitlab/gitlab.go index 94af9f8ac..a4a27fbe0 100644 --- a/pkg/gitlab/gitlab.go +++ b/pkg/gitlab/gitlab.go @@ -10,7 +10,6 @@ import ( "fmt" "github.com/caarlos0/env/v7" go_gitlab "github.com/xanzy/go-gitlab" - "github.com/davecgh/go-spew/spew" "log" "path" "strings" @@ -192,30 +191,7 @@ func (gitlabService GitLabService) MergePullRequest(mergeRequestID int) error { } func (gitlabService GitLabService) IsMergeable(mergeRequestID int) (bool, error) { - //projectId := *gitlabService.Context.ProjectId - //mergeRequestIID := *gitlabService.Context.MergeRequestIId - return gitlabService.Context.IsMeargeable, nil - - /* - fmt.Printf("IsMergeable mergeRequestIID : %d, projectId: %d , discussionId: %s\n", mergeRequestIID, projectId, gitlabService.Context.DiscussionID) - opt := &go_gitlab.GetMergeRequestsOptions{} - - mergeRequest, _, err := gitlabService.Client.MergeRequests.GetMergeRequest(projectId, mergeRequestIID, opt) - - if err != nil { - fmt.Printf("Failed to get a MergeRequest: %d, %v \n", mergeRequestIID, err) - print(err.Error()) - } - - fmt.Printf("mergeRequest.DetailedMergeStatus: %s\n", mergeRequest.DetailedMergeStatus) - - if mergeRequest.DetailedMergeStatus == "mergeable" { - return true, nil - } - return false, nil - - */ } func (gitlabService GitLabService) IsClosed(mergeRequestID int) (bool, error) { @@ -271,9 +247,6 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex for _, project := range impactedProjects { workflow, ok := workflows[project.Workflow] - fmt.Printf("ConvertGitLabEventToCommands, project.Workflow: ") - spew.Dump(project.Workflow) - fmt.Println() if !ok { workflow = workflows["default"] }