Skip to content

Commit 596aba4

Browse files
Merge pull request #6659 from devtron-labs/audit-trigger
feat: Audit ci trigger, precd and post cd trigger so that retrigger can happen from last failed config snapshot
2 parents fccc8a0 + 188483d commit 596aba4

30 files changed

+1132
-217
lines changed

pkg/build/trigger/HandlerService.go

Lines changed: 135 additions & 36 deletions
Large diffs are not rendered by default.

pkg/build/trigger/HandlerService_ent.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,6 @@ func (impl *HandlerServiceImpl) updateCIBuildConfig(ciBuildConfigBean *bean2.CiB
9999
return ciBuildConfigBean
100100
}
101101

102-
func updateBuildPrePostStepDataReq(req *pipelineConfigBean.BuildPrePostStepDataRequest, trigger types.Trigger) *pipelineConfigBean.BuildPrePostStepDataRequest {
102+
func updateBuildPrePostStepDataReq(req *pipelineConfigBean.BuildPrePostStepDataRequest, trigger *types.CiTriggerRequest) *pipelineConfigBean.BuildPrePostStepDataRequest {
103103
return req
104104
}

pkg/build/trigger/adaptor/adaptor.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package adaptor
2+
3+
import (
4+
"github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig"
5+
"time"
6+
)
7+
8+
func GetCiWorkflowFromRefCiWorkflow(refCiWorkflow *pipelineConfig.CiWorkflow, workflowStatus string, triggeredBy int32) *pipelineConfig.CiWorkflow {
9+
return &pipelineConfig.CiWorkflow{
10+
Name: refCiWorkflow.Name,
11+
Status: workflowStatus, // starting CIStage
12+
StartedOn: time.Now(),
13+
CiPipelineId: refCiWorkflow.CiPipelineId,
14+
Namespace: refCiWorkflow.Namespace,
15+
BlobStorageEnabled: refCiWorkflow.BlobStorageEnabled,
16+
GitTriggers: refCiWorkflow.GitTriggers,
17+
CiBuildType: refCiWorkflow.CiBuildType,
18+
TriggeredBy: triggeredBy,
19+
ReferenceCiWorkflowId: refCiWorkflow.Id, // Reference to original workflow
20+
ExecutorType: refCiWorkflow.ExecutorType,
21+
EnvironmentId: refCiWorkflow.EnvironmentId,
22+
}
23+
}

pkg/deployment/trigger/devtronApps/HandlerService.go

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"bufio"
2121
"context"
2222
"github.com/devtron-labs/common-lib/async"
23+
service2 "github.com/devtron-labs/devtron/pkg/workflow/trigger/audit/service"
2324
"os"
2425
"time"
2526

@@ -90,15 +91,15 @@ prePostWfAndLogsCode.go - code containing pre/post wf handling(abort) and logs r
9091
*/
9192

9293
type HandlerService interface {
93-
TriggerPostStage(request bean.TriggerRequest) (*bean4.ManifestPushTemplate, error)
94-
TriggerPreStage(request bean.TriggerRequest) (*bean4.ManifestPushTemplate, error)
94+
TriggerPostStage(request bean.CdTriggerRequest) (*bean4.ManifestPushTemplate, error)
95+
TriggerPreStage(request bean.CdTriggerRequest) (*bean4.ManifestPushTemplate, error)
9596

9697
TriggerAutoCDOnPreStageSuccess(triggerContext bean.TriggerContext, cdPipelineId, ciArtifactId, workflowId int) error
9798

98-
TriggerStageForBulk(triggerRequest bean.TriggerRequest) error
99+
TriggerStageForBulk(triggerRequest bean.CdTriggerRequest) error
99100

100101
ManualCdTrigger(triggerContext bean.TriggerContext, overrideRequest *bean3.ValuesOverrideRequest, userMetadata *userBean.UserMetadata) (int, string, *bean4.ManifestPushTemplate, error)
101-
TriggerAutomaticDeployment(request bean.TriggerRequest) error
102+
TriggerAutomaticDeployment(request bean.CdTriggerRequest) error
102103

103104
TriggerRelease(ctx context.Context, overrideRequest *bean3.ValuesOverrideRequest, envDeploymentConfig *bean9.DeploymentConfig, triggeredAt time.Time, triggeredBy int32) (releaseNo int, manifestPushTemplate *bean4.ManifestPushTemplate, err error)
104105

@@ -170,6 +171,7 @@ type HandlerServiceImpl struct {
170171
blobConfigStorageService pipeline.BlobStorageConfigService
171172
deploymentEventHandler app.DeploymentEventHandler
172173
asyncRunnable *async.Runnable
174+
workflowTriggerAuditService service2.WorkflowTriggerAuditService
173175
}
174176

175177
func NewHandlerServiceImpl(logger *zap.SugaredLogger,
@@ -232,7 +234,9 @@ func NewHandlerServiceImpl(logger *zap.SugaredLogger,
232234
workflowService executor.WorkflowService,
233235
blobConfigStorageService pipeline.BlobStorageConfigService,
234236
deploymentEventHandler app.DeploymentEventHandler,
235-
asyncRunnable *async.Runnable) (*HandlerServiceImpl, error) {
237+
asyncRunnable *async.Runnable,
238+
workflowTriggerAuditService service2.WorkflowTriggerAuditService,
239+
) (*HandlerServiceImpl, error) {
236240
impl := &HandlerServiceImpl{
237241
logger: logger,
238242
cdWorkflowCommonService: cdWorkflowCommonService,
@@ -293,13 +297,14 @@ func NewHandlerServiceImpl(logger *zap.SugaredLogger,
293297
attributeService: attributeService,
294298
cdWorkflowRunnerService: cdWorkflowRunnerService,
295299

296-
clusterRepository: clusterRepository,
297-
clusterService: clusterService,
298-
ciLogService: ciLogService,
299-
workflowService: workflowService,
300-
blobConfigStorageService: blobConfigStorageService,
301-
deploymentEventHandler: deploymentEventHandler,
302-
asyncRunnable: asyncRunnable,
300+
clusterRepository: clusterRepository,
301+
clusterService: clusterService,
302+
ciLogService: ciLogService,
303+
workflowService: workflowService,
304+
blobConfigStorageService: blobConfigStorageService,
305+
deploymentEventHandler: deploymentEventHandler,
306+
asyncRunnable: asyncRunnable,
307+
workflowTriggerAuditService: workflowTriggerAuditService,
303308
}
304309
config, err := types.GetCdConfig()
305310
if err != nil {

pkg/deployment/trigger/devtronApps/bean/bean.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ type TriggerEvent struct {
4040
TriggeredAt time.Time
4141
}
4242

43-
type TriggerRequest struct {
43+
type CdTriggerRequest struct {
4444
CdWf *pipelineConfig.CdWorkflow
4545
Pipeline *pipelineConfig.Pipeline
4646
Artifact *repository.CiArtifact
@@ -51,6 +51,8 @@ type TriggerRequest struct {
5151
WorkflowType bean.WorkflowType
5252
CdWorkflowRunnerId int
5353
TriggerContext
54+
// below fields used for retrigger flow
55+
IsRetrigger bool
5456
}
5557

5658
type TriggerContext struct {
@@ -82,7 +84,7 @@ const (
8284
)
8385

8486
type TriggerRequirementRequestDto struct {
85-
TriggerRequest TriggerRequest
87+
TriggerRequest CdTriggerRequest
8688
}
8789

8890
type VulnerabilityCheckRequest struct {

pkg/deployment/trigger/devtronApps/deployStageHandlerCode.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ import (
6767
"helm.sh/helm/v3/pkg/chart"
6868
)
6969

70-
func (impl *HandlerServiceImpl) TriggerStageForBulk(triggerRequest bean.TriggerRequest) error {
70+
func (impl *HandlerServiceImpl) TriggerStageForBulk(triggerRequest bean.CdTriggerRequest) error {
7171

7272
preStage, err := impl.pipelineStageService.GetCdStageByCdPipelineIdAndStageType(triggerRequest.Pipeline.Id, repository.PIPELINE_STAGE_TYPE_PRE_CD, false)
7373
if err != nil && err != pg.ErrNoRows {
@@ -228,7 +228,7 @@ func (impl *HandlerServiceImpl) ManualCdTrigger(triggerContext bean.TriggerConte
228228
overrideRequest.CdWorkflowId = cdWf.Id
229229

230230
_, span = otel.Tracer("orchestrator").Start(ctx, "TriggerPreStage")
231-
triggerRequest := bean.TriggerRequest{
231+
triggerRequest := bean.CdTriggerRequest{
232232
CdWf: cdWf,
233233
Artifact: artifact,
234234
Pipeline: cdPipeline,
@@ -357,7 +357,7 @@ func (impl *HandlerServiceImpl) ManualCdTrigger(triggerContext bean.TriggerConte
357357
}
358358
}
359359
_, span = otel.Tracer("orchestrator").Start(ctx, "TriggerPostStage")
360-
triggerRequest := bean.TriggerRequest{
360+
triggerRequest := bean.CdTriggerRequest{
361361
CdWf: cdWf,
362362
Pipeline: cdPipeline,
363363
TriggeredBy: overrideRequest.UserId,
@@ -383,7 +383,7 @@ func isNotHibernateRequest(deploymentType models.DeploymentType) bool {
383383
}
384384

385385
// TODO: write a wrapper to handle auto and manual trigger
386-
func (impl *HandlerServiceImpl) TriggerAutomaticDeployment(request bean.TriggerRequest) error {
386+
func (impl *HandlerServiceImpl) TriggerAutomaticDeployment(request bean.CdTriggerRequest) error {
387387
// in case of manual trigger auth is already applied and for auto triggers there is no need for auth check here
388388
triggeredBy := request.TriggeredBy
389389
pipeline := request.Pipeline

pkg/deployment/trigger/devtronApps/deployStageHandlerCode_ent.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func (impl *HandlerServiceImpl) getManifestPushService(storageType string) publi
6363
return manifestPushService
6464
}
6565

66-
func (impl *HandlerServiceImpl) preStageHandlingForTriggerStageInBulk(triggerRequest *bean.TriggerRequest) error {
66+
func (impl *HandlerServiceImpl) preStageHandlingForTriggerStageInBulk(triggerRequest *bean.CdTriggerRequest) error {
6767
return nil
6868
}
6969

pkg/deployment/trigger/devtronApps/postStageHandlerCode.go

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,13 @@ import (
2323
"github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/bean/workflow/cdWorkflow"
2424
bean4 "github.com/devtron-labs/devtron/pkg/app/bean"
2525
"github.com/devtron-labs/devtron/pkg/deployment/trigger/devtronApps/bean"
26-
bean3 "github.com/devtron-labs/devtron/pkg/pipeline/bean"
2726
repository3 "github.com/devtron-labs/devtron/pkg/pipeline/history/repository"
2827
"github.com/devtron-labs/devtron/pkg/pipeline/types"
2928
util2 "github.com/devtron-labs/devtron/util/event"
3029
"time"
3130
)
3231

33-
func (impl *HandlerServiceImpl) TriggerPostStage(request bean.TriggerRequest) (*bean4.ManifestPushTemplate, error) {
32+
func (impl *HandlerServiceImpl) TriggerPostStage(request bean.CdTriggerRequest) (*bean4.ManifestPushTemplate, error) {
3433
request.WorkflowType = bean2.CD_WORKFLOW_TYPE_POST
3534
// setting triggeredAt variable to have consistent data for various audit log places in db for deployment time
3635
triggeredAt := time.Now()
@@ -104,25 +103,10 @@ func (impl *HandlerServiceImpl) TriggerPostStage(request bean.TriggerRequest) (*
104103
impl.logger.Errorw("error, checkVulnerabilityStatusAndFailWfIfNeeded", "err", err, "runner", runner)
105104
return nil, err
106105
}
107-
cdStageWorkflowRequest, err := impl.buildWFRequest(runner, cdWf, pipeline, envDevploymentConfig, triggeredBy)
106+
cdStageWorkflowRequest, err := impl.preparePrePostCdWorkflowRequest(ctx, runner, cdWf, request, env, types.POST, envDevploymentConfig)
108107
if err != nil {
109108
return impl.buildWfRequestErrorHandler(runner, err, triggeredBy)
110109
}
111-
cdStageWorkflowRequest.StageType = types.POST
112-
cdStageWorkflowRequest.Pipeline = pipeline
113-
cdStageWorkflowRequest.Env = env
114-
cdStageWorkflowRequest.Type = bean3.CD_WORKFLOW_PIPELINE_TYPE
115-
// handling plugin specific logic
116-
117-
pluginImagePathReservationIds, err := impl.setCopyContainerImagePluginDataAndReserveImages(cdStageWorkflowRequest, pipeline.Id, types.POST, cdWf.CiArtifact)
118-
if err != nil {
119-
runner.Status = cdWorkflow.WorkflowFailed
120-
runner.Message = err.Error()
121-
runner.FinishedOn = time.Now()
122-
_ = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(runner)
123-
return nil, err
124-
}
125-
126110
_, jobHelmPackagePath, err := impl.workflowService.SubmitWorkflow(cdStageWorkflowRequest)
127111
if err != nil {
128112
impl.logger.Errorw("error in submitting workflow", "err", err, "workflowId", cdStageWorkflowRequest.WorkflowId, "pipeline", pipeline, "env", env)
@@ -137,20 +121,9 @@ func (impl *HandlerServiceImpl) TriggerPostStage(request bean.TriggerRequest) (*
137121
impl.logger.Errorw("error in getting manifest push template", "err", err)
138122
return nil, err
139123
}
140-
wfr, err := impl.cdWorkflowRepository.FindByWorkflowIdAndRunnerType(context.Background(), cdWf.Id, bean2.CD_WORKFLOW_TYPE_POST)
141-
if err != nil {
142-
impl.logger.Errorw("error in getting wfr by workflowId and runnerType", "err", err, "wfId", cdWf.Id)
143-
return nil, err
144-
}
145-
wfr.ImagePathReservationIds = pluginImagePathReservationIds
146-
err = impl.cdWorkflowRunnerService.UpdateCdWorkflowRunnerWithStage(&wfr)
147-
if err != nil {
148-
impl.logger.Error("error in updating image path reservation ids in cd workflow runner", "err", "err")
149-
}
150-
151124
event, _ := impl.eventFactory.Build(util2.Trigger, &pipeline.Id, pipeline.AppId, &pipeline.EnvironmentId, util2.CD)
152-
impl.logger.Debugw("event Cd Post Trigger", "event", event)
153-
event = impl.eventFactory.BuildExtraCDData(event, &wfr, 0, bean2.CD_WORKFLOW_TYPE_POST)
125+
impl.logger.Debugw("event Cd Post CiTriggerRequest", "event", event)
126+
event = impl.eventFactory.BuildExtraCDData(event, runner, 0, bean2.CD_WORKFLOW_TYPE_POST)
154127
_, evtErr := impl.eventClient.WriteNotificationEvent(event)
155128
if evtErr != nil {
156129
impl.logger.Errorw("CD trigger event not sent", "error", evtErr)

pkg/deployment/trigger/devtronApps/postStageHandlerCode_ent.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ import (
2626
"time"
2727
)
2828

29-
func (impl *HandlerServiceImpl) checkFeasibilityForPostStage(pipeline *pipelineConfig.Pipeline, request *bean.TriggerRequest,
29+
func (impl *HandlerServiceImpl) checkFeasibilityForPostStage(pipeline *pipelineConfig.Pipeline, request *bean.CdTriggerRequest,
3030
env *repository.Environment, cdWf *pipelineConfig.CdWorkflow, triggeredBy int32) (interface{}, error) {
3131
//here return type is interface as ResourceFilterEvaluationAudit is not present in this version
3232
return nil, nil
3333
}
3434

35-
func (impl *HandlerServiceImpl) getManifestPushTemplateForPostStage(request bean.TriggerRequest, envDevploymentConfig *bean5.DeploymentConfig,
35+
func (impl *HandlerServiceImpl) getManifestPushTemplateForPostStage(request bean.CdTriggerRequest, envDevploymentConfig *bean5.DeploymentConfig,
3636
jobHelmPackagePath string, cdStageWorkflowRequest *types.WorkflowRequest, cdWf *pipelineConfig.CdWorkflow, runner *pipelineConfig.CdWorkflowRunner,
3737
pipeline *pipelineConfig.Pipeline, triggeredBy int32, triggeredAt time.Time) (*bean4.ManifestPushTemplate, error) {
3838
return nil, nil

0 commit comments

Comments
 (0)