diff --git a/pkg/controller/handlers.go b/pkg/controller/handlers.go index ee638307..b6973208 100644 --- a/pkg/controller/handlers.go +++ b/pkg/controller/handlers.go @@ -129,6 +129,10 @@ func (c *Controller) WebhookHandler(w http.ResponseWriter, r *http.Request) { go c.processJobEvent(ctx, *event) case *gitlab.DeploymentEvent: go c.processDeploymentEvent(ctx, *event) + case *gitlab.PushEvent: + go c.processPushEvent(ctx, *event) + case *gitlab.TagEvent: + go c.processTagEvent(ctx, *event) default: logger. WithField("event-type", reflect.TypeOf(event).String()). diff --git a/pkg/controller/webhooks.go b/pkg/controller/webhooks.go index 9a0b126e..11b2efc0 100644 --- a/pkg/controller/webhooks.go +++ b/pkg/controller/webhooks.go @@ -66,6 +66,62 @@ func (c *Controller) processJobEvent(ctx context.Context, e goGitlab.JobEvent) { )) } +func (c *Controller) processPushEvent(ctx context.Context, e goGitlab.PushEvent) { + if e.CheckoutSHA == "" { + var ( + refKind = schemas.RefKindBranch + refName string + ) + + // branch refs in push events have "refs/heads/" prefix + if branch, found := strings.CutPrefix(e.Ref, "refs/heads/"); found { + refName = branch + } else { + log.WithContext(ctx). + WithFields(log.Fields{ + "project-name": e.Project.Name, + "ref": e.Ref, + }). + Error("extracting branch name from ref") + return + } + + deleteRef(ctx, c.Store, schemas.NewRef( + schemas.NewProject(e.Project.PathWithNamespace), + refKind, + refName, + ), "received branch deletion push event from webhook") + } +} + +func (c *Controller) processTagEvent(ctx context.Context, e goGitlab.TagEvent) { + if e.CheckoutSHA == "" { + var ( + refKind = schemas.RefKindTag + refName string + ) + + // tags refs in tag events have "refs/tags/" prefix + if tag, found := strings.CutPrefix(e.Ref, "refs/tags/"); found { + refName = tag + } else { + log.WithContext(ctx). + WithFields(log.Fields{ + "project-name": e.Project.Name, + "ref": e.Ref, + }). + Error("extracting tag name from ref") + return + } + + deleteRef(ctx, c.Store, schemas.NewRef( + schemas.NewProject(e.Project.PathWithNamespace), + refKind, + refName, + ), "received tag deletion tag event from webhook") + } +} + func (c *Controller) triggerRefMetricsPull(ctx context.Context, ref schemas.Ref) { logFields := log.Fields{ "project-name": ref.Project.Name,