Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 86 additions & 6 deletions src/components/CIPipelineN/AdvancedConfigOptions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,32 @@
*/

import { useContext, useEffect, useState } from 'react'
import { CIBuildConfigType, CIBuildType, KeyValueTableProps, noop, OptionType } from '@devtron-labs/devtron-fe-common-lib'

import {
BuildSecretType,

Check failure on line 20 in src/components/CIPipelineN/AdvancedConfigOptions.tsx

View workflow job for this annotation

GitHub Actions / ci

Module '"@devtron-labs/devtron-fe-common-lib"' has no exported member 'BuildSecretType'.
CIBuildConfigType,
CIBuildType,
KeyValueTableProps,
noop,
OptionType,
} from '@devtron-labs/devtron-fe-common-lib'

import { importComponentFromFELibrary } from '@Components/common'

import CIConfig from '../ciConfig/CIConfig'
import DockerArgs from './DockerArgs'
import CustomImageTags from './CustomImageTags'
import { getTargetPlatformMap } from '../ciConfig/CIConfig.utils'
import TargetPlatformSelector from '../ciConfig/TargetPlatformSelector'
import { AdvancedConfigOptionsProps, CIConfigParentState } from '../ciConfig/types'
import { DockerConfigOverrideKeys } from '../ciPipeline/types'
import { getTargetPlatformMap } from '../ciConfig/CIConfig.utils'
import { pipelineContext } from '../workflowEditor/workflowEditor'
import '../ciConfig/CIConfig.scss'
import CustomImageTags from './CustomImageTags'
import DockerArgs from './DockerArgs'
import { ComponentStates } from './types'

import '../ciConfig/CIConfig.scss'

const BuildSecrets = importComponentFromFELibrary('BuildSecrets', null, 'function')

