diff --git a/internal/server/hooks/hook.go b/internal/server/hooks/hook.go index a992bf05..1c020e56 100644 --- a/internal/server/hooks/hook.go +++ b/internal/server/hooks/hook.go @@ -13,6 +13,7 @@ import ( "github.com/gitploy-io/gitploy/model/ent" "github.com/gitploy-io/gitploy/model/ent/deployment" "github.com/gitploy-io/gitploy/model/ent/event" + "github.com/gitploy-io/gitploy/model/extent" "github.com/gitploy-io/gitploy/pkg/e" ) @@ -170,53 +171,52 @@ func (h *Hooks) handleGithubPushEvent(c *gin.Context) { return } else if r.Edges.Owner == nil { h.log.Warn("The owner is not found.", zap.Int64("repo_id", r.ID)) - gb.ResponseWithError(c, - e.NewErrorWithMessage(e.ErrorCodeInternalError, "The owner is not found.", nil), - ) + gb.ResponseWithError(c, e.NewErrorWithMessage(e.ErrorCodeInternalError, "The owner is not found.", nil)) return } - config, err := h.i.GetConfig(ctx, r.Edges.Owner, r) + h.log.Debug("Get the configuration of the repository.") + config, err := h.i.GetEvaluatedConfig(ctx, r.Edges.Owner, r, &extent.EvalValues{ + IsRollback: false, + }) if err != nil { h.log.Check(gb.GetZapLogLevel(err), "Failed to find the configuration file.").Write(zap.Error(err)) gb.ResponseWithError(c, err) return } + h.log.Debug("Parse the ref of the hook.", zap.String("ref", *evt.Ref)) + typ, ref, err := parseGithubRef(*evt.Ref) + if err != nil { + h.log.Error("Failed to parse the ref.", zap.Error(err)) + gb.ResponseWithError(c, err) + return + } + + // Checks whether the 'auto_deploy_on' field is valid. for _, env := range config.Envs { - ok, err := env.IsAutoDeployOn(*evt.Ref) - if err != nil { - h.log.Warn("Failed to validate the ref is matched with 'auto_deploy_on'.", zap.Error(err)) - continue - } - if !ok { - continue + if _, err := env.IsAutoDeployOn(*evt.Ref); err != nil { + h.log.Error("Failed to validate the ref is matched with 'auto_deploy_on'.", zap.Error(err)) + gb.ResponseWithError(c, err) + return } + } - typ, ref, err := parseGithubRef(*evt.Ref) - if err != nil { - h.log.Error("Failed to parse the ref.", zap.Error(err)) + // If it is a ref matching the 'auto_deploy_on' field, Gitploy trigger to deploy. + for _, env := range config.Envs { + if ok, _ := env.IsAutoDeployOn(*evt.Ref); !ok { + h.log.Debug("Skip the environment, not matched with the ref.", zap.String("env", env.Name), zap.String("ref", *evt.Ref)) continue } h.log.Info("Trigger to deploy the ref.", zap.String("ref", *evt.Ref), zap.String("environment", env.Name)) - d := &ent.Deployment{ + _, err = h.i.Deploy(ctx, r.Edges.Owner, r, &ent.Deployment{ Type: typ, Ref: ref, Env: env.Name, - } - d, err = h.i.Deploy(ctx, r.Edges.Owner, r, d, env) + }, env) if err != nil { h.log.Error("Failed to deploy.", zap.Error(err)) - continue - } - - if _, err := h.i.CreateEvent(ctx, &ent.Event{ - Kind: event.KindDeployment, - Type: event.TypeCreated, - DeploymentID: d.ID, - }); err != nil { - h.log.Error("It has failed to create the event.", zap.Error(err)) } } diff --git a/internal/server/hooks/hook_test.go b/internal/server/hooks/hook_test.go index dba8ff28..a833506d 100644 --- a/internal/server/hooks/hook_test.go +++ b/internal/server/hooks/hook_test.go @@ -123,7 +123,7 @@ func TestHook_HandleHook(t *testing.T) { t.Log("Return the auto-deployment environment.") m. EXPECT(). - GetConfig(gomock.Any(), gomock.AssignableToTypeOf(&ent.User{}), gomock.AssignableToTypeOf(&ent.Repo{})). + GetEvaluatedConfig(gomock.Any(), gomock.AssignableToTypeOf(&ent.User{}), gomock.AssignableToTypeOf(&ent.Repo{}), gomock.AssignableToTypeOf(&extent.EvalValues{})). Return(&extent.Config{ Envs: []*extent.Env{ { @@ -151,11 +151,6 @@ func TestHook_HandleHook(t *testing.T) { ). Return(&ent.Deployment{}, nil) - m. - EXPECT(). - CreateEvent(gomock.Any(), gomock.AssignableToTypeOf(&ent.Event{})). - Return(&ent.Event{}, nil) - h := NewHooks(&ConfigHooks{}, m) r := gin.New() r.POST("/hooks", h.HandleHook) diff --git a/internal/server/hooks/interface.go b/internal/server/hooks/interface.go index 65faa6c2..8f286a68 100644 --- a/internal/server/hooks/interface.go +++ b/internal/server/hooks/interface.go @@ -18,6 +18,6 @@ type ( UpdateDeployment(ctx context.Context, d *ent.Deployment) (*ent.Deployment, error) ProduceDeploymentStatisticsOfRepo(ctx context.Context, r *ent.Repo, d *ent.Deployment) (*ent.DeploymentStatistics, error) CreateEvent(ctx context.Context, e *ent.Event) (*ent.Event, error) - GetConfig(ctx context.Context, u *ent.User, r *ent.Repo) (*extent.Config, error) + GetEvaluatedConfig(ctx context.Context, u *ent.User, r *ent.Repo, v *extent.EvalValues) (*extent.Config, error) } ) diff --git a/internal/server/hooks/mock/interactor.go b/internal/server/hooks/mock/interactor.go index 50b16fb6..e7274aed 100644 --- a/internal/server/hooks/mock/interactor.go +++ b/internal/server/hooks/mock/interactor.go @@ -96,19 +96,19 @@ func (mr *MockInteractorMockRecorder) FindRepoByID(ctx, id interface{}) *gomock. return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindRepoByID", reflect.TypeOf((*MockInteractor)(nil).FindRepoByID), ctx, id) } -// GetConfig mocks base method. -func (m *MockInteractor) GetConfig(ctx context.Context, u *ent.User, r *ent.Repo) (*extent.Config, error) { +// GetEvaluatedConfig mocks base method. +func (m *MockInteractor) GetEvaluatedConfig(ctx context.Context, u *ent.User, r *ent.Repo, v *extent.EvalValues) (*extent.Config, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetConfig", ctx, u, r) + ret := m.ctrl.Call(m, "GetEvaluatedConfig", ctx, u, r, v) ret0, _ := ret[0].(*extent.Config) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetConfig indicates an expected call of GetConfig. -func (mr *MockInteractorMockRecorder) GetConfig(ctx, u, r interface{}) *gomock.Call { +// GetEvaluatedConfig indicates an expected call of GetEvaluatedConfig. +func (mr *MockInteractorMockRecorder) GetEvaluatedConfig(ctx, u, r, v interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConfig", reflect.TypeOf((*MockInteractor)(nil).GetConfig), ctx, u, r) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEvaluatedConfig", reflect.TypeOf((*MockInteractor)(nil).GetEvaluatedConfig), ctx, u, r, v) } // ProduceDeploymentStatisticsOfRepo mocks base method.