All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.nemerosa.ontrack.extension.jenkins.indicator.JenkinsPipelineLibraryIndicatorComputer.kt Maven / Gradle / Ivy

package net.nemerosa.ontrack.extension.jenkins.indicator

import net.nemerosa.ontrack.extension.indicators.computing.IndicatorComputedCategory
import net.nemerosa.ontrack.extension.indicators.computing.IndicatorComputedType
import net.nemerosa.ontrack.extension.indicators.computing.IndicatorComputedValue
import net.nemerosa.ontrack.extension.indicators.model.IndicatorSource
import net.nemerosa.ontrack.extension.indicators.model.createSource
import net.nemerosa.ontrack.extension.jenkins.JenkinsExtensionFeature
import net.nemerosa.ontrack.extension.scm.indicator.AbstractSCMIndicatorComputer
import net.nemerosa.ontrack.extension.scm.service.SCMService
import net.nemerosa.ontrack.extension.scm.service.SCMServiceDetector
import net.nemerosa.ontrack.model.settings.CachedSettingsService
import net.nemerosa.ontrack.model.structure.Project
import org.springframework.stereotype.Component

@Component
class JenkinsPipelineLibraryIndicatorComputer(
    extension: JenkinsExtensionFeature,
    scmServiceDetector: SCMServiceDetector,
    jenkinsPipelineLibraryIndicatorSourceProvider: JenkinsPipelineLibraryIndicatorSourceProvider,
    private val jenkinsPipelineLibraryIndicatorValueType: JenkinsPipelineLibraryIndicatorValueType,
    private val cachedSettingsService: CachedSettingsService,
) : AbstractSCMIndicatorComputer(extension, scmServiceDetector) {

    /**
     * Parallelisation of the computation is not necessary for this indicator.
     */
    override val perProject: Boolean = false

    override val name: String = "Jenkins pipeline libraries"

    override val source: IndicatorSource = jenkinsPipelineLibraryIndicatorSourceProvider.createSource("")

    override fun computeSCMIndicators(
        project: Project,
        scmService: SCMService,
        scmBranch: String,
    ): List> {
        // Gets the content of the Jenkinsfile (or returns no indicator)
        val jenkinsfile = scmService.download(project, scmBranch, "Jenkinsfile") ?: return emptyList()
        // Parsing of the Jenkinsfile to extract the library versions
        val libraries = JenkinsPipelineLibrary.extractLibraries(jenkinsfile)
        // Converts to indicators
        return libraries.map {
            convertToIndicator(it)
        }
    }

    private fun convertToIndicator(library: JenkinsPipelineLibrary) =
        IndicatorComputedValue(
            type = getIndicatorType(library),
            value = library.version,
            comment = null,
        )

    private fun getIndicatorType(library: JenkinsPipelineLibrary): IndicatorComputedType {
        val settings = cachedSettingsService.getCachedSettings(JenkinsPipelineLibraryIndicatorSettings::class.java)
        val librarySettings = settings.findLibrarySettings(library.name)
            ?: JenkinsPipelineLibraryIndicatorLibrarySettings(library = library.name)
        return IndicatorComputedType(
            category = indicatorCategory,
            id = library.name,
            name = "Using the ${library.name} Jenkins pipeline library",
            link = null,
            valueType = jenkinsPipelineLibraryIndicatorValueType,
            valueConfig = JenkinsPipelineLibraryIndicatorValueTypeConfig(
                settings = librarySettings
            ),
        )
    }

    private val indicatorCategory = IndicatorComputedCategory(
        id = "jenkins-pipeline-library",
        name = "Jenkins pipeline libraries"
    )

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy