From 048d60c88ffdcc44826d0c727195f81dda5dddcf Mon Sep 17 00:00:00 2001 From: jeyong <118044367+joon6093@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:58:35 +0900 Subject: [PATCH 1/5] =?UTF-8?q?refactor:=20=EC=A2=85=EB=A3=8C=EB=A5=BC=20?= =?UTF-8?q?=EB=8B=B4=EB=8B=B9=ED=95=98=EB=8A=94=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EC=9D=98=20=EC=9D=98=EB=8F=84=EB=A5=BC=20=EB=93=9C=EB=9F=AC?= =?UTF-8?q?=EB=82=B4=EA=B8=B0=20=EC=9C=84=ED=95=B4=20=EC=B6=94=EC=83=81=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeyong/handler/ApplicationTerminator.java | 8 +++-- .../test/unit/ApplicationTerminatorTest.java | 34 +++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 test/src/test/java/io/jeyong/test/unit/ApplicationTerminatorTest.java diff --git a/handler/src/main/java/io/jeyong/handler/ApplicationTerminator.java b/handler/src/main/java/io/jeyong/handler/ApplicationTerminator.java index 17d59f3..05c9f71 100644 --- a/handler/src/main/java/io/jeyong/handler/ApplicationTerminator.java +++ b/handler/src/main/java/io/jeyong/handler/ApplicationTerminator.java @@ -2,7 +2,11 @@ import sun.misc.SignalHandler; -public interface ApplicationTerminator { +public abstract class ApplicationTerminator { - SignalHandler handleTermination(final int status); + public SignalHandler handleTermination() { + return signal -> System.exit(getExitCode()); + } + + protected abstract int getExitCode(); } diff --git a/test/src/test/java/io/jeyong/test/unit/ApplicationTerminatorTest.java b/test/src/test/java/io/jeyong/test/unit/ApplicationTerminatorTest.java new file mode 100644 index 0000000..f341a5d --- /dev/null +++ b/test/src/test/java/io/jeyong/test/unit/ApplicationTerminatorTest.java @@ -0,0 +1,34 @@ +package io.jeyong.test.unit; + +import static com.github.stefanbirkner.systemlambda.SystemLambda.catchSystemExit; +import static org.assertj.core.api.Assertions.assertThat; + +import io.jeyong.handler.ApplicationTerminator; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import sun.misc.SignalHandler; + +@DisplayName("ApplicationTerminator Unit Test") +public class ApplicationTerminatorTest { + + @Test + @DisplayName("System.exit should be called with the expected exit code") + void testHandleTerminationCallsSystemExit() throws Exception { + // given + int expectedExitCode = 0; + ApplicationTerminator terminator = new ApplicationTerminator() { + + @Override + protected int getExitCode() { + return expectedExitCode; + } + }; + SignalHandler handler = terminator.handleTermination(); + + // when + int actualExitCode = catchSystemExit(() -> handler.handle(null)); + + // then + assertThat(actualExitCode).isEqualTo(expectedExitCode); + } +} From 12342f8721683fc9bf15eccb38cfa36e45274589 Mon Sep 17 00:00:00 2001 From: jeyong <118044367+joon6093@users.noreply.github.com> Date: Mon, 25 Nov 2024 19:00:41 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20=EC=A2=85=EB=A3=8C=20=EC=8B=9C?= =?UTF-8?q?=EA=B7=B8=EB=84=90=EA=B3=BC=20=EC=A2=85=EB=A3=8C=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=EC=99=B8=EB=B6=80=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=A3=BC=EC=9E=85=20=EB=B0=9B=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/SignalHandlerRegistrar.java | 9 +++--- .../handler/SigtermHandlerConfiguration.java | 10 +++++-- .../handler/SpringContextTerminator.java | 15 ++++++++++ .../io/jeyong/handler/SystemTerminator.java | 11 ------- .../test/unit/SignalHandlerRegistrarTest.java | 24 +++++++++++---- .../test/unit/SystemTerminatorTest.java | 29 ------------------- 6 files changed, 44 insertions(+), 54 deletions(-) create mode 100644 handler/src/main/java/io/jeyong/handler/SpringContextTerminator.java delete mode 100644 handler/src/main/java/io/jeyong/handler/SystemTerminator.java delete mode 100644 test/src/test/java/io/jeyong/test/unit/SystemTerminatorTest.java diff --git a/handler/src/main/java/io/jeyong/handler/SignalHandlerRegistrar.java b/handler/src/main/java/io/jeyong/handler/SignalHandlerRegistrar.java index 187c3df..569abff 100644 --- a/handler/src/main/java/io/jeyong/handler/SignalHandlerRegistrar.java +++ b/handler/src/main/java/io/jeyong/handler/SignalHandlerRegistrar.java @@ -5,17 +5,16 @@ public class SignalHandlerRegistrar { - public static final String SIGNAL_TYPE = "TERM"; - public static final int EXIT_CODE = 0; - private final ApplicationTerminator applicationTerminator; + private final String signalType; - public SignalHandlerRegistrar(final ApplicationTerminator applicationTerminator) { + public SignalHandlerRegistrar(final ApplicationTerminator applicationTerminator, final String signalType) { this.applicationTerminator = applicationTerminator; + this.signalType = signalType; } @PostConstruct public void registerHandler() { - Signal.handle(new Signal(SIGNAL_TYPE), applicationTerminator.handleTermination(EXIT_CODE)); + Signal.handle(new Signal(signalType), applicationTerminator.handleTermination()); } } diff --git a/handler/src/main/java/io/jeyong/handler/SigtermHandlerConfiguration.java b/handler/src/main/java/io/jeyong/handler/SigtermHandlerConfiguration.java index 60cf22f..48888d4 100644 --- a/handler/src/main/java/io/jeyong/handler/SigtermHandlerConfiguration.java +++ b/handler/src/main/java/io/jeyong/handler/SigtermHandlerConfiguration.java @@ -1,18 +1,22 @@ package io.jeyong.handler; +import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SigtermHandlerConfiguration { + private static final String SIGNAL_TYPE = "TERM"; + private static final int EXIT_CODE = 0; + @Bean - public ApplicationTerminator applicationTerminator() { - return new SystemTerminator(); + public ApplicationTerminator applicationTerminator(final ApplicationContext applicationContext) { + return new SpringContextTerminator(applicationContext, EXIT_CODE); } @Bean public SignalHandlerRegistrar sigtermHandlerRegister(final ApplicationTerminator applicationTerminator) { - return new SignalHandlerRegistrar(applicationTerminator); + return new SignalHandlerRegistrar(applicationTerminator, SIGNAL_TYPE); } } diff --git a/handler/src/main/java/io/jeyong/handler/SpringContextTerminator.java b/handler/src/main/java/io/jeyong/handler/SpringContextTerminator.java new file mode 100644 index 0000000..7bc0d9c --- /dev/null +++ b/handler/src/main/java/io/jeyong/handler/SpringContextTerminator.java @@ -0,0 +1,15 @@ +package io.jeyong.handler; + +import org.springframework.boot.SpringApplication; +import org.springframework.context.ApplicationContext; + +public class SpringContextTerminator extends ApplicationTerminator { + + private final ApplicationContext applicationContext; + private final int exitCode; + + public SpringContextTerminator(final ApplicationContext applicationContext, final int exitCode) { + this.applicationContext = applicationContext; + this.exitCode = exitCode; + } + diff --git a/handler/src/main/java/io/jeyong/handler/SystemTerminator.java b/handler/src/main/java/io/jeyong/handler/SystemTerminator.java deleted file mode 100644 index fb3f1c2..0000000 --- a/handler/src/main/java/io/jeyong/handler/SystemTerminator.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.jeyong.handler; - -import sun.misc.SignalHandler; - -public class SystemTerminator implements ApplicationTerminator { - - @Override - public SignalHandler handleTermination(final int status) { - return signal -> System.exit(status); - } -} diff --git a/test/src/test/java/io/jeyong/test/unit/SignalHandlerRegistrarTest.java b/test/src/test/java/io/jeyong/test/unit/SignalHandlerRegistrarTest.java index 52f4e6c..f95bf8b 100644 --- a/test/src/test/java/io/jeyong/test/unit/SignalHandlerRegistrarTest.java +++ b/test/src/test/java/io/jeyong/test/unit/SignalHandlerRegistrarTest.java @@ -1,6 +1,5 @@ package io.jeyong.test.unit; -import static io.jeyong.handler.SignalHandlerRegistrar.SIGNAL_TYPE; import static org.assertj.core.api.Assertions.assertThat; import io.jeyong.handler.ApplicationTerminator; @@ -17,17 +16,30 @@ public class SignalHandlerRegistrarTest { @DisplayName("SignalHandler should be registered correctly") void testSignalHandlerRegistration() { // given - SignalHandler mockSignalHandler = signal -> System.out.println("Mock signal handler"); - ApplicationTerminator applicationTerminator = status -> mockSignalHandler; - SignalHandlerRegistrar registrar = new SignalHandlerRegistrar(applicationTerminator); + String signalType = "TERM"; + int exitCode = 0; + SignalHandler expectedHandler = signal -> System.exit(exitCode); + ApplicationTerminator terminator = new ApplicationTerminator() { + + @Override + public SignalHandler handleTermination() { + return expectedHandler; + } + + @Override + protected int getExitCode() { + return exitCode; + } + }; + SignalHandlerRegistrar registrar = new SignalHandlerRegistrar(terminator, signalType); // when registrar.registerHandler(); - Signal registeredSignal = new Signal(SIGNAL_TYPE); + Signal registeredSignal = new Signal(signalType); SignalHandler registeredHandler = Signal.handle(registeredSignal, null); // then - assertThat(registeredHandler).isEqualTo(mockSignalHandler); + assertThat(registeredHandler).isEqualTo(expectedHandler); } } diff --git a/test/src/test/java/io/jeyong/test/unit/SystemTerminatorTest.java b/test/src/test/java/io/jeyong/test/unit/SystemTerminatorTest.java deleted file mode 100644 index cf6f19a..0000000 --- a/test/src/test/java/io/jeyong/test/unit/SystemTerminatorTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.jeyong.test.unit; - -import static com.github.stefanbirkner.systemlambda.SystemLambda.catchSystemExit; -import static io.jeyong.handler.SignalHandlerRegistrar.EXIT_CODE; -import static org.assertj.core.api.Assertions.assertThat; - -import io.jeyong.handler.SystemTerminator; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import sun.misc.SignalHandler; - -@DisplayName("SystemTerminator Unit Test") -public class SystemTerminatorTest { - - @Test - @DisplayName("System.exit should be called with the expected status code") - void testHandleTerminationCallsSystemExit() throws Exception { - // given - SystemTerminator terminator = new SystemTerminator(); - int expectedStatusCode = EXIT_CODE; - SignalHandler handler = terminator.handleTermination(expectedStatusCode); - - // when - int actualExitCode = catchSystemExit(() -> handler.handle(null)); - - // then - assertThat(actualExitCode).isEqualTo(expectedStatusCode); - } -} From 063ff949295fa8ed0df7dccbf20e6209a2269755 Mon Sep 17 00:00:00 2001 From: jeyong Date: Tue, 26 Nov 2024 04:52:50 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20=EC=A2=85=EB=A3=8C=20=EC=8B=9C=20?= =?UTF-8?q?=EA=B3=B5=EC=8B=9D=20=EB=AC=B8=EC=84=9C=EC=B2=98=EB=9F=BC=20Spr?= =?UTF-8?q?ingApplication.exit=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/jeyong/handler/SpringContextTerminator.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/handler/src/main/java/io/jeyong/handler/SpringContextTerminator.java b/handler/src/main/java/io/jeyong/handler/SpringContextTerminator.java index 7bc0d9c..3ba3d1d 100644 --- a/handler/src/main/java/io/jeyong/handler/SpringContextTerminator.java +++ b/handler/src/main/java/io/jeyong/handler/SpringContextTerminator.java @@ -13,3 +13,8 @@ public SpringContextTerminator(final ApplicationContext applicationContext, fina this.exitCode = exitCode; } + @Override + protected int getExitCode() { + return SpringApplication.exit(applicationContext, () -> exitCode); + } +} From 1d72c5b070624e2da7aa4a7bb0e566e31bf0036a Mon Sep 17 00:00:00 2001 From: jeyong Date: Tue, 26 Nov 2024 04:54:01 +0900 Subject: [PATCH 4/5] =?UTF-8?q?test:=20=EC=A2=85=EB=A3=8C=20=EC=8B=9C=20?= =?UTF-8?q?=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=9D=BC=EC=9D=B4=ED=94=84=20?= =?UTF-8?q?=EC=82=AC=EC=9D=B4=ED=81=B4=20=EC=BD=9C=EB=B0=B1=EC=9D=84=20?= =?UTF-8?q?=EC=A0=9C=EB=8C=80=EB=A1=9C=20=ED=98=B8=EC=B6=9C=ED=95=98?= =?UTF-8?q?=EB=8A=94=EC=A7=80=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/cleanup/CleanupConfiguration.java | 25 +++++ .../cleanup/ContextClosedEventHandler.java | 16 +++ .../test/cleanup/PreDestroyHandler.java | 15 +++ .../test/cleanup/ShutdownHookHandler.java | 13 +++ .../test/integration/SigtermHandlerTest.java | 99 +++++++++++++------ 5 files changed, 137 insertions(+), 31 deletions(-) create mode 100644 test/src/main/java/io/jeyong/test/cleanup/CleanupConfiguration.java create mode 100644 test/src/main/java/io/jeyong/test/cleanup/ContextClosedEventHandler.java create mode 100644 test/src/main/java/io/jeyong/test/cleanup/PreDestroyHandler.java create mode 100644 test/src/main/java/io/jeyong/test/cleanup/ShutdownHookHandler.java diff --git a/test/src/main/java/io/jeyong/test/cleanup/CleanupConfiguration.java b/test/src/main/java/io/jeyong/test/cleanup/CleanupConfiguration.java new file mode 100644 index 0000000..f7df01c --- /dev/null +++ b/test/src/main/java/io/jeyong/test/cleanup/CleanupConfiguration.java @@ -0,0 +1,25 @@ +package io.jeyong.test.cleanup; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class CleanupConfiguration { + + @Bean + public PreDestroyHandler preDestroyHandler() { + return new PreDestroyHandler(); + } + + @Bean + public ContextClosedEventHandler contextClosedEventHandler() { + return new ContextClosedEventHandler(); + } + + @Bean + public ShutdownHookHandler shutdownHookHandler() { + ShutdownHookHandler shutdownHookHandler = new ShutdownHookHandler(); + shutdownHookHandler.registerShutdownHook(); + return shutdownHookHandler; + } +} diff --git a/test/src/main/java/io/jeyong/test/cleanup/ContextClosedEventHandler.java b/test/src/main/java/io/jeyong/test/cleanup/ContextClosedEventHandler.java new file mode 100644 index 0000000..d65bf40 --- /dev/null +++ b/test/src/main/java/io/jeyong/test/cleanup/ContextClosedEventHandler.java @@ -0,0 +1,16 @@ +package io.jeyong.test.cleanup; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.ContextClosedEvent; +import org.springframework.context.event.EventListener; + +@Slf4j +public class ContextClosedEventHandler { + + public static final String CONTEXT_CLOSED_EVENT_LOG = "Handling ContextClosedEvent..."; + + @EventListener(ContextClosedEvent.class) + public void handleContextClosed() { + log.info(CONTEXT_CLOSED_EVENT_LOG); + } +} diff --git a/test/src/main/java/io/jeyong/test/cleanup/PreDestroyHandler.java b/test/src/main/java/io/jeyong/test/cleanup/PreDestroyHandler.java new file mode 100644 index 0000000..8d52557 --- /dev/null +++ b/test/src/main/java/io/jeyong/test/cleanup/PreDestroyHandler.java @@ -0,0 +1,15 @@ +package io.jeyong.test.cleanup; + +import jakarta.annotation.PreDestroy; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class PreDestroyHandler { + + public static final String PRE_DESTROY_LOG = "Executing @PreDestroy cleanup logic..."; + + @PreDestroy + public void cleanup() { + log.info(PRE_DESTROY_LOG); + } +} diff --git a/test/src/main/java/io/jeyong/test/cleanup/ShutdownHookHandler.java b/test/src/main/java/io/jeyong/test/cleanup/ShutdownHookHandler.java new file mode 100644 index 0000000..6b5fa79 --- /dev/null +++ b/test/src/main/java/io/jeyong/test/cleanup/ShutdownHookHandler.java @@ -0,0 +1,13 @@ +package io.jeyong.test.cleanup; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class ShutdownHookHandler { + + public static final String SHUTDOWN_HOOK_LOG = "Executing JVM Shutdown Hook..."; + + public void registerShutdownHook() { + Runtime.getRuntime().addShutdownHook(new Thread(() -> log.info(SHUTDOWN_HOOK_LOG))); + } +} diff --git a/test/src/test/java/io/jeyong/test/integration/SigtermHandlerTest.java b/test/src/test/java/io/jeyong/test/integration/SigtermHandlerTest.java index 8ffae9f..26ad92b 100644 --- a/test/src/test/java/io/jeyong/test/integration/SigtermHandlerTest.java +++ b/test/src/test/java/io/jeyong/test/integration/SigtermHandlerTest.java @@ -1,38 +1,70 @@ package io.jeyong.test.integration; +import static io.jeyong.test.cleanup.ContextClosedEventHandler.CONTEXT_CLOSED_EVENT_LOG; +import static io.jeyong.test.cleanup.PreDestroyHandler.PRE_DESTROY_LOG; +import static io.jeyong.test.cleanup.ShutdownHookHandler.SHUTDOWN_HOOK_LOG; import static org.assertj.core.api.Assertions.assertThat; +import static org.testcontainers.containers.wait.strategy.Wait.forLogMessage; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; import org.apache.commons.io.FileUtils; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.images.builder.ImageFromDockerfile; @SpringBootTest @DisplayName("SigtermHandler Integration Test") public class SigtermHandlerTest { - private final Logger logger = LoggerFactory.getLogger(SigtermHandlerTest.class); + private static ImageFromDockerfile dockerImage; + + @BeforeAll + static void setUp() { + dockerImage = buildImage(); + } + + @Test + @DisplayName("Container should exit with code 0 on SIGTERM") + void testExitCode() throws Exception { + // given + GenericContainer container = new GenericContainer<>(dockerImage) + .waitingFor(forLogMessage(".*Started TestApplication.*\\n", 1)); + container.start(); + + // when + sendSigtermToContainer(container); + + // then + Long exitCode = container.getCurrentContainerInfo().getState().getExitCodeLong(); + assertThat(exitCode).isEqualTo(0); + } @Test - @DisplayName("Application should exit with code 0 on SIGTERM") - void testSigtermHandling() throws Exception { + @DisplayName("Container should exit with cleanup performed on SIGTERM") + void testCleanUp() throws Exception { // given - Path tempDir = Files.createTempDirectory("docker-context"); - copyFile("../gradlew", tempDir.resolve("gradlew")); - copyDirectory("../gradle", tempDir.resolve("gradle")); - copyFile("../settings.gradle", tempDir.resolve("settings.gradle")); - copyDirectory("../handler", tempDir.resolve("handler")); - copyDirectory("../test", tempDir.resolve("test")); - - ImageFromDockerfile image = new ImageFromDockerfile() + GenericContainer container = new GenericContainer<>(dockerImage) + .waitingFor(forLogMessage(".*Started TestApplication.*\\n", 1)); + container.start(); + + // when + sendSigtermToContainer(container); + + // then + String logs = container.getLogs(); + assertThat(logs).contains(PRE_DESTROY_LOG); + assertThat(logs).contains(CONTEXT_CLOSED_EVENT_LOG); + assertThat(logs).contains(SHUTDOWN_HOOK_LOG); + } + + private static ImageFromDockerfile buildImage() { + Path tempDir = createTempDirectory(); + return new ImageFromDockerfile() .withFileFromPath(".", tempDir) .withDockerfileFromBuilder(builder -> { builder.from("eclipse-temurin:17") @@ -47,32 +79,37 @@ void testSigtermHandling() throws Exception { .cmd("java", "-jar", "/app/test/build/libs/test-0.0.1-SNAPSHOT.jar") .build(); }); + } - // when - try (GenericContainer container = new GenericContainer<>(image) - .withLogConsumer(new Slf4jLogConsumer(logger))) { - container.start(); - sendSigtermToContainer(container); - - // then - Long exitCode = container.getCurrentContainerInfo().getState().getExitCodeLong(); - assertThat(exitCode).isEqualTo(0); + private static Path createTempDirectory() { + try { + Path tempDir = Files.createTempDirectory("docker-context"); + copyFile("../gradlew", tempDir.resolve("gradlew")); + copyDirectory("../gradle", tempDir.resolve("gradle")); + copyFile("../settings.gradle", tempDir.resolve("settings.gradle")); + copyDirectory("../handler", tempDir.resolve("handler")); + copyDirectory("../test", tempDir.resolve("test")); + return tempDir; + } catch (Exception e) { + throw new RuntimeException("Failed to create temp directory for Docker context", e); } } - private void sendSigtermToContainer(GenericContainer container) { + private static void copyFile(String source, Path destination) throws Exception { + FileUtils.copyFile(new File(source), destination.toFile()); + } + + private static void copyDirectory(String source, Path destination) throws Exception { + FileUtils.copyDirectory(new File(source), destination.toFile()); + } + + private static void sendSigtermToContainer(GenericContainer container) throws Exception { String containerId = container.getContainerId(); container.getDockerClient() .killContainerCmd(containerId) .withSignal("SIGTERM") .exec(); - } - - private void copyFile(String source, Path destination) throws Exception { - FileUtils.copyFile(new File(source), destination.toFile()); - } - private void copyDirectory(String source, Path destination) throws Exception { - FileUtils.copyDirectory(new File(source), destination.toFile()); + Thread.sleep(1000); } } From f99bbc75102ce58fdbfa219029ec6705b7c3b192 Mon Sep 17 00:00:00 2001 From: jeyong Date: Tue, 26 Nov 2024 05:00:43 +0900 Subject: [PATCH 5/5] =?UTF-8?q?chore:=20=EB=A6=B4=EB=A6=AC=EC=A6=88=20?= =?UTF-8?q?=EB=B2=84=EC=A0=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handler/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/handler/build.gradle b/handler/build.gradle index a33a4fc..a519cc3 100644 --- a/handler/build.gradle +++ b/handler/build.gradle @@ -5,7 +5,7 @@ plugins { } group = 'io.jeyong' -version = '1.0.3' +version = '1.1.0' ext { artifactName = 'k8s-sigterm-handler'