diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a85278c..3ec5c03 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,34 +1,55 @@ -name: Build and Check -on: - workflow_dispatch: - pull_request: - push: - branches: - - main - - develop -jobs: - build: - name: Build - uses: Logius-standaarden/Automatisering/.github/workflows/build.yml@main - check: - needs: build - name: Check - uses: Logius-standaarden/Automatisering/.github/workflows/check.yml@main - publish: - needs: build - name: Publish (Logius) - uses: Logius-standaarden/Automatisering/.github/workflows/publish.yml@main - secrets: inherit - spectral_linter: - needs: build - name: Spectral linter test cases - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Run test suite - run: | - npm install -g @stoplight/spectral-cli - node linter/run-linter-tests.mjs +name: Build and Check +on: + workflow_dispatch: + pull_request: + push: + branches: + - main + - develop +jobs: + build: + name: Build + uses: Logius-standaarden/Automatisering/.github/workflows/build.yml@main + check: + needs: build + name: Check + uses: Logius-standaarden/Automatisering/.github/workflows/check.yml@main + publish: + needs: build + name: Publish (Logius) + uses: Logius-standaarden/Automatisering/.github/workflows/publish.yml@main + secrets: inherit + spectral_linter: + needs: build + name: Spectral linter test cases + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Run test suite + run: | + npm install -g @stoplight/spectral-cli + node linter/run-linter-tests.mjs + examples_linter: + needs: spectral_linter + name: Examples linter tests + runs-on: ubuntu-22.04 + strategy: + matrix: + # Minimum supported and maximum available. + example: [ quarkus ] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 21 + - name: Install Spectral + run: npm install -g @stoplight/spectral-cli + - name: Run linter on ${{ matrix.example }} example + run: ./examples/${{ matrix.example }}/build-and-check-project.sh diff --git a/examples/quarkus/.dockerignore b/examples/quarkus/.dockerignore deleted file mode 100644 index 94810d0..0000000 --- a/examples/quarkus/.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/examples/quarkus/README.md b/examples/quarkus/README.md index f8d87c8..658c06e 100644 --- a/examples/quarkus/README.md +++ b/examples/quarkus/README.md @@ -1,62 +1,15 @@ -# code-with-quarkus +# Quarkus example -This project uses Quarkus, the Supersonic Subatomic Java Framework. +Dit project gebruikt Quarkus: , een Java framework waarmee onder andere API's kunnen worden gebruikt. -If you want to learn more about Quarkus, please visit its website: . - -## Running the application in dev mode - -You can run your application in dev mode that enables live coding using: - -```shell script -./mvnw quarkus:dev -``` - -> **_NOTE:_** Quarkus now ships with a Dev UI, which is available in dev mode only at . - -## Packaging and running the application - -The application can be packaged using: +Om het project te bouwen en een `openapi.json` te genereren, run het volgende: ```shell script ./mvnw package ``` -It produces the `quarkus-run.jar` file in the `target/quarkus-app/` directory. -Be aware that it’s not an _über-jar_ as the dependencies are copied into the `target/quarkus-app/lib/` directory. - -The application is now runnable using `java -jar target/quarkus-app/quarkus-run.jar`. - -If you want to build an _über-jar_, execute the following command: - -```shell script -./mvnw package -Dquarkus.package.jar.type=uber-jar -``` - -The application, packaged as an _über-jar_, is now runnable using `java -jar target/*-runner.jar`. - -## Creating a native executable - -You can create a native executable using: - -```shell script -./mvnw package -Dnative -``` - -Or, if you don't have GraalVM installed, you can run the native executable build in a container using: - -```shell script -./mvnw package -Dnative -Dquarkus.native.container-build=true -``` - -You can then execute your native executable with: `./target/code-with-quarkus-1.0.0-SNAPSHOT-runner` - -If you want to learn more about building native executables, please consult . - -## Provided Code - -### REST - -Easily start your REST Web Services +Dit genereert `target/generated/openapi/openapi.json` op basis van de classes in [`src/main/java/org/acme/`](src/main/java/org/acme/). +Daar kun je de verscheidene annotations bekijken die gebruikt worden om API's te documenteren. +Tevens is er enkele configuratie vereist in [`src/main/resources/application.properties`](src/main/resources/application.properties) om Quarkus goed in te stellen. -[Related guide section...](https://quarkus.io/guides/getting-started-reactive#reactive-jax-rs-resources) +Met deze annotations en configuratie voldoet het example aan alle regels van de API Design Rules. diff --git a/examples/quarkus/build-and-check-project.sh b/examples/quarkus/build-and-check-project.sh new file mode 100755 index 0000000..47fb6d5 --- /dev/null +++ b/examples/quarkus/build-and-check-project.sh @@ -0,0 +1,8 @@ +#!/bin/sh +CURRENT_DIRECTORY=$(dirname "$0") + +cd $CURRENT_DIRECTORY + +./mvnw --no-transfer-progress package + +../run-spectral-linter.sh $(realpath target/generated/openapi/openapi.json) diff --git a/examples/quarkus/run-spectral-linter.sh b/examples/quarkus/run-spectral-linter.sh deleted file mode 100755 index 37c0e52..0000000 --- a/examples/quarkus/run-spectral-linter.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -./mvnw package - -spectral lint -r ../../linter/spectral.yml target/generated/openapi/openapi.json diff --git a/examples/quarkus/src/main/docker/Dockerfile.jvm b/examples/quarkus/src/main/docker/Dockerfile.jvm deleted file mode 100644 index ff46a4f..0000000 --- a/examples/quarkus/src/main/docker/Dockerfile.jvm +++ /dev/null @@ -1,98 +0,0 @@ -#### -# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode -# -# Before building the container image run: -# -# ./mvnw package -# -# Then, build the image with: -# -# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/code-with-quarkus-jvm . -# -# Then run the container using: -# -# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-jvm -# -# If you want to include the debug port into your docker image -# you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. -# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 -# when running the container -# -# Then run the container using : -# -# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-jvm -# -# This image uses the `run-java.sh` script to run the application. -# This scripts computes the command line to execute your Java application, and -# includes memory/GC tuning. -# You can configure the behavior using the following environment properties: -# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") - Be aware that this will override -# the default JVM options, use `JAVA_OPTS_APPEND` to append options -# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options -# in JAVA_OPTS (example: "-Dsome.property=foo") -# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is -# used to calculate a default maximal heap memory based on a containers restriction. -# If used in a container without any memory constraints for the container then this -# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio -# of the container available memory as set here. The default is `50` which means 50% -# of the available memory is used as an upper boundary. You can skip this mechanism by -# setting this value to `0` in which case no `-Xmx` option is added. -# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This -# is used to calculate a default initial heap memory based on the maximum heap memory. -# If used in a container without any memory constraints for the container then this -# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio -# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` -# is used as the initial heap size. You can skip this mechanism by setting this value -# to `0` in which case no `-Xms` option is added (example: "25") -# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. -# This is used to calculate the maximum value of the initial heap memory. If used in -# a container without any memory constraints for the container then this option has -# no effect. If there is a memory constraint then `-Xms` is limited to the value set -# here. The default is 4096MB which means the calculated value of `-Xms` never will -# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") -# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output -# when things are happening. This option, if set to true, will set -# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). -# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: -# true"). -# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). -# - CONTAINER_CORE_LIMIT: A calculated core limit as described in -# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") -# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). -# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. -# (example: "20") -# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. -# (example: "40") -# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. -# (example: "4") -# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus -# previous GC times. (example: "90") -# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") -# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") -# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should -# contain the necessary JRE command-line options to specify the required GC, which -# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). -# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") -# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") -# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be -# accessed directly. (example: "foo.example.com,bar.example.com") -# -### -FROM registry.access.redhat.com/ubi9/openjdk-21:1.21 - -ENV LANGUAGE='en_US:en' - - -# We make four distinct layers so if there are application changes the library layers can be re-used -COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/ -COPY --chown=185 target/quarkus-app/*.jar /deployments/ -COPY --chown=185 target/quarkus-app/app/ /deployments/app/ -COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/ - -EXPOSE 8080 -USER 185 -ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" -ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" - -ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] - diff --git a/examples/quarkus/src/main/docker/Dockerfile.legacy-jar b/examples/quarkus/src/main/docker/Dockerfile.legacy-jar deleted file mode 100644 index 7054d37..0000000 --- a/examples/quarkus/src/main/docker/Dockerfile.legacy-jar +++ /dev/null @@ -1,94 +0,0 @@ -#### -# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode -# -# Before building the container image run: -# -# ./mvnw package -Dquarkus.package.jar.type=legacy-jar -# -# Then, build the image with: -# -# docker build -f src/main/docker/Dockerfile.legacy-jar -t quarkus/code-with-quarkus-legacy-jar . -# -# Then run the container using: -# -# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-legacy-jar -# -# If you want to include the debug port into your docker image -# you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. -# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 -# when running the container -# -# Then run the container using : -# -# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-legacy-jar -# -# This image uses the `run-java.sh` script to run the application. -# This scripts computes the command line to execute your Java application, and -# includes memory/GC tuning. -# You can configure the behavior using the following environment properties: -# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") - Be aware that this will override -# the default JVM options, use `JAVA_OPTS_APPEND` to append options -# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options -# in JAVA_OPTS (example: "-Dsome.property=foo") -# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is -# used to calculate a default maximal heap memory based on a containers restriction. -# If used in a container without any memory constraints for the container then this -# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio -# of the container available memory as set here. The default is `50` which means 50% -# of the available memory is used as an upper boundary. You can skip this mechanism by -# setting this value to `0` in which case no `-Xmx` option is added. -# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This -# is used to calculate a default initial heap memory based on the maximum heap memory. -# If used in a container without any memory constraints for the container then this -# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio -# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` -# is used as the initial heap size. You can skip this mechanism by setting this value -# to `0` in which case no `-Xms` option is added (example: "25") -# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. -# This is used to calculate the maximum value of the initial heap memory. If used in -# a container without any memory constraints for the container then this option has -# no effect. If there is a memory constraint then `-Xms` is limited to the value set -# here. The default is 4096MB which means the calculated value of `-Xms` never will -# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") -# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output -# when things are happening. This option, if set to true, will set -# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). -# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: -# true"). -# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). -# - CONTAINER_CORE_LIMIT: A calculated core limit as described in -# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") -# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). -# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. -# (example: "20") -# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. -# (example: "40") -# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. -# (example: "4") -# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus -# previous GC times. (example: "90") -# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") -# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") -# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should -# contain the necessary JRE command-line options to specify the required GC, which -# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). -# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") -# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") -# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be -# accessed directly. (example: "foo.example.com,bar.example.com") -# -### -FROM registry.access.redhat.com/ubi9/openjdk-21:1.21 - -ENV LANGUAGE='en_US:en' - - -COPY target/lib/* /deployments/lib/ -COPY target/*-runner.jar /deployments/quarkus-run.jar - -EXPOSE 8080 -USER 185 -ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" -ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" - -ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] diff --git a/examples/quarkus/src/main/docker/Dockerfile.native b/examples/quarkus/src/main/docker/Dockerfile.native deleted file mode 100644 index 0e3fa1d..0000000 --- a/examples/quarkus/src/main/docker/Dockerfile.native +++ /dev/null @@ -1,29 +0,0 @@ -#### -# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. -# -# Before building the container image run: -# -# ./mvnw package -Dnative -# -# Then, build the image with: -# -# docker build -f src/main/docker/Dockerfile.native -t quarkus/code-with-quarkus . -# -# Then run the container using: -# -# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus -# -# The ` registry.access.redhat.com/ubi8/ubi-minimal:8.10` base image is based on UBI 9. -# To use UBI 8, switch to `quay.io/ubi8/ubi-minimal:8.10`. -### -FROM registry.access.redhat.com/ubi8/ubi-minimal:8.10 -WORKDIR /work/ -RUN chown 1001 /work \ - && chmod "g+rwX" /work \ - && chown 1001:root /work -COPY --chown=1001:root --chmod=0755 target/*-runner /work/application - -EXPOSE 8080 -USER 1001 - -ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/examples/quarkus/src/main/docker/Dockerfile.native-micro b/examples/quarkus/src/main/docker/Dockerfile.native-micro deleted file mode 100644 index d7f3271..0000000 --- a/examples/quarkus/src/main/docker/Dockerfile.native-micro +++ /dev/null @@ -1,32 +0,0 @@ -#### -# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. -# It uses a micro base image, tuned for Quarkus native executables. -# It reduces the size of the resulting container image. -# Check https://quarkus.io/guides/quarkus-runtime-base-image for further information about this image. -# -# Before building the container image run: -# -# ./mvnw package -Dnative -# -# Then, build the image with: -# -# docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/code-with-quarkus . -# -# Then run the container using: -# -# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus -# -# The `quay.io/quarkus/quarkus-micro-image:2.0` base image is based on UBI 9. -# To use UBI 8, switch to `quay.io/quarkus/quarkus-micro-image:2.0`. -### -FROM quay.io/quarkus/quarkus-micro-image:2.0 -WORKDIR /work/ -RUN chown 1001 /work \ - && chmod "g+rwX" /work \ - && chown 1001:root /work -COPY --chown=1001:root --chmod=0755 target/*-runner /work/application - -EXPOSE 8080 -USER 1001 - -ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/examples/quarkus/src/main/java/org/acme/OpenAPIJsonFilter.java b/examples/quarkus/src/main/java/org/acme/OpenAPIJsonFilter.java index b07f7d7..a8f11f8 100644 --- a/examples/quarkus/src/main/java/org/acme/OpenAPIJsonFilter.java +++ b/examples/quarkus/src/main/java/org/acme/OpenAPIJsonFilter.java @@ -39,9 +39,12 @@ private static APIResponses createOpenApiResponse() { Content jsonContent = OASFactory.createContent() .addMediaType(MediaType.APPLICATION_JSON, OASFactory.createMediaType()); - Header apiVersionsHeader = + Schema stringSchema = OASFactory.createSchema().addType(Schema.SchemaType.STRING); + Header apiVersionsHeader = OASFactory.createHeader().schema(stringSchema); + Header corsHeader = OASFactory.createHeader() - .schema(OASFactory.createSchema().addType(Schema.SchemaType.STRING)); + .description("Available to all origins") + .schema(stringSchema); return OASFactory.createAPIResponses() .addAPIResponse( "200", @@ -49,6 +52,7 @@ private static APIResponses createOpenApiResponse() { .description("Open API specification") .addHeader( OpenApiConstants.API_VERSION_HEADER_NAME, apiVersionsHeader) + .addHeader("access-control-allow-origin", corsHeader) .content(jsonContent)); } } diff --git a/examples/run-spectral-linter.sh b/examples/run-spectral-linter.sh new file mode 100755 index 0000000..567c336 --- /dev/null +++ b/examples/run-spectral-linter.sh @@ -0,0 +1,10 @@ +#!/bin/sh +CURRENT_DIRECTORY=$(dirname "$0") + +# Nodig vanwege https://github.com/stoplightio/spectral/issues/2675 +if ! [ -f "$1" ]; then + echo "Generated $1 does not exist" + exit 1 +fi + +spectral lint -r $CURRENT_DIRECTORY/../linter/spectral.yml $1