Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 4 commits into from
May 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
19 changes: 12 additions & 7 deletions cmd/drone-server/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion cmd/drone-server/inject_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
21 changes: 14 additions & 7 deletions service/hook/hook.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,28 @@ 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 {
err := s.renew.Renew(ctx, user, false)
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,
Expand All @@ -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)
Expand Down
49 changes: 45 additions & 4 deletions service/hook/hook_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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, []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)
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)
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down