Skip to content

Commit 000d170

Browse files
authored
Merge pull request #6637 from devtron-labs/deployment-tempalte-history-fix
fix: duplicate entries in deployment history without override
2 parents ad89c1d + 96a2471 commit 000d170

File tree

5 files changed

+22
-43
lines changed

5 files changed

+22
-43
lines changed

internal/sql/repository/pipelineConfig/PipelineRepository.go

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ type PipelineRepository interface {
118118
FindActiveByInFilter(envId int, appIdIncludes []int) (pipelines []*Pipeline, err error)
119119
FindActivePipelineAppIdsByInFilter(envId int, appIdIncludes []int) ([]int, error)
120120
FindActiveByNotFilter(envId int, appIdExcludes []int) (pipelines []*Pipeline, err error)
121-
FindAllPipelinesByChartsOverrideAndAppIdAndChartId(chartOverridden bool, appId int, chartId int) (pipelines []*Pipeline, err error)
121+
FindAllPipelinesWithoutOverriddenCharts(appId int) (pipelineIds []int, err error)
122122
FindActiveByAppIdAndPipelineId(appId int, pipelineId int) ([]*Pipeline, error)
123123
FindActiveByAppIdAndEnvId(appId int, envId int) (*Pipeline, error)
124124
SetDeploymentAppCreatedInPipeline(deploymentAppCreated bool, pipelineId int, userId int32) error
@@ -577,19 +577,16 @@ func (impl *PipelineRepositoryImpl) FindActiveByNotFilter(envId int, appIdExclud
577577
return pipelines, err
578578
}
579579

580-
func (impl *PipelineRepositoryImpl) FindAllPipelinesByChartsOverrideAndAppIdAndChartId(hasConfigOverridden bool, appId int, chartId int) (pipelines []*Pipeline, err error) {
581-
err = impl.dbConnection.Model(&pipelines).
582-
Column("pipeline.*").
583-
Join("inner join charts on pipeline.app_id = charts.app_id").
584-
Join("inner join chart_env_config_override ceco on charts.id = ceco.chart_id").
585-
Where("pipeline.app_id = ?", appId).
586-
Where("charts.id = ?", chartId).
587-
Where("ceco.is_override = ?", hasConfigOverridden).
588-
Where("pipeline.deleted = ?", false).
589-
Where("ceco.active = ?", true).
590-
Where("charts.active = ?", true).
591-
Select()
592-
return pipelines, err
580+
func (impl *PipelineRepositoryImpl) FindAllPipelinesWithoutOverriddenCharts(appId int) (pipelineIds []int, err error) {
581+
err = impl.dbConnection.Model().Table("pipeline").Column("pipeline.id").
582+
Where("pipeline.deleted = ?", false).Where("pipeline.app_id = ?", appId).
583+
Where(`pipeline.environment_id NOT IN (
584+
SELECT ceco.target_environment FROM chart_env_config_override ceco
585+
INNER JOIN charts ON charts.id = ceco.chart_id
586+
WHERE charts.app_id = ? AND charts.active = ? AND ceco.is_override = ?
587+
AND ceco.active = ? AND ceco.latest = ?)`, appId, true, true, true, true).
588+
Select(&pipelineIds)
589+
return pipelineIds, err
593590
}
594591

595592
func (impl *PipelineRepositoryImpl) FindActiveByAppIdAndPipelineId(appId int, pipelineId int) ([]*Pipeline, error) {

pkg/deployment/manifest/deploymentTemplate/DeploymentTemplateHistoryService.go

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,16 @@ func NewDeploymentTemplateHistoryServiceImpl(logger *zap.SugaredLogger, deployme
7070

7171
func (impl DeploymentTemplateHistoryServiceImpl) CreateDeploymentTemplateHistoryFromGlobalTemplate(chart *chartRepoRepository.Chart, tx *pg.Tx, IsAppMetricsEnabled bool) (err error) {
7272
//getting all pipelines without overridden charts
73-
pipelines, err := impl.pipelineRepository.FindAllPipelinesByChartsOverrideAndAppIdAndChartId(false, chart.AppId, chart.Id)
73+
pipelineIds, err := impl.pipelineRepository.FindAllPipelinesWithoutOverriddenCharts(chart.AppId)
7474
if err != nil && err != pg.ErrNoRows {
7575
impl.logger.Errorw("err in getting pipelines, CreateDeploymentTemplateHistoryFromGlobalTemplate", "err", err, "chart", chart)
7676
return err
7777
}
78+
/*
79+
When creating base template entry, we also create entries for all pipeline whose env template is not overridden;
80+
as the change in base template will also impact them. Earlier we used to create individual entries for all pipelines
81+
but due to performance impact we are now saving the impacted pipelineIds in the base template entry itself (column pipeline_ids).
82+
*/
7883
chartRefDto, err := impl.chartRefService.FindById(chart.ChartRefId)
7984
if err != nil {
8085
impl.logger.Errorw("err in getting chartRef, CreateDeploymentTemplateHistoryFromGlobalTemplate", "err", err, "chart", chart)
@@ -89,6 +94,7 @@ func (impl DeploymentTemplateHistoryServiceImpl) CreateDeploymentTemplateHistory
8994
TemplateName: chartRefDto.Name,
9095
TemplateVersion: chartRefDto.Version,
9196
IsAppMetricsEnabled: IsAppMetricsEnabled,
97+
PipelineIds: pipelineIds,
9298
AuditLog: sql.AuditLog{
9399
CreatedOn: chart.CreatedOn,
94100
CreatedBy: chart.CreatedBy,
@@ -106,34 +112,6 @@ func (impl DeploymentTemplateHistoryServiceImpl) CreateDeploymentTemplateHistory
106112
impl.logger.Errorw("err in creating history entry for deployment template", "err", err, "history", historyModel)
107113
return err
108114
}
109-
for _, pipeline := range pipelines {
110-
historyModel := &repository.DeploymentTemplateHistory{
111-
AppId: chart.AppId,
112-
PipelineId: pipeline.Id,
113-
ImageDescriptorTemplate: chart.ImageDescriptorTemplate,
114-
Template: chart.GlobalOverride,
115-
Deployed: false,
116-
TemplateName: chartRefDto.Name,
117-
TemplateVersion: chartRefDto.Version,
118-
IsAppMetricsEnabled: IsAppMetricsEnabled,
119-
AuditLog: sql.AuditLog{
120-
CreatedOn: chart.CreatedOn,
121-
CreatedBy: chart.CreatedBy,
122-
UpdatedOn: chart.UpdatedOn,
123-
UpdatedBy: chart.UpdatedBy,
124-
},
125-
}
126-
//creating new entry
127-
if tx != nil {
128-
_, err = impl.deploymentTemplateHistoryRepository.CreateHistoryWithTxn(historyModel, tx)
129-
} else {
130-
_, err = impl.deploymentTemplateHistoryRepository.CreateHistory(historyModel)
131-
}
132-
if err != nil {
133-
impl.logger.Errorw("err in creating history entry for deployment template", "err", err, "history", historyModel)
134-
return err
135-
}
136-
}
137115
return err
138116
}
139117

pkg/pipeline/history/repository/DeploymentTemplateHistoryRepository.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ type DeploymentTemplateHistory struct {
5757
DeployedOn time.Time `sql:"deployed_on"`
5858
DeployedBy int32 `sql:"deployed_by"`
5959
MergeStrategy string `sql:"merge_strategy"`
60+
PipelineIds []int `sql:"pipeline_ids,array"`
6061
sql.AuditLog
6162
//getting below data from cd_workflow_runner and users join
6263
DeploymentStatus string `sql:"-"`
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
-- not dropping the added column as it is used for audit and data loss can be impactful. The old code can run with the column added and should not cause any issue.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ALTER TABLE deployment_template_history
2+
ADD COLUMN IF NOT EXISTS pipeline_ids integer[];

0 commit comments

Comments
 (0)