export default function AdvancedConfigOptions({ ciPipeline, appId, isTemplateView }: AdvancedConfigOptionsProps) {
const { formData, setFormData, loadingState, setLoadingState, formDataErrorObj, setFormDataErrorObj } =
useContext(pipelineContext)
Expand All @@ -53,6 +67,22 @@
const hasParentLoaded = parentState?.loadingState === ComponentStates.loaded
const showNonBuildpackOptions = hasParentLoaded && (isGlobalAndNotBuildpack || !isCurrentCITypeBuildpack)

// Shows the current override draft if present; else the pipeline's saved override (fetched via
// app/ci-pipeline/:appId/:ciPipelineId) if it already has one; else the global config as the starting
// point to override - same precedence populateCurrentPlatformsData uses for targetPlatform below
const currentSecrets: BuildSecretType[] =
formData.dockerConfigOverride?.ciBuildConfig?.dockerBuildConfig?.secrets ??

Check failure on line 74 in src/components/CIPipelineN/AdvancedConfigOptions.tsx

View workflow job for this annotation

GitHub Actions / ci

Property 'secrets' does not exist on type 'DockerBuildConfigType'.
(allowOverride && parentState.selectedCIPipeline?.isDockerConfigOverridden
? parentState.selectedCIPipeline?.dockerConfigOverride?.ciBuildConfig?.dockerBuildConfig?.secrets

Check failure on line 76 in src/components/CIPipelineN/AdvancedConfigOptions.tsx

View workflow job for this annotation

GitHub Actions / ci

Property 'secrets' does not exist on type 'DockerBuildConfigType'.
: parentState.ciConfig?.ciBuildConfig?.dockerBuildConfig?.secrets) ??

Check failure on line 77 in src/components/CIPipelineN/AdvancedConfigOptions.tsx

View workflow job for this annotation

GitHub Actions / ci

Property 'secrets' does not exist on type 'DockerBuildConfigType'.
[]
const currentSSH: BuildSecretType[] =
formData.dockerConfigOverride?.ciBuildConfig?.dockerBuildConfig?.ssh ??

Check failure on line 80 in src/components/CIPipelineN/AdvancedConfigOptions.tsx

View workflow job for this annotation

GitHub Actions / ci

Property 'ssh' does not exist on type 'DockerBuildConfigType'.
(allowOverride && parentState.selectedCIPipeline?.isDockerConfigOverridden
? parentState.selectedCIPipeline?.dockerConfigOverride?.ciBuildConfig?.dockerBuildConfig?.ssh

Check failure on line 82 in src/components/CIPipelineN/AdvancedConfigOptions.tsx

View workflow job for this annotation

GitHub Actions / ci

Property 'ssh' does not exist on type 'DockerBuildConfigType'.
: parentState.ciConfig?.ciBuildConfig?.dockerBuildConfig?.ssh) ??

Check failure on line 83 in src/components/CIPipelineN/AdvancedConfigOptions.tsx

View workflow job for this annotation

GitHub Actions / ci

Property 'ssh' does not exist on type 'DockerBuildConfigType'.
[]
Comment thread
arunjaindev marked this conversation as resolved.
Outdated

useEffect(() => {
if (parentState.ciConfig) {
populateCurrentPlatformsData()
Expand Down Expand Up @@ -99,7 +129,7 @@

const updateDockerConfigOverride = (
key: string,
value: CIBuildConfigType | OptionType[] | boolean | string,
value: CIBuildConfigType | OptionType[] | boolean | string | BuildSecretType[],
): void => {
setFormData((prevFormData) => {
const _form = structuredClone(prevFormData)
Expand Down Expand Up @@ -143,6 +173,22 @@
_form.dockerConfigOverride.ciBuildConfig.dockerBuildConfig.buildContext = value as string
} else if (key === DockerConfigOverrideKeys.projectPath) {
_form.dockerConfigOverride.ciBuildConfig.buildPackConfig.projectPath = value as string
} else if (key === DockerConfigOverrideKeys.secrets) {
_form.dockerConfigOverride.ciBuildConfig = {
..._form.dockerConfigOverride.ciBuildConfig,
dockerBuildConfig: {
..._form.dockerConfigOverride.ciBuildConfig.dockerBuildConfig,
secrets: value as BuildSecretType[],

Check failure on line 181 in src/components/CIPipelineN/AdvancedConfigOptions.tsx

View workflow job for this annotation

GitHub Actions / ci

Object literal may only specify known properties, and 'secrets' does not exist in type 'DockerBuildConfigType'.
},
}
} else if (key === DockerConfigOverrideKeys.ssh) {
_form.dockerConfigOverride.ciBuildConfig = {
..._form.dockerConfigOverride.ciBuildConfig,
dockerBuildConfig: {
..._form.dockerConfigOverride.ciBuildConfig.dockerBuildConfig,
ssh: value as BuildSecretType[],

Check failure on line 189 in src/components/CIPipelineN/AdvancedConfigOptions.tsx

View workflow job for this annotation

GitHub Actions / ci

Object literal may only specify known properties, and 'ssh' does not exist in type 'DockerBuildConfigType'.
},
}
} else {
_form.dockerConfigOverride.ciBuildConfig = value as CIBuildConfigType
}
Expand All @@ -156,6 +202,28 @@
})
}

const handleBuildSecretsUpdate = (secrets: BuildSecretType[]): void => {
updateDockerConfigOverride(DockerConfigOverrideKeys.secrets, secrets)
}

const handleSSHUpdate = (ssh: BuildSecretType[]): void => {
updateDockerConfigOverride(DockerConfigOverrideKeys.ssh, ssh)
}

const handleBuildSecretsError = (hasError: boolean): void => {
setFormDataErrorObj({
...formDataErrorObj,
secretsError: { isValid: !hasError, message: 'Invalid build secrets' },
})
}
Comment thread
arunjaindev marked this conversation as resolved.

const handleSSHError = (hasError: boolean): void => {
setFormDataErrorObj({
...formDataErrorObj,
sshError: { isValid: !hasError, message: 'Invalid SSH keys' },
})
}

const toggleAdvancedOptions = (): void => {
setCollapsedSection(!collapsedSection)
}
Expand Down Expand Up @@ -232,6 +300,18 @@
handleDockerArgsError={handleDockerArgsError}
/>
)}

{showNonBuildpackOptions && BuildSecrets && (
<BuildSecrets
appId={appId}
secrets={currentSecrets}
ssh={currentSSH}
onSecretsChange={handleBuildSecretsUpdate}
onSSHChange={handleSSHUpdate}
onSecretsError={handleBuildSecretsError}
onSSHError={handleSSHError}
/>
)}
</div>
</div>
)
Expand Down
22 changes: 20 additions & 2 deletions src/components/CIPipelineN/CIPipeline.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,14 @@ export default function CIPipeline({
message: '',
isValid: true,
},
secretsError: {
message: '',
isValid: true,
},
sshError: {
message: '',
isValid: true,
},
})

