diff --git a/api/appbean/AppDetail.go b/api/appbean/AppDetail.go index 2e2fe3379e..8a9c50dca6 100644 --- a/api/appbean/AppDetail.go +++ b/api/appbean/AppDetail.go @@ -58,6 +58,7 @@ type DockerBuildConfig struct { Args map[string]string `json:"args,omitempty"` TargetPlatform string `json:"targetPlatform"` DockerBuildOptions map[string]string `json:"dockerBuildOptions,omitempty"` + BuildContext string `json:"buildContext"` } type DeploymentTemplate struct { diff --git a/api/restHandler/CoreAppRestHandler.go b/api/restHandler/CoreAppRestHandler.go index 54cc4deb9c..bf068004a4 100644 --- a/api/restHandler/CoreAppRestHandler.go +++ b/api/restHandler/CoreAppRestHandler.go @@ -1271,6 +1271,7 @@ func (handler CoreAppRestHandlerImpl) createDockerConfig(appId int, dockerConfig DockerBuildOptions: dockerBuildConfig.DockerBuildOptions, Args: dockerBuildConfig.Args, TargetPlatform: dockerBuildConfig.TargetPlatform, + BuildContext: dockerBuildConfig.BuildContext, }, } } diff --git a/internal/sql/repository/pipelineConfig/CiPipelineMaterial.go b/internal/sql/repository/pipelineConfig/CiPipelineMaterial.go index 30ebf7f54d..155837f840 100644 --- a/internal/sql/repository/pipelineConfig/CiPipelineMaterial.go +++ b/internal/sql/repository/pipelineConfig/CiPipelineMaterial.go @@ -54,6 +54,7 @@ type CiPipelineMaterialRepository interface { GetRegexByPipelineId(id int) ([]*CiPipelineMaterial, error) CheckRegexExistsForMaterial(id int) bool GetByPipelineIdForRegexAndFixed(id int) ([]*CiPipelineMaterial, error) + GetCheckoutPath(gitMaterialId int) (string, error) } type CiPipelineMaterialRepositoryImpl struct { @@ -164,3 +165,12 @@ func (impl CiPipelineMaterialRepositoryImpl) CheckRegexExistsForMaterial(id int) } return exists } + +func (impl CiPipelineMaterialRepositoryImpl) GetCheckoutPath(gitMaterialId int) (string, error) { + var checkoutPath string + err := impl.dbConnection.Model((*GitMaterial)(nil)). + Column("git_material.checkout_path"). + Where("id=?", gitMaterialId). + Select(&checkoutPath) + return checkoutPath, err +} diff --git a/internal/sql/repository/pipelineConfig/CiTemplateOverrideRepository.go b/internal/sql/repository/pipelineConfig/CiTemplateOverrideRepository.go index 1d351a5570..8391649549 100644 --- a/internal/sql/repository/pipelineConfig/CiTemplateOverrideRepository.go +++ b/internal/sql/repository/pipelineConfig/CiTemplateOverrideRepository.go @@ -8,15 +8,16 @@ import ( ) type CiTemplateOverride struct { - tableName struct{} `sql:"ci_template_override" pg:",discard_unknown_columns"` - Id int `sql:"id"` - CiPipelineId int `sql:"ci_pipeline_id"` - DockerRegistryId string `sql:"docker_registry_id"` - DockerRepository string `sql:"docker_repository"` - DockerfilePath string `sql:"dockerfile_path"` - GitMaterialId int `sql:"git_material_id"` - Active bool `sql:"active,notnull"` - CiBuildConfigId int `sql:"ci_build_config_id"` + tableName struct{} `sql:"ci_template_override" pg:",discard_unknown_columns"` + Id int `sql:"id"` + CiPipelineId int `sql:"ci_pipeline_id"` + DockerRegistryId string `sql:"docker_registry_id"` + DockerRepository string `sql:"docker_repository"` + DockerfilePath string `sql:"dockerfile_path"` + GitMaterialId int `sql:"git_material_id"` + BuildContextGitMaterialId int `sql:"build_context_git_material_id"` + Active bool `sql:"active,notnull"` + CiBuildConfigId int `sql:"ci_build_config_id"` sql.AuditLog GitMaterial *GitMaterial DockerRegistry *repository.DockerArtifactStore diff --git a/internal/sql/repository/pipelineConfig/CiTemplateRepository.go b/internal/sql/repository/pipelineConfig/CiTemplateRepository.go index ffba2c1a5e..6ee7a2c5ff 100644 --- a/internal/sql/repository/pipelineConfig/CiTemplateRepository.go +++ b/internal/sql/repository/pipelineConfig/CiTemplateRepository.go @@ -27,22 +27,24 @@ import ( ) type CiTemplate struct { - tableName struct{} `sql:"ci_template" pg:",discard_unknown_columns"` - Id int `sql:"id"` - AppId int `sql:"app_id"` //foreign key of app - DockerRegistryId *string `sql:"docker_registry_id"` //foreign key of registry - DockerRepository string `sql:"docker_repository"` - DockerfilePath string `sql:"dockerfile_path"` - Args string `sql:"args"` //json string format of map[string]string - TargetPlatform string `sql:"target_platform,notnull"` - BeforeDockerBuild string `sql:"before_docker_build"` //json string format of []*Task - AfterDockerBuild string `sql:"after_docker_build"` //json string format of []*Task - TemplateName string `sql:"template_name"` - Version string `sql:"version"` //gocd etage - Active bool `sql:"active,notnull"` - GitMaterialId int `sql:"git_material_id"` - DockerBuildOptions string `sql:"docker_build_options"` //json string format of map[string]string - CiBuildConfigId int `sql:"ci_build_config_id"` + tableName struct{} `sql:"ci_template" pg:",discard_unknown_columns"` + Id int `sql:"id"` + AppId int `sql:"app_id"` //foreign key of app + DockerRegistryId *string `sql:"docker_registry_id"` //foreign key of registry + DockerRepository string `sql:"docker_repository"` + DockerfilePath string `sql:"dockerfile_path"` + Args string `sql:"args"` //json string format of map[string]string + TargetPlatform string `sql:"target_platform,notnull"` + BeforeDockerBuild string `sql:"before_docker_build"` //json string format of []*Task + AfterDockerBuild string `sql:"after_docker_build"` //json string format of []*Task + TemplateName string `sql:"template_name"` + Version string `sql:"version"` //gocd etage + Active bool `sql:"active,notnull"` + GitMaterialId int `sql:"git_material_id"` + BuildContextGitMaterialId int `sql:"build_context_git_material_id"` + DockerBuildOptions string `sql:"docker_build_options"` //json string format of map[string]string + CiBuildConfigId int `sql:"ci_build_config_id"` + //BuildContext string `sql:"build_context,notnull"` sql.AuditLog App *app.App DockerRegistry *dockerRegistryRepository.DockerArtifactStore diff --git a/pkg/pipeline/CiCdPipelineOrchestrator.go b/pkg/pipeline/CiCdPipelineOrchestrator.go index be2ac06ae5..a75ba95161 100644 --- a/pkg/pipeline/CiCdPipelineOrchestrator.go +++ b/pkg/pipeline/CiCdPipelineOrchestrator.go @@ -320,8 +320,9 @@ func (impl CiCdPipelineOrchestratorImpl) PatchMaterialValue(createRequest *bean. DockerRegistryId: createRequest.DockerConfigOverride.DockerRegistry, DockerRepository: createRequest.DockerConfigOverride.DockerRepository, //DockerfilePath: createRequest.DockerConfigOverride.DockerBuildConfig.DockerfilePath, - GitMaterialId: ciBuildConfigBean.GitMaterialId, - Active: true, + GitMaterialId: ciBuildConfigBean.GitMaterialId, + BuildContextGitMaterialId: ciBuildConfigBean.BuildContextGitMaterialId, + Active: true, AuditLog: sql.AuditLog{ CreatedOn: time.Now(), CreatedBy: userId, @@ -627,8 +628,9 @@ func (impl CiCdPipelineOrchestratorImpl) CreateCiConf(createRequest *bean.CiConf DockerRegistryId: ciPipeline.DockerConfigOverride.DockerRegistry, DockerRepository: ciPipeline.DockerConfigOverride.DockerRepository, //DockerfilePath: ciPipeline.DockerConfigOverride.DockerBuildConfig.DockerfilePath, - GitMaterialId: ciPipeline.DockerConfigOverride.CiBuildConfig.GitMaterialId, - Active: true, + GitMaterialId: ciPipeline.DockerConfigOverride.CiBuildConfig.GitMaterialId, + BuildContextGitMaterialId: ciPipeline.DockerConfigOverride.CiBuildConfig.BuildContextGitMaterialId, + Active: true, AuditLog: sql.AuditLog{ CreatedBy: createRequest.UserId, CreatedOn: time.Now(), diff --git a/pkg/pipeline/CiService.go b/pkg/pipeline/CiService.go index 51d4d4b5a1..f557b62513 100644 --- a/pkg/pipeline/CiService.go +++ b/pkg/pipeline/CiService.go @@ -418,6 +418,7 @@ func (impl *CiServiceImpl) buildWfRequestForCiPipeline(pipeline *pipelineConfig. dockerRepository = ciTemplate.DockerRepository ciBuildConfigEntity := ciTemplate.CiBuildConfig ciBuildConfigBean, err = bean2.ConvertDbBuildConfigToBean(ciBuildConfigEntity) + ciBuildConfigBean.BuildContextGitMaterialId = ciTemplate.BuildContextGitMaterialId if err != nil { impl.Logger.Errorw("error occurred while converting buildconfig dbEntity to configBean", "ciBuildConfigEntity", ciBuildConfigEntity, "err", err) return nil, errors.New("error while parsing ci build config") @@ -433,7 +434,13 @@ func (impl *CiServiceImpl) buildWfRequestForCiPipeline(pipeline *pipelineConfig. impl.Logger.Errorw("error occurred while overriding ci build config", "oldArgs", oldArgs, "ciLevelArgs", ciLevelArgs, "error", err) return nil, errors.New("error while parsing ci build config") } + buildContextCheckoutPath, err := impl.ciPipelineMaterialRepository.GetCheckoutPath(ciBuildConfigBean.BuildContextGitMaterialId) + if err != nil { + impl.Logger.Errorw("error occurred while getting checkout path from git material", "gitMaterialId", ciBuildConfigBean.BuildContextGitMaterialId, "error", err) + return nil, err + } if ciBuildConfigBean.CiBuildType == bean2.SELF_DOCKERFILE_BUILD_TYPE || ciBuildConfigBean.CiBuildType == bean2.MANAGED_DOCKERFILE_BUILD_TYPE { + ciBuildConfigBean.DockerBuildConfig.BuildContext = filepath.Join(buildContextCheckoutPath, ciBuildConfigBean.DockerBuildConfig.BuildContext) dockerBuildConfig := ciBuildConfigBean.DockerBuildConfig dockerfilePath = filepath.Join(checkoutPath, dockerBuildConfig.DockerfilePath) dockerBuildConfig.DockerfilePath = dockerfilePath diff --git a/pkg/pipeline/CiTemplateService.go b/pkg/pipeline/CiTemplateService.go index c56262ebcf..29f9e5d4b7 100644 --- a/pkg/pipeline/CiTemplateService.go +++ b/pkg/pipeline/CiTemplateService.go @@ -84,6 +84,7 @@ func (impl CiTemplateServiceImpl) FindByAppId(appId int) (ciTemplateBean *bean.C } } ciBuildConfigBean.GitMaterialId = ciTemplate.GitMaterialId + ciBuildConfigBean.BuildContextGitMaterialId = ciTemplate.BuildContextGitMaterialId return &bean.CiTemplateBean{ CiTemplate: ciTemplate, CiBuildConfig: ciBuildConfigBean, @@ -146,6 +147,7 @@ func (impl CiTemplateServiceImpl) extractBuildConfigBean(templateOverride *pipel } } ciBuildConfigBean.GitMaterialId = templateOverride.GitMaterialId + ciBuildConfigBean.BuildContextGitMaterialId = templateOverride.BuildContextGitMaterialId return ciBuildConfigBean, nil } diff --git a/pkg/pipeline/PipelineBuilder.go b/pkg/pipeline/PipelineBuilder.go index 690219104e..cf5f4b702f 100644 --- a/pkg/pipeline/PipelineBuilder.go +++ b/pkg/pipeline/PipelineBuilder.go @@ -1148,7 +1148,8 @@ func (impl PipelineBuilderImpl) UpdateCiTemplate(updateRequest *bean.CiConfigReq originalCiBuildConfig := originalCiConf.CiBuildConfig ciTemplate := &pipelineConfig.CiTemplate{ //DockerfilePath: originalCiConf.DockerBuildConfig.DockerfilePath, - GitMaterialId: ciBuildConfig.GitMaterialId, + GitMaterialId: ciBuildConfig.GitMaterialId, + BuildContextGitMaterialId: ciBuildConfig.BuildContextGitMaterialId, //Args: string(argByte), //TargetPlatform: originalCiConf.DockerBuildConfig.TargetPlatform, AppId: originalCiConf.AppId, @@ -1250,7 +1251,8 @@ func (impl PipelineBuilderImpl) CreateCiPipeline(createRequest *bean.CiConfigReq ciTemplate := &pipelineConfig.CiTemplate{ //DockerRegistryId: createRequest.DockerRegistry, //DockerRepository: createRequest.DockerRepository, - GitMaterialId: buildConfig.GitMaterialId, + GitMaterialId: buildConfig.GitMaterialId, + BuildContextGitMaterialId: buildConfig.BuildContextGitMaterialId, //DockerfilePath: createRequest.DockerBuildConfig.DockerfilePath, //Args: string(argByte), //TargetPlatform: createRequest.DockerBuildConfig.TargetPlatform, diff --git a/pkg/pipeline/bean/CiBuildConfig.go b/pkg/pipeline/bean/CiBuildConfig.go index bd3c7b0b84..bb548a8fed 100644 --- a/pkg/pipeline/bean/CiBuildConfig.go +++ b/pkg/pipeline/bean/CiBuildConfig.go @@ -17,11 +17,12 @@ const ( ) type CiBuildConfigBean struct { - Id int `json:"id"` - GitMaterialId int `json:"gitMaterialId,omitempty" validate:"required"` - CiBuildType CiBuildType `json:"ciBuildType"` - DockerBuildConfig *DockerBuildConfig `json:"dockerBuildConfig,omitempty"` - BuildPackConfig *BuildPackConfig `json:"buildPackConfig"` + Id int `json:"id"` + GitMaterialId int `json:"gitMaterialId,omitempty" validate:"required"` + BuildContextGitMaterialId int `json:"buildContextGitMaterialId,omitempty" validate:"required"` + CiBuildType CiBuildType `json:"ciBuildType"` + DockerBuildConfig *DockerBuildConfig `json:"dockerBuildConfig,omitempty"` + BuildPackConfig *BuildPackConfig `json:"buildPackConfig"` } type DockerBuildConfig struct { @@ -32,6 +33,7 @@ type DockerBuildConfig struct { Language string `json:"language,omitempty"` LanguageFramework string `json:"languageFramework,omitempty"` DockerBuildOptions map[string]string `json:"dockerBuildOptions,omitempty"` + BuildContext string `json:"buildContext,omitempty"` } type BuildPackConfig struct { @@ -138,6 +140,7 @@ func OverrideCiBuildConfig(dockerfilePath string, oldArgs string, ciLevelArgs st Args: dockerArgs, TargetPlatform: targetPlatform, DockerBuildOptions: dockerBuildOptionsMap, + BuildContext: "", }, } } else if ciBuildConfigBean.CiBuildType == SELF_DOCKERFILE_BUILD_TYPE || ciBuildConfigBean.CiBuildType == MANAGED_DOCKERFILE_BUILD_TYPE { diff --git a/scripts/sql/139_alter_ci_template.down.sql b/scripts/sql/139_alter_ci_template.down.sql new file mode 100644 index 0000000000..98dc4a83f5 --- /dev/null +++ b/scripts/sql/139_alter_ci_template.down.sql @@ -0,0 +1,4 @@ +ALTER TABLE ci_template DROP COLUMN IF EXISTS build_context_git_material_id; +ALTER TABLE ci_template DROP CONSTRAINT IF EXISTS ci_template_build_context_git_material_id_fkey; +ALTER TABLE ci_template_override DROP COLUMN IF EXISTS build_context_git_material_id; +ALTER TABLE ci_template_override DROP CONSTRAINT IF EXISTS ci_template_override_build_context_git_material_id_fkey; diff --git a/scripts/sql/139_alter_ci_template.up.sql b/scripts/sql/139_alter_ci_template.up.sql new file mode 100644 index 0000000000..35aaf4fde7 --- /dev/null +++ b/scripts/sql/139_alter_ci_template.up.sql @@ -0,0 +1,10 @@ +ALTER TABLE ci_template ADD COLUMN build_context_git_material_id INT; +UPDATE ci_template SET build_context_git_material_id = git_material_id; +ALTER TABLE ci_template_override ADD COLUMN build_context_git_material_id INT; +UPDATE ci_template_override SET build_context_git_material_id = git_material_id; + +ALTER TABLE ci_template + ADD CONSTRAINT "ci_template_build_context_git_material_id_fkey" FOREIGN KEY ("build_context_git_material_id") REFERENCES "public"."git_material" ("id"); + +ALTER TABLE ci_template_override + ADD CONSTRAINT "ci_template_override_build_context_git_material_id_fkey" FOREIGN KEY ("build_context_git_material_id") REFERENCES "public"."git_material" ("id"); \ No newline at end of file