diff --git a/pkg/microservice/aslan/core/common/repository/models/workflow_v4.go b/pkg/microservice/aslan/core/common/repository/models/workflow_v4.go index 66857a50603..9c7b3da254d 100644 --- a/pkg/microservice/aslan/core/common/repository/models/workflow_v4.go +++ b/pkg/microservice/aslan/core/common/repository/models/workflow_v4.go @@ -312,11 +312,11 @@ type ZadigVMDeployJobSpec struct { } type ZadigHelmChartDeployJobSpec struct { - Env string `bson:"env" yaml:"env" json:"env"` - EnvOptions []string `bson:"-" yaml:"env_options" json:"env_options"` - EnvSource string `bson:"env_source" yaml:"env_source" json:"env_source"` - SkipCheckRunStatus bool `bson:"skip_check_run_status" yaml:"skip_check_run_status" json:"skip_check_run_status"` - DeployHelmCharts []*DeployHelmChart `bson:"deploy_helm_charts" yaml:"deploy_helm_charts" json:"deploy_helm_charts"` + Env string `bson:"env" yaml:"env" json:"env"` + EnvOptions []*ZadigHelmDeployEnvInformation `bson:"-" yaml:"env_options" json:"env_options"` + EnvSource string `bson:"env_source" yaml:"env_source" json:"env_source"` + SkipCheckRunStatus bool `bson:"skip_check_run_status" yaml:"skip_check_run_status" json:"skip_check_run_status"` + DeployHelmCharts []*DeployHelmChart `bson:"deploy_helm_charts" yaml:"deploy_helm_charts" json:"deploy_helm_charts"` } type DeployHelmChart struct { @@ -573,6 +573,11 @@ type ZadigDeployEnvInformation struct { Services []*DeployServiceInfo `json:"services" yaml:"services"` } +type ZadigHelmDeployEnvInformation struct { + Env string `json:"env" yaml:"env"` + Services []*DeployHelmChart `json:"services" yaml:"services"` +} + type ClusterBrief struct { ClusterID string `json:"cluster_id" yaml:"cluster_id"` ClusterName string `json:"cluster_name" yaml:"cluster_name"` diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/job/job_deploy.go b/pkg/microservice/aslan/core/workflow/service/workflow/job/job_deploy.go index 86aac42b674..3371b946a37 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/job/job_deploy.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/job/job_deploy.go @@ -65,7 +65,7 @@ func (j *DeployJob) setDefaultDeployContent() { } } -func (j *DeployJob) getOriginReferedJobTargets(jobName string) ([]*commonmodels.ServiceAndImage, error) { +func (j *DeployJob) getOriginReferredJobTargets(jobName string) ([]*commonmodels.ServiceAndImage, error) { serviceAndImages := []*commonmodels.ServiceAndImage{} for _, stage := range j.workflow.Stages { for _, job := range stage.Jobs { @@ -83,7 +83,7 @@ func (j *DeployJob) getOriginReferedJobTargets(jobName string) ([]*commonmodels. ServiceModule: build.ServiceModule, Image: build.Image, }) - log.Infof("DeployJob ToJobs getOriginReferedJobTargets: workflow %s service %s, module %s, image %s", + log.Infof("DeployJob ToJobs getOriginReferredJobTargets: workflow %s service %s, module %s, image %s", j.workflow.Name, build.ServiceName, build.ServiceModule, build.Image) } return serviceAndImages, nil @@ -388,7 +388,7 @@ func (j *DeployJob) ToJobs(taskID int64) ([]*commonmodels.JobTask, error) { j.spec.JobName = j.spec.OriginJobName } j.spec.JobName = getOriginJobName(j.workflow, j.spec.JobName) - targets, err := j.getOriginReferedJobTargets(j.spec.JobName) + targets, err := j.getOriginReferredJobTargets(j.spec.JobName) if err != nil { return resp, fmt.Errorf("get origin refered job: %s targets failed, err: %v", j.spec.JobName, err) } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/job/job_helm_chart_deploy.go b/pkg/microservice/aslan/core/workflow/service/workflow/job/job_helm_chart_deploy.go index d2c7f0196fb..6f9ab4bb4d0 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/job/job_helm_chart_deploy.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/job/job_helm_chart_deploy.go @@ -27,6 +27,7 @@ import ( "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/util" "github.com/koderover/zadig/v2/pkg/setting" e "github.com/koderover/zadig/v2/pkg/tool/errors" + "github.com/koderover/zadig/v2/pkg/tool/log" ) type HelmChartDeployJob struct { @@ -50,36 +51,97 @@ func (j *HelmChartDeployJob) SetPreset() error { return err } + product, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{Name: j.workflow.Project, EnvName: j.spec.Env}) + if err != nil { + return fmt.Errorf("env %s not exists", j.spec.Env) + } + renderChartMap := product.GetChartDeployRenderMap() + + deploys := []*commonmodels.DeployHelmChart{} + productChartServiceMap := product.GetChartServiceMap() + for _, chartSvc := range productChartServiceMap { + renderChart := renderChartMap[chartSvc.ReleaseName] + if renderChart == nil { + return fmt.Errorf("render chart %s not found", chartSvc.ReleaseName) + } + deploy := &commonmodels.DeployHelmChart{ + ReleaseName: chartSvc.ReleaseName, + ChartRepo: renderChart.ChartRepo, + ChartName: renderChart.ChartName, + ChartVersion: renderChart.ChartVersion, + ValuesYaml: renderChart.GetOverrideYaml(), + } + deploys = append(deploys, deploy) + } + j.spec.DeployHelmCharts = deploys + j.job.Spec = j.spec + + return nil +} + +// SetOptions gets all helm chart info in all envs, and set it in EnvOptions field +func (j *HelmChartDeployJob) SetOptions() error { + j.spec = &commonmodels.ZadigHelmChartDeployJobSpec{} + if err := commonmodels.IToi(j.job.Spec, j.spec); err != nil { + return err + } + + envOptions := make([]*commonmodels.ZadigHelmDeployEnvInformation, 0) + if strings.HasPrefix(j.spec.Env, setting.FixedValueMark) { - j.spec.EnvOptions = []string{strings.ReplaceAll(j.spec.Env, setting.FixedValueMark, "")} + envName := strings.ReplaceAll(j.spec.Env, setting.FixedValueMark, "") + + chartInfo, err := generateEnvHelmChartInfo(envName, j.workflow.Project) + if err != nil { + log.Errorf("failed to generate helm chart deploy info for env: %s, error: %s", envName, err) + return err + } + + envOptions = append(envOptions, &commonmodels.ZadigHelmDeployEnvInformation{ + Env: envName, + Services: chartInfo, + }) } else { productList, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{ Name: j.workflow.Project, }) if err != nil { + log.Errorf("can't list envs in project %s, error: %w", j.workflow.Project, err) return fmt.Errorf("failed to list env with project: %s, error: %s", j.workflow.Project, err) } - envs := make([]string, 0) for _, env := range productList { - envs = append(envs, env.EnvName) + serviceDeployOption, err := generateEnvHelmChartInfo(env.EnvName, j.workflow.Project) + if err != nil { + log.Errorf("failed to generate chart deployment info for env: %s, error: %s", env.EnvName, err) + return err + } + + envOptions = append(envOptions, &commonmodels.ZadigHelmDeployEnvInformation{ + Env: env.EnvName, + Services: serviceDeployOption, + }) } - - j.spec.EnvOptions = envs } - product, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{Name: j.workflow.Project, EnvName: j.spec.Env}) + j.spec.EnvOptions = envOptions + j.job.Spec = j.spec + return nil +} + +func generateEnvHelmChartInfo(env, project string) ([]*commonmodels.DeployHelmChart, error) { + product, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{Name: project, EnvName: env}) if err != nil { - return fmt.Errorf("env %s not exists", j.spec.Env) + return nil, fmt.Errorf("failed to get env information from db, error: %s", err) } renderChartMap := product.GetChartDeployRenderMap() - deploys := []*commonmodels.DeployHelmChart{} + deploys := make([]*commonmodels.DeployHelmChart, 0) productChartServiceMap := product.GetChartServiceMap() for _, chartSvc := range productChartServiceMap { renderChart := renderChartMap[chartSvc.ReleaseName] if renderChart == nil { - return fmt.Errorf("render chart %s not found", chartSvc.ReleaseName) + return nil, fmt.Errorf("failed to get service render info for service: %s in env: %s", chartSvc.ServiceName, env) } deploy := &commonmodels.DeployHelmChart{ ReleaseName: chartSvc.ReleaseName, @@ -90,14 +152,8 @@ func (j *HelmChartDeployJob) SetPreset() error { } deploys = append(deploys, deploy) } - j.spec.DeployHelmCharts = deploys - j.job.Spec = j.spec - return nil -} - -func (j *HelmChartDeployJob) SetOptions() error { - return nil + return deploys, nil } func (j *HelmChartDeployJob) MergeArgs(args *commonmodels.Job) error {