diff --git a/build.gradle.kts b/build.gradle.kts index 6127970..8e31f1f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,17 +16,25 @@ val junitVersion = "5.6.1" val spockVersion = "1.3-groovy-2.4" val groovyVersion = "2.4.19" val slf4jVersion = "1.8.0-beta4" +var jacksonVersion = "2.9.8" dependencies { implementation("org.codehaus.groovy", "groovy-all", groovyVersion) + // jackson + implementation("com.fasterxml.jackson.module", "jackson-module-jsonSchema", jacksonVersion) + + // unit-tests testImplementation("org.junit.jupiter", "junit-jupiter-api", junitVersion) testRuntimeOnly("org.junit.jupiter", "junit-jupiter-engine", junitVersion) testImplementation("org.assertj", "assertj-core", "3.15.0") testImplementation("org.mockito", "mockito-core", "3.3.3") - testImplementation("org.spockframework", "spock-core", spockVersion) + testImplementation("org.slf4j", "slf4j-api", slf4jVersion) + testImplementation("org.slf4j", "slf4j-simple", slf4jVersion) + + // integration-tests integrationTestImplementation("org.spockframework", "spock-core", spockVersion) integrationTestImplementation("org.codehaus.groovy", "groovy-all", groovyVersion) diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json new file mode 100644 index 0000000..8cd1a00 --- /dev/null +++ b/resources/globalConfiguration.json @@ -0,0 +1,4 @@ +{ + "$schema": "schema.json", + "sonarScannerToolName": "sonar-scanner" +} \ No newline at end of file diff --git a/resources/schema.json b/resources/schema.json new file mode 100644 index 0000000..99a633c --- /dev/null +++ b/resources/schema.json @@ -0,0 +1,14 @@ +{ + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:JobConfiguration", + "properties" : { + "v8version" : { + "type" : "string", + "description" : "Версия платформы 1С:Предприятие в формате 8.3.хх.хххх." + }, + "sonarScannerToolName" : { + "type" : "string", + "description" : "Имя настроенной утилиты sonar-scanner." + } + } +} \ No newline at end of file diff --git a/src/JobConfigurationSchemaGenerator.java b/src/JobConfigurationSchemaGenerator.java new file mode 100644 index 0000000..68fe569 --- /dev/null +++ b/src/JobConfigurationSchemaGenerator.java @@ -0,0 +1,27 @@ +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.module.jsonSchema.JsonSchema; +import com.fasterxml.jackson.module.jsonSchema.JsonSchemaGenerator; +import ru.pulsar.jenkins.library.configuration.JobConfiguration; + +import java.io.File; +import java.io.StringWriter; + +public class JobConfigurationSchemaGenerator { + + public static void main(String[] args) throws Exception { + ObjectMapper mapper = new ObjectMapper(); + JsonSchemaGenerator generator = new JsonSchemaGenerator(mapper); + JsonSchema jsonSchema = generator.generateSchema(JobConfiguration.class); + + StringWriter json = new StringWriter(); + mapper.configure(SerializationFeature.INDENT_OUTPUT, true); + mapper.writeValue(json, jsonSchema); + + File jsonSchemaFile = new File("./resources/schema.json"); + mapper.writeValue(jsonSchemaFile, jsonSchema); + + System.out.println(json.toString()); + } + +} diff --git a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy index 3c019b4..9e3c446 100644 --- a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy @@ -8,4 +8,6 @@ interface IStepExecutor { int bat(String script, boolean returnStatus, String encoding) + String libraryResource(String path) + } \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/StepExecutor.groovy b/src/ru/pulsar/jenkins/library/StepExecutor.groovy index 5ca3b61..3678798 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -22,4 +22,9 @@ class StepExecutor implements IStepExecutor { int bat(String script, boolean returnStatus, String encoding) { steps.bat script: script, returnStatus: returnStatus, encoding: encoding } + + @Override + String libraryResource(String path) { + steps.libraryResource path + } } diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy new file mode 100644 index 0000000..ea09acd --- /dev/null +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -0,0 +1,28 @@ +package ru.pulsar.jenkins.library.configuration + +import com.fasterxml.jackson.databind.ObjectMapper +import org.apache.commons.beanutils.BeanUtils +import ru.pulsar.jenkins.library.IStepExecutor +import ru.pulsar.jenkins.library.ioc.ContextRegistry + +class ConfigurationReader implements Serializable { + static JobConfiguration create(String config) { + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + def mapper = new ObjectMapper() + def globalConfig = steps.libraryResource 'globalConfiguration.json' + + def globalConfiguration = mapper.readValue(globalConfig, JobConfiguration.class) + def jobConfiguration = mapper.readValue(config, JobConfiguration.class) + + BeanUtils.describe(jobConfiguration).entrySet().stream() + .filter({ e -> e.getValue() != null }) + .filter({ e -> e.getKey() != "class" }) + .filter({ e -> e.getKey() != "metaClass" }) + .forEach { e -> + BeanUtils.setProperty(globalConfiguration, e.getKey(), e.getValue()); + } + + return globalConfiguration + } +} diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index 3fd0eff..aad3ee8 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -1,8 +1,13 @@ package ru.pulsar.jenkins.library.configuration -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.fasterxml.jackson.annotation.JsonPropertyDescription @JsonIgnoreProperties(ignoreUnknown = true) -class JobConfiguration { +class JobConfiguration implements Serializable { + @JsonPropertyDescription("Версия платформы 1С:Предприятие в формате 8.3.хх.хххх.") + String v8version + @JsonPropertyDescription("Имя настроенной утилиты sonar-scanner.") + String sonarScannerToolName } \ No newline at end of file diff --git a/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java new file mode 100644 index 0000000..29ba45f --- /dev/null +++ b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java @@ -0,0 +1,48 @@ +package ru.pulsar.jenkins.library.configuration; + +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import ru.pulsar.jenkins.library.IStepExecutor; +import ru.pulsar.jenkins.library.MockStepExecutor; +import ru.pulsar.jenkins.library.ioc.ContextRegistry; +import ru.pulsar.jenkins.library.ioc.IContext; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +class ConfigurationReaderTest { + + @BeforeEach + void setUp() { + IContext context = mock(IContext.class); + IStepExecutor steps = spy(new MockStepExecutor()); + + when(context.getStepExecutor()).thenReturn(steps); + + ContextRegistry.registerContext(context); + } + + @Test + void testCreateJobConfigurationObject() throws IOException { + // given + String config = IOUtils.resourceToString( + "jobConfiguration.json", + StandardCharsets.UTF_8, + this.getClass().getClassLoader() + ); + + // when + JobConfiguration jobConfiguration = ConfigurationReader.create(config); + + // then + assertThat(jobConfiguration.getV8version()).isEqualTo("8.3.14.1944"); + assertThat(jobConfiguration.getSonarScannerToolName()).isEqualTo("sonar-scanner"); + } + +} \ No newline at end of file diff --git a/test/unit/resources/jobConfiguration.json b/test/unit/resources/jobConfiguration.json new file mode 100644 index 0000000..17aee9f --- /dev/null +++ b/test/unit/resources/jobConfiguration.json @@ -0,0 +1,3 @@ +{ + "v8version": "8.3.14.1944" +} \ No newline at end of file diff --git a/vars/jobConfiguration.groovy b/vars/jobConfiguration.groovy new file mode 100644 index 0000000..eacb5cf --- /dev/null +++ b/vars/jobConfiguration.groovy @@ -0,0 +1,10 @@ +import ru.pulsar.jenkins.library.configuration.ConfigurationReader +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.ioc.ContextRegistry + +JobConfiguration call(String path = "") { + ContextRegistry.registerDefaultContext(this) + + def config = readFile(path) + return ConfigurationReader.create(config) +} \ No newline at end of file