From 0bf4f5e4cf353383e5fe83afdbf66298fc75f86a Mon Sep 17 00:00:00 2001 From: Jonathan Christison Date: Sat, 22 Aug 2020 19:24:24 +0100 Subject: [PATCH] Do multistage build invoke - docker build -f src/main/docker/Dockerfile.multistage -t quarkus-quickstart/getting-started . --- README.md | 12 +++++-- getting-started/.dockerignore | 5 --- .../src/main/docker/Dockerfile.multistage | 31 +++++++++++++++++++ .../getting/started/GreetingResource.java | 15 ++++++++- .../acme/getting/started/GreetingService.java | 12 +++++++ .../getting/started/GreetingResourceTest.java | 15 +++++++-- 6 files changed, 79 insertions(+), 11 deletions(-) delete mode 100644 getting-started/.dockerignore create mode 100644 getting-started/src/main/docker/Dockerfile.multistage create mode 100644 getting-started/src/main/java/org/acme/getting/started/GreetingService.java diff --git a/README.md b/README.md index d08c3e0..054925e 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,10 @@ * ArC - CDI (injection framework), developed from Weld * Command mode - terminates exits after run as opposed to normal operation (wait for systemexit or pod to be killed) +* Jandex - Java annotations indexer (Jason Green dev) + + + # General Notes Quarkus built upon VERT-X for non-blocking IO, VERT-X mostly built upon netty, Vert-X provides a 80+ connectors for non-blocking IO like Kafka, mongodb, AMQP etc @@ -59,11 +63,13 @@ uni.onItem() # The plan - [ ] Understand technologies and terminologies -- [ ] Fire up Quarkus example +- [ ] Fire up Quarkus example (hello world) - [ ] Design an LED conversion proxy for front porch - [ ] Listen to MQTT broker - [ ] Possibly use camel k to write mqtt to file or something - [ ] "Translate" and passthrough to porchLED + - [ ] Write TestNG tests + - [ ] Mockquito # Refs @@ -72,6 +78,6 @@ uni.onItem() * [CDI explained](https://www.youtube.com/watch?v=Q8jHRDu9Fbo) * [Mutiny lib/Vert-X](https://www.youtube.com/watch?v=uTK73fpPznQ) * [Weld](http://weld.cdi-spec.org/) - - +* [Quickstart hello world](https://quarkus.io/guides/getting-started) +& [Building native image](https://quarkus.io/guides/building-native-image) - Used multistage build diff --git a/getting-started/.dockerignore b/getting-started/.dockerignore deleted file mode 100644 index 94810d0..0000000 --- a/getting-started/.dockerignore +++ /dev/null @@ -1,5 +0,0 @@ -* -!target/*-runner -!target/*-runner.jar -!target/lib/* -!target/quarkus-app/* \ No newline at end of file diff --git a/getting-started/src/main/docker/Dockerfile.multistage b/getting-started/src/main/docker/Dockerfile.multistage new file mode 100644 index 0000000..daefc56 --- /dev/null +++ b/getting-started/src/main/docker/Dockerfile.multistage @@ -0,0 +1,31 @@ +## Stage 1 : build with maven builder image with native capabilities +FROM quay.io/quarkus/centos-quarkus-maven:20.1.0-java11 AS build +COPY pom.xml /usr/src/app/ +RUN mvn -f /usr/src/app/pom.xml -B de.qaware.maven:go-offline-maven-plugin:1.2.5:resolve-dependencies +COPY src /usr/src/app/src +USER root +RUN chown -R quarkus /usr/src/app +USER quarkus +RUN mvn -f /usr/src/app/pom.xml -Pnative clean package + + + +## Stage 2 : create the docker final image +FROM registry.access.redhat.com/ubi8/ubi-minimal +WORKDIR /work/ +COPY --from=build /usr/src/app/target/*-runner /work/application + +# set up permissions for user `1001` +RUN chmod 775 /work /work/application \ + && chown -R 1001 /work \ + && chmod -R "g+rwX" /work \ + && chown -R 1001:root /work + +EXPOSE 8080 +USER 1001 + +CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] + + + + diff --git a/getting-started/src/main/java/org/acme/getting/started/GreetingResource.java b/getting-started/src/main/java/org/acme/getting/started/GreetingResource.java index 40ebe85..204ff04 100644 --- a/getting-started/src/main/java/org/acme/getting/started/GreetingResource.java +++ b/getting-started/src/main/java/org/acme/getting/started/GreetingResource.java @@ -1,16 +1,29 @@ package org.acme.getting.started; +import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import org.jboss.resteasy.annotations.jaxrs.PathParam; + @Path("/hello") public class GreetingResource { + @Inject + GreetingService service; + + @GET + @Produces(MediaType.TEXT_PLAIN) + @Path("/greeting/{name}") + public String greeting(@PathParam String name) { + return service.greeting(name); + } + @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "hello"; } -} \ No newline at end of file +} diff --git a/getting-started/src/main/java/org/acme/getting/started/GreetingService.java b/getting-started/src/main/java/org/acme/getting/started/GreetingService.java new file mode 100644 index 0000000..ad93468 --- /dev/null +++ b/getting-started/src/main/java/org/acme/getting/started/GreetingService.java @@ -0,0 +1,12 @@ +package org.acme.getting.started; + +import javax.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class GreetingService { + + public String greeting(String name) { + //return "Hey " + name; + return "Hey " + name + ", You're an idiot"; + } +} diff --git a/getting-started/src/test/java/org/acme/getting/started/GreetingResourceTest.java b/getting-started/src/test/java/org/acme/getting/started/GreetingResourceTest.java index 9cb8115..69d182e 100644 --- a/getting-started/src/test/java/org/acme/getting/started/GreetingResourceTest.java +++ b/getting-started/src/test/java/org/acme/getting/started/GreetingResourceTest.java @@ -3,6 +3,8 @@ package org.acme.getting.started; import io.quarkus.test.junit.QuarkusTest; import org.junit.jupiter.api.Test; +import java.util.UUID; + import static io.restassured.RestAssured.given; import static org.hamcrest.CoreMatchers.is; @@ -17,5 +19,14 @@ public class GreetingResourceTest { .statusCode(200) .body(is("hello")); } - -} \ No newline at end of file + @Test + public void testGreetingEndpoint() { + String uuid = UUID.randomUUID().toString(); + given() + .pathParam("name", uuid) + .when().get("/hello/greeting/{name}") + .then() + .statusCode(200) + .body(is("Hey " + uuid + ", You're an idiot")); + } +}