fix: [CI-11840]: Added env variable to control the event of inbound w… (#3508)

Have added the env var "DRONE_INCOMING_WEBHOOK_EVENTS" (of type list of
string) to control the event in case of incoming webhook. If no such env
variable is provided then it will fallback to default behaviour. Below
are the test cases


- Case 1: When no env variable "DRONE_INCOMING_WEBHOOK_EVENTS" is
present.


https://github.com/harness/gitness/assets/139750384/ad228d61-2608-4756-abaa-b3397eba1fb7

-  Case 2: When Deployment event is missing from env var.


https://github.com/harness/gitness/assets/139750384/0faf2afc-9e0b-42f1-9327-8dc674ed112d

- Case 3: When Deployment, pull_request events are missing from env var.


https://github.com/harness/gitness/assets/139750384/29f40107-4b7a-4eae-afa8-464d78662e8b

- Case 4: When Deployment and push events are only present in env var.


https://github.com/harness/gitness/assets/139750384/b6cdec79-20bb-4d56-8fd0-f72cb9e57a8e


Tested with few more combinations as well.
pull/3511/head
ShobhitSingh11 2024-05-07 21:05:06 +05:30 committed by GitHub
parent cc2f033569
commit 87381af2ac
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 73 additions and 20 deletions

View File

@ -80,13 +80,14 @@ type (
Yaml Yaml
// Remote configurations
Bitbucket Bitbucket
Gitea Gitea
Github Github
GitLab GitLab
Gogs Gogs
Stash Stash
Gitee Gitee
Bitbucket Bitbucket
Gitea Gitea
Github Github
GitLab GitLab
Gogs Gogs
Stash Stash
Gitee Gitee
IncomingWebhook IncomingWebhook
}
// Cloning provides the cloning configuration.
@ -443,6 +444,10 @@ type (
ContentSecurityPolicy string `envconfig:"DRONE_HTTP_CONTENT_SECURITY_POLICY"`
ReferrerPolicy string `envconfig:"DRONE_HTTP_REFERRER_POLICY"`
}
IncomingWebhook struct {
Events []string `envconfig:"DRONE_INCOMING_WEBHOOK_EVENTS" default:"branch,deployment,push,tag,pull_request"`
}
)
// Environ returns the settings from the environment.

View File

@ -85,7 +85,7 @@ func provideContentService(client *scm.Client, renewer core.Renewer) core.FileSe
// provideHookService is a Wire provider function that returns a
// hook service based on the environment configuration.
func provideHookService(client *scm.Client, renewer core.Renewer, config config.Config) core.HookService {
return hook.New(client, config.Proxy.Addr, renewer)
return hook.New(client, config.Proxy.Addr, renewer, config.IncomingWebhook.Events)
}
// provideNetrcService is a Wire provider function that returns

View File