const [ciPipeline, setCIPipeline] = useState<CIPipelineDataType>({
Expand Down Expand Up @@ -419,7 +427,11 @@ export default function CIPipeline({
}

_formDataErrorObj[BuildStageVariable.Build].isValid =
_formDataErrorObj.name.isValid && valid && _formDataErrorObj.dockerArgsError.isValid
_formDataErrorObj.name.isValid &&
valid &&
_formDataErrorObj.dockerArgsError.isValid &&
_formDataErrorObj.secretsError.isValid &&
_formDataErrorObj.sshError.isValid
} else {
const stepsLength = _formData[stageName].steps.length
let isStageValid = true
Expand Down Expand Up @@ -639,7 +651,13 @@ export default function CIPipeline({
) {
setApiInProgress(false)
const branchNameNotPresent = formData.materials.some((_mat) => !_mat.value)
if (formData.name === '' || branchNameNotPresent || !formDataErrorObj.dockerArgsError.isValid) {
if (
formData.name === '' ||
branchNameNotPresent ||
!formDataErrorObj.dockerArgsError.isValid ||
!formDataErrorObj.secretsError.isValid ||
!formDataErrorObj.sshError.isValid
) {
ToastManager.showToast({
variant: ToastVariantType.error,
description: 'Please ensure all fields are valid',
Expand Down
63 changes: 46 additions & 17 deletions src/components/ciConfig/CIAdvancedConfig.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,31 @@
*/

import { useState } from 'react'
import PluginIcon from '../../assets/icons/ic-plugin.svg?react'

import { BuildSecretType, KeyValueTableProps } from '@devtron-labs/devtron-fe-common-lib'

Check failure on line 19 in src/components/ciConfig/CIAdvancedConfig.tsx

View workflow job for this annotation

GitHub Actions / ci

Module '"@devtron-labs/devtron-fe-common-lib"' has no exported member 'BuildSecretType'.

import Dropdown from '../../assets/icons/ic-chevron-down.svg?react'
import { CIAdvancedConfigProps } from './types'
import TargetPlatformSelector from './TargetPlatformSelector'
import PluginIcon from '../../assets/icons/ic-plugin.svg?react'
import DockerArgs from '../CIPipelineN/DockerArgs'
import { KeyValueTableProps } from '@devtron-labs/devtron-fe-common-lib'
import { importComponentFromFELibrary } from '../common'
import TargetPlatformSelector from './TargetPlatformSelector'
import { CIAdvancedConfigProps } from './types'

const BuildSecrets = importComponentFromFELibrary('BuildSecrets', null, 'function')

export default function CIAdvancedConfig({
configOverrideView,
allowOverride,
args,
setArgs,
setArgsError,
appId,
secrets,
setSecrets,
ssh,
setSsh,
setSecretsError,
setSshError,
isBuildpackType,
selectedTargetPlatforms,
setSelectedTargetPlatforms,
Expand All @@ -50,21 +62,27 @@
setArgsError((prev) => ({ ...prev, [isBuildpackType ? 'buildEnvArgs' : 'args']: errorState }))
}

const renderTargetPlatform = () => {
return (
<div className="pb-8">
<TargetPlatformSelector
selectedTargetPlatforms={selectedTargetPlatforms}
setSelectedTargetPlatforms={setSelectedTargetPlatforms}
showCustomPlatformWarning={showCustomPlatformWarning}
setShowCustomPlatformWarning={setShowCustomPlatformWarning}
targetPlatformMap={targetPlatformMap}
configOverrideView={false}
/>
</div>
)
const handleBuildSecretsChange = (updatedSecrets: BuildSecretType[]): void => {
setSecrets(updatedSecrets)
}

const handleSSHChange = (updatedSSH: BuildSecretType[]): void => {
setSsh(updatedSSH)
}

const renderTargetPlatform = () => (
<div className="pb-8">
<TargetPlatformSelector
selectedTargetPlatforms={selectedTargetPlatforms}
setSelectedTargetPlatforms={setSelectedTargetPlatforms}
showCustomPlatformWarning={showCustomPlatformWarning}
setShowCustomPlatformWarning={setShowCustomPlatformWarning}
targetPlatformMap={targetPlatformMap}
configOverrideView={false}
/>
</div>
)

if (configOverrideView && !isBuildpackType) {
return null
}
Expand Down Expand Up @@ -110,6 +128,17 @@
handleDockerArgsError={handleDockerArgsError}
readOnly={updateNotAllowed}
/>
{BuildSecrets && (
<BuildSecrets
appId={appId}
secrets={secrets}
ssh={ssh}
onSecretsChange={handleBuildSecretsChange}
onSSHChange={handleSSHChange}
onSecretsError={setSecretsError}
onSSHError={setSshError}
/>
)}
</>
)}
</>
Expand Down
26 changes: 26 additions & 0 deletions src/components/ciConfig/CIConfigForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import { useEffect, useState } from 'react'
import {
BuildSecretType,
CIBuildConfigType,
CIBuildType,
showError,
Expand Down Expand Up @@ -134,6 +135,10 @@ export default function CIConfigForm({
args: false,
buildEnvArgs: false,
})
const [secrets, setSecrets] = useState<BuildSecretType[]>([])
const [ssh, setSsh] = useState<BuildSecretType[]>([])
const [secretsError, setSecretsError] = useState<boolean>(false)
const [sshError, setSshError] = useState<boolean>(false)
const [loadingDataState, setLoadingDataState] = useState<LoadingState>({
loading: false,
failed: false,
Expand Down Expand Up @@ -182,6 +187,10 @@ export default function CIConfigForm({

// Buildpack - build env arguments
setBuildEnvArgs(processBuildArgs(currentCIBuildConfig.buildPackConfig?.args))

// Build secrets and SSH keys
setSecrets(ciConfig?.ciBuildConfig?.dockerBuildConfig?.secrets ?? [])
setSsh(ciConfig?.ciBuildConfig?.dockerBuildConfig?.ssh ?? [])
}

const updateParentCIBuildTypeState = () => {
Expand All @@ -203,6 +212,14 @@ export default function CIConfigForm({
return
}

if (!isBuildpackType && (secretsError || sshError)) {
ToastManager.showToast({
variant: ToastVariantType.error,
description: 'Please ensure build secrets and SSH keys are valid',
})
return
}

let targetPlatforms = ''
const targetPlatformsSet = new Set()
for (let index = 0; index < selectedTargetPlatforms.length; index++) {
Expand Down Expand Up @@ -247,6 +264,8 @@ export default function CIConfigForm({
dockerfileRepository: repository.value,
targetPlatform: targetPlatforms,
buildContext: buildContext.value,
secrets: secrets.filter((secret) => secret.type && secret.secretName && secret.id && secret.key),
ssh: ssh.filter((sshKey) => sshKey.type && sshKey.secretName && sshKey.id && sshKey.key),
}
}

Expand Down Expand Up @@ -405,6 +424,13 @@ export default function CIConfigForm({
buildEnvArgs={buildEnvArgs}
setBuildEnvArgs={setBuildEnvArgs}
setArgsError={setArgsError}
appId={appId}
secrets={secrets}
setSecrets={setSecrets}
ssh={ssh}
setSsh={setSsh}
setSecretsError={setSecretsError}
setSshError={setSshError}
handleOnChangeConfig={handleOnChangeConfig}
selectedTargetPlatforms={selectedTargetPlatforms}
setSelectedTargetPlatforms={setSelectedTargetPlatforms}
Expand Down
14 changes: 14 additions & 0 deletions src/components/ciConfig/CIDockerFileConfig.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,13 @@ export default function CIDockerFileConfig({
buildEnvArgs,
setBuildEnvArgs,
setArgsError,
appId,
secrets,
setSecrets,
ssh,
setSsh,
setSecretsError,
setSshError,
handleOnChangeConfig,
selectedTargetPlatforms,
setSelectedTargetPlatforms,
Expand Down Expand Up @@ -436,6 +443,13 @@ export default function CIDockerFileConfig({
args={isBuildpackType ? buildEnvArgs : args}
setArgs={isBuildpackType ? setBuildEnvArgs : setArgs}
setArgsError={setArgsError}
appId={appId}
secrets={secrets}
setSecrets={setSecrets}
ssh={ssh}
setSsh={setSsh}
setSecretsError={setSecretsError}
setSshError={setSshError}
isBuildpackType={isBuildpackType}
selectedTargetPlatforms={selectedTargetPlatforms}
setSelectedTargetPlatforms={setSelectedTargetPlatforms}
Expand Down
Loading
Loading