package com.freeleaps.devops import com.freeleaps.devops.enums.DependenciesManager class DependenciesResolver { def steps def language def cachingEnabled def mgr def workspace DependenciesResolver(steps, language, workspace) { this.steps = steps this.language = language this.workspace = workspace } def enableCachingSupport() { this.cachingEnabled = true } def disableCachingSupport() { this.cachingEnabled = false } def useManager(DependenciesManager mgr) { if (mgr == DependenciesManager.UNKNOWN) { steps.error("Unknown dependencies manager") } this.mgr = mgr } def getNodeVersion() { def version = steps.sh(script: "node -v", returnStdout: true).trim() steps.log.info 'Dependencies Resolver', "Node version is ${version}" } def resolve(configurations) { if (mgr == null) { steps.error("Dependencies manager is not set") } steps.log.info("Dependencies Resolver","Ready to resolve dependencies for ${language}...") steps.log.info("Dependencies Resolver","Using ${mgr.manager} to resolve dependencies...") steps.log.info("Dependencies Resolver","Workspace sets to: ${this.workspace}") if (cachingEnabled) { steps.log.info("Dependencies Resolver","Dependencies caching is enabled") } switch (mgr) { case DependenciesManager.PIP: if (configurations.requirementsFile == null || configurations.requirementsFile.isEmpty()) { steps.error("requirementsFile is required when using PIP as dependencies manager") } def requirementsFile = configurations.requirementsFile if (cachingEnabled) { steps.dir(this.workspace) { steps.cache(maxCacheSize: 512, caches: [[$class: 'ArbitraryFileCache', cacheName: "${configurations.name}-pip-cache", includes: '**/*', path: '.pip-cache', cacheValidityDecidingFile: 'requirements.txt']]) { steps.sh "pip install --cache-dir .pip-cache -r ${requirementsFile}" } } } else { steps.dir(this.workspace) { steps.sh "pip install -r ${requirementsFile}" } } break case DependenciesManager.NPM: if (configurations.npmPackageJsonFile == null || configurations.npmPackageJsonFile.isEmpty()) { steps.error("npmPackageJsonFile is required when using NPM as dependencies manager") } def packageJsonFile = configurations.npmPackageJsonFile this.getNodeVersion() if (cachingEnabled) { steps.dir(this.workspace) { steps.cache(maxCacheSize: 512, caches: [[$class: 'ArbitraryFileCache', cacheName: "${configurations.name}-npm-cache", includes: '**/*', path: '.npm-cache', cacheValidityDecidingFile: 'package-lock.json']]) { steps.sh "npm install --cache .npm-cache --prefer-offline --no-audit" } } } else { steps.dir(this.workspace) { steps.sh "npm install" } } break case DependenciesManager.YARN: if (configurations.yarnPackageJsonFile == null || configurations.yarnPackageJsonFile.isEmpty()) { steps.error("yarnPackageJsonFile is required when using YARN as dependencies manager") } def packageJsonFile = configurations.yarnPackageJsonFile this.getNodeVersion() if (cachingEnabled) { steps.dir(this.workspace) { steps.cache(maxCacheSize: 512, caches: [[$class: 'ArbitraryFileCache', includes: '**/*', cacheName: "${configurations.name}-pnpm-cache", path: '.yarn-cache', cacheValidityDecidingFile: 'yarn.lock']]) { steps.sh "yarn install --cache-folder .yarn-cache --prefer-offline" } } } else { steps.dir(this.workspace) { steps.sh "yarn install" } } break default: steps.error("Unsupported dependencies manager") } } }