From 60e184c14c0e1c56d9bd8c4d0caeedbc0462656d Mon Sep 17 00:00:00 2001 From: Egor Ivanov Date: Sat, 24 Aug 2024 13:24:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BC=D0=BF=D0=BB=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=B7=D0=BA=D0=B8=20=D0=B8=D0=B7=20dt=20=D0=B8=D0=BB?= =?UTF-8?q?=D0=B8=201cd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 1 + resources/globalConfiguration.json | 2 + resources/schema.json | 8 +++ .../configuration/InitInfoBaseOptions.groovy | 14 ++++ .../library/steps/CreateInfobase.groovy | 68 +++++++++++++++++++ .../library/steps/GetExtensions.groovy | 36 +--------- .../library/steps/InitFromFiles.groovy | 16 ++++- .../library/steps/InitFromStorage.groovy | 16 ++++- .../jenkins/library/utils/FileUtils.groovy | 32 +++++++++ 9 files changed, 156 insertions(+), 37 deletions(-) create mode 100644 src/ru/pulsar/jenkins/library/steps/CreateInfobase.groovy diff --git a/build.gradle.kts b/build.gradle.kts index afd047a..dd06aaf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,6 +11,7 @@ plugins { repositories { mavenCentral() + maven(url = "https://repo.jenkins-ci.org/releases/") } tasks { diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 693f554..4d0496c 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -42,6 +42,8 @@ "initMethod": "fromStorage", "runMigration": true, "additionalInitializationSteps": [], + "baseDBPath": "", + "vrunnerSettings": "", "extensions": [] }, "bdd": { diff --git a/resources/schema.json b/resources/schema.json index 326c1e0..3c63f64 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -173,6 +173,14 @@ "type" : "string" } }, + "vrunnerSettings" : { + "type" : "string", + "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию не заполнено, требуется, если на этапе подготовки база загружается из архива.\n " + }, + "baseDBPath" : { + "type" : "string", + "description" : "Путь к конфигурационному файлу эталонной базы данных.\n * По умолчанию не заполнен.\n * Указывается путь к файлу *.dt или *.1CD\n " + }, "extensions" : { "type" : "array", "description" : "Массив расширений для загрузки в конфигурацию.", diff --git a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy index f1b7e1a..593c283 100644 --- a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy @@ -25,6 +25,18 @@ class InitInfoBaseOptions implements Serializable { """) String[] additionalInitializationSteps + @JsonPropertyDescription("""Путь к конфигурационному файлу vanessa-runner. + По умолчанию не заполнено, требуется, если на этапе подготовки база загружается из архива. + """) + String vrunnerSettings + + @JsonPropertyDescription(""" + Путь к конфигурационному файлу эталонной базы данных. + * По умолчанию не заполнен; + * Указывается путь к файлу *.dt или *.1CD. + """) + String baseDBPath + @JsonPropertyDescription("Массив расширений для загрузки в конфигурацию.") Extension[] extensions @@ -62,6 +74,8 @@ class InitInfoBaseOptions implements Serializable { return "InitInfoBaseOptions{" + "initMethod=" + initMethod + ", runMigration=" + runMigration + + ", vrunnerSettings=" + vrunnerSettings + + ", baseDBPath=" + baseDBPath + ", additionalInitializationSteps=" + additionalInitializationSteps + ", extensions=" + extensions + '}' diff --git a/src/ru/pulsar/jenkins/library/steps/CreateInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/CreateInfobase.groovy new file mode 100644 index 0000000..57febbb --- /dev/null +++ b/src/ru/pulsar/jenkins/library/steps/CreateInfobase.groovy @@ -0,0 +1,68 @@ +package ru.pulsar.jenkins.library.steps + +import ru.pulsar.jenkins.library.IStepExecutor +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.utils.Logger +import ru.pulsar.jenkins.library.utils.VRunner +import hudson.FilePath +import ru.pulsar.jenkins.library.utils.FileUtils + +class CreateInfobase implements Serializable { + + private final JobConfiguration config; + + CreateInfobase(JobConfiguration config) { + this.config = config + } + + def run() { + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + Logger.printLocation() + + def env = steps.env() + + steps.installLocalDependencies(); + + String baseDBPath = config.initInfoBaseOptions.baseDBPath + if (baseDBPath == '') { + // Не указан путь к базе данных, создадим пустую базу данных. + createBase('', steps) + } else if (baseDBPath.endsWith('.1CD')) { + // Это файл базы данных 1С, просто скопируем его. + String pathToInfobase = "$env.WORKSPACE/build/ib/1Cv8.1CD" + FileUtils.loadFile(baseDBPath, env, pathToInfobase) + } else if (baseDBPath.endsWith('.dt')) { + // Это файл дампа БД, скопируем его и создадим БД. + String pathToDt = "$env.WORKSPACE/build/tmp/dump.dt" + FileUtils.loadFile(baseDBPath, env, pathToDt) + createBase('build/tmp/dump.dt', steps) + } else { + Logger.println("Неизвестный формат базы данных. Поддерживаются только .1CD и .dt") + } + + } + + private void createBase(String dtPath = '', def steps) { + Logger.println("Создание информационной базы") + String vrunnerPath = VRunner.getVRunnerPath(); + def initCommand = "$vrunnerPath init-dev --ibconnection \"/F./build/ib\"" + VRunner.exec(initCommand) + + if (dtPath) { + // Загрузка из dt в vrunner 2.2.2 не работает корректно, потому инициировать через init-dev не получится. + def loadDtCommand = "$vrunnerPath restore --ibconnection \"/F./build/ib\" $dtPath" + VRunner.exec(loadDtCommand) + + def updateDbCommand = "$vrunnerPath updatedb --ibconnection \"/F./build/ib\"" + def options = config.initInfoBaseOptions + + String vrunnerSettings = options.vrunnerSettings + if (vrunnerSettings && steps.fileExists(vrunnerSettings)) { + updateDbCommand += " --settings $vrunnerSettings" + } + VRunner.exec(updateDbCommand) + } + } +} diff --git a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy index 68bd950..4fac658 100644 --- a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy @@ -54,7 +54,8 @@ class GetExtensions implements Serializable { buildExtension(it, srcDir, vrunnerPath, steps) } else if (it.initMethod == InitExtensionMethod.FILE){ Logger.println("Загрузка расширения ${it.name} из ${it.path}") - loadExtension(it, env) + String pathToExtension = "$pathToExtensionDir/${it.name}.cfe" + FileUtils.loadFile(it.path, env, pathToExtension) } else { Logger.println("Неизвестный метод инициализации расширения ${it.name}") } @@ -73,22 +74,6 @@ class GetExtensions implements Serializable { } } - private void loadExtension(Extension extension, def env) { - String pathToExtension = "$env.WORKSPACE/${EXTENSIONS_OUT_DIR}/${extension.name}.cfe" - FilePath localPathToExtension = FileUtils.getFilePath(pathToExtension) - - if (isValidUrl(extension.path)) { - // If the path is a URL, download the file - localPathToExtension.copyFrom(new URL(extension.path)) - } else { - // If the path is a local file, copy the file - String localPath = getAbsolutePath(extension.path, env) - FilePath localFilePath = FileUtils.getFilePath(localPath) - localPathToExtension.copyFrom(localFilePath) - } - } - - private String initVRunnerPath() { return VRunner.getVRunnerPath() } @@ -108,21 +93,4 @@ class GetExtensions implements Serializable { steps.unzip(sourceDirName, EdtToDesignerFormatTransformation.EXTENSION_ZIP) } } - - private static boolean isValidUrl(String url) { - try { - new URL(url) - return true - } catch (MalformedURLException e) { - return false - } - } - - private static String getAbsolutePath(String path, def env) { - if (path.startsWith("/") || path.startsWith("\\") || path.matches("^[A-Za-z]:.*")) { - return path - } else { - return "${env.WORKSPACE}/${path}" - } - } } diff --git a/src/ru/pulsar/jenkins/library/steps/InitFromFiles.groovy b/src/ru/pulsar/jenkins/library/steps/InitFromFiles.groovy index e08fa32..48fa280 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitFromFiles.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitFromFiles.groovy @@ -6,6 +6,7 @@ import ru.pulsar.jenkins.library.configuration.SourceFormat import ru.pulsar.jenkins.library.ioc.ContextRegistry import ru.pulsar.jenkins.library.utils.Logger import ru.pulsar.jenkins.library.utils.VRunner +import ru.pulsar.jenkins.library.steps.CreateInfobase class InitFromFiles implements Serializable { @@ -41,9 +42,20 @@ class InitFromFiles implements Serializable { srcDir = config.srcDir; } + def createInfobase = new CreateInfobase(config) + createInfobase.run() + Logger.println("Выполнение загрузки конфигурации из файлов") String vrunnerPath = VRunner.getVRunnerPath(); - def initCommand = "$vrunnerPath init-dev --src $srcDir --ibconnection \"/F./build/ib\"" - VRunner.exec(initCommand) + def command = "$vrunnerPath update-dev --src $srcDir --ibconnection \"/F./build/ib\"" + + def options = config.initInfoBaseOptions + + String vrunnerSettings = options.vrunnerSettings + if (vrunnerSettings && steps.fileExists(vrunnerSettings)) { + command += " --settings $vrunnerSettings" + } + + VRunner.exec(command) } } diff --git a/src/ru/pulsar/jenkins/library/steps/InitFromStorage.groovy b/src/ru/pulsar/jenkins/library/steps/InitFromStorage.groovy index 888dde1..ff34cba 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitFromStorage.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitFromStorage.groovy @@ -10,6 +10,7 @@ import ru.pulsar.jenkins.library.utils.Logger import ru.pulsar.jenkins.library.utils.RepoUtils import ru.pulsar.jenkins.library.utils.VRunner import ru.pulsar.jenkins.library.utils.VersionParser +import ru.pulsar.jenkins.library.steps.CreateInfobase import static ru.pulsar.jenkins.library.configuration.Secrets.UNKNOWN_ID @@ -43,6 +44,9 @@ class InitFromStorage implements Serializable { String storageCredentials = secrets.storage == UNKNOWN_ID ? repoSlug + "_STORAGE_USER" : secrets.storage String storagePath = secrets.storagePath == UNKNOWN_ID ? repoSlug + "_STORAGE_PATH" : secrets.storagePath + def createInfobase = new CreateInfobase(config) + createInfobase.run() + steps.withCredentials([ steps.usernamePassword( storageCredentials, @@ -54,8 +58,18 @@ class InitFromStorage implements Serializable { 'RUNNER_STORAGE_NAME' ) ]) { + Logger.println("Выполнение загрузки конфигурации из хранилища") String vrunnerPath = VRunner.getVRunnerPath() - VRunner.exec "$vrunnerPath init-dev --storage $storageVersionParameter --ibconnection \"/F./build/ib\"" + def command = "$vrunnerPath update-dev --storage $storageVersionParameter --ibconnection \"/F./build/ib\"" + + def options = config.initInfoBaseOptions + + String vrunnerSettings = options.vrunnerSettings + if (vrunnerSettings && steps.fileExists(vrunnerSettings)) { + command += " --settings $vrunnerSettings" + } + + VRunner.exec(command) } } diff --git a/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy b/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy index e7a0f6c..8ad5f0d 100644 --- a/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy +++ b/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy @@ -41,4 +41,36 @@ class FileUtils { .replaceAll('\\\\', '/') .toString() } + + static void loadFile(String filePathFrom, def env, String filePathTo) { + + FilePath localPathToFile = getFilePath(filePathTo) + + if (isValidUrl(filePathFrom)) { + // If the path is a URL, download the file + localPathToFile.copyFrom(new URL(filePathFrom)) + } else { + // If the path is a local file, copy the file + String localPath = getAbsolutePath(filePathFrom, env) + FilePath localFilePath = getFilePath(localPath) + localPathToFile.copyFrom(localFilePath) + } + } + + private static boolean isValidUrl(String url) { + try { + new URL(url) + return true + } catch (MalformedURLException e) { + return false + } + } + + private static String getAbsolutePath(String path, def env) { + if (path.startsWith("/") || path.startsWith("\\") || path.matches("^[A-Za-z]:.*")) { + return path + } else { + return "${env.WORKSPACE}/${path}" + } + } }