@ -23,14 +23,15 @@ import (
)
// New returns a new HookService.
func New(client *scm.Client, addr string, renew core.Renewer) core.HookService {
return &service{client: client, addr: addr, renew: renew}
func New(client *scm.Client, addr string, renew core.Renewer, events []string) core.HookService {
return &service{client: client, addr: addr, renew: renew, events: events}
}
type service struct {
renew core.Renewer
client *scm.Client
addr string
events []string
}
func (s *service) Create(ctx context.Context, user *core.User, repo *core.Repository) error {
@ -38,6 +39,12 @@ func (s *service) Create(ctx context.Context, user *core.User, repo *core.Reposi
if err != nil {
return err
}
eventsMap := make(map[string]bool)
for _, event := range s.events {
eventsMap[event] = true
}
ctx = context.WithValue(ctx, scm.TokenKey{}, &scm.Token{
Token: user.Token,
Refresh: user.Refresh,
@ -48,11 +55,11 @@ func (s *service) Create(ctx context.Context, user *core.User, repo *core.Reposi
Target: s.addr + "/hook",
Secret: repo.Signer,
Events: scm.HookEvents{
Branch: true,
Deployment: true,
PullRequest: true,
Push: true,
Tag: true,
Branch: eventsMap["branch"],
Deployment: eventsMap["deployment"],
PullRequest: eventsMap["pull_request"],
Push: eventsMap["push"],
Tag: eventsMap["tag"],
},
}
return replaceHook(ctx, s.client, repo.Slug, hook)

View File

@ -50,11 +50,52 @@ func TestCreate(t *testing.T) {
mockRepos := mockscm.NewMockRepositoryService(controller)
mockRepos.EXPECT().ListHooks(gomock.Any(), "octocat/hello-world", gomock.Any()).Return(mockHooks, nil, nil)
mockRepos.EXPECT().CreateHook(gomock.Any(), "octocat/hello-world", hook).Return(nil, nil, nil)
client := new(scm.Client)
client.Repositories = mockRepos
service := New(client, "https://drone.company.com", mockRenewer)
service := New(client, "https://drone.company.com", mockRenewer, []string{"branch", "deployment", "push", "tag", "pull_request"})
err := service.Create(noContext, mockUser, mockRepo)
if err != nil {
t.Error(err)
}
}
func TestCreateWithLimitedEvents(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
mockUser := &core.User{}
mockHooks := []*scm.Hook{}
mockRepo := &core.Repository{
Namespace: "octocat",
Name: "hello-world",
Slug: "octocat/hello-world",
Signer: "abc123",
}
hook := &scm.HookInput{
Name: "drone",
Target: "https://drone.company.com/hook",
Secret: "abc123",
Events: scm.HookEvents{
Branch: false,
Deployment: true,
PullRequest: true,
Push: false,
Tag: true,
},
}
mockRenewer := mock.NewMockRenewer(controller)
mockRenewer.EXPECT().Renew(gomock.Any(), mockUser, false).Return(nil)
mockRepos := mockscm.NewMockRepositoryService(controller)
mockRepos.EXPECT().ListHooks(gomock.Any(), "octocat/hello-world", gomock.Any()).Return(mockHooks, nil, nil)
mockRepos.EXPECT().CreateHook(gomock.Any(), "octocat/hello-world", hook).Return(nil, nil, nil)
client := new(scm.Client)
client.Repositories = mockRepos
service := New(client, "https://drone.company.com", mockRenewer, []string{"deployment", "tag", "pull_request"})
err := service.Create(noContext, mockUser, mockRepo)
if err != nil {
t.Error(err)
@ -70,7 +111,7 @@ func TestCreate_RenewErr(t *testing.T) {
mockRenewer := mock.NewMockRenewer(controller)
mockRenewer.EXPECT().Renew(gomock.Any(), mockUser, false).Return(scm.ErrNotAuthorized)
service := New(nil, "https://drone.company.com", mockRenewer)
service := New(nil, "https://drone.company.com", mockRenewer, []string{})
err := service.Create(noContext, mockUser, nil)
if err != scm.ErrNotAuthorized {
t.Errorf("Want not authorized error, got %v", err)
@ -106,7 +147,7 @@ func TestDelete(t *testing.T) {
client := new(scm.Client)
client.Repositories = mockRepos
service := New(client, "https://drone.company.com", mockRenewer)
service := New(client, "https://drone.company.com", mockRenewer, []string{})
err := service.Delete(noContext, mockUser, mockRepo)
if err != nil {
t.Error(err)
@ -122,7 +163,7 @@ func TestDelete_RenewErr(t *testing.T) {
mockRenewer := mock.NewMockRenewer(controller)
mockRenewer.EXPECT().Renew(gomock.Any(), mockUser, false).Return(scm.ErrNotAuthorized)
service := New(nil, "https://drone.company.com", mockRenewer)
service := New(nil, "https://drone.company.com", mockRenewer, []string{})
err := service.Delete(noContext, mockUser, nil)
if err != scm.ErrNotAuthorized {
t.Errorf("Want not authorized error, got %v", err)