Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ root = true
insert_final_newline = true

[{*.kt,*.kts}]
ident_size = 4
indent_size = 4
max_line_length = 80
ktlint_code_style = ktlint_official
ktlint_experimental = enabled
Expand Down
23 changes: 14 additions & 9 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,9 @@ jobs:
contents: write
steps:
- name: Code Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6

- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'adopt'
java-version: '21'

- name: Get Gradle Version
- name: Get release attributes
run: |
echo "TAGS=latest" >> $GITHUB_ENV
SUFFIX=""
Expand All @@ -35,12 +29,23 @@ jobs:
run: |
URL=$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/tags/${{ env.VERSION }}
echo "$URL"
CODE=$(curl -s -o /dev/null -w "%{http_code}" "$URL")
CODE=$(curl -s -H "Authorization: Bearer ${{ github.token }}" -o /dev/null -w "%{http_code}" "$URL")
if [ "$CODE" != 404 ]; then
echo "Release '$VERSION' already exists. ($CODE)"
exit 1
fi

- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: 'adopt'
java-version: '21'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v5
with:
cache-read-only: false

- name: Generating self-signed certificate
run: |
openssl req \
Expand Down
11 changes: 8 additions & 3 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,19 @@ jobs:
timeout-minutes: 20
steps:
- name: Code Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6

- name: Setup Java
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
distribution: 'adopt'
java-version: '21'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v5
with:
cache-read-only: false

- name: Generating self-signed certificate
run: |
openssl req \
Expand All @@ -30,4 +35,4 @@ jobs:
-subj "/CN=localhost"

- name: Tests
run: ./gradlew test --no-daemon
run: ./gradlew test
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,5 @@ nb-configuration.xml

# Certificates
*.pem

ktlint
9 changes: 7 additions & 2 deletions build-image.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,15 @@ if [ ! -f "build/httpbucket-$VERSION-runner" ]
then
./gradlew clean

./gradlew build -Dquarkus.package.type=native \
-Dquarkus.native.container-build=true
./gradlew build -Dquarkus.package.jar.enabled=false \
-Dquarkus.native.enabled=true \
-Dquarkus.native.compression.level=5
fi

docker build . -f src/main/docker/Dockerfile.native-micro \
-t "httpbucket-local:$VERSION" \
-t "httpbucket-local:latest"

docker run --rm --name httpbucket \
-p 8080:8080 -p 8443:8443 \
"httpbucket-local:$VERSION"
8 changes: 5 additions & 3 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
plugins {
kotlin("jvm") version "2.1.21"
kotlin("plugin.allopen") version "2.1.21"
kotlin("jvm") version "2.2.21"
kotlin("plugin.allopen") version "2.2.21"
id("io.quarkus")
}

Expand Down Expand Up @@ -37,7 +37,7 @@ dependencies {
}

group = "com.testainers"
version = "0.2.0"
version = "0.3.0"

