From ff07c6431410ccccf566351e0cc7f8393062ad4e Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Mon, 26 Oct 2020 17:54:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20git=20lfs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 1 + resources/globalConfiguration.json | 7 +- resources/schema.json | 18 +++++ .../jenkins/library/IStepExecutor.groovy | 6 ++ .../jenkins/library/StepExecutor.groovy | 12 ++++ .../configuration/ConfigurationReader.groovy | 3 +- .../configuration/GitSCMOptions.groovy | 23 +++++++ .../configuration/JobConfiguration.groovy | 5 ++ .../library/configuration/Secrets.groovy | 4 ++ .../jenkins/library/steps/EdtTransform.groovy | 66 +++++++++++++++++++ .../library/steps/GitSCMExtension.groovy | 16 +++++ 11 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy create mode 100644 src/ru/pulsar/jenkins/library/steps/GitSCMExtension.groovy diff --git a/build.gradle.kts b/build.gradle.kts index 7af7246..643a9db 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -78,6 +78,7 @@ sharedLibrary { // TODO: retrieve downloaded plugin resource pluginDependencies { dependency("org.jenkins-ci.plugins", "pipeline-build-step", "2.12") + dependency("org.jenkins-ci.plugins", "git", "4.4.4") dependency("org.6wind.jenkins", "lockable-resources", "2.7") dependency("ru.yandex.qatools.allure", "allure-jenkins-plugin", "2.28.1") val declarativePluginsVersion = "1.6.0" diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index d7bd1ae..8841a10 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -3,7 +3,8 @@ "srcDir": "src/cf", "secrets": { "storagePath": "UNKNOWN_ID", - "storage": "UNKNOWN_ID" + "storage": "UNKNOWN_ID", + "lfs": "UNKNOWN_ID" }, "stages": { "initSteps": false, @@ -47,5 +48,9 @@ "resultsTransform": { "removeSupport": false, "supportLevel": 0 + }, + "git": { + "lfsPull": false, + "lfsURI": "" } } diff --git a/resources/schema.json b/resources/schema.json index 2e05d48..8534a7e 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -22,6 +22,10 @@ "storage" : { "type" : "string", "description" : "Данные авторизации в хранилище конфигурации" + }, + "lfs" : { + "type" : "string", + "description" : "Данные авторизации для работы с LFS" } } }, @@ -143,6 +147,20 @@ "description" : "Настройка фильтрации замечаний по уровню поддержки.\n 0 - удалить файлы на замке;\n 1 - удалить файлы на замке и на поддержке;\n 2 - удалить файлы на замке, на поддержке и снятые с поддержки.\n " } } + }, + "git" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:GitSCMOptions", + "description" : "Настройки git-репозитория", + "properties" : { + "lfsPull" : { + "type" : "boolean", + "description" : "Дополнительно выполнить git lfs pull" + }, + "lfsURI" : { + "type" : "string" + } + } } } } \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy index 54d57af..5d9d8a8 100644 --- a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy @@ -1,5 +1,7 @@ package ru.pulsar.jenkins.library +import hudson.plugins.git.GitSCM +import hudson.scm.SCM import org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction interface IStepExecutor { @@ -26,6 +28,10 @@ interface IStepExecutor { EnvironmentAction env() + GitSCM scm() + + void checkout(SCM scm) + void createDir(String path) def withEnv(List strings, Closure body) diff --git a/src/ru/pulsar/jenkins/library/StepExecutor.groovy b/src/ru/pulsar/jenkins/library/StepExecutor.groovy index facf839..c297dfa 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -1,5 +1,7 @@ package ru.pulsar.jenkins.library +import hudson.plugins.git.GitSCM +import hudson.scm.SCM import org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction import ru.yandex.qatools.allure.jenkins.config.ResultsConfig @@ -63,6 +65,16 @@ class StepExecutor implements IStepExecutor { return steps.env } + @Override + GitSCM scm() { + return steps.scm + } + + @Override + void checkout(SCM scm) { + steps.checkout(scm) + } + @Override void createDir(String path) { steps.createDir(path) diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index 1065790..8388096 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -47,7 +47,8 @@ class ConfigurationReader implements Serializable { "bddOptions", "sonarQubeOptions", "syntaxCheckOptions", - "resultsTransformOptions" + "resultsTransformOptions", + "gitSCMOptions" ).toSet() mergeObjects(baseConfiguration, configurationToMerge, nonMergeableSettings) diff --git a/src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy new file mode 100644 index 0000000..e47a71e --- /dev/null +++ b/src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy @@ -0,0 +1,23 @@ +package ru.pulsar.jenkins.library.configuration + +import com.cloudbees.groovy.cps.NonCPS +import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.fasterxml.jackson.annotation.JsonPropertyDescription + +@JsonIgnoreProperties(ignoreUnknown = true) +class GitSCMOptions implements Serializable { + + @JsonPropertyDescription("Дополнительно выполнить git lfs pull") + boolean lfsPull + + String lfsURI = "" + + @Override + @NonCPS + String toString() { + return "GitSCMOptions{" + + "lfsPull=" + lfsPull + + "lfsURI=" + lfsURI + + '}'; + } +} diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index 352308f..babde5a 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -40,6 +40,10 @@ class JobConfiguration implements Serializable { @JsonPropertyDescription("Настройки трансформации результатов анализа") ResultsTransformOptions resultsTransformOptions; + @JsonProperty("git") + @JsonPropertyDescription("Настройки git-репозитория") + GitSCMOptions gitSCMOptions; + @Override @NonCPS String toString() { @@ -53,6 +57,7 @@ class JobConfiguration implements Serializable { ", sonarQubeOptions=" + sonarQubeOptions + ", syntaxCheckOptions=" + syntaxCheckOptions + ", resultsTransformOptions=" + resultsTransformOptions + + ", gitSCMOptions=" + gitSCMOptions + '}'; } } \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/configuration/Secrets.groovy b/src/ru/pulsar/jenkins/library/configuration/Secrets.groovy index 0ee17f0..b27d418 100644 --- a/src/ru/pulsar/jenkins/library/configuration/Secrets.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/Secrets.groovy @@ -13,12 +13,16 @@ class Secrets implements Serializable { @JsonPropertyDescription("Данные авторизации в хранилище конфигурации") String storage + @JsonPropertyDescription("Данные авторизации для работы с LFS") + String lfs + @Override @NonCPS String toString() { return "Secrets{" + "storagePath='" + storagePath + '\'' + ", storage='" + storage + '\'' + + ", lfs='" + lfs + '\'' + '}'; } } diff --git a/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy b/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy index 4b2a065..c8e8102 100644 --- a/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy +++ b/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy @@ -1,5 +1,9 @@ package ru.pulsar.jenkins.library.steps + +import hudson.plugins.git.GitSCM +import hudson.plugins.git.UserRemoteConfig +import hudson.plugins.git.extensions.impl.GitLFSPull import ru.pulsar.jenkins.library.IStepExecutor import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.ioc.ContextRegistry @@ -28,6 +32,8 @@ class EdtTransform implements Serializable { return } + doSCM() + def env = steps.env(); def workspaceDir = "$env.WORKSPACE/$WORKSPACE" @@ -47,4 +53,64 @@ class EdtTransform implements Serializable { steps.zip(WORKSPACE, WORKSPACE_ZIP) steps.stash(WORKSPACE_ZIP_STASH, WORKSPACE_ZIP) } + + private void doSCM() { + + def gitSCMOptions = config.gitSCMOptions + + if (!gitSCMOptions.lfsPull) { + return + } + + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + def scm = steps.scm() + + boolean needToCheckout = false + needToCheckout = addLFS(scm, needToCheckout) + scm = addLFSRemoteConfig(scm) + + if (needToCheckout) { + steps.checkout(scm) + } + } + + private boolean addLFS(GitSCM scm, boolean needToCheckout) { + GitLFSPull gitLFS = new GitLFSPull(); + def extensions = scm.getExtensions() + if (!extensions.contains(gitLFS)) { + needToCheckout = true + extensions.add(gitLFS) + } + needToCheckout + } + + private GitSCM addLFSRemoteConfig(GitSCM scm) { + def gitSCMOptions = config.gitSCMOptions + + if (gitSCMOptions.lfsURI.isEmpty()) { + return scm + } + + List userRemoteConfigs = new ArrayList<>(scm.getUserRemoteConfigs()) + + def userRemoteConfig = userRemoteConfigs.find { it.url == gitSCMOptions.lfsURI } + if (userRemoteConfig == null) { + def credentialsId = config.secrets.lfs.isEmpty() ? null : config.secrets.lfs + userRemoteConfig = new UserRemoteConfig(config.gitSCMOptions.lfsURI, null, null, credentialsId) + userRemoteConfigs.add(0, userRemoteConfig) + + scm = new GitSCM( + userRemoteConfigs, + scm.branches, + scm.doGenerateSubmoduleConfigurations, + scm.submoduleCfg, + scm.browser, + scm.gitTool, + scm.extensions + ) + } + + return scm + } } diff --git a/src/ru/pulsar/jenkins/library/steps/GitSCMExtension.groovy b/src/ru/pulsar/jenkins/library/steps/GitSCMExtension.groovy new file mode 100644 index 0000000..af387cc --- /dev/null +++ b/src/ru/pulsar/jenkins/library/steps/GitSCMExtension.groovy @@ -0,0 +1,16 @@ +package ru.pulsar.jenkins.library.steps + +import ru.pulsar.jenkins.library.configuration.JobConfiguration + +class GitSCMExtension implements Serializable { + + private final JobConfiguration config; + + GitSCMExtension(JobConfiguration config) { + this.config = config + } + + def run() { + + } +}