From f12bc9aae6382c1687cb6338f7e468c24e49d5c5 Mon Sep 17 00:00:00 2001 From: Jan Zickermann <jan.zickermann@dataport.de> Date: Mon, 28 Apr 2025 12:33:09 +0200 Subject: [PATCH 1/5] KOP-3139 pom: Remove ozgcloud-common-parent --- pom.xml | 269 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 243 insertions(+), 26 deletions(-) diff --git a/pom.xml b/pom.xml index a2bd7bb..e8ca0b3 100644 --- a/pom.xml +++ b/pom.xml @@ -1,23 +1,53 @@ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>de.ozgcloud.common</groupId> - <artifactId>ozgcloud-common-parent</artifactId> - <version>4.3.0</version> - <relativePath/> - </parent> <groupId>de.ozgcloud.xta</groupId> <artifactId>xta-client-lib</artifactId> <version>0.3.0-SNAPSHOT</version> <properties> + <java.version>21</java.version> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> + + <!-- plugins --> + <maven-surefire-plugin.version>3.5.2</maven-surefire-plugin.version> + <maven-failsafe-plugin.version>3.5.2</maven-failsafe-plugin.version> + <maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version> + <maven-source-plugin.version>3.3.1</maven-source-plugin.version> + <maven-jar-plugin.version>3.4.2</maven-jar-plugin.version> + <jacoco.plugin.version>0.8.12</jacoco.plugin.version> + + <sonarqube.version>3.9.1.2184</sonarqube.version> + <license.plugin.version>4.6</license.plugin.version> + <rewrite.plugin.version>4.38.2</rewrite.plugin.version> + + <dependency-track-maven-plugin.version>1.7.0</dependency-track-maven-plugin.version> + <git-commit-id-maven-plugin.version>7.0.0</git-commit-id-maven-plugin.version> + <cyclonedx-maven-plugin.version>2.7.11</cyclonedx-maven-plugin.version> + + <!-- test --> + <httpclient5.version>5.4.1</httpclient5.version> + <mockito.version>5.14.2</mockito.version> + <assertj.version>3.26.3</assertj.version> + <snakeyaml.version>2.3</snakeyaml.version> + <junit-jupiter.version>5.11.4</junit-jupiter.version> + <testcontainers.version>1.20.6</testcontainers.version> + <!-- build versions --> - <cxf.version>4.0.5</cxf.version> - <cxf-xjc.version>4.0.0</cxf-xjc.version> + <mapstruct.version>1.6.3</mapstruct.version> + <log4j2.version>2.24.3</log4j2.version> + <lombok.version>1.18.36</lombok.version> + + <cxf.version>4.0.7</cxf.version> + <cxf-xjc.version>4.0.2</cxf-xjc.version> <jsr305.version>3.0.2</jsr305.version> + <bouncycastle.version>1.80</bouncycastle.version> + <commons-io.version>2.19.0</commons-io.version> + <commons-lang3.version>3.17.0</commons-lang3.version> + <jakarta.version>3.1.1</jakarta.version> <!-- Build settings --> <timestamp>${maven.build.timestamp}</timestamp> @@ -27,13 +57,34 @@ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-bom</artifactId> + <version>${log4j2.version}</version> + <scope>import</scope> + <type>pom</type> + </dependency> + <dependency> + <groupId>org.junit</groupId> + <artifactId>junit-bom</artifactId> + <version>${junit-jupiter.version}</version> + <scope>import</scope> + <type>pom</type> + </dependency> + <dependency> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-bom</artifactId> + <version>4.0.7</version> + <scope>import</scope> + <type>pom</type> + </dependency> + </dependencies> + </dependencyManagement> + <dependencies> <!-- CXF--> - <dependency> - <groupId>org.apache.cxf</groupId> - <artifactId>cxf-spring-boot-starter-jaxws</artifactId> - <version>${cxf.version}</version> - </dependency> <dependency> <groupId>org.apache.cxf.xjcplugins</groupId> <artifactId>cxf-xjc-ts</artifactId> @@ -54,19 +105,34 @@ <artifactId>cxf-xjc-runtime</artifactId> <version>${cxf-xjc.version}</version> </dependency> + <dependency> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-rt-frontend-jaxws</artifactId> + </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-features-logging</artifactId> - <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-ws-security</artifactId> - <version>${cxf.version}</version> + </dependency> + + <!-- Other apache --> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>${commons-lang3.version}</version> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>${commons-io.version}</version> </dependency> <dependency> <groupId>org.apache.httpcomponents.client5</groupId> <artifactId>httpclient5</artifactId> + <version>${httpclient5.version}</version> </dependency> <dependency> <groupId>org.apache.cxf.services.xkms</groupId> @@ -79,6 +145,12 @@ <version>${cxf.version}</version> </dependency> + <dependency> + <groupId>jakarta.validation</groupId> + <artifactId>jakarta.validation-api</artifactId> + <version>${jakarta.version}</version> + </dependency> + <dependency> <groupId>com.google.code.findbugs</groupId> <artifactId>jsr305</artifactId> @@ -88,11 +160,13 @@ <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> + <version>${mapstruct.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> + <version>${lombok.version}</version> <scope>provided</scope> </dependency> @@ -100,25 +174,44 @@ <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-api</artifactId> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-slf4j2-impl</artifactId> + <scope>runtime</scope> + </dependency> <!-- Test --> <dependency> + <!-- TODO remove this dependency --> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> + <version>4.4</version> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> + <version>${assertj.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk18on</artifactId> + <version>${bouncycastle.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk18on</artifactId> + <version>${bouncycastle.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-params</artifactId> <scope>test</scope> </dependency> <dependency> @@ -129,25 +222,138 @@ <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> + <version>${mockito.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> + <version>${mockito.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> + <version>${snakeyaml.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.testcontainers</groupId> + <artifactId>testcontainers</artifactId> + <version>${testcontainers.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.testcontainers</groupId> + <artifactId>junit-jupiter</artifactId> + <version>${testcontainers.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>${maven-jar-plugin.version}</version> + </plugin> + + <plugin> + <groupId>org.sonarsource.scanner.maven</groupId> + <artifactId>sonar-maven-plugin</artifactId> + <version>${sonarqube.version}</version> + </plugin> + + + <plugin> + <groupId>io.github.git-commit-id</groupId> + <artifactId>git-commit-id-maven-plugin</artifactId> + <version>${git-commit-id-maven-plugin.version}</version> + <configuration> + <offline>true</offline> + </configuration> + <executions> + <execution> + <id>get-the-git-infos</id> + <goals> + <goal>revision</goal> + </goals> + <phase>initialize</phase> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.jacoco</groupId> + <artifactId>jacoco-maven-plugin</artifactId> + <version>${jacoco.plugin.version}</version> + <executions> + <execution> + <id>start-agent</id> + <goals> + <goal>prepare-agent</goal> + </goals> + <configuration> + <propertyName>surefire.jacoco.args</propertyName> + </configuration> + </execution> + <execution> + <id>generate-report</id> + <phase>package</phase> + <goals> + <goal>report</goal> + </goals> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.openrewrite.maven</groupId> + <artifactId>rewrite-maven-plugin</artifactId> + <version>${rewrite.plugin.version}</version> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-source-plugin</artifactId> + <version>${maven-source-plugin.version}</version> + <executions> + <execution> + <id>attach-sources</id> + <goals> + <goal>jar-no-fork</goal> + </goals> + </execution> + </executions> + </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> + <version>${maven-compiler-plugin.version}</version> + <configuration> + <parameters>true</parameters> + <source>${java.version}</source> + <target>${java.version}</target> + <fork>true</fork> + <annotationProcessorPaths> + <path> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${lombok.version}</version> + </path> + <path> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct-processor</artifactId> + <version>${mapstruct.version}</version> + </path> + </annotationProcessorPaths> + <showWarnings>true</showWarnings> + <compilerArgs> + <compilerArg> + -Amapstruct.unmappedTargetPolicy=WARN + </compilerArg> + </compilerArgs> + </configuration> <executions> <execution> <id>log4j2-plugin-processor</id> @@ -165,15 +371,34 @@ </path> </annotationProcessorPaths> <annotationProcessors> - <processor>org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor</processor> + <processor> + org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor + </processor> </annotationProcessors> </configuration> </execution> </executions> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>${maven-surefire-plugin.version}</version> + <configuration> + <argLine> + ${surefire.jacoco.args} + </argLine> + </configuration> + </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> + <version>${maven-failsafe-plugin.version}</version> + <configuration> + <argLine> + ${surefire.jacoco.args} + </argLine> + <classesDirectory>${project.build.outputDirectory}</classesDirectory> + </configuration> <executions> <execution> <goals> @@ -183,14 +408,6 @@ </execution> </executions> </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> -- GitLab From 34bcdf928bc8e241185cba34cd1c7d5a0522642b Mon Sep 17 00:00:00 2001 From: Jan Zickermann <jan.zickermann@dataport.de> Date: Mon, 28 Apr 2025 13:22:12 +0200 Subject: [PATCH 2/5] KOP-3139 pom: Use hibernate-validator --- pom.xml | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index e8ca0b3..7f4f3eb 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,9 @@ <bouncycastle.version>1.80</bouncycastle.version> <commons-io.version>2.19.0</commons-io.version> <commons-lang3.version>3.17.0</commons-lang3.version> - <jakarta.version>3.1.1</jakarta.version> + <jakarta-validation.version>3.0.2</jakarta-validation.version> + <hibernate-validator.version>8.0.2.Final</hibernate-validator.version> + <expressly.version>5.0.0</expressly.version> <!-- Build settings --> <timestamp>${maven.build.timestamp}</timestamp> @@ -76,7 +78,7 @@ <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-bom</artifactId> - <version>4.0.7</version> + <version>${cxf.version}</version> <scope>import</scope> <type>pom</type> </dependency> @@ -145,10 +147,21 @@ <version>${cxf.version}</version> </dependency> + <!-- Validation https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/ --> <dependency> <groupId>jakarta.validation</groupId> <artifactId>jakarta.validation-api</artifactId> - <version>${jakarta.version}</version> + <version>${jakarta-validation.version}</version> + </dependency> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-validator</artifactId> + <version>${hibernate-validator.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.expressly</groupId> + <artifactId>expressly</artifactId> + <version>${expressly.version}</version> </dependency> <dependency> -- GitLab From 529c8a7d7da1a0e858be56f96aa9ee3bdd59ecca Mon Sep 17 00:00:00 2001 From: Jan Zickermann <jan.zickermann@dataport.de> Date: Mon, 28 Apr 2025 13:34:39 +0200 Subject: [PATCH 3/5] KOP-3139 pom: Remove commons-collections4 --- pom.xml | 14 ----------- .../extension/XtaMessageExampleLoader.java | 25 +++++++++++-------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/pom.xml b/pom.xml index 7f4f3eb..0abda89 100644 --- a/pom.xml +++ b/pom.xml @@ -198,12 +198,6 @@ </dependency> <!-- Test --> - <dependency> - <!-- TODO remove this dependency --> - <groupId>org.apache.commons</groupId> - <artifactId>commons-collections4</artifactId> - <version>4.4</version> - </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> @@ -396,20 +390,12 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>${maven-surefire-plugin.version}</version> - <configuration> - <argLine> - ${surefire.jacoco.args} - </argLine> - </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>${maven-failsafe-plugin.version}</version> <configuration> - <argLine> - ${surefire.jacoco.args} - </argLine> <classesDirectory>${project.build.outputDirectory}</classesDirectory> </configuration> <executions> diff --git a/src/test/java/de/ozgcloud/xta/client/extension/XtaMessageExampleLoader.java b/src/test/java/de/ozgcloud/xta/client/extension/XtaMessageExampleLoader.java index 740edbd..aa61f23 100644 --- a/src/test/java/de/ozgcloud/xta/client/extension/XtaMessageExampleLoader.java +++ b/src/test/java/de/ozgcloud/xta/client/extension/XtaMessageExampleLoader.java @@ -22,7 +22,6 @@ import jakarta.mail.util.ByteArrayDataSource; import jakarta.validation.constraints.NotBlank; import org.apache.commons.codec.Resources; -import org.apache.commons.collections4.MapUtils; import org.apache.commons.io.IOUtils; import org.yaml.snakeyaml.Yaml; @@ -104,17 +103,12 @@ public class XtaMessageExampleLoader { @Nullable XtaIdentifier reader) { } - @SuppressWarnings("unchecked") - private static Map<String, Object> getChild(Map<String, Object> parent, String key) { - return Objects.requireNonNull((Map<String, Object>) MapUtils.getMap(parent, key), "Missing key: %s".formatted(key)); - } - private static XtaFile mapXtaFile( Map<String, Object> messageFile, String resourcePrefix, MessageFileProcessor messageFileProcessor) { Function<String, String> getString = key -> Objects.requireNonNull( - MapUtils.getString(messageFile, key), "[Failed mapping for %s] Missing key: %s".formatted(resourcePrefix, key)); + getChildString(messageFile, key), "[Failed mapping for %s] Missing key: %s".formatted(resourcePrefix, key)); var name = getString.apply("name"); var path = getMessageResourcePath(resourcePrefix, name); @@ -126,7 +120,7 @@ public class XtaMessageExampleLoader { .name(name) .contentType(getString.apply("contentType")) .content(createContentDataHandler(data)) - .id(MapUtils.getString(messageFile, "id")) + .id(getChildString(messageFile, "id")) .build(); } @@ -138,7 +132,7 @@ public class XtaMessageExampleLoader { private static XtaMessageMetaData mapXtaMessageMetadata(Map<String, Object> metaData, MessageExampleConfig config) { Function<String, String> getString = key -> Objects.requireNonNull( - MapUtils.getString(metaData, key), "metaData key missing: %s".formatted(key)); + getChildString(metaData, key), "metaData key missing: %s".formatted(key)); return XtaMessageMetaData.builder() .service(getString.apply("service")) .businessScenarioCode(getString.apply("businessScenarioCode")) @@ -147,7 +141,7 @@ public class XtaMessageExampleLoader { .messageTypeCode(getString.apply("messageTypeCode")) .messageTypePayloadSchema(getString.apply("messageTypePayloadSchema")) .messageId(getIfConfigNull( - config.messageId, () -> MapUtils.getString(metaData, "messageId"))) + config.messageId, () -> getChildString(metaData, "messageId"))) .authorIdentifier(getIfConfigNull( config.author, () -> mapIdentifier(getChild(metaData, "authorIdentifier")))) @@ -157,6 +151,17 @@ public class XtaMessageExampleLoader { .build(); } + @SuppressWarnings("unchecked") + private static Map<String, Object> getChild(Map<String, Object> parent, String key) { + return Objects.requireNonNull((Map<String, Object>) parent.get(key), "Missing key: %s".formatted(key)); + } + + private static String getChildString(Map<String, Object> parent, String key) { + return Optional.ofNullable(parent.get(key)) + .map(Object::toString) + .orElse(null); + } + private static <T> T getIfConfigNull(T configValue, Supplier<T> supplier) { return configValue != null ? configValue : supplier.get(); } -- GitLab From a8f4529b728c9b8a7c17c459f80639d628c371b2 Mon Sep 17 00:00:00 2001 From: Jan Zickermann <jan.zickermann@dataport.de> Date: Mon, 28 Apr 2025 13:59:16 +0200 Subject: [PATCH 4/5] KOP-3139 test: Fetch xta-test-server from codesh --- .../java/de/ozgcloud/xta/client/XtaTestServerContainer.java | 4 ++-- .../xta/client/extension/XtaTestServerSetupExtension.java | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/test/java/de/ozgcloud/xta/client/XtaTestServerContainer.java b/src/test/java/de/ozgcloud/xta/client/XtaTestServerContainer.java index 5642170..c68e60e 100644 --- a/src/test/java/de/ozgcloud/xta/client/XtaTestServerContainer.java +++ b/src/test/java/de/ozgcloud/xta/client/XtaTestServerContainer.java @@ -7,8 +7,8 @@ import org.testcontainers.utility.DockerImageName; public class XtaTestServerContainer extends GenericContainer<XtaTestServerContainer> { - private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("docker.ozg-sh.de/xta-test-server"); - private static final String DEFAULT_TAG = "latest"; + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("code.schleswig-holstein.de:5050/ozg-cloud/lib/xta-test-server"); + private static final String DEFAULT_TAG = "1.9.0"; public static final int PORT = 8443; public XtaTestServerContainer() { diff --git a/src/test/java/de/ozgcloud/xta/client/extension/XtaTestServerSetupExtension.java b/src/test/java/de/ozgcloud/xta/client/extension/XtaTestServerSetupExtension.java index 6a5f489..f5feb6b 100644 --- a/src/test/java/de/ozgcloud/xta/client/extension/XtaTestServerSetupExtension.java +++ b/src/test/java/de/ozgcloud/xta/client/extension/XtaTestServerSetupExtension.java @@ -23,9 +23,6 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class XtaTestServerSetupExtension implements BeforeAllCallback, AfterAllCallback { - private static final DockerImageName XTA_TEST_SERVER_IMAGE = DockerImageName.parse("docker.ozg-sh.de/xta-test-server") - .withTag("1.9.0"); - private static final String XTA_TEST_CLIENT_KEYSTORE_PATH = "store/xta-test-client-john-smith_keystore.p12"; private static final String XTA_TEST_CLIENT_KEYSTORE_PASSWORD = "password"; @@ -69,7 +66,7 @@ public class XtaTestServerSetupExtension implements BeforeAllCallback, AfterAllC } private void setupServer() { - xtaServerContainer = new XtaTestServerContainer(XTA_TEST_SERVER_IMAGE) + xtaServerContainer = new XtaTestServerContainer() .withLogConsumer(outputFrame -> log.info(outputFrame.getUtf8String().strip())); xtaServerContainer.start(); -- GitLab From e962ef19337361e5b42b01c757bf592b87eb15c1 Mon Sep 17 00:00:00 2001 From: Jan Zickermann <jan.zickermann@dataport.de> Date: Tue, 13 May 2025 15:35:55 +0200 Subject: [PATCH 5/5] KOP-3139 pipeline: Add temp gitlab image deploy --- .gitlab-ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ad6c905..44a4ebb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -70,6 +70,14 @@ snapshot-gitlab: only: - main +snapshot-custom-gitlab: + stage: publish + script: + - mvn versions:set -DnewVersion=0.3.0-KOP-3139-SNAPSHOT $MAVEN_CLI_OPTS + - mvn deploy -Pgitlab-deploy $MAVEN_DEPLOY_CLI_OPTS $MAVEN_CLI_OPTS + only: + - KOP-3139-ozgcloud-Abhaengigkeit-entfernen + snapshot-nexus: stage: publish script: -- GitLab