pkg/event_processor/gitlab/gitlab.go (96 lines of code) (raw):
package gitlab
import (
"context"
"encoding/json"
"errors"
"fmt"
"go.uber.org/zap"
ctrlClient "sigs.k8s.io/controller-runtime/pkg/client"
"github.com/epam/edp-tekton/pkg/event_processor"
)
type EventProcessor struct {
ksClient ctrlClient.Reader
logger *zap.SugaredLogger
}
func NewEventProcessor(ksClient ctrlClient.Reader, logger *zap.SugaredLogger) *EventProcessor {
return &EventProcessor{
ksClient: ksClient,
logger: logger,
}
}
func (p *EventProcessor) Process(ctx context.Context, body []byte, ns, eventType string) (*event_processor.EventInfo, error) {
switch eventType {
case event_processor.GitLabEventTypeCommentAdded:
return p.processCommentEvent(ctx, body, ns)
default:
return p.processMergeEvent(ctx, body, ns)
}
}
func (p *EventProcessor) processMergeEvent(ctx context.Context, body []byte, ns string) (*event_processor.EventInfo, error) {
gitLabEvent := &event_processor.GitLabMergeRequestsEvent{}
if err := json.Unmarshal(body, gitLabEvent); err != nil {
return nil, fmt.Errorf("failed to unmarshal GitLab event: %w", err)
}
if gitLabEvent.Project.PathWithNamespace == "" {
return nil, errors.New("gitlab repository path empty")
}
if gitLabEvent.ObjectAttributes.TargetBranch == "" {
return nil, errors.New("gitlab target branch empty")
}
repoPath := event_processor.ConvertRepositoryPath(gitLabEvent.Project.PathWithNamespace)
codebase, err := event_processor.GetCodebaseByRepoPath(ctx, p.ksClient, ns, repoPath)
if err != nil {
return nil, fmt.Errorf("failed to get codebase by repo path: %w", err)
}
return &event_processor.EventInfo{
GitProvider: event_processor.GitProviderGitLab,
RepoPath: repoPath,
TargetBranch: gitLabEvent.ObjectAttributes.TargetBranch,
Type: event_processor.EventTypeMerge,
Codebase: codebase,
PullRequest: &event_processor.PullRequest{
HeadSha: gitLabEvent.ObjectAttributes.LastCommit.ID,
Title: gitLabEvent.ObjectAttributes.Title,
HeadRef: gitLabEvent.ObjectAttributes.SourceBranch,
ChangeNumber: gitLabEvent.ObjectAttributes.ChangeNumber,
LastCommitMessage: gitLabEvent.ObjectAttributes.LastCommit.Message,
},
}, nil
}
func (p *EventProcessor) processCommentEvent(ctx context.Context, body []byte, ns string) (*event_processor.EventInfo, error) {
gitLabEvent := &event_processor.GitLabCommentEvent{}
if err := json.Unmarshal(body, gitLabEvent); err != nil {
return nil, fmt.Errorf("failed to unmarshal GitLab event: %w", err)
}
if gitLabEvent.Project.PathWithNamespace == "" {
return nil, errors.New("gitlab repository path empty")
}
repoPath := event_processor.ConvertRepositoryPath(gitLabEvent.Project.PathWithNamespace)
codebase, err := event_processor.GetCodebaseByRepoPath(ctx, p.ksClient, ns, repoPath)
if err != nil {
return nil, fmt.Errorf("failed to get codebase by repo path: %w", err)
}
// The comment was added not to the merge request if TargetBranch is empty.
// Skip processing such events.
if gitLabEvent.MergeRequest.TargetBranch == "" {
return &event_processor.EventInfo{
GitProvider: event_processor.GitProviderGitLab,
Type: event_processor.EventTypeReviewComment,
Codebase: codebase,
HasPipelineRecheck: false,
}, nil
}
return &event_processor.EventInfo{
GitProvider: event_processor.GitProviderGitLab,
RepoPath: repoPath,
TargetBranch: gitLabEvent.MergeRequest.TargetBranch,
Type: event_processor.EventTypeReviewComment,
Codebase: codebase,
HasPipelineRecheck: event_processor.ContainsPipelineRecheck(gitLabEvent.ObjectAttributes.Note),
PullRequest: &event_processor.PullRequest{
HeadSha: gitLabEvent.MergeRequest.LastCommit.ID,
Title: gitLabEvent.MergeRequest.Title,
HeadRef: gitLabEvent.MergeRequest.SourceBranch,
ChangeNumber: gitLabEvent.MergeRequest.ChangeNumber,
LastCommitMessage: gitLabEvent.MergeRequest.LastCommit.Message,
},
}, nil
}