mirror of
https://github.com/firstBitMarksistskaya/jenkins-lib.git
synced 2025-01-06 13:16:33 +02:00
Merge branch 'develop' into feat/53-wait-sq
This commit is contained in:
commit
134b33992b
@ -21,7 +21,7 @@
|
||||
|
||||
1. Для шага подготовки требуется любой агент с меткой `agent`.
|
||||
1. Для запуска шага анализа SonarQube требуется агент с меткой `sonar`.
|
||||
1. Для запуска шагов, работающих с EDT (валидация, трансформация формата исходников) требуется агент с меткой `edt` и агент с меткой `oscript`, на котором глобально установлена библиотека [stebi](https://github.com/Stepa86/stebi) версии 1.9.1 или новее.
|
||||
1. Для запуска шагов, работающих с EDT (валидация, трансформация формата исходников) требуется агент с меткой `edt` (если используется несколько версий EDT необходимо к метке добавить версию, например `edt@2021.3.4:x86_64`) и агент с меткой `oscript`, на котором глобально установлена библиотека [stebi](https://github.com/Stepa86/stebi) версии 1.9.1 или новее.
|
||||
1. Для запуска шагов, работающих с 1С (подготовка, синтаксический контроль и т.д.) требуется агент с меткой, совпадающей со значением в поле `v8version` файла конфигурации.
|
||||
1. В качестве ИБ используется файловая база, создаваемая в каталоге `./build/ib`. При необходимости вы можете создать пользователей на фазе инициализации ИБ.
|
||||
|
||||
@ -76,6 +76,7 @@ pipeline1C()
|
||||
Пример переопределения:
|
||||
|
||||
* указывается точная версия платформы (и соответственно метка агента, см. ограничения)
|
||||
* указывается точная версия модуля EDT (и соответственно метка агента, см. ограничения)
|
||||
* идентификаторы credentials для пути к хранилищу и к паре логин/пароль для авторизации в хранилище (необходимы, если применяются шаги, работающие с информационной базой)
|
||||
* включаются шаги запуска статического анализа SonarQube, валидации средствами EDT и синтаксического контроля
|
||||
|
||||
@ -83,6 +84,7 @@ pipeline1C()
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/firstBitSemenovskaya/jenkins-lib/master/resources/schema.json",
|
||||
"v8version": "8.3.14.1976",
|
||||
"edtVersion": "2021.3.4:x86_64",
|
||||
"secrets": {
|
||||
"storagePath": "f7b21c02-711a-4883-81c5-d429454e3f8b",
|
||||
"storage" : "c1fc5f33-67d4-493f-a2a4-97d3040e4b8c"
|
||||
@ -103,6 +105,7 @@ pipeline1C()
|
||||
|
||||
* Общее:
|
||||
* В качестве маски версии платформы используется строка "8.3" (`v8version`).
|
||||
* По-умолчанию версия модуля EDT не заполнена, т.к. в случае единственной версии для утилиты ring дополнительного указания не требуется (`edtVersion`).
|
||||
* Исходники конфигурации ожидаются в каталоге `src/cf` (`srcDir`).
|
||||
* Формат исходников - выгрузка из Конфигуратора (`sourceFormat`).
|
||||
* Ветка по умолчанию (для комбинированного режима загрузки конфигурации) - "main" (`defaultBranch`).
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"$schema": "schema.json",
|
||||
"v8version": "8.3",
|
||||
"edtVersion": "",
|
||||
"srcDir": "src/cf",
|
||||
"sourceFormat": "designer",
|
||||
"defaultBranch": "main",
|
||||
@ -44,6 +45,7 @@
|
||||
"useSonarScannerFromPath": true,
|
||||
"sonarScannerToolName": "sonar-scanner",
|
||||
"infoBaseUpdateModuleName" : "",
|
||||
"useBranchPlugin" : true,
|
||||
"waitForQualityGate": false
|
||||
},
|
||||
"syntaxCheck": {
|
||||
|
@ -6,6 +6,10 @@
|
||||
"type" : "string",
|
||||
"description" : "Версия платформы 1С:Предприятие в формате 8.3.хх.хххх."
|
||||
},
|
||||
"edtVersion" : {
|
||||
"type" : "string",
|
||||
"description" : "Версия модуля 1C:Enterprise Development Tools формате xxxx.x.x:x86_64"
|
||||
},
|
||||
"srcDir" : {
|
||||
"type" : "string",
|
||||
"description" : "Путь к корневому каталогу с исходниками конфигурации, в случае хранения исходников в формате EDT, необходимо указать путь к проекту"
|
||||
@ -174,6 +178,10 @@
|
||||
"type" : "string",
|
||||
"description" : "Имя общего модуля (например, ОбновлениеИнформационнойБазыXXX), в котором указана версия библиотеки.\n Версия должна задаваться в виде присвоения `Описание.Версия = \"ваш номер версии\";`\n "
|
||||
},
|
||||
"useBranchPlugin" : {
|
||||
"type" : "boolean",
|
||||
"description" : "Используется ли Branch-plugin в SonarQube"
|
||||
},
|
||||
"waitForQualityGate" : {
|
||||
"type" : "boolean",
|
||||
"description" : "Ожидать состояние Quality Gate от SonarQube после загрузки анализа. По умолчанию `false`.\n Таймаут ожидания состояния равен таймауту шага.\n "
|
||||
|
@ -12,6 +12,9 @@ class JobConfiguration implements Serializable {
|
||||
@JsonPropertyDescription("Версия платформы 1С:Предприятие в формате 8.3.хх.хххх.")
|
||||
String v8version
|
||||
|
||||
@JsonPropertyDescription("Версия модуля 1C:Enterprise Development Tools формате xxxx.x.x:x86_64")
|
||||
String edtVersion
|
||||
|
||||
@JsonPropertyDescription("Путь к корневому каталогу с исходниками конфигурации, в случае хранения исходников в формате EDT, необходимо указать путь к проекту")
|
||||
String srcDir
|
||||
|
||||
@ -65,6 +68,7 @@ class JobConfiguration implements Serializable {
|
||||
String toString() {
|
||||
return "JobConfiguration{" +
|
||||
"v8version='" + v8version + '\'' +
|
||||
", edtVersion='" + edtVersion + '\'' +
|
||||
", srcDir='" + srcDir + '\'' +
|
||||
", sourceFormat=" + sourceFormat +
|
||||
", stageFlags=" + stageFlags +
|
||||
@ -90,4 +94,16 @@ class JobConfiguration implements Serializable {
|
||||
return (initMethod == InitInfoBaseMethod.FROM_SOURCE) ||
|
||||
(initMethod == InitInfoBaseMethod.DEFAULT_BRANCH_FROM_STORAGE && branchName != defaultBranch)
|
||||
}
|
||||
|
||||
String v8AgentLabel() {
|
||||
return v8version
|
||||
}
|
||||
|
||||
String edtAgentLabel() {
|
||||
String edtVersionForRing = "edt"
|
||||
if (edtVersion != '') {
|
||||
edtVersionForRing += "@" + edtVersion
|
||||
}
|
||||
return edtVersionForRing
|
||||
}
|
||||
}
|
@ -25,6 +25,9 @@ class SonarQubeOptions implements Serializable {
|
||||
""")
|
||||
String infoBaseUpdateModuleName
|
||||
|
||||
@JsonPropertyDescription("Используется ли Branch-plugin в SonarQube")
|
||||
Boolean useBranchPlugin
|
||||
|
||||
@JsonPropertyDescription("""Ожидать состояние Quality Gate от SonarQube после загрузки анализа. По умолчанию `false`.
|
||||
Таймаут ожидания состояния равен таймауту шага.
|
||||
""")
|
||||
@ -38,6 +41,7 @@ class SonarQubeOptions implements Serializable {
|
||||
", sonarScannerToolName='" + sonarScannerToolName + '\'' +
|
||||
", sonarQubeInstallation='" + sonarQubeInstallation + '\'' +
|
||||
", infoBaseUpdateModuleName='" + infoBaseUpdateModuleName + '\'' +
|
||||
", useBranchPlugin='" + useBranchPlugin + '\'' +
|
||||
", waitForQualityGate='" + waitForQualityGate + '\'' +
|
||||
'}';
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ 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.Constants
|
||||
import ru.pulsar.jenkins.library.utils.EDT
|
||||
import ru.pulsar.jenkins.library.utils.Logger
|
||||
|
||||
class DesignerToEdtFormatTransformation implements Serializable {
|
||||
@ -34,12 +35,13 @@ class DesignerToEdtFormatTransformation implements Serializable {
|
||||
|
||||
def workspaceDir = "$env.WORKSPACE/$WORKSPACE"
|
||||
def configurationRoot = new File(env.WORKSPACE, config.srcDir).getAbsolutePath()
|
||||
def edtVersionForRing = EDT.ringModule(config)
|
||||
|
||||
steps.deleteDir(workspaceDir)
|
||||
|
||||
Logger.println("Конвертация исходников из формата конфигуратора в формат EDT")
|
||||
|
||||
def ringCommand = "ring edt workspace import --configuration-files \"$configurationRoot\" --project-name $PROJECT_NAME --workspace-location \"$workspaceDir\""
|
||||
def ringCommand = "ring $edtVersionForRing workspace import --configuration-files \"$configurationRoot\" --project-name $PROJECT_NAME --workspace-location \"$workspaceDir\""
|
||||
|
||||
def ringOpts = [Constants.DEFAULT_RING_OPTS]
|
||||
steps.withEnv(ringOpts) {
|
||||
|
@ -6,6 +6,7 @@ import ru.pulsar.jenkins.library.configuration.JobConfiguration
|
||||
import ru.pulsar.jenkins.library.configuration.SourceFormat
|
||||
import ru.pulsar.jenkins.library.ioc.ContextRegistry
|
||||
import ru.pulsar.jenkins.library.utils.Constants
|
||||
import ru.pulsar.jenkins.library.utils.EDT
|
||||
import ru.pulsar.jenkins.library.utils.Logger
|
||||
|
||||
class EdtToDesignerFormatTransformation implements Serializable {
|
||||
@ -37,13 +38,14 @@ class EdtToDesignerFormatTransformation implements Serializable {
|
||||
def projectDir = new File("$env.WORKSPACE/$srcDir").getCanonicalPath()
|
||||
def workspaceDir = "$env.WORKSPACE/$WORKSPACE"
|
||||
def configurationRoot = "$env.WORKSPACE/$CONFIGURATION_DIR"
|
||||
def edtVersionForRing = EDT.ringModule(config)
|
||||
|
||||
steps.deleteDir(workspaceDir)
|
||||
steps.deleteDir(configurationRoot)
|
||||
|
||||
Logger.println("Конвертация исходников из формата EDT в формат Конфигуратора")
|
||||
|
||||
def ringCommand = "ring edt workspace export --workspace-location \"$workspaceDir\" --project \"$projectDir\" --configuration-files \"$configurationRoot\""
|
||||
def ringCommand = "ring $edtVersionForRing workspace export --workspace-location \"$workspaceDir\" --project \"$projectDir\" --configuration-files \"$configurationRoot\""
|
||||
|
||||
def ringOpts = [Constants.DEFAULT_RING_OPTS]
|
||||
steps.withEnv(ringOpts) {
|
||||
|
@ -5,6 +5,7 @@ import ru.pulsar.jenkins.library.configuration.JobConfiguration
|
||||
import ru.pulsar.jenkins.library.configuration.SourceFormat
|
||||
import ru.pulsar.jenkins.library.ioc.ContextRegistry
|
||||
import ru.pulsar.jenkins.library.utils.Constants
|
||||
import ru.pulsar.jenkins.library.utils.EDT
|
||||
import ru.pulsar.jenkins.library.utils.Logger
|
||||
|
||||
class EdtValidate implements Serializable {
|
||||
@ -40,14 +41,15 @@ class EdtValidate implements Serializable {
|
||||
projectList = "--project-name-list $DesignerToEdtFormatTransformation.PROJECT_NAME"
|
||||
} else {
|
||||
String projectDir = new File("$env.WORKSPACE/$config.srcDir").getCanonicalPath()
|
||||
projectList = "--project-list '$projectDir'"
|
||||
projectList = "--project-list \"$projectDir\""
|
||||
}
|
||||
|
||||
def resultFile = "$env.WORKSPACE/$RESULT_FILE"
|
||||
def edtVersionForRing = EDT.ringModule(config)
|
||||
|
||||
Logger.println("Выполнение валидации EDT")
|
||||
|
||||
def ringCommand = "ring edt workspace validate --workspace-location \"$workspaceLocation\" --file \"$resultFile\" $projectList"
|
||||
def ringCommand = "ring $edtVersionForRing workspace validate --workspace-location \"$workspaceLocation\" --file \"$resultFile\" $projectList"
|
||||
def ringOpts = [Constants.DEFAULT_RING_OPTS]
|
||||
steps.withEnv(ringOpts) {
|
||||
steps.catchError {
|
||||
|
@ -36,7 +36,11 @@ class SonarScanner implements Serializable {
|
||||
sonarScannerBinary = "$scannerHome/bin/sonar-scanner"
|
||||
}
|
||||
|
||||
String sonarCommand = "$sonarScannerBinary -Dsonar.branch.name=$env.BRANCH_NAME"
|
||||
String sonarCommand = "$sonarScannerBinary"
|
||||
|
||||
if (config.sonarQubeOptions.useBranchPlugin) {
|
||||
sonarCommand += " -Dsonar.branch.name=$env.BRANCH_NAME"
|
||||
}
|
||||
|
||||
String projectVersion = computeProjectVersion()
|
||||
if (projectVersion) {
|
||||
|
12
src/ru/pulsar/jenkins/library/utils/EDT.groovy
Normal file
12
src/ru/pulsar/jenkins/library/utils/EDT.groovy
Normal file
@ -0,0 +1,12 @@
|
||||
package ru.pulsar.jenkins.library.utils
|
||||
|
||||
import ru.pulsar.jenkins.library.configuration.JobConfiguration
|
||||
|
||||
final class EDT {
|
||||
|
||||
static String ringModule(JobConfiguration config) {
|
||||
return config.edtAgentLabel()
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package ru.pulsar.jenkins.library.configuration;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import ru.pulsar.jenkins.library.utils.TestUtils;
|
||||
|
||||
@ -31,6 +32,7 @@ class ConfigurationReaderTest {
|
||||
|
||||
// then
|
||||
assertThat(jobConfiguration.getV8version()).isEqualTo("8.3.14.1944");
|
||||
assertThat(jobConfiguration.getEdtVersion()).isEqualTo("2021.3.4:x86_64");
|
||||
|
||||
assertThat(jobConfiguration.getSonarQubeOptions().getSonarScannerToolName()).isEqualTo("sonar-scanner");
|
||||
assertThat(jobConfiguration.getSonarQubeOptions().getSonarQubeInstallation()).isEqualTo("qa");
|
||||
@ -61,4 +63,52 @@ class ConfigurationReaderTest {
|
||||
assertThat(jobConfiguration.getTimeoutOptions().getZipInfoBase()).isEqualTo(123);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testV8AgentLabel() throws IOException {
|
||||
// given
|
||||
String config = IOUtils.resourceToString(
|
||||
"jobConfiguration.json",
|
||||
StandardCharsets.UTF_8,
|
||||
this.getClass().getClassLoader()
|
||||
);
|
||||
|
||||
// when
|
||||
JobConfiguration jobConfiguration = ConfigurationReader.create(config);
|
||||
|
||||
// then
|
||||
assertThat(jobConfiguration.v8AgentLabel()).isEqualTo("8.3.14.1944");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testEdtAgentLabel() throws IOException {
|
||||
// given
|
||||
String config = IOUtils.resourceToString(
|
||||
"jobConfiguration.json",
|
||||
StandardCharsets.UTF_8,
|
||||
this.getClass().getClassLoader()
|
||||
);
|
||||
|
||||
// when
|
||||
JobConfiguration jobConfiguration = ConfigurationReader.create(config);
|
||||
|
||||
// then
|
||||
assertThat(jobConfiguration.edtAgentLabel()).isEqualTo("edt@2021.3.4:x86_64");
|
||||
}
|
||||
|
||||
@Disabled
|
||||
void testInfoBaseFromFiles() throws IOException {
|
||||
// given
|
||||
String config = IOUtils.resourceToString(
|
||||
"jobConfiguration.json",
|
||||
StandardCharsets.UTF_8,
|
||||
this.getClass().getClassLoader()
|
||||
);
|
||||
|
||||
// when
|
||||
JobConfiguration jobConfiguration = ConfigurationReader.create(config);
|
||||
|
||||
// then
|
||||
assertThat(jobConfiguration.infoBaseFromFiles()).isFalse();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package ru.pulsar.jenkins.library.utils;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import ru.pulsar.jenkins.library.configuration.ConfigurationReader;
|
||||
import ru.pulsar.jenkins.library.configuration.JobConfiguration;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
class EDTTest {
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
TestUtils.setupMockedContext();
|
||||
}
|
||||
|
||||
@Test
|
||||
void testRingModule() throws IOException {
|
||||
|
||||
// given
|
||||
String config = IOUtils.resourceToString(
|
||||
"jobConfiguration.json",
|
||||
StandardCharsets.UTF_8,
|
||||
this.getClass().getClassLoader()
|
||||
);
|
||||
|
||||
// when
|
||||
JobConfiguration jobConfiguration = ConfigurationReader.create(config);
|
||||
String edtModule = EDT.ringModule(jobConfiguration);
|
||||
|
||||
// then
|
||||
assertThat(edtModule).isEqualTo("edt@2021.3.4:x86_64");
|
||||
}
|
||||
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
{
|
||||
"v8version": "8.3.14.1944",
|
||||
"edtVersion": "2021.3.4:x86_64",
|
||||
"secrets": {
|
||||
"storage": "1234"
|
||||
},
|
||||
|
@ -11,6 +11,9 @@ JobConfiguration config
|
||||
@Field
|
||||
String agent1C
|
||||
|
||||
@Field
|
||||
String agentEdt
|
||||
|
||||
void call() {
|
||||
|
||||
//noinspection GroovyAssignabilityCheck
|
||||
@ -35,7 +38,8 @@ void call() {
|
||||
steps {
|
||||
script {
|
||||
config = jobConfiguration() as JobConfiguration
|
||||
agent1C = config.v8version
|
||||
agent1C = config.v8AgentLabel()
|
||||
agentEdt = config.edtAgentLabel()
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -54,7 +58,7 @@ void call() {
|
||||
stages {
|
||||
stage('Трансформация из формата EDT') {
|
||||
agent {
|
||||
label 'edt'
|
||||
label agentEdt
|
||||
}
|
||||
when {
|
||||
beforeAgent true
|
||||
@ -114,7 +118,7 @@ void call() {
|
||||
|
||||
stage('Трансформация в формат EDT') {
|
||||
agent {
|
||||
label 'edt'
|
||||
label agentEdt
|
||||
}
|
||||
when {
|
||||
beforeAgent true
|
||||
@ -139,7 +143,7 @@ void call() {
|
||||
stages {
|
||||
stage('Валидация EDT') {
|
||||
agent {
|
||||
label 'edt'
|
||||
label agentEdt
|
||||
}
|
||||
steps {
|
||||
timeout(time: config.timeoutOptions.edtValidate, unit: TimeUnit.MINUTES) {
|
||||
|
Loading…
Reference in New Issue
Block a user