mirror of https://github.com/harness/drone.git
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
parent
cc2f033569
commit
87381af2ac
|
@ -80,13 +80,14 @@ type (
|
||||||
Yaml Yaml
|
Yaml Yaml
|
||||||
|
|
||||||
// Remote configurations
|
// Remote configurations
|
||||||
Bitbucket Bitbucket
|
Bitbucket Bitbucket
|
||||||
Gitea Gitea
|
Gitea Gitea
|
||||||
Github Github
|
Github Github
|
||||||
GitLab GitLab
|
GitLab GitLab
|
||||||
Gogs Gogs
|
Gogs Gogs
|
||||||
Stash Stash
|
Stash Stash
|
||||||
Gitee Gitee
|
Gitee Gitee
|
||||||
|
IncomingWebhook IncomingWebhook
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cloning provides the cloning configuration.
|
// Cloning provides the cloning configuration.
|
||||||
|
@ -443,6 +444,10 @@ type (
|
||||||
ContentSecurityPolicy string `envconfig:"DRONE_HTTP_CONTENT_SECURITY_POLICY"`
|
ContentSecurityPolicy string `envconfig:"DRONE_HTTP_CONTENT_SECURITY_POLICY"`
|
||||||
ReferrerPolicy string `envconfig:"DRONE_HTTP_REFERRER_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.
|
// Environ returns the settings from the environment.
|
||||||
|
|
|
@ -85,7 +85,7 @@ func provideContentService(client *scm.Client, renewer core.Renewer) core.FileSe
|
||||||
// provideHookService is a Wire provider function that returns a
|
// provideHookService is a Wire provider function that returns a
|
||||||
// hook service based on the environment configuration.
|
// hook service based on the environment configuration.
|
||||||
func provideHookService(client *scm.Client, renewer core.Renewer, config config.Config) core.HookService {
|
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
|
// provideNetrcService is a Wire provider function that returns
|
||||||
|
|
|
@ -23,14 +23,15 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// New returns a new HookService.
|
// New returns a new HookService.
|
||||||
func New(client *scm.Client, addr string, renew core.Renewer) core.HookService {
|
func New(client *scm.Client, addr string, renew core.Renewer, events []string) core.HookService {
|
||||||
return &service{client: client, addr: addr, renew: renew}
|
return &service{client: client, addr: addr, renew: renew, events: events}
|
||||||
}
|
}
|
||||||
|
|
||||||
type service struct {
|
type service struct {
|
||||||
renew core.Renewer
|
renew core.Renewer
|
||||||
client *scm.Client
|
client *scm.Client
|
||||||
addr string
|
addr string
|
||||||
|
events []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) Create(ctx context.Context, user *core.User, repo *core.Repository) error {
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
eventsMap := make(map[string]bool)
|
||||||
|
for _, event := range s.events {
|
||||||
|
eventsMap[event] = true
|
||||||
|
}
|
||||||
|
|
||||||
ctx = context.WithValue(ctx, scm.TokenKey{}, &scm.Token{
|
ctx = context.WithValue(ctx, scm.TokenKey{}, &scm.Token{
|
||||||
Token: user.Token,
|
Token: user.Token,
|
||||||
Refresh: user.Refresh,
|
Refresh: user.Refresh,
|
||||||
|
@ -48,11 +55,11 @@ func (s *service) Create(ctx context.Context, user *core.User, repo *core.Reposi
|
||||||
Target: s.addr + "/hook",
|
Target: s.addr + "/hook",
|
||||||
Secret: repo.Signer,
|
Secret: repo.Signer,
|
||||||
Events: scm.HookEvents{
|
Events: scm.HookEvents{
|
||||||
Branch: true,
|
Branch: eventsMap["branch"],
|
||||||
Deployment: true,
|
Deployment: eventsMap["deployment"],
|
||||||
PullRequest: true,
|
PullRequest: eventsMap["pull_request"],
|
||||||
Push: true,
|
Push: eventsMap["push"],
|
||||||
Tag: true,
|
Tag: eventsMap["tag"],
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
return replaceHook(ctx, s.client, repo.Slug, hook)
|
return replaceHook(ctx, s.client, repo.Slug, hook)
|
||||||
|
|
|
@ -50,11 +50,52 @@ func TestCreate(t *testing.T) {
|
||||||
mockRepos := mockscm.NewMockRepositoryService(controller)
|
mockRepos := mockscm.NewMockRepositoryService(controller)
|
||||||
mockRepos.EXPECT().ListHooks(gomock.Any(), "octocat/hello-world", gomock.Any()).Return(mockHooks, nil, nil)
|
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)
|
mockRepos.EXPECT().CreateHook(gomock.Any(), "octocat/hello-world", hook).Return(nil, nil, nil)
|
||||||
|
|
||||||
client := new(scm.Client)
|
client := new(scm.Client)
|
||||||
client.Repositories = mockRepos
|
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)
|
err := service.Create(noContext, mockUser, mockRepo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
|
@ -70,7 +111,7 @@ func TestCreate_RenewErr(t *testing.T) {
|
||||||
mockRenewer := mock.NewMockRenewer(controller)
|
mockRenewer := mock.NewMockRenewer(controller)
|
||||||
mockRenewer.EXPECT().Renew(gomock.Any(), mockUser, false).Return(scm.ErrNotAuthorized)
|
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)
|
err := service.Create(noContext, mockUser, nil)
|
||||||
if err != scm.ErrNotAuthorized {
|
if err != scm.ErrNotAuthorized {
|
||||||
t.Errorf("Want not authorized error, got %v", err)
|
t.Errorf("Want not authorized error, got %v", err)
|
||||||
|
@ -106,7 +147,7 @@ func TestDelete(t *testing.T) {
|
||||||
client := new(scm.Client)
|
client := new(scm.Client)
|
||||||
client.Repositories = mockRepos
|
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)
|
err := service.Delete(noContext, mockUser, mockRepo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
|
@ -122,7 +163,7 @@ func TestDelete_RenewErr(t *testing.T) {
|
||||||
mockRenewer := mock.NewMockRenewer(controller)
|
mockRenewer := mock.NewMockRenewer(controller)
|
||||||
mockRenewer.EXPECT().Renew(gomock.Any(), mockUser, false).Return(scm.ErrNotAuthorized)
|
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)
|
err := service.Delete(noContext, mockUser, nil)
|
||||||
if err != scm.ErrNotAuthorized {
|
if err != scm.ErrNotAuthorized {
|
||||||
t.Errorf("Want not authorized error, got %v", err)
|
t.Errorf("Want not authorized error, got %v", err)
|
||||||
|
|
Loading…
Reference in New Issue