java {
sourceCompatibility = JavaVersion.VERSION_21
Expand All @@ -50,6 +50,8 @@ tasks.withType<Test> {
"org.jboss.logmanager.LogManager",
)

jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED")

testLogging {
events(
"PASSED",
Expand Down
2 changes: 1 addition & 1 deletion coverage.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ set -e

/bin/cp -rf helpers/jacoco-report/* build/jacoco-report/.

# /opt/google/chrome/google-chrome build/coverage/index.html
# /opt/google/chrome/google-chrome "file://$(pwd)/build/jacoco-report/index.html"
17 changes: 14 additions & 3 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,17 @@
#Gradle properties
# Gradle properties

quarkusPluginId=io.quarkus
quarkusPluginVersion=3.23.4
quarkusPluginVersion=3.30.6
quarkusPlatformGroupId=io.quarkus.platform
quarkusPlatformArtifactId=quarkus-bom
quarkusPlatformVersion=3.23.4
quarkusPlatformVersion=3.30.6

# Executa tasks em paralelo (ex: compila modulo A e B ao mesmo tempo)
org.gradle.parallel=true

# Habilita o cache local de build (reutiliza outputs de tasks)
org.gradle.caching=true

# Aumenta a mem�ria da JVM (ajuste conforme a capacidade do runner do GitHub)
# O runner padr�o tem 7GB de RAM total. N�o aloque tudo para o Gradle.
org.gradle.jvmargs=-Xmx3g -XX:+UseParallelGC
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
5 changes: 4 additions & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
# https://gradle.org/release-checksums/
distributionSha256Sum=f86344275d1b194688dd330abf9f6f2344cd02872ffee035f2d1ea2fd60cf7f3
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-all.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
4 changes: 1 addition & 3 deletions src/main/docker/Dockerfile.jvm
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@
# accessed directly. (example: "foo.example.com,bar.example.com")
#
###
FROM registry.access.redhat.com/ubi8/openjdk-21:1.21
FROM registry.access.redhat.com/ubi9/openjdk-21:1.23

ENV LANGUAGE='en_US:en'

Expand All @@ -88,9 +88,7 @@ COPY --chown=185 build/quarkus-app/app/ /deployments/app/
COPY --chown=185 build/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"

Expand Down
4 changes: 1 addition & 3 deletions src/main/docker/Dockerfile.legacy-jar
Original file line number Diff line number Diff line change
Expand Up @@ -77,17 +77,15 @@
# accessed directly. (example: "foo.example.com,bar.example.com")
#
###
FROM registry.access.redhat.com/ubi8/openjdk-21:1.21
FROM registry.access.redhat.com/ubi9/openjdk-21:1.23

ENV LANGUAGE='en_US:en'

COPY build/lib/* /deployments/lib/
COPY build/*-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"

Expand Down
12 changes: 5 additions & 7 deletions src/main/docker/Dockerfile.native
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,17 @@
#
# docker run -i --rm -p 8080:8080 quarkus/httpbucket
#
# The ` registry.access.redhat.com/ubi9/ubi-minimal:9.7` 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/ubi9/ubi-minimal:9.5

FROM registry.access.redhat.com/ubi9/ubi-minimal:9.7
WORKDIR /work/

RUN chown 1001 /work \
&& chmod "g+rwX" /work \
&& chown 1001:root /work

COPY --chown=1001:root --chmod=0755 build/*-runner /work/application
COPY --chown=1001:root --chmod=0755 build/*-runner /work/httpbucket

EXPOSE 8080

USER 1001

ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"]
ENTRYPOINT ["./httpbucket", "-Dquarkus.http.host=0.0.0.0"]
11 changes: 5 additions & 6 deletions src/main/docker/Dockerfile.native-micro
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@
#
# docker run -i --rm -p 8080:8080 quarkus/httpbucket
#
# The `quay.io/quarkus/ubi9-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

FROM quay.io/quarkus/ubi9-quarkus-micro-image:2.0
WORKDIR /work/

RUN chown 1001 /work \
&& chmod "g+rwX" /work \
&& chown 1001:root /work
Expand All @@ -31,13 +31,12 @@ ADD --chown=1001:root \

RUN chmod +x /usr/bin/check

COPY --chown=1001:root --chmod=0755 build/*-runner /work/application
COPY --chown=1001:root --chmod=0755 build/*-runner /work/httpbucket
COPY --chown=1001:root cert.pem /work/cert.pem
COPY --chown=1001:root key.pem /work/key.pem

EXPOSE 8080
EXPOSE 8443

USER 1001

ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"]
ENTRYPOINT ["./httpbucket", "-Dquarkus.http.host=0.0.0.0"]
7 changes: 5 additions & 2 deletions src/main/kotlin/com/testainers/BasicAuthResource.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ package com.testainers
import io.quarkus.security.Authenticated
import io.vertx.core.http.HttpServerRequest
import jakarta.ws.rs.*
import jakarta.ws.rs.core.*
import jakarta.ws.rs.core.HttpHeaders
import jakarta.ws.rs.core.MediaType
import jakarta.ws.rs.core.Response
import jakarta.ws.rs.core.UriInfo
import org.eclipse.microprofile.openapi.annotations.responses.APIResponse
import org.eclipse.microprofile.openapi.annotations.responses.APIResponses
import org.jboss.resteasy.reactive.RestHeader
Expand Down Expand Up @@ -87,7 +90,7 @@ class BasicAuthResource(
bodyMap["message"] = "Forbidden."
bodyMap["body"] = body

if (auth.isNullOrBlank()) {
if (auth == null) {
code = 401
bodyMap["message"] = "Authorization header not present."
} else {
Expand Down
12 changes: 10 additions & 2 deletions src/main/kotlin/com/testainers/LengthResource.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.testainers

import io.quarkus.vertx.http.Uncompressed
import jakarta.ws.rs.*
import jakarta.ws.rs.core.*
import jakarta.ws.rs.core.HttpHeaders
import jakarta.ws.rs.core.MediaType
import jakarta.ws.rs.core.Response
import org.eclipse.microprofile.openapi.annotations.media.Content
import org.eclipse.microprofile.openapi.annotations.media.Schema
import org.eclipse.microprofile.openapi.annotations.parameters.Parameter
Expand All @@ -26,6 +29,7 @@ import org.jboss.resteasy.reactive.RestHeader
APIResponse(responseCode = "500", description = "Invalid size: X."),
)
class LengthResource {
@Uncompressed
@GET
fun get(
@RestHeader(HttpHeaders.ACCEPT) accept: String,
Expand All @@ -40,6 +44,7 @@ class LengthResource {
) size: Int,
): Response = internal(accept, size)

@Uncompressed
@POST
fun post(
@RestHeader(HttpHeaders.ACCEPT) accept: String,
Expand All @@ -54,6 +59,7 @@ class LengthResource {
) size: Int,
): Response = internal(accept, size)

@Uncompressed
@PUT
fun put(
@RestHeader(HttpHeaders.ACCEPT) accept: String,
Expand All @@ -68,6 +74,7 @@ class LengthResource {
) size: Int,
): Response = internal(accept, size)

@Uncompressed
@PATCH
fun patch(
@RestHeader(HttpHeaders.ACCEPT) accept: String,
Expand All @@ -82,6 +89,7 @@ class LengthResource {
) size: Int,
): Response = internal(accept, size)

@Uncompressed
@DELETE
fun delete(
@RestHeader(HttpHeaders.ACCEPT) accept: String,
Expand All @@ -100,7 +108,7 @@ class LengthResource {
accept: String,
size: Int,
): Response =
if (size < 1 || size > 2048) {
if (size !in 1..2048) {
Response
.status(500)
.header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN)
Expand Down
6 changes: 4 additions & 2 deletions src/main/kotlin/com/testainers/RedirectResource.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.testainers

import jakarta.ws.rs.*
import jakarta.ws.rs.core.*
import jakarta.ws.rs.core.HttpHeaders
import jakarta.ws.rs.core.MediaType
import jakarta.ws.rs.core.Response
import org.eclipse.microprofile.openapi.annotations.media.Schema
import org.eclipse.microprofile.openapi.annotations.parameters.Parameter
import org.eclipse.microprofile.openapi.annotations.responses.APIResponse
Expand Down Expand Up @@ -126,7 +128,7 @@ class RedirectResource {
.build()
}

if (code < 300 || code > 399) {
if (code !in 300..399) {
return Response
.status(500)
.header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN)
Expand Down
6 changes: 4 additions & 2 deletions src/main/kotlin/com/testainers/StatusResource.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package com.testainers

import io.vertx.core.http.HttpServerRequest
import jakarta.ws.rs.*
import jakarta.ws.rs.core.*
import jakarta.ws.rs.core.MediaType
import jakarta.ws.rs.core.Response
import jakarta.ws.rs.core.UriInfo
import org.eclipse.microprofile.openapi.annotations.media.Schema
import org.eclipse.microprofile.openapi.annotations.parameters.Parameter

Expand Down Expand Up @@ -86,7 +88,7 @@ class StatusResource(
var status = code
val responseBody = ResponseBody(request, uriInfo, body)

if (status < 200 || status > 599) {
if (status !in 200..599) {
val message =
if (status in 100..199) {
"Informational responses are not supported: %d"
Expand Down
Loading