1
0
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:
Nikita Fedkin 2022-05-20 19:48:32 +03:00 committed by GitHub
commit 134b33992b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 159 additions and 10 deletions

View File

@ -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`).

View File

@ -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": {

View File

@ -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 "

View File

@ -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
}
}

View File

@ -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 + '\'' +
'}';
}

View File

@ -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) {

View File

@ -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) {

View File

@ -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 {

View File

@ -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) {

View 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()
}
}

View File

@ -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();
}
}

View File

@ -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");
}
}

View File

@ -1,5 +1,6 @@
{
"v8version": "8.3.14.1944",
"edtVersion": "2021.3.4:x86_64",
"secrets": {
"storage": "1234"
},

View File

@ -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) {