From 3eec9fe65c52ac0eaf6ba8b49fd4a7c73cea6a0c Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 22 Nov 2024 13:41:48 +0530 Subject: [PATCH 01/16] added func for sourcebashrc --- ci-runner/executor/stage/ciStages.go | 2 +- ci-runner/helper/DockerHelper.go | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/ci-runner/executor/stage/ciStages.go b/ci-runner/executor/stage/ciStages.go index e120ce30a..7031e3904 100644 --- a/ci-runner/executor/stage/ciStages.go +++ b/ci-runner/executor/stage/ciStages.go @@ -422,7 +422,7 @@ func (impl *CiStage) extractDigest(ciCdRequest *helper.CiCdTriggerEvent, dest st digest, err = impl.dockerHelper.ExtractDigestForBuildx(dest, ciCdRequest.CommonWorkflowRequest) } else { // push to dest - log.Println(util.DEVTRON, "Docker push Artifact", "dest", dest) + log.Println(util.DEVTRON, "Docker `push Artifact", "dest", dest) err = impl.pushArtifact(ciCdRequest, dest, digest, metrics, artifactUploaded) if err != nil { return err diff --git a/ci-runner/helper/DockerHelper.go b/ci-runner/helper/DockerHelper.go index de4081849..61846128e 100644 --- a/ci-runner/helper/DockerHelper.go +++ b/ci-runner/helper/DockerHelper.go @@ -275,9 +275,26 @@ func (impl *DockerHelperImpl) DockerLogin(ciContext cicxt.CiContext, dockerCrede return util.ExecuteWithStageInfoLog(util.DOCKER_LOGIN_STAGE, performDockerLogin) } +func (impl *DockerHelperImpl) sourceBashrc(ciContext cicxt.CiContext) error { + dockerTag := "source ~/.bashrc" + log.Println(" -----> " + dockerTag) + dockerTagCMD := impl.GetCommandToExecute(dockerTag) + err := impl.cmdExecutor.RunCommand(ciContext, dockerTagCMD) + if err != nil { + log.Println(err) + return err + } + return nil +} + func (impl *DockerHelperImpl) BuildArtifact(ciRequest *CommonWorkflowRequest) (string, error) { + ciContext := cicxt.BuildCiContext(context.Background(), ciRequest.EnableSecretMasking) - err := impl.DockerLogin(ciContext, &DockerCredentials{ + err := impl.sourceBashrc(ciContext) + if err != nil { + log.Println("Error while sourceBashrc", err) + } + err = impl.DockerLogin(ciContext, &DockerCredentials{ DockerUsername: ciRequest.DockerUsername, DockerPassword: ciRequest.DockerPassword, AwsRegion: ciRequest.AwsRegion, From a156321364bdeadb474b57d1c9f2b8095ec30a77 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 22 Nov 2024 15:21:20 +0530 Subject: [PATCH 02/16] enabling support for envs in build artifact --- ci-runner/helper/DockerHelper.go | 51 ++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/ci-runner/helper/DockerHelper.go b/ci-runner/helper/DockerHelper.go index 61846128e..22dbe0614 100644 --- a/ci-runner/helper/DockerHelper.go +++ b/ci-runner/helper/DockerHelper.go @@ -64,7 +64,7 @@ const ( type DockerHelper interface { StartDockerDaemon(commonWorkflowRequest *CommonWorkflowRequest) DockerLogin(ciContext cicxt.CiContext, dockerCredentials *DockerCredentials) error - BuildArtifact(ciRequest *CommonWorkflowRequest) (string, error) + BuildArtifact(ciRequest *CommonWorkflowRequest, scriptEnvs map[string]string, preCiStageOutVariable map[int]map[string]*VariableObject) (string, error) StopDocker(ciContext cicxt.CiContext) error PushArtifact(ciContext cicxt.CiContext, dest string) error ExtractDigestForBuildx(dest string, ciRequest *CommonWorkflowRequest) (string, error) @@ -287,14 +287,10 @@ func (impl *DockerHelperImpl) sourceBashrc(ciContext cicxt.CiContext) error { return nil } -func (impl *DockerHelperImpl) BuildArtifact(ciRequest *CommonWorkflowRequest) (string, error) { +func (impl *DockerHelperImpl) BuildArtifact(ciRequest *CommonWorkflowRequest, scriptEnvs map[string]string, preCiStageOutVariable map[int]map[string]*VariableObject) (string, error) { ciContext := cicxt.BuildCiContext(context.Background(), ciRequest.EnableSecretMasking) - err := impl.sourceBashrc(ciContext) - if err != nil { - log.Println("Error while sourceBashrc", err) - } - err = impl.DockerLogin(ciContext, &DockerCredentials{ + err := impl.DockerLogin(ciContext, &DockerCredentials{ DockerUsername: ciRequest.DockerUsername, DockerPassword: ciRequest.DockerPassword, AwsRegion: ciRequest.AwsRegion, @@ -340,7 +336,8 @@ func (impl *DockerHelperImpl) BuildArtifact(ciRequest *CommonWorkflowRequest) (s } } - dockerBuildFlags := getDockerBuildFlagsMap(dockerBuildConfig) + + dockerBuildFlags := getDockerBuildFlagsMap(dockerBuildConfig, scriptEnvs, preCiStageOutVariable) for key, value := range dockerBuildFlags { dockerBuild = dockerBuild + " " + key + value } @@ -493,25 +490,53 @@ func (impl *DockerHelperImpl) BuildArtifact(ciRequest *CommonWorkflowRequest) (s return dest, nil } -func getDockerBuildFlagsMap(dockerBuildConfig *DockerBuildConfig) map[string]string { +func getDockerBuildFlagsMap(dockerBuildConfig *DockerBuildConfig, scriptEnvs map[string]string, preCiStageOutVariable map[int]map[string]*VariableObject) map[string]string { dockerBuildFlags := make(map[string]string) dockerBuildArgsMap := dockerBuildConfig.Args for k, v := range dockerBuildArgsMap { flagKey := fmt.Sprintf("%s %s", BUILD_ARG_FLAG, k) - dockerBuildFlags[flagKey] = parseDockerFlagParam(v) + dockerBuildFlags[flagKey] = parseDockerFlagParam(v, scriptEnvs, preCiStageOutVariable) } dockerBuildOptionsMap := dockerBuildConfig.DockerBuildOptions for k, v := range dockerBuildOptionsMap { flagKey := "--" + k - dockerBuildFlags[flagKey] = parseDockerFlagParam(v) + dockerBuildFlags[flagKey] = parseDockerFlagParam(v, scriptEnvs, preCiStageOutVariable) } return dockerBuildFlags } -func parseDockerFlagParam(param string) string { +func parseDockerFlagParam(param string, scriptEnvs map[string]string, preCiStageOutVariable map[int]map[string]*VariableObject) string { value := param + log.Println("--- parseDockerFlagParam scriptEnvs", scriptEnvs) + log.Println("--- parseDockerFlagParam preCiStageOutVariable", preCiStageOutVariable) if strings.HasPrefix(param, DEVTRON_ENV_VAR_PREFIX) { - value = os.Getenv(strings.TrimPrefix(param, DEVTRON_ENV_VAR_PREFIX)) + key := strings.TrimPrefix(param, DEVTRON_ENV_VAR_PREFIX) + + if preCiStageOutVariable != nil { + for k, task := range preCiStageOutVariable { + if _, ok := preCiStageOutVariable[k]; ok { + for variable, details := range task { + if variable == key { + outputVariableEnv := details.Value + if len(outputVariableEnv) > 0 { + value = outputVariableEnv + } + } + + } + } + } + } + if len(value) == 0 && scriptEnvs != nil { + scriptEnvVal, ok := scriptEnvs[key] + if ok { + value = scriptEnvVal + } + } + + if len(value) == 0 { + value = os.Getenv(key) + } } return wrapSingleOrDoubleQuotedValue(value) From ef3fdcd35ff16b426c2072db7e3340c5103fcdb2 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 22 Nov 2024 15:46:09 +0530 Subject: [PATCH 03/16] compile fix --- ci-runner/executor/stage/ciStages.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci-runner/executor/stage/ciStages.go b/ci-runner/executor/stage/ciStages.go index 7031e3904..d2d2654dc 100644 --- a/ci-runner/executor/stage/ciStages.go +++ b/ci-runner/executor/stage/ciStages.go @@ -387,7 +387,7 @@ func (impl *CiStage) runBuildArtifact(ciCdRequest *helper.CiCdTriggerEvent, metr // build start := time.Now() metrics.BuildStartTime = start - dest, err := impl.dockerHelper.BuildArtifact(ciCdRequest.CommonWorkflowRequest) // TODO make it skipable + dest, err := impl.dockerHelper.BuildArtifact(ciCdRequest.CommonWorkflowRequest, scriptEnvs, preCiStageOutVariable) // TODO make it skipable metrics.BuildDuration = time.Since(start).Seconds() if err != nil { log.Println("Error in building artifact", "err", err) From 20f53f8e66c64706700eb37e55b240d2214791df Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 22 Nov 2024 19:14:59 +0530 Subject: [PATCH 04/16] handle empty check --- ci-runner/helper/DockerHelper.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ci-runner/helper/DockerHelper.go b/ci-runner/helper/DockerHelper.go index 22dbe0614..1d05fa1bc 100644 --- a/ci-runner/helper/DockerHelper.go +++ b/ci-runner/helper/DockerHelper.go @@ -495,12 +495,18 @@ func getDockerBuildFlagsMap(dockerBuildConfig *DockerBuildConfig, scriptEnvs map dockerBuildArgsMap := dockerBuildConfig.Args for k, v := range dockerBuildArgsMap { flagKey := fmt.Sprintf("%s %s", BUILD_ARG_FLAG, k) - dockerBuildFlags[flagKey] = parseDockerFlagParam(v, scriptEnvs, preCiStageOutVariable) + parsedDockerFlagValue := parseDockerFlagParam(v, scriptEnvs, preCiStageOutVariable) + if len(parsedDockerFlagValue) > 0 { + dockerBuildFlags[flagKey] = parsedDockerFlagValue + } } dockerBuildOptionsMap := dockerBuildConfig.DockerBuildOptions for k, v := range dockerBuildOptionsMap { flagKey := "--" + k - dockerBuildFlags[flagKey] = parseDockerFlagParam(v, scriptEnvs, preCiStageOutVariable) + parsedDockerFlagValue := parseDockerFlagParam(v, scriptEnvs, preCiStageOutVariable) + if len(parsedDockerFlagValue) > 0 { + dockerBuildFlags[flagKey] = parsedDockerFlagValue + } } return dockerBuildFlags } From 621af289942dacf3de9e36b9bcded580a14b3a23 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 22 Nov 2024 21:06:56 +0530 Subject: [PATCH 05/16] handle not configure env variable --- ci-runner/helper/DockerHelper.go | 1 + 1 file changed, 1 insertion(+) diff --git a/ci-runner/helper/DockerHelper.go b/ci-runner/helper/DockerHelper.go index 1d05fa1bc..b79d48fe0 100644 --- a/ci-runner/helper/DockerHelper.go +++ b/ci-runner/helper/DockerHelper.go @@ -543,6 +543,7 @@ func parseDockerFlagParam(param string, scriptEnvs map[string]string, preCiStage if len(value) == 0 { value = os.Getenv(key) } + return "" } return wrapSingleOrDoubleQuotedValue(value) From 60563a9d1cc322922052c1844ea3ec2f6550e0f2 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 22 Nov 2024 21:21:18 +0530 Subject: [PATCH 06/16] if check --- ci-runner/helper/DockerHelper.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ci-runner/helper/DockerHelper.go b/ci-runner/helper/DockerHelper.go index b79d48fe0..cd51ea156 100644 --- a/ci-runner/helper/DockerHelper.go +++ b/ci-runner/helper/DockerHelper.go @@ -543,7 +543,9 @@ func parseDockerFlagParam(param string, scriptEnvs map[string]string, preCiStage if len(value) == 0 { value = os.Getenv(key) } - return "" + if len(value) == 0 { + return "" + } } return wrapSingleOrDoubleQuotedValue(value) From 46b4d63c902a91af93f39825867209d7c6b295b5 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 22 Nov 2024 21:37:32 +0530 Subject: [PATCH 07/16] handle not changed val --- ci-runner/helper/DockerHelper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci-runner/helper/DockerHelper.go b/ci-runner/helper/DockerHelper.go index cd51ea156..df7544940 100644 --- a/ci-runner/helper/DockerHelper.go +++ b/ci-runner/helper/DockerHelper.go @@ -543,7 +543,7 @@ func parseDockerFlagParam(param string, scriptEnvs map[string]string, preCiStage if len(value) == 0 { value = os.Getenv(key) } - if len(value) == 0 { + if len(value) == 0 || strings.HasPrefix(param, DEVTRON_ENV_VAR_PREFIX) { return "" } } From 08db9201baa2449cd5055dfc00665f7cc3575f84 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 22 Nov 2024 21:38:57 +0530 Subject: [PATCH 08/16] remove empty check --- ci-runner/helper/DockerHelper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci-runner/helper/DockerHelper.go b/ci-runner/helper/DockerHelper.go index df7544940..3f8bcfb39 100644 --- a/ci-runner/helper/DockerHelper.go +++ b/ci-runner/helper/DockerHelper.go @@ -543,7 +543,7 @@ func parseDockerFlagParam(param string, scriptEnvs map[string]string, preCiStage if len(value) == 0 { value = os.Getenv(key) } - if len(value) == 0 || strings.HasPrefix(param, DEVTRON_ENV_VAR_PREFIX) { + if strings.HasPrefix(param, DEVTRON_ENV_VAR_PREFIX) { return "" } } From 32f1a6b18b4557191884514a306608e05d678c50 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Fri, 22 Nov 2024 21:52:18 +0530 Subject: [PATCH 09/16] bug fix --- ci-runner/helper/DockerHelper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci-runner/helper/DockerHelper.go b/ci-runner/helper/DockerHelper.go index 3f8bcfb39..a13faec19 100644 --- a/ci-runner/helper/DockerHelper.go +++ b/ci-runner/helper/DockerHelper.go @@ -543,7 +543,7 @@ func parseDockerFlagParam(param string, scriptEnvs map[string]string, preCiStage if len(value) == 0 { value = os.Getenv(key) } - if strings.HasPrefix(param, DEVTRON_ENV_VAR_PREFIX) { + if strings.HasPrefix(value, DEVTRON_ENV_VAR_PREFIX) { return "" } } From 4cc6b42934de58d972ae215311c66e380de929e2 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Mon, 25 Nov 2024 14:51:56 +0530 Subject: [PATCH 10/16] add multi tag support build and push non-buildx --- ci-runner/executor/stage/ciStages.go | 30 +++++++++++-- ci-runner/helper/DockerHelper.go | 63 ++++++++++++++++++++++++++-- 2 files changed, 85 insertions(+), 8 deletions(-) diff --git a/ci-runner/executor/stage/ciStages.go b/ci-runner/executor/stage/ciStages.go index d2d2654dc..19a2e4952 100644 --- a/ci-runner/executor/stage/ciStages.go +++ b/ci-runner/executor/stage/ciStages.go @@ -410,7 +410,7 @@ func (impl *CiStage) runBuildArtifact(ciCdRequest *helper.CiCdTriggerEvent, metr return dest, err } -func (impl *CiStage) extractDigest(ciCdRequest *helper.CiCdTriggerEvent, dest string, metrics *helper.CIMetrics, artifactUploaded bool) (string, error) { +func (impl *CiStage) extractDigest(ciCdRequest *helper.CiCdTriggerEvent, dest string, metrics *helper.CIMetrics, artifactUploaded bool, scriptEnvs map[string]string, preCiStageOutVariable map[int]map[string]*helper.VariableObject) (string, error) { var digest string var err error @@ -423,7 +423,7 @@ func (impl *CiStage) extractDigest(ciCdRequest *helper.CiCdTriggerEvent, dest st } else { // push to dest log.Println(util.DEVTRON, "Docker `push Artifact", "dest", dest) - err = impl.pushArtifact(ciCdRequest, dest, digest, metrics, artifactUploaded) + err = impl.pushArtifact(ciCdRequest, dest, digest, metrics, artifactUploaded, scriptEnvs, preCiStageOutVariable) if err != nil { return err } @@ -496,7 +496,7 @@ func (impl *CiStage) getImageDestAndDigest(ciCdRequest *helper.CiCdTriggerEvent, if err != nil { return "", "", err } - digest, err := impl.extractDigest(ciCdRequest, dest, metrics, artifactUploaded) + digest, err := impl.extractDigest(ciCdRequest, dest, metrics, artifactUploaded, scriptEnvs, preCiStageOutVariable) if err != nil { log.Println("Error in extracting digest", "err", err) return "", "", err @@ -564,9 +564,10 @@ func sendCDFailureEvent(ciRequest *helper.CommonWorkflowRequest, err *helper.CdS } } -func (impl *CiStage) pushArtifact(ciCdRequest *helper.CiCdTriggerEvent, dest string, digest string, metrics *helper.CIMetrics, artifactUploaded bool) error { +func (impl *CiStage) pushArtifact(ciCdRequest *helper.CiCdTriggerEvent, dest string, digest string, metrics *helper.CIMetrics, artifactUploaded bool, scriptEnvs map[string]string, preCiStageOutVariable map[int]map[string]*helper.VariableObject) error { imageRetryCountValue := ciCdRequest.CommonWorkflowRequest.ImageRetryCount imageRetryIntervalValue := ciCdRequest.CommonWorkflowRequest.ImageRetryInterval + var err error for i := 0; i < imageRetryCountValue+1; i++ { if i != 0 { @@ -585,6 +586,27 @@ func (impl *CiStage) pushArtifact(ciCdRequest *helper.CiCdTriggerEvent, dest str WithFailureMessage(workFlow.PushFailed.String()). WithArtifactUploaded(artifactUploaded) } + multiDockerTagsValue := helper.GetMultiDockerTagsValue(scriptEnvs, preCiStageOutVariable) + if len(multiDockerTagsValue) > 0 { + tags := strings.Split(multiDockerTagsValue, `,`) + for _, tmpDockerTag := range tags { + if !strings.Contains(tmpDockerTag, ":") { + fullImageUrl, err := helper.BuildDockerImagePath(ciCdRequest.CommonWorkflowRequest) + if err != nil { + log.Println("Error in building docker image", "err", err) + return err + } + tmpDockerTag = fullImageUrl + } + ciContext := cicxt.BuildCiContext(context.Background(), ciCdRequest.CommonWorkflowRequest.EnableSecretMasking) + err = impl.dockerHelper.PushArtifact(ciContext, tmpDockerTag) + if err == nil { + break + } + log.Println("Error in pushing artifact", "artifact", tmpDockerTag, "err", err) + } + + } return err } diff --git a/ci-runner/helper/DockerHelper.go b/ci-runner/helper/DockerHelper.go index a13faec19..aafcb83be 100644 --- a/ci-runner/helper/DockerHelper.go +++ b/ci-runner/helper/DockerHelper.go @@ -59,6 +59,7 @@ const ( BUILDX_K8S_DRIVER_NAME = "devtron-buildx-builder" BUILDX_NODE_NAME = "devtron-buildx-node-" DOCKERD_OUTPUT_FILE_PATH = "/usr/local/bin/nohup.out" + MULTI_TAG_ENV = "docker_env_multi_tags" ) type DockerHelper interface { @@ -440,7 +441,7 @@ func (impl *DockerHelperImpl) BuildArtifact(ciRequest *CommonWorkflowRequest, sc } if !useBuildx { - err = impl.tagDockerBuild(ciContext, ciRequest.DockerRepository, dest) + err = impl.tagDockerBuild(ciContext, ciRequest, dest, scriptEnvs, preCiStageOutVariable) if err != nil { return "", err } @@ -773,18 +774,72 @@ func (impl *DockerHelperImpl) executeCmd(ciContext cicxt.CiContext, dockerBuild return err } -func (impl *DockerHelperImpl) tagDockerBuild(ciContext cicxt.CiContext, dockerRepository string, dest string) error { - dockerTag := "docker tag " + dockerRepository + ":latest" + " " + dest - log.Println(" -----> " + dockerTag) +func (impl *DockerHelperImpl) tagDockerBuild(ciContext cicxt.CiContext, ciRequest *CommonWorkflowRequest, dest string, scriptEnvs map[string]string, preCiStageOutVariable map[int]map[string]*VariableObject) error { + dockerTag := "docker tag " + ciRequest.DockerRepository + ":latest" + " " + dest dockerTagCMD := impl.GetCommandToExecute(dockerTag) err := impl.cmdExecutor.RunCommand(ciContext, dockerTagCMD) if err != nil { log.Println(err) return err } + + log.Println(" -----> " + dockerTag) + multiDockerTagsValue := GetMultiDockerTagsValue(scriptEnvs, preCiStageOutVariable) + if len(multiDockerTagsValue) > 0 { + tags := strings.Split(multiDockerTagsValue, `,`) + for _, tmpDockerTag := range tags { + tmpDockerTag = strings.TrimSpace(tmpDockerTag) + if !strings.Contains(tmpDockerTag, ":") { + fullImageUrl, err := BuildDockerImagePath(ciRequest) + if err != nil { + log.Println("Error in building docker image", "err", err) + return err + } + tmpDockerTag = fullImageUrl + } + tmpDockerTagCommand := "docker tag " + ciRequest.DockerRepository + ":latest" + " " + tmpDockerTag + tmpDockerTagCMD := impl.GetCommandToExecute(tmpDockerTagCommand) + err := impl.cmdExecutor.RunCommand(ciContext, tmpDockerTagCMD) + if err != nil { + log.Println(err) + return err + } + } + + } + return nil } +func GetMultiDockerTagsValue(scriptEnvs map[string]string, preCiStageOutVariable map[int]map[string]*VariableObject) string { + multiDockerTagsValue := "" + log.Println("--- GetMultiDockerTagsValue scriptEnvs", scriptEnvs) + log.Println("--- GetMultiDockerTagsValue preCiStageOutVariable", preCiStageOutVariable) + if preCiStageOutVariable != nil { + for k, task := range preCiStageOutVariable { + if _, ok := preCiStageOutVariable[k]; ok { + for variable, details := range task { + if variable == MULTI_TAG_ENV { + outputVariableEnv := details.Value + if len(outputVariableEnv) > 0 { + multiDockerTagsValue = outputVariableEnv + } + } + + } + } + } + } + if len(multiDockerTagsValue) == 0 && scriptEnvs != nil { + scriptEnvVal, ok := scriptEnvs[MULTI_TAG_ENV] + if ok { + multiDockerTagsValue = scriptEnvVal + } + } + log.Println("--- GetMultiDockerTagsValue multiDockerTagsValue", multiDockerTagsValue) + return multiDockerTagsValue +} + func (impl *DockerHelperImpl) setupCacheForBuildx(ciContext cicxt.CiContext, localCachePath string, oldCacheBuildxPath string) error { err := impl.checkAndCreateDirectory(ciContext, localCachePath) if err != nil { From 8608a136839958ec11886c59f225c4b16da28d1a Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Mon, 25 Nov 2024 15:07:35 +0530 Subject: [PATCH 11/16] build full url for custom tag --- ci-runner/executor/stage/ciStages.go | 3 ++- ci-runner/helper/DockerHelper.go | 14 +++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/ci-runner/executor/stage/ciStages.go b/ci-runner/executor/stage/ciStages.go index 19a2e4952..6d9c44db3 100644 --- a/ci-runner/executor/stage/ciStages.go +++ b/ci-runner/executor/stage/ciStages.go @@ -591,13 +591,14 @@ func (impl *CiStage) pushArtifact(ciCdRequest *helper.CiCdTriggerEvent, dest str tags := strings.Split(multiDockerTagsValue, `,`) for _, tmpDockerTag := range tags { if !strings.Contains(tmpDockerTag, ":") { - fullImageUrl, err := helper.BuildDockerImagePath(ciCdRequest.CommonWorkflowRequest) + fullImageUrl, err := helper.BuildDockerImagePathForCustomTag(ciCdRequest.CommonWorkflowRequest, tmpDockerTag) if err != nil { log.Println("Error in building docker image", "err", err) return err } tmpDockerTag = fullImageUrl } + log.Println(" -----> custom-tag push " + tmpDockerTag) ciContext := cicxt.BuildCiContext(context.Background(), ciCdRequest.CommonWorkflowRequest.EnableSecretMasking) err = impl.dockerHelper.PushArtifact(ciContext, tmpDockerTag) if err == nil { diff --git a/ci-runner/helper/DockerHelper.go b/ci-runner/helper/DockerHelper.go index aafcb83be..30d4c2572 100644 --- a/ci-runner/helper/DockerHelper.go +++ b/ci-runner/helper/DockerHelper.go @@ -790,13 +790,14 @@ func (impl *DockerHelperImpl) tagDockerBuild(ciContext cicxt.CiContext, ciReques for _, tmpDockerTag := range tags { tmpDockerTag = strings.TrimSpace(tmpDockerTag) if !strings.Contains(tmpDockerTag, ":") { - fullImageUrl, err := BuildDockerImagePath(ciRequest) + fullImageUrl, err := BuildDockerImagePathForCustomTag(ciRequest, tmpDockerTag) if err != nil { log.Println("Error in building docker image", "err", err) return err } tmpDockerTag = fullImageUrl } + log.Println(" -----> custom-tag " + tmpDockerTag) tmpDockerTagCommand := "docker tag " + ciRequest.DockerRepository + ":latest" + " " + tmpDockerTag tmpDockerTagCMD := impl.GetCommandToExecute(tmpDockerTagCommand) err := impl.cmdExecutor.RunCommand(ciContext, tmpDockerTagCMD) @@ -924,6 +925,17 @@ func BuildDockerImagePath(ciRequest *CommonWorkflowRequest) (string, error) { } +func BuildDockerImagePathForCustomTag(ciRequest *CommonWorkflowRequest, dockerTag string) (string, error) { + return utils.BuildDockerImagePath(bean.DockerRegistryInfo{ + DockerImageTag: dockerTag, + DockerRegistryId: ciRequest.DockerRegistryId, + DockerRegistryType: ciRequest.DockerRegistryType, + DockerRegistryURL: ciRequest.IntermediateDockerRegistryUrl, + DockerRepository: ciRequest.DockerRepository, + }) + +} + func (impl *DockerHelperImpl) PushArtifact(ciContext cicxt.CiContext, dest string) error { //awsLogin := "$(aws ecr get-login --no-include-email --region " + ciRequest.AwsRegion + ")" dockerPush := "docker push " + dest From 71388e4d3a040ee088e93d72de797296f0d31545 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Mon, 25 Nov 2024 16:06:14 +0530 Subject: [PATCH 12/16] support for buildx --- ci-runner/executor/stage/ciStages.go | 4 ++-- ci-runner/helper/DockerHelper.go | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/ci-runner/executor/stage/ciStages.go b/ci-runner/executor/stage/ciStages.go index 6d9c44db3..467adbbe1 100644 --- a/ci-runner/executor/stage/ciStages.go +++ b/ci-runner/executor/stage/ciStages.go @@ -601,8 +601,8 @@ func (impl *CiStage) pushArtifact(ciCdRequest *helper.CiCdTriggerEvent, dest str log.Println(" -----> custom-tag push " + tmpDockerTag) ciContext := cicxt.BuildCiContext(context.Background(), ciCdRequest.CommonWorkflowRequest.EnableSecretMasking) err = impl.dockerHelper.PushArtifact(ciContext, tmpDockerTag) - if err == nil { - break + if err != nil { + log.Println("Error in pushing artifact", "artifact", tmpDockerTag, "err", err) } log.Println("Error in pushing artifact", "artifact", tmpDockerTag, "err", err) } diff --git a/ci-runner/helper/DockerHelper.go b/ci-runner/helper/DockerHelper.go index 30d4c2572..b9d7a5d9e 100644 --- a/ci-runner/helper/DockerHelper.go +++ b/ci-runner/helper/DockerHelper.go @@ -401,6 +401,27 @@ func (impl *DockerHelperImpl) BuildArtifact(ciRequest *CommonWorkflowRequest, sc multiNodeK8sDriver := useBuildxK8sDriver && len(eligibleK8sDriverNodes) > 1 exportBuildxCacheAfterBuild := ciRequest.AsyncBuildxCacheExport && multiNodeK8sDriver dockerBuild, buildxExportCacheFunc = impl.getBuildxBuildCommand(ciContext, exportBuildxCacheAfterBuild, cacheEnabled, ciRequest.BuildxCacheModeMin, dockerBuild, oldCacheBuildxPath, localCachePath, dest, dockerBuildConfig, dockerfilePath) + multiDockerTagsValue := GetMultiDockerTagsValue(scriptEnvs, preCiStageOutVariable) + if len(multiDockerTagsValue) > 0 { + tags := strings.Split(multiDockerTagsValue, `,`) + for _, tmpDockerTag := range tags { + tmpDockerTag = strings.TrimSpace(tmpDockerTag) + if !strings.Contains(tmpDockerTag, ":") { + fullImageUrl, err := BuildDockerImagePathForCustomTag(ciRequest, tmpDockerTag) + if err != nil { + log.Println("Error in building docker image", "err", err) + return "", err + } + tmpDockerTag = fullImageUrl + } + log.Println(" -----> custom-tag " + tmpDockerTag) + dockerBuildxForMultiTag, _ := impl.getBuildxBuildCommand(ciContext, exportBuildxCacheAfterBuild, cacheEnabled, ciRequest.BuildxCacheModeMin, dockerBuild, oldCacheBuildxPath, localCachePath, tmpDockerTag, dockerBuildConfig, dockerfilePath) + err = impl.executeCmd(ciContext, dockerBuildxForMultiTag) + if err != nil { + return "", err + } + } + } } else { dockerBuild = fmt.Sprintf("%s -f %s --network host -t %s %s", dockerBuild, dockerfilePath, ciRequest.DockerRepository, dockerBuildConfig.BuildContext) } From ab2b1daf107db1f5859ede1764dd5af1106a30b2 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Mon, 25 Nov 2024 16:21:26 +0530 Subject: [PATCH 13/16] fix log --- ci-runner/executor/stage/ciStages.go | 1 - 1 file changed, 1 deletion(-) diff --git a/ci-runner/executor/stage/ciStages.go b/ci-runner/executor/stage/ciStages.go index 467adbbe1..a44d261e4 100644 --- a/ci-runner/executor/stage/ciStages.go +++ b/ci-runner/executor/stage/ciStages.go @@ -604,7 +604,6 @@ func (impl *CiStage) pushArtifact(ciCdRequest *helper.CiCdTriggerEvent, dest str if err != nil { log.Println("Error in pushing artifact", "artifact", tmpDockerTag, "err", err) } - log.Println("Error in pushing artifact", "artifact", tmpDockerTag, "err", err) } } From bd2320655200edff8cd53e0a77e34af4c1577da0 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Tue, 26 Nov 2024 12:18:01 +0530 Subject: [PATCH 14/16] improve code for buildx support --- ci-runner/helper/DockerHelper.go | 45 ++++++++++++++------------------ 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/ci-runner/helper/DockerHelper.go b/ci-runner/helper/DockerHelper.go index b9d7a5d9e..4fdb49cb6 100644 --- a/ci-runner/helper/DockerHelper.go +++ b/ci-runner/helper/DockerHelper.go @@ -400,28 +400,13 @@ func (impl *DockerHelperImpl) BuildArtifact(ciRequest *CommonWorkflowRequest, sc multiNodeK8sDriver := useBuildxK8sDriver && len(eligibleK8sDriverNodes) > 1 exportBuildxCacheAfterBuild := ciRequest.AsyncBuildxCacheExport && multiNodeK8sDriver - dockerBuild, buildxExportCacheFunc = impl.getBuildxBuildCommand(ciContext, exportBuildxCacheAfterBuild, cacheEnabled, ciRequest.BuildxCacheModeMin, dockerBuild, oldCacheBuildxPath, localCachePath, dest, dockerBuildConfig, dockerfilePath) + multiDockerTagsValue := GetMultiDockerTagsValue(scriptEnvs, preCiStageOutVariable) + dockerTags := []string{} if len(multiDockerTagsValue) > 0 { - tags := strings.Split(multiDockerTagsValue, `,`) - for _, tmpDockerTag := range tags { - tmpDockerTag = strings.TrimSpace(tmpDockerTag) - if !strings.Contains(tmpDockerTag, ":") { - fullImageUrl, err := BuildDockerImagePathForCustomTag(ciRequest, tmpDockerTag) - if err != nil { - log.Println("Error in building docker image", "err", err) - return "", err - } - tmpDockerTag = fullImageUrl - } - log.Println(" -----> custom-tag " + tmpDockerTag) - dockerBuildxForMultiTag, _ := impl.getBuildxBuildCommand(ciContext, exportBuildxCacheAfterBuild, cacheEnabled, ciRequest.BuildxCacheModeMin, dockerBuild, oldCacheBuildxPath, localCachePath, tmpDockerTag, dockerBuildConfig, dockerfilePath) - err = impl.executeCmd(ciContext, dockerBuildxForMultiTag) - if err != nil { - return "", err - } - } + dockerTags = strings.Split(multiDockerTagsValue, `,`) } + dockerBuild, buildxExportCacheFunc = impl.getBuildxBuildCommand(ciContext, exportBuildxCacheAfterBuild, cacheEnabled, ciRequest.BuildxCacheModeMin, dockerBuild, oldCacheBuildxPath, localCachePath, dest, dockerBuildConfig, dockerfilePath, dockerTags) } else { dockerBuild = fmt.Sprintf("%s -f %s --network host -t %s %s", dockerBuild, dockerfilePath, ciRequest.DockerRepository, dockerBuildConfig.BuildContext) } @@ -651,7 +636,7 @@ func getSourceCaches(targetPlatforms, oldCachePathLocation string) string { return strings.Join(allCachePaths, " ") } -func (impl *DockerHelperImpl) getBuildxBuildCommandV2(ciContext cicxt.CiContext, cacheEnabled bool, useCacheMin bool, dockerBuild, oldCacheBuildxPath, localCachePath, dest string, dockerBuildConfig *DockerBuildConfig, dockerfilePath string) (string, func() error) { +func (impl *DockerHelperImpl) getBuildxBuildCommandV2(ciContext cicxt.CiContext, cacheEnabled bool, useCacheMin bool, dockerBuild, oldCacheBuildxPath, localCachePath, dest string, dockerBuildConfig *DockerBuildConfig, dockerfilePath string, additionalImageTags []string) (string, func() error) { dockerBuild = fmt.Sprintf("%s %s -f %s --network host --allow network.host --allow security.insecure", dockerBuild, dockerBuildConfig.BuildContext, dockerfilePath) exportCacheCmds := make(map[string]string) @@ -673,18 +658,26 @@ func (impl *DockerHelperImpl) getBuildxBuildCommandV2(ciContext cicxt.CiContext, } manifestLocation := util.LOCAL_BUILDX_LOCATION + "/manifest.json" - dockerBuild = fmt.Sprintf("%s -t %s --push --metadata-file %s", dockerBuild, dest, manifestLocation) + dockerBuild = fmt.Sprintf("%s %s --push --metadata-file %s", dockerBuild, GetTagArgumentFlagForBuildx(dest, additionalImageTags), manifestLocation) return dockerBuild, impl.getBuildxExportCacheFunc(ciContext, exportCacheCmds) } -func (impl *DockerHelperImpl) getBuildxBuildCommandV1(cacheEnabled bool, useCacheMin bool, dockerBuild, oldCacheBuildxPath, localCachePath, dest string, dockerBuildConfig *DockerBuildConfig, dockerfilePath string) (string, func() error) { +func GetTagArgumentFlagForBuildx(dest string, additionalTags []string) string { + flagCmd := fmt.Sprintf("-t %s", dest) + for _, tag := range additionalTags { + flagCmd = fmt.Sprintf("%s -t %s", flagCmd, tag) + } + return flagCmd +} + +func (impl *DockerHelperImpl) getBuildxBuildCommandV1(cacheEnabled bool, useCacheMin bool, dockerBuild, oldCacheBuildxPath, localCachePath, dest string, dockerBuildConfig *DockerBuildConfig, dockerfilePath string, additionalImageTags []string) (string, func() error) { cacheMode := CacheModeMax if useCacheMin { cacheMode = CacheModeMin } - dockerBuild = fmt.Sprintf("%s -f %s -t %s --push %s --network host --allow network.host --allow security.insecure", dockerBuild, dockerfilePath, dest, dockerBuildConfig.BuildContext) + dockerBuild = fmt.Sprintf("%s -f %s %s --push %s --network host --allow network.host --allow security.insecure", dockerBuild, dockerfilePath, GetTagArgumentFlagForBuildx(dest, additionalImageTags), dockerBuildConfig.BuildContext) if cacheEnabled { dockerBuild = fmt.Sprintf("%s --cache-to=type=local,dest=%s,mode=%s --cache-from=type=local,src=%s", dockerBuild, localCachePath, cacheMode, oldCacheBuildxPath) } @@ -702,11 +695,11 @@ func (impl *DockerHelperImpl) getBuildxBuildCommandV1(cacheEnabled bool, useCach return dockerBuild, nil } -func (impl *DockerHelperImpl) getBuildxBuildCommand(ciContext cicxt.CiContext, exportBuildxCacheAfterBuild bool, cacheEnabled bool, useCacheMin bool, dockerBuild, oldCacheBuildxPath, localCachePath, dest string, dockerBuildConfig *DockerBuildConfig, dockerfilePath string) (string, func() error) { +func (impl *DockerHelperImpl) getBuildxBuildCommand(ciContext cicxt.CiContext, exportBuildxCacheAfterBuild bool, cacheEnabled bool, useCacheMin bool, dockerBuild, oldCacheBuildxPath, localCachePath, dest string, dockerBuildConfig *DockerBuildConfig, dockerfilePath string, additionalImageTags []string) (string, func() error) { if exportBuildxCacheAfterBuild { - return impl.getBuildxBuildCommandV2(ciContext, cacheEnabled, useCacheMin, dockerBuild, oldCacheBuildxPath, localCachePath, dest, dockerBuildConfig, dockerfilePath) + return impl.getBuildxBuildCommandV2(ciContext, cacheEnabled, useCacheMin, dockerBuild, oldCacheBuildxPath, localCachePath, dest, dockerBuildConfig, dockerfilePath, additionalImageTags) } - return impl.getBuildxBuildCommandV1(cacheEnabled, useCacheMin, dockerBuild, oldCacheBuildxPath, localCachePath, dest, dockerBuildConfig, dockerfilePath) + return impl.getBuildxBuildCommandV1(cacheEnabled, useCacheMin, dockerBuild, oldCacheBuildxPath, localCachePath, dest, dockerBuildConfig, dockerfilePath, additionalImageTags) } func (impl *DockerHelperImpl) handleLanguageVersion(ciContext cicxt.CiContext, projectPath string, buildpackConfig *BuildPackConfig) { From c3a63aa110141000f3af33852d9e437192bba275 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Tue, 26 Nov 2024 13:36:24 +0530 Subject: [PATCH 15/16] using full image url for buildx --- ci-runner/helper/DockerHelper.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/ci-runner/helper/DockerHelper.go b/ci-runner/helper/DockerHelper.go index 4fdb49cb6..8eab71dd5 100644 --- a/ci-runner/helper/DockerHelper.go +++ b/ci-runner/helper/DockerHelper.go @@ -402,11 +402,23 @@ func (impl *DockerHelperImpl) BuildArtifact(ciRequest *CommonWorkflowRequest, sc exportBuildxCacheAfterBuild := ciRequest.AsyncBuildxCacheExport && multiNodeK8sDriver multiDockerTagsValue := GetMultiDockerTagsValue(scriptEnvs, preCiStageOutVariable) - dockerTags := []string{} + fullUrlDockerTags := []string{} if len(multiDockerTagsValue) > 0 { - dockerTags = strings.Split(multiDockerTagsValue, `,`) + dockerTags := strings.Split(multiDockerTagsValue, `,`) + for _, tmpDockerTag := range dockerTags { + tmpDockerTag = strings.TrimSpace(tmpDockerTag) + if !strings.Contains(tmpDockerTag, ":") { + fullImageUrl, err := BuildDockerImagePathForCustomTag(ciRequest, tmpDockerTag) + if err != nil { + log.Println("Error in building docker image multiple tags", "err", err) + return "", err + } + tmpDockerTag = fullImageUrl + } + fullUrlDockerTags = append(fullUrlDockerTags, tmpDockerTag) + } } - dockerBuild, buildxExportCacheFunc = impl.getBuildxBuildCommand(ciContext, exportBuildxCacheAfterBuild, cacheEnabled, ciRequest.BuildxCacheModeMin, dockerBuild, oldCacheBuildxPath, localCachePath, dest, dockerBuildConfig, dockerfilePath, dockerTags) + dockerBuild, buildxExportCacheFunc = impl.getBuildxBuildCommand(ciContext, exportBuildxCacheAfterBuild, cacheEnabled, ciRequest.BuildxCacheModeMin, dockerBuild, oldCacheBuildxPath, localCachePath, dest, dockerBuildConfig, dockerfilePath, fullUrlDockerTags) } else { dockerBuild = fmt.Sprintf("%s -f %s --network host -t %s %s", dockerBuild, dockerfilePath, ciRequest.DockerRepository, dockerBuildConfig.BuildContext) } From f2df4a22ebb856e7da1529be95d6e965057c2d80 Mon Sep 17 00:00:00 2001 From: ayu-devtron Date: Wed, 27 Nov 2024 10:50:19 +0530 Subject: [PATCH 16/16] remove unnecessary logs and functions --- ci-runner/executor/stage/ciStages.go | 4 ++-- ci-runner/helper/DockerHelper.go | 19 +------------------ 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/ci-runner/executor/stage/ciStages.go b/ci-runner/executor/stage/ciStages.go index a44d261e4..885b073e5 100644 --- a/ci-runner/executor/stage/ciStages.go +++ b/ci-runner/executor/stage/ciStages.go @@ -422,7 +422,7 @@ func (impl *CiStage) extractDigest(ciCdRequest *helper.CiCdTriggerEvent, dest st digest, err = impl.dockerHelper.ExtractDigestForBuildx(dest, ciCdRequest.CommonWorkflowRequest) } else { // push to dest - log.Println(util.DEVTRON, "Docker `push Artifact", "dest", dest) + log.Println(util.DEVTRON, "Docker push Artifact", "dest", dest) err = impl.pushArtifact(ciCdRequest, dest, digest, metrics, artifactUploaded, scriptEnvs, preCiStageOutVariable) if err != nil { return err @@ -593,7 +593,7 @@ func (impl *CiStage) pushArtifact(ciCdRequest *helper.CiCdTriggerEvent, dest str if !strings.Contains(tmpDockerTag, ":") { fullImageUrl, err := helper.BuildDockerImagePathForCustomTag(ciCdRequest.CommonWorkflowRequest, tmpDockerTag) if err != nil { - log.Println("Error in building docker image", "err", err) + log.Println("Error in building docker image", "fullImageUrl", fullImageUrl, "err", err) return err } tmpDockerTag = fullImageUrl diff --git a/ci-runner/helper/DockerHelper.go b/ci-runner/helper/DockerHelper.go index 8eab71dd5..1463976ae 100644 --- a/ci-runner/helper/DockerHelper.go +++ b/ci-runner/helper/DockerHelper.go @@ -276,18 +276,6 @@ func (impl *DockerHelperImpl) DockerLogin(ciContext cicxt.CiContext, dockerCrede return util.ExecuteWithStageInfoLog(util.DOCKER_LOGIN_STAGE, performDockerLogin) } -func (impl *DockerHelperImpl) sourceBashrc(ciContext cicxt.CiContext) error { - dockerTag := "source ~/.bashrc" - log.Println(" -----> " + dockerTag) - dockerTagCMD := impl.GetCommandToExecute(dockerTag) - err := impl.cmdExecutor.RunCommand(ciContext, dockerTagCMD) - if err != nil { - log.Println(err) - return err - } - return nil -} - func (impl *DockerHelperImpl) BuildArtifact(ciRequest *CommonWorkflowRequest, scriptEnvs map[string]string, preCiStageOutVariable map[int]map[string]*VariableObject) (string, error) { ciContext := cicxt.BuildCiContext(context.Background(), ciRequest.EnableSecretMasking) @@ -410,7 +398,7 @@ func (impl *DockerHelperImpl) BuildArtifact(ciRequest *CommonWorkflowRequest, sc if !strings.Contains(tmpDockerTag, ":") { fullImageUrl, err := BuildDockerImagePathForCustomTag(ciRequest, tmpDockerTag) if err != nil { - log.Println("Error in building docker image multiple tags", "err", err) + log.Println("Error in building docker image multiple tags", "fullImageUrl", fullImageUrl, "err", err) return "", err } tmpDockerTag = fullImageUrl @@ -532,8 +520,6 @@ func getDockerBuildFlagsMap(dockerBuildConfig *DockerBuildConfig, scriptEnvs map func parseDockerFlagParam(param string, scriptEnvs map[string]string, preCiStageOutVariable map[int]map[string]*VariableObject) string { value := param - log.Println("--- parseDockerFlagParam scriptEnvs", scriptEnvs) - log.Println("--- parseDockerFlagParam preCiStageOutVariable", preCiStageOutVariable) if strings.HasPrefix(param, DEVTRON_ENV_VAR_PREFIX) { key := strings.TrimPrefix(param, DEVTRON_ENV_VAR_PREFIX) @@ -840,8 +826,6 @@ func (impl *DockerHelperImpl) tagDockerBuild(ciContext cicxt.CiContext, ciReques func GetMultiDockerTagsValue(scriptEnvs map[string]string, preCiStageOutVariable map[int]map[string]*VariableObject) string { multiDockerTagsValue := "" - log.Println("--- GetMultiDockerTagsValue scriptEnvs", scriptEnvs) - log.Println("--- GetMultiDockerTagsValue preCiStageOutVariable", preCiStageOutVariable) if preCiStageOutVariable != nil { for k, task := range preCiStageOutVariable { if _, ok := preCiStageOutVariable[k]; ok { @@ -863,7 +847,6 @@ func GetMultiDockerTagsValue(scriptEnvs map[string]string, preCiStageOutVariable multiDockerTagsValue = scriptEnvVal } } - log.Println("--- GetMultiDockerTagsValue multiDockerTagsValue", multiDockerTagsValue) return multiDockerTagsValue }