diff --git a/client/cron/CiTriggerCron.go b/client/cron/CiTriggerCron.go index c208ff8cc8..3ded91c038 100644 --- a/client/cron/CiTriggerCron.go +++ b/client/cron/CiTriggerCron.go @@ -20,6 +20,7 @@ import ( "fmt" "github.com/caarlos0/env" repository2 "github.com/devtron-labs/devtron/internal/sql/repository" + bean2 "github.com/devtron-labs/devtron/pkg/auth/user/bean" "github.com/devtron-labs/devtron/pkg/bean" pipelineConfigBean "github.com/devtron-labs/devtron/pkg/build/pipeline/bean" "github.com/devtron-labs/devtron/pkg/pipeline" @@ -98,7 +99,7 @@ func (impl *CiTriggerCronImpl) TriggerCiCron() { ciTriggerRequest := bean.CiTriggerRequest{ PipelineId: ciPipelineId, CiPipelineMaterial: ciPipelineMaterials, - TriggeredBy: 1, + TriggeredBy: bean2.SYSTEM_USER_ID, InvalidateCache: false, PipelineType: string(pipelineConfigBean.CI_JOB), } diff --git a/internal/sql/repository/app/AppRepository.go b/internal/sql/repository/app/AppRepository.go index 0af623c669..2ccf064c9a 100644 --- a/internal/sql/repository/app/AppRepository.go +++ b/internal/sql/repository/app/AppRepository.go @@ -48,10 +48,6 @@ func (app *App) IsEmpty() bool { return app.Id == 0 } -const ( - SYSTEM_USER_ID = 1 -) - func (app *App) IsAppJobOrExternalType() bool { return len(app.DisplayName) > 0 } diff --git a/pkg/build/git/gitWebhook/GitWebhookService.go b/pkg/build/git/gitWebhook/GitWebhookService.go index 57baf251dd..3f301db311 100644 --- a/pkg/build/git/gitWebhook/GitWebhookService.go +++ b/pkg/build/git/gitWebhook/GitWebhookService.go @@ -20,6 +20,7 @@ import ( "github.com/devtron-labs/devtron/client/gitSensor" "github.com/devtron-labs/devtron/internal/sql/constants" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" + bean2 "github.com/devtron-labs/devtron/pkg/auth/user/bean" "github.com/devtron-labs/devtron/pkg/bean" "github.com/devtron-labs/devtron/pkg/build/git/gitWebhook/repository" "github.com/devtron-labs/devtron/pkg/pipeline" @@ -71,7 +72,7 @@ func (impl *GitWebhookServiceImpl) HandleGitWebhook(gitWebhookRequest gitSensor. resp, err := impl.ciHandler.HandleCIWebhook(bean.GitCiTriggerRequest{ CiPipelineMaterial: ciPipelineMaterial, - TriggeredBy: 1, // Automatic trigger, userId is 1 + TriggeredBy: bean2.SYSTEM_USER_ID, // Automatic trigger, system user ExtraEnvironmentVariables: gitWebhookRequest.ExtraEnvironmentVariables, }) if err != nil { diff --git a/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go b/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go index 6e0b81c207..580bbf4da9 100644 --- a/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go +++ b/pkg/deployment/trigger/devtronApps/PreStageTriggerService.go @@ -32,6 +32,7 @@ import ( "github.com/devtron-labs/devtron/internal/util" bean6 "github.com/devtron-labs/devtron/pkg/app/bean" attributesBean "github.com/devtron-labs/devtron/pkg/attributes/bean" + bean7 "github.com/devtron-labs/devtron/pkg/auth/user/bean" bean4 "github.com/devtron-labs/devtron/pkg/bean" "github.com/devtron-labs/devtron/pkg/bean/common" repository4 "github.com/devtron-labs/devtron/pkg/cluster/environment/repository" @@ -177,7 +178,7 @@ func (impl *TriggerServiceImpl) TriggerPreStage(request bean.TriggerRequest) (*b return manifestPushTemplate, nil } -func (impl *TriggerServiceImpl) TriggerAutoCDOnPreStageSuccess(triggerContext bean.TriggerContext, cdPipelineId, ciArtifactId, workflowId int, triggerdBy int32) error { +func (impl *TriggerServiceImpl) TriggerAutoCDOnPreStageSuccess(triggerContext bean.TriggerContext, cdPipelineId, ciArtifactId, workflowId int) error { pipeline, err := impl.pipelineRepository.FindById(cdPipelineId) if err != nil { return err @@ -204,7 +205,7 @@ func (impl *TriggerServiceImpl) TriggerAutoCDOnPreStageSuccess(triggerContext be CdWf: cdWorkflow, Pipeline: pipeline, Artifact: ciArtifact, - TriggeredBy: triggerdBy, + TriggeredBy: bean7.SYSTEM_USER_ID, TriggerContext: triggerContext, } diff --git a/pkg/deployment/trigger/devtronApps/TriggerService.go b/pkg/deployment/trigger/devtronApps/TriggerService.go index ea4f7ecca6..7a5d135045 100644 --- a/pkg/deployment/trigger/devtronApps/TriggerService.go +++ b/pkg/deployment/trigger/devtronApps/TriggerService.go @@ -104,7 +104,7 @@ type TriggerService interface { TriggerPostStage(request bean.TriggerRequest) (*bean4.ManifestPushTemplate, error) TriggerPreStage(request bean.TriggerRequest) (*bean4.ManifestPushTemplate, error) - TriggerAutoCDOnPreStageSuccess(triggerContext bean.TriggerContext, cdPipelineId, ciArtifactId, workflowId int, triggerdBy int32) error + TriggerAutoCDOnPreStageSuccess(triggerContext bean.TriggerContext, cdPipelineId, ciArtifactId, workflowId int) error TriggerStageForBulk(triggerRequest bean.TriggerRequest) error @@ -646,7 +646,7 @@ func (impl *TriggerServiceImpl) TriggerAutomaticDeployment(request bean.TriggerR WorkflowType: bean3.CD_WORKFLOW_TYPE_DEPLOY, ExecutorType: cdWorkflow.WORKFLOW_EXECUTOR_TYPE_SYSTEM, Status: cdWorkflow.WorkflowInitiated, // deployment Initiated for auto trigger - TriggeredBy: 1, + TriggeredBy: triggeredBy, StartedOn: triggeredAt, Namespace: impl.config.GetDefaultNamespace(), CdWorkflowId: cdWf.Id, @@ -677,13 +677,12 @@ func (impl *TriggerServiceImpl) TriggerAutomaticDeployment(request bean.TriggerR impl.logger.Errorw("error in fetching environment deployment config by appId and envId", "appId", pipeline.AppId, "envId", pipeline.EnvironmentId, "err", err) return err } - // setting triggeredBy as 1(system user) since case of auto trigger - validationErr := impl.validateDeploymentTriggerRequest(ctx, adapter.NewValidateDeploymentTriggerObj(runner, pipeline, artifact.ImageDigest, envDeploymentConfig, 1, false)) + validationErr := impl.validateDeploymentTriggerRequest(ctx, adapter.NewValidateDeploymentTriggerObj(runner, pipeline, artifact.ImageDigest, envDeploymentConfig, triggeredBy, false)) if validationErr != nil { impl.logger.Errorw("validation error deployment request", "cdWfr", runner.Id, "err", validationErr) return validationErr } - releaseErr := impl.TriggerCD(ctx, artifact, cdWf.Id, savedWfr.Id, pipeline, envDeploymentConfig, triggeredAt) + releaseErr := impl.TriggerCD(ctx, artifact, cdWf.Id, savedWfr.Id, pipeline, envDeploymentConfig, triggeredAt, triggeredBy) // if releaseErr found, then the mark current deployment Failed and return if releaseErr != nil { err := impl.cdWorkflowCommonService.MarkCurrentDeploymentFailed(runner, releaseErr, triggeredBy) @@ -695,9 +694,9 @@ func (impl *TriggerServiceImpl) TriggerAutomaticDeployment(request bean.TriggerR return nil } -func (impl *TriggerServiceImpl) TriggerCD(ctx context.Context, artifact *repository3.CiArtifact, cdWorkflowId, wfrId int, pipeline *pipelineConfig.Pipeline, envDeploymentConfig *bean9.DeploymentConfig, triggeredAt time.Time) error { +func (impl *TriggerServiceImpl) TriggerCD(ctx context.Context, artifact *repository3.CiArtifact, cdWorkflowId, wfrId int, pipeline *pipelineConfig.Pipeline, envDeploymentConfig *bean9.DeploymentConfig, triggeredAt time.Time, triggeredBy int32) error { impl.logger.Debugw("automatic pipeline trigger attempt async", "artifactId", artifact.Id) - err := impl.triggerReleaseAsync(ctx, artifact, cdWorkflowId, wfrId, pipeline, envDeploymentConfig, triggeredAt) + err := impl.triggerReleaseAsync(ctx, artifact, cdWorkflowId, wfrId, pipeline, envDeploymentConfig, triggeredAt, triggeredBy) if err != nil { impl.logger.Errorw("error in cd trigger", "err", err) return err @@ -705,8 +704,8 @@ func (impl *TriggerServiceImpl) TriggerCD(ctx context.Context, artifact *reposit return err } -func (impl *TriggerServiceImpl) triggerReleaseAsync(ctx context.Context, artifact *repository3.CiArtifact, cdWorkflowId, wfrId int, pipeline *pipelineConfig.Pipeline, envDeploymentConfig *bean9.DeploymentConfig, triggeredAt time.Time) error { - err := impl.validateAndTrigger(ctx, pipeline, envDeploymentConfig, artifact, cdWorkflowId, wfrId, triggeredAt) +func (impl *TriggerServiceImpl) triggerReleaseAsync(ctx context.Context, artifact *repository3.CiArtifact, cdWorkflowId, wfrId int, pipeline *pipelineConfig.Pipeline, envDeploymentConfig *bean9.DeploymentConfig, triggeredAt time.Time, triggeredBy int32) error { + err := impl.validateAndTrigger(ctx, pipeline, envDeploymentConfig, artifact, cdWorkflowId, wfrId, triggeredAt, triggeredBy) if err != nil { impl.logger.Errorw("error in trigger for pipeline", "pipelineId", strconv.Itoa(pipeline.Id)) } @@ -714,7 +713,7 @@ func (impl *TriggerServiceImpl) triggerReleaseAsync(ctx context.Context, artifac return err } -func (impl *TriggerServiceImpl) validateAndTrigger(ctx context.Context, p *pipelineConfig.Pipeline, envDeploymentConfig *bean9.DeploymentConfig, artifact *repository3.CiArtifact, cdWorkflowId, wfrId int, triggeredAt time.Time) error { +func (impl *TriggerServiceImpl) validateAndTrigger(ctx context.Context, p *pipelineConfig.Pipeline, envDeploymentConfig *bean9.DeploymentConfig, artifact *repository3.CiArtifact, cdWorkflowId, wfrId int, triggeredAt time.Time, triggeredBy int32) error { //TODO: verify this logic object := impl.enforcerUtil.GetAppRBACNameByAppId(p.AppId) envApp := strings.Split(object, "/") @@ -722,11 +721,11 @@ func (impl *TriggerServiceImpl) validateAndTrigger(ctx context.Context, p *pipel impl.logger.Error("invalid req, app and env not found from rbac") return errors.New("invalid req, app and env not found from rbac") } - err := impl.releasePipeline(ctx, p, envDeploymentConfig, artifact, cdWorkflowId, wfrId, triggeredAt) + err := impl.releasePipeline(ctx, p, envDeploymentConfig, artifact, cdWorkflowId, wfrId, triggeredAt, triggeredBy) return err } -func (impl *TriggerServiceImpl) releasePipeline(ctx context.Context, pipeline *pipelineConfig.Pipeline, envDeploymentConfig *bean9.DeploymentConfig, artifact *repository3.CiArtifact, cdWorkflowId, wfrId int, triggeredAt time.Time) error { +func (impl *TriggerServiceImpl) releasePipeline(ctx context.Context, pipeline *pipelineConfig.Pipeline, envDeploymentConfig *bean9.DeploymentConfig, artifact *repository3.CiArtifact, cdWorkflowId, wfrId int, triggeredAt time.Time, triggeredBy int32) error { startTime := time.Now() defer func() { impl.logger.Debugw("auto trigger release process completed", "timeTaken", time.Since(startTime), "cdPipelineId", pipeline.Id, "artifactId", artifact.Id, "wfrId", wfrId) @@ -751,8 +750,7 @@ func (impl *TriggerServiceImpl) releasePipeline(ctx context.Context, pipeline *p adapter.SetPipelineFieldsInOverrideRequest(request, pipeline, envDeploymentConfig) - // setting deployedBy as 1(system user) since case of auto trigger - id, _, err := impl.handleCDTriggerRelease(ctx, request, envDeploymentConfig, triggeredAt, 1) + id, _, err := impl.handleCDTriggerRelease(ctx, request, envDeploymentConfig, triggeredAt, triggeredBy) if err != nil { impl.logger.Errorw("error in auto cd pipeline trigger", "pipelineId", pipeline.Id, "artifactId", artifact.Id, "err", err) } else { diff --git a/pkg/eventProcessor/in/WorkflowEventProcessorService.go b/pkg/eventProcessor/in/WorkflowEventProcessorService.go index d91bd56caf..2800e9a3bb 100644 --- a/pkg/eventProcessor/in/WorkflowEventProcessorService.go +++ b/pkg/eventProcessor/in/WorkflowEventProcessorService.go @@ -316,7 +316,7 @@ func (impl *WorkflowEventProcessorImpl) SubscribeTriggerBulkAction() error { CdWf: adapter.ConvertCdWorkflowDtoToDbObj(wf), //TODO: update object from db to dto Artifact: artifact, Pipeline: pipelineObj, - TriggeredBy: cdWorkflow.CreatedBy, + TriggeredBy: cdWorkflow.CreatedBy, //actual request sent by user who created initial workflow, and then nats event is sent ApplyAuth: false, TriggerContext: triggerContext, } diff --git a/pkg/pipeline/CiHandler.go b/pkg/pipeline/CiHandler.go index 7cd3503bfa..5f05b28ef6 100644 --- a/pkg/pipeline/CiHandler.go +++ b/pkg/pipeline/CiHandler.go @@ -25,6 +25,7 @@ import ( "github.com/devtron-labs/common-lib/utils/workFlow" "github.com/devtron-labs/devtron/internal/sql/constants" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" + bean6 "github.com/devtron-labs/devtron/pkg/auth/user/bean" "github.com/devtron-labs/devtron/pkg/bean/common" "github.com/devtron-labs/devtron/pkg/build/artifacts/imageTagging" bean4 "github.com/devtron-labs/devtron/pkg/build/pipeline/bean" @@ -222,7 +223,7 @@ func (impl *CiHandlerImpl) reTriggerCi(retryCount int, refCiWorkflow *pipelineCo } trigger := types.Trigger{} - trigger.BuildTriggerObject(refCiWorkflow, ciMaterials, 1, true, nil, "") + trigger.BuildTriggerObject(refCiWorkflow, ciMaterials, bean6.SYSTEM_USER_ID, true, nil, "") _, err = impl.ciService.TriggerCiPipeline(trigger) if err != nil { diff --git a/pkg/workflow/dag/WorkflowDagExecutor.go b/pkg/workflow/dag/WorkflowDagExecutor.go index d55ad5d8b8..d87f6bfd97 100644 --- a/pkg/workflow/dag/WorkflowDagExecutor.go +++ b/pkg/workflow/dag/WorkflowDagExecutor.go @@ -35,6 +35,7 @@ import ( "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow" cdWorkflow2 "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow" "github.com/devtron-labs/devtron/pkg/app/status" + bean7 "github.com/devtron-labs/devtron/pkg/auth/user/bean" "github.com/devtron-labs/devtron/pkg/build/artifacts" bean5 "github.com/devtron-labs/devtron/pkg/build/pipeline/bean" common2 "github.com/devtron-labs/devtron/pkg/deployment/common" @@ -240,7 +241,7 @@ func (impl *WorkflowDagExecutorImpl) HandleCdStageReTrigger(runner *pipelineConf CdWf: runner.CdWorkflow, Pipeline: runner.CdWorkflow.Pipeline, Artifact: runner.CdWorkflow.CiArtifact, - TriggeredBy: 1, + TriggeredBy: bean7.SYSTEM_USER_ID, ApplyAuth: false, RefCdWorkflowRunnerId: runner.Id, TriggerContext: triggerBean.TriggerContext{ @@ -519,7 +520,6 @@ func (impl *WorkflowDagExecutorImpl) deleteCorruptedPipelineStage(pipelineStage } func (impl *WorkflowDagExecutorImpl) triggerIfAutoStageCdPipeline(request triggerBean.TriggerRequest) error { - preStage, err := impl.getPipelineStage(request.Pipeline.Id, repository4.PIPELINE_STAGE_TYPE_PRE_CD) if err != nil { return err @@ -533,6 +533,8 @@ func (impl *WorkflowDagExecutorImpl) triggerIfAutoStageCdPipeline(request trigge } request.TriggerContext.Context = context.Background() + //for auto stage setting triggeredBy to system user no matter where the request came from + request.TriggeredBy = bean7.SYSTEM_USER_ID if len(request.Pipeline.PreStageConfig) > 0 || (preStage != nil && !deleted) { // pre stage exists if request.Pipeline.PreTriggerType == pipelineConfig.TRIGGER_TYPE_AUTOMATIC { @@ -613,7 +615,7 @@ func (impl *WorkflowDagExecutorImpl) HandlePreStageSuccessEvent(triggerContext t } else { ciArtifactId = cdStageCompleteEvent.CiArtifactDTO.Id } - err = impl.cdTriggerService.TriggerAutoCDOnPreStageSuccess(triggerContext, cdStageCompleteEvent.CdPipelineId, ciArtifactId, cdStageCompleteEvent.WorkflowId, cdStageCompleteEvent.TriggeredBy) + err = impl.cdTriggerService.TriggerAutoCDOnPreStageSuccess(triggerContext, cdStageCompleteEvent.CdPipelineId, ciArtifactId, cdStageCompleteEvent.WorkflowId) if err != nil { impl.logger.Errorw("error in triggering cd on pre cd succcess", "err", err) return err @@ -637,11 +639,10 @@ func (impl *WorkflowDagExecutorImpl) HandleDeploymentSuccessEvent(triggerContext return err } - var triggeredByUser int32 = 1 //handle corrupt data (https://github.com/devtron-labs/devtron/issues/3826) - err, deleted := impl.deleteCorruptedPipelineStage(postStage, triggeredByUser) + err, deleted := impl.deleteCorruptedPipelineStage(postStage, bean7.SYSTEM_USER_ID) if err != nil { - impl.logger.Errorw("error in deleteCorruptedPipelineStage ", "err", err, "preStage", postStage, "triggeredBy", triggeredByUser) + impl.logger.Errorw("error in deleteCorruptedPipelineStage ", "err", err, "preStage", postStage) return err } @@ -653,7 +654,7 @@ func (impl *WorkflowDagExecutorImpl) HandleDeploymentSuccessEvent(triggerContext triggerRequest := triggerBean.TriggerRequest{ CdWf: cdWorkflow, Pipeline: pipelineOverride.Pipeline, - TriggeredBy: triggeredByUser, + TriggeredBy: bean7.SYSTEM_USER_ID, TriggerContext: triggerContext, RefCdWorkflowRunnerId: 0, } diff --git a/wire_gen.go b/wire_gen.go index b8264c531a..ac459536ce 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -1,6 +1,6 @@ // Code generated by Wire. DO NOT EDIT. -//go:generate go run github.com/google/wire/cmd/wire +//go:generate go run -mod=mod github.com/google/wire/cmd/wire //go:build !wireinject // +build !wireinject