Skip to content

Commit

Permalink
feat: flag driven tag based build propogate same tag for CI Build (#4404
Browse files Browse the repository at this point in the history
)

* tag based tag propagation

* config

* pr based handling

* pr based

* refactoring

* pr based
  • Loading branch information
Shivam-nagar23 authored Dec 14, 2023
1 parent e206ffc commit 0746280
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 42 deletions.
42 changes: 26 additions & 16 deletions pkg/pipeline/CiService.go
Original file line number Diff line number Diff line change
Expand Up @@ -844,40 +844,50 @@ func buildCiStepsDataFromDockerBuildScripts(dockerBuildScripts []*bean.CiScript)

func (impl *CiServiceImpl) buildImageTag(commitHashes map[int]pipelineConfig.GitCommit, id int, wfId int) string {
dockerImageTag := ""
toAppendDevtronParamInTag := true
for _, v := range commitHashes {
_truncatedCommit := ""
if v.WebhookData.Id == 0 {
if v.Commit == "" {
continue
}
_truncatedCommit = _getTruncatedImageTag(v.Commit)
dockerImageTag = getUpdatedDockerImageTagWithCommitOrCheckOutData(dockerImageTag, _getTruncatedImageTag(v.Commit))
} else {
_targetCheckout := v.WebhookData.Data[bean.WEBHOOK_SELECTOR_TARGET_CHECKOUT_NAME]
if _targetCheckout == "" {
continue
}
_truncatedCommit = _getTruncatedImageTag(_targetCheckout)
if v.WebhookData.EventActionType == bean.WEBHOOK_EVENT_MERGED_ACTION_TYPE {
// if not PR based then meaning tag based
isPRBasedEvent := v.WebhookData.EventActionType == bean.WEBHOOK_EVENT_MERGED_ACTION_TYPE
if !isPRBasedEvent && impl.config.CiCdConfig.UseImageTagFromGitProviderForTagBasedBuild {
dockerImageTag = getUpdatedDockerImageTagWithCommitOrCheckOutData(dockerImageTag, _targetCheckout)
} else {
dockerImageTag = getUpdatedDockerImageTagWithCommitOrCheckOutData(dockerImageTag, _getTruncatedImageTag(_targetCheckout))
}
if isPRBasedEvent {
_sourceCheckout := v.WebhookData.Data[bean.WEBHOOK_SELECTOR_SOURCE_CHECKOUT_NAME]
if len(_sourceCheckout) > 0 {
_truncatedCommit = _truncatedCommit + "-" + _getTruncatedImageTag(_sourceCheckout)
}
dockerImageTag = getUpdatedDockerImageTagWithCommitOrCheckOutData(dockerImageTag, _getTruncatedImageTag(_sourceCheckout))
} else {
toAppendDevtronParamInTag = !impl.config.CiCdConfig.UseImageTagFromGitProviderForTagBasedBuild
}
}

if dockerImageTag == "" {
dockerImageTag = _truncatedCommit
} else {
dockerImageTag = dockerImageTag + "-" + _truncatedCommit
}
}
if dockerImageTag != "" {
dockerImageTag = dockerImageTag + "-" + strconv.Itoa(id) + "-" + strconv.Itoa(wfId)
toAppendDevtronParamInTag = toAppendDevtronParamInTag && dockerImageTag != ""
if toAppendDevtronParamInTag {
dockerImageTag = fmt.Sprintf("%s-%d-%d", dockerImageTag, id, wfId)
}

// replace / with underscore, as docker image tag doesn't support slash. it gives error
dockerImageTag = strings.ReplaceAll(dockerImageTag, "/", "_")
return dockerImageTag
}

func getUpdatedDockerImageTagWithCommitOrCheckOutData(dockerImageTag, commitOrCheckOutData string) string {
if dockerImageTag == "" {
dockerImageTag = commitOrCheckOutData
} else {
if commitOrCheckOutData != "" {
dockerImageTag = fmt.Sprintf("%s-%s", dockerImageTag, commitOrCheckOutData)
}
}
return dockerImageTag
}

Expand Down
53 changes: 27 additions & 26 deletions pkg/pipeline/types/CiCdConfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,32 +96,33 @@ type CiCdConfig struct {
MaxCdWorkflowRunnerRetries int `env:"MAX_CD_WORKFLOW_RUNNER_RETRIES" envDefault:"0"`

//common in both ciconfig and cd config
Type string
Mode string `env:"MODE" envDefault:"DEV"`
OrchestratorHost string `env:"ORCH_HOST" envDefault:"http://devtroncd-orchestrator-service-prod.devtroncd/webhook/msg/nats"`
OrchestratorToken string `env:"ORCH_TOKEN" envDefault:""`
ClusterConfig *rest.Config
CloudProvider blob_storage.BlobStorageType `env:"BLOB_STORAGE_PROVIDER" envDefault:"S3"`
BlobStorageEnabled bool `env:"BLOB_STORAGE_ENABLED" envDefault:"false"`
BlobStorageS3AccessKey string `env:"BLOB_STORAGE_S3_ACCESS_KEY"`
BlobStorageS3SecretKey string `env:"BLOB_STORAGE_S3_SECRET_KEY"`
BlobStorageS3Endpoint string `env:"BLOB_STORAGE_S3_ENDPOINT"`
BlobStorageS3EndpointInsecure bool `env:"BLOB_STORAGE_S3_ENDPOINT_INSECURE" envDefault:"false"`
BlobStorageS3BucketVersioned bool `env:"BLOB_STORAGE_S3_BUCKET_VERSIONED" envDefault:"true"`
BlobStorageGcpCredentialJson string `env:"BLOB_STORAGE_GCP_CREDENTIALS_JSON"`
AzureAccountName string `env:"AZURE_ACCOUNT_NAME"`
AzureGatewayUrl string `env:"AZURE_GATEWAY_URL" envDefault:"http://devtron-minio.devtroncd:9000"`
AzureGatewayConnectionInsecure bool `env:"AZURE_GATEWAY_CONNECTION_INSECURE" envDefault:"true"`
AzureBlobContainerCiLog string `env:"AZURE_BLOB_CONTAINER_CI_LOG"`
AzureBlobContainerCiCache string `env:"AZURE_BLOB_CONTAINER_CI_CACHE"`
AzureAccountKey string `env:"AZURE_ACCOUNT_KEY"`
BuildLogTTLValue int `env:"BUILD_LOG_TTL_VALUE_IN_SECS" envDefault:"3600"`
BaseLogLocationPath string `env:"BASE_LOG_LOCATION_PATH" envDefault:"/home/devtron/"`
InAppLoggingEnabled bool `env:"IN_APP_LOGGING_ENABLED" envDefault:"false"`
BuildxProvenanceMode string `env:"BUILDX_PROVENANCE_MODE" envDefault:""` //provenance is set to false if this flag is not set
ExtBlobStorageCmName string `env:"EXTERNAL_BLOB_STORAGE_CM_NAME" envDefault:"blob-storage-cm"`
ExtBlobStorageSecretName string `env:"EXTERNAL_BLOB_STORAGE_SECRET_NAME" envDefault:"blob-storage-secret"`
UseArtifactListingQueryV2 bool `env:"USE_ARTIFACT_LISTING_QUERY_V2" envDefault:"true"`
Type string
Mode string `env:"MODE" envDefault:"DEV"`
OrchestratorHost string `env:"ORCH_HOST" envDefault:"http://devtroncd-orchestrator-service-prod.devtroncd/webhook/msg/nats"`
OrchestratorToken string `env:"ORCH_TOKEN" envDefault:""`
ClusterConfig *rest.Config
CloudProvider blob_storage.BlobStorageType `env:"BLOB_STORAGE_PROVIDER" envDefault:"S3"`
BlobStorageEnabled bool `env:"BLOB_STORAGE_ENABLED" envDefault:"false"`
BlobStorageS3AccessKey string `env:"BLOB_STORAGE_S3_ACCESS_KEY"`
BlobStorageS3SecretKey string `env:"BLOB_STORAGE_S3_SECRET_KEY"`
BlobStorageS3Endpoint string `env:"BLOB_STORAGE_S3_ENDPOINT"`
BlobStorageS3EndpointInsecure bool `env:"BLOB_STORAGE_S3_ENDPOINT_INSECURE" envDefault:"false"`
BlobStorageS3BucketVersioned bool `env:"BLOB_STORAGE_S3_BUCKET_VERSIONED" envDefault:"true"`
BlobStorageGcpCredentialJson string `env:"BLOB_STORAGE_GCP_CREDENTIALS_JSON"`
AzureAccountName string `env:"AZURE_ACCOUNT_NAME"`
AzureGatewayUrl string `env:"AZURE_GATEWAY_URL" envDefault:"http://devtron-minio.devtroncd:9000"`
AzureGatewayConnectionInsecure bool `env:"AZURE_GATEWAY_CONNECTION_INSECURE" envDefault:"true"`
AzureBlobContainerCiLog string `env:"AZURE_BLOB_CONTAINER_CI_LOG"`
AzureBlobContainerCiCache string `env:"AZURE_BLOB_CONTAINER_CI_CACHE"`
AzureAccountKey string `env:"AZURE_ACCOUNT_KEY"`
BuildLogTTLValue int `env:"BUILD_LOG_TTL_VALUE_IN_SECS" envDefault:"3600"`
BaseLogLocationPath string `env:"BASE_LOG_LOCATION_PATH" envDefault:"/home/devtron/"`
InAppLoggingEnabled bool `env:"IN_APP_LOGGING_ENABLED" envDefault:"false"`
BuildxProvenanceMode string `env:"BUILDX_PROVENANCE_MODE" envDefault:""` //provenance is set to false if this flag is not set
ExtBlobStorageCmName string `env:"EXTERNAL_BLOB_STORAGE_CM_NAME" envDefault:"blob-storage-cm"`
ExtBlobStorageSecretName string `env:"EXTERNAL_BLOB_STORAGE_SECRET_NAME" envDefault:"blob-storage-secret"`
UseArtifactListingQueryV2 bool `env:"USE_ARTIFACT_LISTING_QUERY_V2" envDefault:"true"`
UseImageTagFromGitProviderForTagBasedBuild bool `env:"USE_IMAGE_TAG_FROM_GIT_PROVIDER_FOR_TAG_BASED_BUILD" envDefault:"false"` // this is being done for https://github.com/devtron-labs/devtron/issues/4263
}

type CiConfig struct {
Expand Down

0 comments on commit 0746280

Please sign in to comment.