mirror of https://github.com/harness/drone.git
(DRON-418) send webhook and set status for failed builds (#3266)
parent
2fd3ee9491
commit
7a65bf7393
|
@ -515,6 +515,15 @@ func trunc(s string, i int) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *triggerer) createBuildError(ctx context.Context, repo *core.Repository, base *core.Hook, message string) (*core.Build, error) {
|
func (t *triggerer) createBuildError(ctx context.Context, repo *core.Repository, base *core.Hook, message string) (*core.Build, error) {
|
||||||
|
logger := logrus.WithFields(
|
||||||
|
logrus.Fields{
|
||||||
|
"repo": repo.Slug,
|
||||||
|
"ref": base.Ref,
|
||||||
|
"event": base.Event,
|
||||||
|
"commit": base.After,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
repo, err := t.repos.Increment(ctx, repo)
|
repo, err := t.repos.Increment(ctx, repo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -553,6 +562,41 @@ func (t *triggerer) createBuildError(ctx context.Context, repo *core.Repository,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = t.builds.Create(ctx, build, nil)
|
err = t.builds.Create(ctx, build, nil)
|
||||||
|
if err != nil {
|
||||||
|
logger = logger.WithError(err)
|
||||||
|
logger.Errorln("trigger: cannot create build error")
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
user, err := t.users.Find(ctx, repo.UserID)
|
||||||
|
if err != nil {
|
||||||
|
logger = logger.WithError(err)
|
||||||
|
logger.Warnln("trigger: cannot find repository owner")
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = t.status.Send(ctx, user, &core.StatusInput{
|
||||||
|
Repo: repo,
|
||||||
|
Build: build,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
logger = logger.WithError(err)
|
||||||
|
logger.Warnln("trigger: cannot create status")
|
||||||
|
}
|
||||||
|
|
||||||
|
payload := &core.WebhookData{
|
||||||
|
Event: core.WebhookEventBuild,
|
||||||
|
Action: core.WebhookActionCreated,
|
||||||
|
User: user,
|
||||||
|
Repo: repo,
|
||||||
|
Build: build,
|
||||||
|
}
|
||||||
|
err = t.hooks.Send(ctx, payload)
|
||||||
|
if err != nil {
|
||||||
|
logger = logger.WithError(err)
|
||||||
|
logger.Warnln("trigger: cannot send webhook")
|
||||||
|
}
|
||||||
|
|
||||||
return build, err
|
return build, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
// Use of this source code is governed by the Drone Non-Commercial License
|
// Use of this source code is governed by the Drone Non-Commercial License
|
||||||
// that can be found in the LICENSE file.
|
// that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build !oss
|
||||||
// +build !oss
|
// +build !oss
|
||||||
|
|
||||||
package trigger
|
package trigger
|
||||||
|
@ -192,8 +193,30 @@ func TestTrigger_ErrorYaml(t *testing.T) {
|
||||||
controller := gomock.NewController(t)
|
controller := gomock.NewController(t)
|
||||||
defer controller.Finish()
|
defer controller.Finish()
|
||||||
|
|
||||||
|
checkBuild := func(_ context.Context, build *core.Build, stages []*core.Stage) {
|
||||||
|
if diff := cmp.Diff(build, dummyErrorBuild, ignoreBuildFields); diff != "" {
|
||||||
|
t.Errorf(diff)
|
||||||
|
}
|
||||||
|
if diff := cmp.Diff(stages, []*core.Stage(nil), ignoreStageFields); diff != "" {
|
||||||
|
t.Errorf(diff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
checkStatus := func(_ context.Context, _ *core.User, req *core.StatusInput) error {
|
||||||
|
if diff := cmp.Diff(req.Build, dummyErrorBuild, ignoreBuildFields); diff != "" {
|
||||||
|
t.Errorf(diff)
|
||||||
|
}
|
||||||
|
if diff := cmp.Diff(req.Repo, dummyRepo, ignoreStageFields); diff != "" {
|
||||||
|
t.Errorf(diff)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
mockUsers := mock.NewMockUserStore(controller)
|
mockUsers := mock.NewMockUserStore(controller)
|
||||||
mockUsers.EXPECT().Find(noContext, dummyRepo.UserID).Return(dummyUser, nil)
|
mockUsers.EXPECT().Find(noContext, dummyRepo.UserID).Return(dummyUser, nil).MaxTimes(3)
|
||||||
|
|
||||||
|
mockRepos := mock.NewMockRepositoryStore(controller)
|
||||||
|
mockRepos.EXPECT().Increment(gomock.Any(), dummyRepo).Return(dummyRepo, nil)
|
||||||
|
|
||||||
mockConfigService := mock.NewMockConfigService(controller)
|
mockConfigService := mock.NewMockConfigService(controller)
|
||||||
mockConfigService.EXPECT().Find(gomock.Any(), gomock.Any()).Return(dummyYamlInvalid, nil)
|
mockConfigService.EXPECT().Find(gomock.Any(), gomock.Any()).Return(dummyYamlInvalid, nil)
|
||||||
|
@ -201,24 +224,27 @@ func TestTrigger_ErrorYaml(t *testing.T) {
|
||||||
mockConvertService := mock.NewMockConvertService(controller)
|
mockConvertService := mock.NewMockConvertService(controller)
|
||||||
mockConvertService.EXPECT().Convert(gomock.Any(), gomock.Any()).Return(dummyYamlInvalid, nil)
|
mockConvertService.EXPECT().Convert(gomock.Any(), gomock.Any()).Return(dummyYamlInvalid, nil)
|
||||||
|
|
||||||
mockRepos := mock.NewMockRepositoryStore(controller)
|
mockStatus := mock.NewMockStatusService(controller)
|
||||||
mockRepos.EXPECT().Increment(gomock.Any(), dummyRepo).Return(dummyRepo, nil)
|
mockStatus.EXPECT().Send(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).Do(checkStatus)
|
||||||
|
|
||||||
mockBuilds := mock.NewMockBuildStore(controller)
|
mockBuilds := mock.NewMockBuildStore(controller)
|
||||||
mockBuilds.EXPECT().Create(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil) // .Do(checkBuild).Return(nil)
|
mockBuilds.EXPECT().Create(gomock.Any(), gomock.Any(), gomock.Any()).Do(checkBuild).Return(nil)
|
||||||
|
|
||||||
|
mockWebhooks := mock.NewMockWebhookSender(controller)
|
||||||
|
mockWebhooks.EXPECT().Send(gomock.Any(), gomock.Any()).Return(nil)
|
||||||
|
|
||||||
triggerer := New(
|
triggerer := New(
|
||||||
nil,
|
nil,
|
||||||
mockConfigService,
|
mockConfigService,
|
||||||
mockConvertService,
|
mockConvertService,
|
||||||
nil,
|
nil,
|
||||||
nil,
|
mockStatus,
|
||||||
mockBuilds,
|
mockBuilds,
|
||||||
nil,
|
nil,
|
||||||
mockRepos,
|
mockRepos,
|
||||||
mockUsers,
|
mockUsers,
|
||||||
nil,
|
nil,
|
||||||
nil,
|
mockWebhooks,
|
||||||
)
|
)
|
||||||
|
|
||||||
build, err := triggerer.Trigger(noContext, dummyRepo, dummyHook)
|
build, err := triggerer.Trigger(noContext, dummyRepo, dummyHook)
|
||||||
|
@ -520,6 +546,28 @@ var (
|
||||||
Action: "opened",
|
Action: "opened",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dummyErrorBuild = &core.Build{
|
||||||
|
Number: dummyRepo.Counter,
|
||||||
|
RepoID: dummyRepo.ID,
|
||||||
|
Status: core.StatusError,
|
||||||
|
Error: "yaml: found unknown directive name",
|
||||||
|
Event: core.EventPush,
|
||||||
|
Link: "https://github.com/octocat/Hello-World/commit/7fd1a60b01f91b314f59955a4e4d4e80d8edf11d",
|
||||||
|
// Timestamp: 1299283200,
|
||||||
|
Message: "first commit",
|
||||||
|
Before: "553c2077f0edc3d5dc5d17262f6aa498e69d6f8e",
|
||||||
|
After: "7fd1a60b01f91b314f59955a4e4d4e80d8edf11d",
|
||||||
|
Ref: "refs/heads/master",
|
||||||
|
Source: "master",
|
||||||
|
Target: "master",
|
||||||
|
Author: "octocat",
|
||||||
|
AuthorName: "The Octocat",
|
||||||
|
AuthorEmail: "octocat@hello-world.com",
|
||||||
|
AuthorAvatar: "https://avatars3.githubusercontent.com/u/583231",
|
||||||
|
Sender: "octocat",
|
||||||
|
Action: "opened",
|
||||||
|
}
|
||||||
|
|
||||||
dummyRepo = &core.Repository{
|
dummyRepo = &core.Repository{
|
||||||
ID: 1,
|
ID: 1,
|
||||||
UID: "1296269",
|
UID: "1296269",
|
||||||
|
@ -558,6 +606,10 @@ var (
|
||||||
dummyStage,
|
dummyStage,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dummyErrorStages = []*core.Stage{
|
||||||
|
dummyStage,
|
||||||
|
}
|
||||||
|
|
||||||
dummyUser = &core.User{
|
dummyUser = &core.User{
|
||||||
ID: 2,
|
ID: 2,
|
||||||
Login: "octocat",
|
Login: "octocat",
|
||||||
|
@ -600,7 +652,7 @@ trigger:
|
||||||
}
|
}
|
||||||
|
|
||||||
ignoreBuildFields = cmpopts.IgnoreFields(core.Build{},
|
ignoreBuildFields = cmpopts.IgnoreFields(core.Build{},
|
||||||
"Created", "Updated")
|
"Created", "Updated", "Started", "Finished")
|
||||||
|
|
||||||
ignoreStageFields = cmpopts.IgnoreFields(core.Stage{},
|
ignoreStageFields = cmpopts.IgnoreFields(core.Stage{},
|
||||||
"Created", "Updated")
|
"Created", "Updated")
|
||||||
|
|
Loading…
Reference in New Issue