From 37833c8c795aa5a239df986775b2254f9eb92acc Mon Sep 17 00:00:00 2001 From: Corneil du Plessis Date: Fri, 20 Sep 2024 15:57:12 +0200 Subject: [PATCH] Update build to create native container for timestamp-task-3.0.x and timestamp-batch-3.0.x (#200) * Attempt native tests of timestamp-task-3.0.x and timestamp-batch-3.0.x * Added org.graalvm.buildtools:native-maven-plugin --- .github/workflows/ci.yml | 5 +- .../TimestampBatchTaskConfiguration.java | 2 +- timestamp-batch-3.0.x/pom.xml | 30 ++++++--- timestamp-batch-3.0.x/run-docker.sh | 9 +++ timestamp-batch-3.0.x/run-jar.sh | 5 ++ timestamp-batch-3.0.x/run-native.sh | 5 ++ .../java/io/spring/BatchJobApplication.java | 18 +++--- .../TimestampBatchTaskConfiguration.java | 62 ++++--------------- .../io/spring/TimestampBatchTaskTests.java | 31 ++++++---- timestamp-task-3.0.x/pom.xml | 22 ++++++- timestamp-task-3.0.x/run-docker.sh | 9 +++ timestamp-task-3.0.x/run-jar.sh | 5 ++ timestamp-task-3.0.x/run-native.sh | 5 ++ .../io/spring/timestamp/TaskApplication.java | 14 +++-- .../src/main/resources/application.properties | 1 + .../timestamp/TaskApplicationTests.java | 2 +- 16 files changed, 136 insertions(+), 89 deletions(-) create mode 100755 timestamp-batch-3.0.x/run-docker.sh create mode 100755 timestamp-batch-3.0.x/run-jar.sh create mode 100755 timestamp-batch-3.0.x/run-native.sh create mode 100755 timestamp-task-3.0.x/run-docker.sh create mode 100755 timestamp-task-3.0.x/run-jar.sh create mode 100755 timestamp-task-3.0.x/run-native.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5a1183d..88aa249 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -317,6 +317,7 @@ jobs: java-version: '17' artifactory-publish: ${{ inputs.maven-build-only != true }} jf-artifactory-spring: ${{ secrets.JF_ARTIFACTORY_SPRING }} + jf-mvn-build-commands: '-B clean install -DskipTests' docker-push: ${{ inputs.maven-build-only != true }} docker-username: ${{ secrets.DOCKERHUB_USERNAME }} docker-password: ${{ secrets.DOCKERHUB_TOKEN }} @@ -330,7 +331,7 @@ jobs: - uses: ./.github/actions/build-sample-app with: app-dir: 'timestamp-task-3.0.x' - mvn-build-commands: '-B clean install spring-boot:build-image' + mvn-build-commands: '-B clean install spring-boot:build-image -Pnative' artifactory-publish: ${{ inputs.maven-build-only != true }} jf-artifactory-spring: ${{ secrets.JF_ARTIFACTORY_SPRING }} artifactory-repo-deploy-releases: 'libs-milestone-local' @@ -347,7 +348,7 @@ jobs: - uses: ./.github/actions/build-sample-app with: app-dir: 'timestamp-batch-3.0.x' - mvn-build-commands: '-B clean install spring-boot:build-image' + mvn-build-commands: '-B clean install spring-boot:build-image -Pnative' artifactory-publish: ${{ inputs.maven-build-only != true }} jf-artifactory-spring: ${{ secrets.JF_ARTIFACTORY_SPRING }} artifactory-repo-deploy-releases: 'libs-milestone-local' diff --git a/timestamp-batch-2.0.x/src/main/java/io/spring/configuration/TimestampBatchTaskConfiguration.java b/timestamp-batch-2.0.x/src/main/java/io/spring/configuration/TimestampBatchTaskConfiguration.java index e7975c8..8fe093e 100644 --- a/timestamp-batch-2.0.x/src/main/java/io/spring/configuration/TimestampBatchTaskConfiguration.java +++ b/timestamp-batch-2.0.x/src/main/java/io/spring/configuration/TimestampBatchTaskConfiguration.java @@ -113,7 +113,7 @@ public class TimestampBatchTaskConfiguration { logger.info("jobstep1:{}", contribution.getStepExecution().getExecutionContext()); logger.info("job2:{}", contribution.getStepExecution().getJobExecution().getExecutionContext()); DateFormat dateFormat = new SimpleDateFormat(config.getFormat()); - logger.info("Job2 was run with date {}", dateFormat.format(new Date())); + logger.info("Job2 was run with {}", dateFormat.format(new Date())); return RepeatStatus.FINISHED; }) .build()) diff --git a/timestamp-batch-3.0.x/pom.xml b/timestamp-batch-3.0.x/pom.xml index 9ad9786..eae1dcf 100644 --- a/timestamp-batch-3.0.x/pom.xml +++ b/timestamp-batch-3.0.x/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.3 + 3.3.2 io.spring @@ -16,7 +16,7 @@ 17 - 2022.0.5 + 2023.0.3 @@ -51,10 +51,6 @@ h2 [2.2,) - - org.postgresql - postgresql - org.springframework.boot spring-boot-starter-test @@ -77,6 +73,10 @@ io.micrometer micrometer-registry-prometheus + + ch.qos.logback + logback-classic + org.assertj assertj-core @@ -103,11 +103,27 @@ spring-boot-maven-plugin + IF_NOT_PRESENT + + ${java.version} + springcloudtask/${project.artifactId}:${project.version} - + + + native + + + + org.graalvm.buildtools + native-maven-plugin + + + + + diff --git a/timestamp-batch-3.0.x/run-docker.sh b/timestamp-batch-3.0.x/run-docker.sh new file mode 100755 index 0000000..57ecdaa --- /dev/null +++ b/timestamp-batch-3.0.x/run-docker.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set +e +docker inspect springcloudtask/timestamp-batch-task:3.0.0 > /dev/null +RC=$? +set -e +if((RC>0)); then + ./mvnw clean spring-boot:build-image -Pnative +fi +docker run springcloudtask/timestamp-batch-task:3.0.0 diff --git a/timestamp-batch-3.0.x/run-jar.sh b/timestamp-batch-3.0.x/run-jar.sh new file mode 100755 index 0000000..b58eced --- /dev/null +++ b/timestamp-batch-3.0.x/run-jar.sh @@ -0,0 +1,5 @@ +#!/bin/bash +if [ ! -f ./target/timestamp-batch-task-3.0.0.jar ]; then + ./mvnw clean package +fi +java -jar ./target/timestamp-batch-task-3.0.0.jar \ No newline at end of file diff --git a/timestamp-batch-3.0.x/run-native.sh b/timestamp-batch-3.0.x/run-native.sh new file mode 100755 index 0000000..334d689 --- /dev/null +++ b/timestamp-batch-3.0.x/run-native.sh @@ -0,0 +1,5 @@ +#!/bin/bash +if [ ! -f ./target/timestamp-batch-task ]; then + ./mvnw clean native:compile -Pnative +fi +./target/timestamp-batch-task diff --git a/timestamp-batch-3.0.x/src/main/java/io/spring/BatchJobApplication.java b/timestamp-batch-3.0.x/src/main/java/io/spring/BatchJobApplication.java index ff7fe10..e17ae59 100644 --- a/timestamp-batch-3.0.x/src/main/java/io/spring/BatchJobApplication.java +++ b/timestamp-batch-3.0.x/src/main/java/io/spring/BatchJobApplication.java @@ -16,6 +16,11 @@ package io.spring; +import java.util.Arrays; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.batch.core.Job; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.launch.JobLauncher; @@ -28,31 +33,30 @@ import org.springframework.context.annotation.Bean; @EnableTask @SpringBootApplication public class BatchJobApplication { - + private static final Logger logger = LoggerFactory.getLogger(BatchJobApplication.class); public static void main(String[] args) { SpringApplication.run(BatchJobApplication.class, args); } @Bean - public TimestampTask timestampTask(JobLauncher jobLauncher, Job job1, Job job2) { - return new TimestampTask(jobLauncher, job1, job2); + public TimestampTask timestampTask(JobLauncher jobLauncher, Job job1) { + return new TimestampTask(jobLauncher, job1); } public static class TimestampTask implements CommandLineRunner { private final JobLauncher launcher; private final Job job1; - private final Job job2; - public TimestampTask(JobLauncher launcher, Job job1, Job job2) { + + public TimestampTask(JobLauncher launcher, Job job1) { this.launcher = launcher; this.job1 = job1; - this.job2 = job2; } @Override public void run(String... strings) throws Exception { + logger.info("starting: {} with {}", job1.getName(), Arrays.asList(strings)); launcher.run(job1, new JobParameters()); - launcher.run(job2, new JobParameters()); } } } diff --git a/timestamp-batch-3.0.x/src/main/java/io/spring/configuration/TimestampBatchTaskConfiguration.java b/timestamp-batch-3.0.x/src/main/java/io/spring/configuration/TimestampBatchTaskConfiguration.java index 11c60ad..e077ff1 100644 --- a/timestamp-batch-3.0.x/src/main/java/io/spring/configuration/TimestampBatchTaskConfiguration.java +++ b/timestamp-batch-3.0.x/src/main/java/io/spring/configuration/TimestampBatchTaskConfiguration.java @@ -16,64 +16,40 @@ package io.spring.configuration; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; -import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.transaction.PlatformTransactionManager; -import javax.sql.DataSource; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; - @Configuration @EnableConfigurationProperties({ TimestampBatchTaskProperties.class }) -public class TimestampBatchTaskConfiguration extends DefaultBatchConfiguration { +public class TimestampBatchTaskConfiguration { private static final Logger logger = LoggerFactory.getLogger(TimestampBatchTaskProperties.class); - - @Value("${spring.batch.jdbc.table-prefix:BATCH_}") - private String tablePrefix; - @Autowired private TimestampBatchTaskProperties config; - @Bean - @ConditionalOnProperty(name = "spring.datasource.driver-class-name", matchIfMissing = true, havingValue="matchonlyifmissing") - public DataSource dataSource() { - return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2) - .addScript("/org/springframework/batch/core/schema-h2.sql") - .generateUniqueName(true).build(); - } - - protected String getTablePrefix() { - return tablePrefix; - } - - /** - * Override default transaction isolation level 'ISOLATION_REPEATABLE_READ' which Oracle does not - * support. - */ - @Bean + @Bean(name = "job1step1") public Step job1step1(JobRepository jobRepository, PlatformTransactionManager springCloudTaskTransactionManager) { return new StepBuilder("job1step1", jobRepository) - .tasklet(getTasklet("Job1 was run with date %s"), springCloudTaskTransactionManager).build(); + .tasklet(getTasklet("Job1 was run with format %s and result=date %s"), springCloudTaskTransactionManager).build(); } private Tasklet getTasklet(String format) { @@ -83,31 +59,17 @@ public class TimestampBatchTaskConfiguration extends DefaultBatchConfiguration { contribution.getStepExecution().getJobExecution().getExecutionContext().put("job-ctx1", "exec-job1"); logger.info("{}:{}", contribution.getStepExecution().getStepName(), contribution.getStepExecution().getExecutionContext()); logger.info("{}:{}", contribution.getStepExecution().getJobExecution().getJobInstance().getJobName(), contribution.getStepExecution().getJobExecution().getExecutionContext()); - logger.info(String.format(format, dateFormat.format(new Date()))); + logger.info(String.format(format, format, dateFormat.format(new Date()))); return RepeatStatus.FINISHED; }; } - @Bean - public Job job1(JobRepository jobRepository, Step job1step1) { + @Bean(name = "job1") + public Job job1(JobRepository jobRepository, @Qualifier("job1step1") Step job1step1) { return new JobBuilder("job1", jobRepository) .start(job1step1) .build(); } - @Bean - public Step job2step1(JobRepository jobRepository, - PlatformTransactionManager springCloudTaskTransactionManager - ) { - return new StepBuilder("job2step1", jobRepository) - .tasklet(getTasklet("Job2 was run with date %s"), springCloudTaskTransactionManager) - .build(); - } - @Bean - public Job job2(JobRepository jobRepository, Step job2step1) { - return new JobBuilder("job2", jobRepository) - .start(job2step1) - .build(); - } } diff --git a/timestamp-batch-3.0.x/src/test/java/io/spring/TimestampBatchTaskTests.java b/timestamp-batch-3.0.x/src/test/java/io/spring/TimestampBatchTaskTests.java index 2011722..75fecb1 100644 --- a/timestamp-batch-3.0.x/src/test/java/io/spring/TimestampBatchTaskTests.java +++ b/timestamp-batch-3.0.x/src/test/java/io/spring/TimestampBatchTaskTests.java @@ -16,11 +16,10 @@ package io.spring; +import io.spring.configuration.TimestampBatchTaskConfiguration; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; @@ -33,7 +32,14 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Glenn Renfro */ @ExtendWith(OutputCaptureExtension.class) -@SpringBootTest(properties = "--timestamp.format=yyyy.......") +@SpringBootTest(classes = { + BatchJobApplication.class, + TimestampBatchTaskConfiguration.class +}, + properties = { + "logging.level.root=debug", + "timestamp.format=yyyy......." + }) public class TimestampBatchTaskTests { @Test @@ -41,9 +47,9 @@ public class TimestampBatchTaskTests { final String TEST_DATE_DOTS = "......."; final String CREATE_TASK_MESSAGE = "Creating: TaskExecution{executionId="; final String UPDATE_TASK_MESSAGE = "Updating: TaskExecution with executionId=1 with the following"; - final String JOB1_MESSAGE = "Job1 was run with date "; - final String JOB2_MESSAGE = "Job2 was run with date "; - + final String JOB1_MESSAGE = "Job1 was run with "; + + String output = capturedOutput.toString(); assertThat(output).contains(TEST_DATE_DOTS); @@ -51,14 +57,13 @@ public class TimestampBatchTaskTests { assertThat(output).contains(UPDATE_TASK_MESSAGE); assertThat(output).contains(JOB1_MESSAGE); - assertThat(output).contains(JOB2_MESSAGE); } - @SpringBootApplication - public static class TestTimestampBatchTaskApplication { - public static void main(String[] args) { - SpringApplication.run(TestTimestampBatchTaskApplication.class, args); - } - } +// @SpringBootApplication +// public static class TestTimestampBatchTaskApplication { +// public static void main(String[] args) { +// SpringApplication.run(TestTimestampBatchTaskApplication.class, args); +// } +// } } diff --git a/timestamp-task-3.0.x/pom.xml b/timestamp-task-3.0.x/pom.xml index ddec9e9..c7051f0 100644 --- a/timestamp-task-3.0.x/pom.xml +++ b/timestamp-task-3.0.x/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.4 + 3.3.2 io.spring @@ -16,7 +16,7 @@ 17 - 2022.0.4 + 2023.0.3 @@ -90,11 +90,27 @@ spring-boot-maven-plugin + IF_NOT_PRESENT + + ${java.version} + springcloudtask/${project.artifactId}:${project.version} - + + + native + + + + org.graalvm.buildtools + native-maven-plugin + + + + + diff --git a/timestamp-task-3.0.x/run-docker.sh b/timestamp-task-3.0.x/run-docker.sh new file mode 100755 index 0000000..369f41f --- /dev/null +++ b/timestamp-task-3.0.x/run-docker.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set +e +docker inspect springcloudtask/timestamp-task:3.0.0 > /dev/null +RC=$? +set -e +if((RC>0)); then + ./mvnw clean spring-boot:build-image -Pnative +fi +docker run springcloudtask/timestamp-task:3.0.0 diff --git a/timestamp-task-3.0.x/run-jar.sh b/timestamp-task-3.0.x/run-jar.sh new file mode 100755 index 0000000..0901d39 --- /dev/null +++ b/timestamp-task-3.0.x/run-jar.sh @@ -0,0 +1,5 @@ +#!/bin/bash +if [ ! -f ./target/timestamp-task-3.0.0.jar ]; then + ./mvnw clean package +fi +java -jar ./target/timestamp-task-3.0.0.jar \ No newline at end of file diff --git a/timestamp-task-3.0.x/run-native.sh b/timestamp-task-3.0.x/run-native.sh new file mode 100755 index 0000000..29d2bce --- /dev/null +++ b/timestamp-task-3.0.x/run-native.sh @@ -0,0 +1,5 @@ +#!/bin/bash +if [ ! -f ./target/timestamp-task ]; then + ./mvnw clean native:compile -Pnative +fi +./target/timestamp-task diff --git a/timestamp-task-3.0.x/src/main/java/io/spring/timestamp/TaskApplication.java b/timestamp-task-3.0.x/src/main/java/io/spring/timestamp/TaskApplication.java index ea9b14b..992d9f5 100644 --- a/timestamp-task-3.0.x/src/main/java/io/spring/timestamp/TaskApplication.java +++ b/timestamp-task-3.0.x/src/main/java/io/spring/timestamp/TaskApplication.java @@ -19,10 +19,12 @@ package io.spring.timestamp; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.util.Arrays; import java.util.Date; +import java.util.List; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; @@ -40,7 +42,7 @@ import org.springframework.context.annotation.Bean; @EnableConfigurationProperties({TimestampTaskProperties.class}) public class TaskApplication { - private static final Log logger = LogFactory.getLog(TaskApplication.class); + private static final Logger logger = LoggerFactory.getLogger(TaskApplication.class); public static void main(String[] args) { SpringApplication.run(TaskApplication.class, args); @@ -60,9 +62,11 @@ public class TaskApplication { private TimestampTaskProperties config; @Override - public void run(String... strings) throws Exception { + public void run(String... arguments) throws Exception { + List args = Arrays.asList(arguments); + logger.info("starting with {}", args); DateFormat dateFormat = new SimpleDateFormat(this.config.getFormat()); - logger.info(dateFormat.format(new Date())); + logger.info("completed at:{} with args {}", dateFormat.format(new Date()), args); } } } diff --git a/timestamp-task-3.0.x/src/main/resources/application.properties b/timestamp-task-3.0.x/src/main/resources/application.properties index 398a1dc..66f6a63 100644 --- a/timestamp-task-3.0.x/src/main/resources/application.properties +++ b/timestamp-task-3.0.x/src/main/resources/application.properties @@ -1 +1,2 @@ logging.level.org.springframework.cloud.task=debug +logging.level.io.spring=debug \ No newline at end of file diff --git a/timestamp-task-3.0.x/src/test/java/io/spring/timestamp/TaskApplicationTests.java b/timestamp-task-3.0.x/src/test/java/io/spring/timestamp/TaskApplicationTests.java index ba2e0cf..418e131 100644 --- a/timestamp-task-3.0.x/src/test/java/io/spring/timestamp/TaskApplicationTests.java +++ b/timestamp-task-3.0.x/src/test/java/io/spring/timestamp/TaskApplicationTests.java @@ -65,6 +65,6 @@ public class TaskApplicationTests { count++; } assertThat(count).as("The number of task titles did not match expected: ") - .isEqualTo(1); + .isGreaterThanOrEqualTo(1); } }