diff --git a/.dockerignore b/.dockerignore index 0922a42..6b91788 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,6 @@ * !build/*-runner +!build/**/*-runner !build/*-runner.jar !build/lib/* !build/quarkus-app/* diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4c86567..568767c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,49 +2,132 @@ name: CI Build on: push: - branches: [ main ] + branches: + - main + - alpha + - beta jobs: - build: - name: Build + prepare: + timeout-minutes: 5 runs-on: ubuntu-latest - timeout-minutes: 15 - permissions: - contents: write + outputs: + VERSION: ${{ steps.version.outputs.VERSION }} + DOCKER_TAG: ${{ steps.version.outputs.DOCKER_TAG }} steps: - name: Code Checkout uses: actions/checkout@v6 - name: Get release attributes + id: version run: | - echo "TAGS=latest" >> $GITHUB_ENV SUFFIX="" - VERSION=$(grep 'version =' build.gradle.kts | cut -f 2 -d '"')$SUFFIX - echo "VERSION=$VERSION" >> $GITHUB_ENV - REPO=$(echo $GITHUB_REPOSITORY | cut -f 2 -d "/") - echo "REPO=$REPO" >> $GITHUB_ENV - echo "OWNER=$GITHUB_REPOSITORY_OWNER" >> $GITHUB_ENV + DOCKER_TAG=$GITHUB_REF_NAME + case $GITHUB_REF_NAME in + main) DOCKER_TAG="latest";; + alpha) SUFFIX="A";; + beta) SUFFIX="B";; + esac + echo "DOCKER_TAG=$DOCKER_TAG" >> $GITHUB_OUTPUT + VERSION=$(grep 'version = ' build.gradle.kts | cut -f 2 -d "\"")$SUFFIX + echo "VERSION=$VERSION" >> $GITHUB_OUTPUT - name: Check if version is used run: | - URL=$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/tags/${{ env.VERSION }} - echo "$URL" + URL=$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/tags/${{ steps.version.outputs.VERSION }} 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)" + echo "Release '${{ steps.version.outputs.VERSION }}' already exists. ($CODE)" exit 1 fi + - name: Setup ktlint + run: | + curl -sSLO https://github.com/pinterest/ktlint/releases/download/1.8.0/ktlint + chmod a+x ktlint + sudo mv ktlint /usr/local/bin/ + + - name: Run linter + run: ktlint + - name: Setup Java uses: actions/setup-java@v5 with: distribution: 'adopt' java-version: '21' - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v5 + - name: Generating self-signed certificate + run: | + openssl req \ + -newkey rsa:2048 \ + -new \ + -nodes \ + -x509 \ + -days 2 \ + -keyout key.pem \ + -out cert.pem \ + -subj "/CN=localhost" + + - name: Tests + run: ./gradlew test + + - name: Upload Jacoco Report + uses: actions/upload-artifact@v7 with: - cache-read-only: false + name: jacoco-report + path: build/jacoco-report + if-no-files-found: error + retention-days: 1 + + build-native: + needs: prepare + timeout-minutes: 10 + strategy: + matrix: + include: + - os: ubuntu-latest + arch: amd64 + - os: ubuntu-24.04-arm + arch: arm64 + runs-on: ${{ matrix.os }} + steps: + - name: Code Checkout + uses: actions/checkout@v6 + + - name: Setup GraalVM + uses: graalvm/setup-graalvm@v1 + with: + java-version: '21' + distribution: 'graalvm-community' + github-token: ${{ secrets.GITHUB_TOKEN }} + cache: 'gradle' + + - name: Build Native Executable + run: | + ./gradlew build -Dquarkus.package.jar.enabled=false \ + -Dquarkus.native.enabled=true \ + -Dquarkus.native.compression.level=5 \ + -x test + + - name: Upload Native Binary + uses: actions/upload-artifact@v7 + with: + name: native-executable-${{ matrix.arch }} + path: build/*-runner + if-no-files-found: error + retention-days: 1 + + publish: + needs: + - prepare + - build-native + timeout-minutes: 5 + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Code checkout + uses: actions/checkout@v6 - name: Generating self-signed certificate run: | @@ -58,31 +141,58 @@ jobs: -out cert.pem \ -subj "/C=US/ST=SC/L=Hometown/O=IT/emailAddress=root@localhost/CN=localhost" - - name: Test & Build - run: | - ./gradlew build --no-daemon \ - -Dquarkus.package.type=native \ - -Dquarkus.native.container-build=true \ - -Dquarkus.container-image.build=true \ - -Dquarkus.container-image.push=true \ - -Dquarkus.container-image.username=${{ env.OWNER }} \ - -Dquarkus.container-image.password=${{ secrets.DOCKER_TOKEN }} \ - -Dquarkus.container-image.group=${{ env.OWNER }} \ - -Dquarkus.container-image.name=${{ env.REPO }} \ - -Dquarkus.container-image.tag=${{ env.VERSION }} \ - -Dquarkus.container-image.additional-tags=${{ env.TAGS }} + - name: Download Jacoco Report + uses: actions/download-artifact@v8 + with: + name: jacoco-report + path: build/jacoco-report + + - name: Download AMD64 Binary + uses: actions/download-artifact@v8 + with: + name: native-executable-amd64 + path: build/amd64 + + - name: Download ARM64 Binary + uses: actions/download-artifact@v8 + with: + name: native-executable-arm64 + path: build/arm64 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Registry + uses: docker/login-action@v3 + with: + username: ${{ github.repository_owner }} + password: ${{ secrets.DOCKER_TOKEN }} + + - name: Docker Build & Push + uses: docker/build-push-action@v6 + with: + push: true + context: . + file: src/main/docker/Dockerfile.native-multi-arch + platforms: linux/amd64,linux/arm64 + tags: | + ${{ github.repository }}:${{ needs.prepare.outputs.VERSION }} + ${{ github.repository }}:${{ needs.prepare.outputs.DOCKER_TAG }} - name: Creating GitHub Tag uses: mathieudutour/github-tag-action@v6.2 with: - custom_tag: ${{ env.VERSION }} + custom_tag: ${{ needs.prepare.outputs.VERSION }} tag_prefix: '' github_token: ${{ secrets.GITHUB_TOKEN }} - name: Create GitHub Release uses: ncipollo/release-action@v1 with: - tag: ${{ env.VERSION }} + tag: ${{ needs.prepare.outputs.VERSION }} token: ${{ secrets.GITHUB_TOKEN }} - name: Overwrite Coverage Theme diff --git a/README.md b/README.md index 0e8f35a..22f236f 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,7 @@ Thank you for your continued support! ## PIX Sua contribuição ajudará a impulsionar o desenvolvimento de ferramentas de -qualidade para a comunidade de desenvolvedores Flutter e Dart. Qualquer quantia -será apreciada. +qualidade para a comunidade de desenvolvedores. Qualquer quantia será apreciada. Obrigado pelo seu apoio contínuo! [![PIX](helpers/pix.png)](https://nubank.com.br/pagar/2bt2q/RBr4Szfuwr) @@ -92,5 +91,4 @@ openssl req \ - /openapi - /swagger-ui - /health -- /metrics - /info diff --git a/build.gradle.kts b/build.gradle.kts index 1f360d4..1570639 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ plugins { - kotlin("jvm") version "2.2.21" - kotlin("plugin.allopen") version "2.2.21" + kotlin("jvm") version "2.3.10" + kotlin("plugin.allopen") version "2.3.10" id("io.quarkus") } @@ -20,12 +20,10 @@ dependencies { ), ) implementation("io.smallrye.config:smallrye-config-source-file-system") - implementation("io.quarkus:quarkus-micrometer-registry-prometheus") implementation("io.quarkus:quarkus-smallrye-openapi") implementation("io.quarkus:quarkus-smallrye-health") implementation("io.quarkus:quarkus-rest") implementation("io.quarkus:quarkus-rest-jackson") - implementation("io.quarkus:quarkus-container-image-docker") implementation("io.quarkus:quarkus-info") implementation("io.quarkus:quarkus-kotlin") implementation("io.quarkus:quarkus-arc") @@ -37,7 +35,7 @@ dependencies { } group = "com.testainers" -version = "0.3.0" +version = "0.4.0" java { sourceCompatibility = JavaVersion.VERSION_21 @@ -45,13 +43,6 @@ java { } tasks.withType { - systemProperty( - "java.util.logging.manager", - "org.jboss.logmanager.LogManager", - ) - - jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED") - testLogging { events( "PASSED", diff --git a/gradle.properties b/gradle.properties index a8fe039..3a2f18c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,17 +1,11 @@ # Gradle properties quarkusPluginId=io.quarkus -quarkusPluginVersion=3.30.6 +quarkusPluginVersion=3.32.1 quarkusPlatformGroupId=io.quarkus.platform quarkusPlatformArtifactId=quarkus-bom -quarkusPlatformVersion=3.30.6 +quarkusPlatformVersion=3.32.1 -# 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 +org.gradle.configuration-cache=true +org.gradle.configuration-cache.parallel=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index af0e1ab..17c9e60 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,8 +1,8 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -# https://gradle.org/release-checksums/ -distributionSha256Sum=f86344275d1b194688dd330abf9f6f2344cd02872ffee035f2d1ea2fd60cf7f3 -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-all.zip +distributionSha256Sum=17f277867f6914d61b1aa02efab1ba7bb439ad652ca485cd8ca6842fccec6e43 +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-all.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/docker/Dockerfile.jvm b/src/main/docker/Dockerfile.jvm index c826bc6..7d6f1de 100644 --- a/src/main/docker/Dockerfile.jvm +++ b/src/main/docker/Dockerfile.jvm @@ -77,7 +77,7 @@ # accessed directly. (example: "foo.example.com,bar.example.com") # ### -FROM registry.access.redhat.com/ubi9/openjdk-21:1.23 +FROM registry.access.redhat.com/ubi9/openjdk-21:1.24 ENV LANGUAGE='en_US:en' diff --git a/src/main/docker/Dockerfile.legacy-jar b/src/main/docker/Dockerfile.legacy-jar index b83dbd8..546b3e8 100644 --- a/src/main/docker/Dockerfile.legacy-jar +++ b/src/main/docker/Dockerfile.legacy-jar @@ -77,7 +77,7 @@ # accessed directly. (example: "foo.example.com,bar.example.com") # ### -FROM registry.access.redhat.com/ubi9/openjdk-21:1.23 +FROM registry.access.redhat.com/ubi9/openjdk-21:1.24 ENV LANGUAGE='en_US:en' diff --git a/src/main/docker/Dockerfile.native-multi-arch b/src/main/docker/Dockerfile.native-multi-arch new file mode 100644 index 0000000..8173d50 --- /dev/null +++ b/src/main/docker/Dockerfile.native-multi-arch @@ -0,0 +1,19 @@ +FROM quay.io/quarkus/ubi9-quarkus-micro-image:2.0 + +ARG TARGETARCH + +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work + +COPY --chown=1001:root build/${TARGETARCH}/*-runner /work/httpbucket +RUN chmod +x /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 ["./httpbucket", "-Dquarkus.http.host=0.0.0.0"] diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index bfeb1a8..c4d7bb1 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -10,8 +10,6 @@ quarkus.application.name=httpbucket quarkus.ssl.native=true %dev.quarkus.http.host=0.0.0.0 # -quarkus.docker.dockerfile-native-path=src/main/docker/Dockerfile.native-micro -# quarkus.http.ssl.certificate.files=${httpbucket.ssl.cert:cert.pem} quarkus.http.ssl.certificate.key-files=${httpbucket.ssl.key:key.pem} # @@ -19,8 +17,6 @@ quarkus.info.path=/info # quarkus.smallrye-health.root-path=/health # -quarkus.micrometer.export.prometheus.path=/metrics -# quarkus.smallrye-openapi.path=/openapi quarkus.smallrye-openapi.info-title=httpbucket quarkus.smallrye-openapi.security-scheme=basic