diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index 0ce4d19..5f27461 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -5,8 +5,6 @@ on: - '*' jobs: build: - env: - RUNNER_TOOL_CACHE: /toolcache runs-on: hostinger steps: - name: Checkout sources @@ -19,49 +17,53 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 - name: Execute Gradle build - env: - PUBLISHER_TOKEN: ${{ secrets.PUBLISHER_TOKEN }} run: ./gradlew build - - name: Publish artifacts - env: - PUBLISHER_TOKEN: ${{ secrets.PUBLISHER_TOKEN }} - run: ./gradlew publish - build-docker: - name: "Build Docker images" - runs-on: hostinger - steps: - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.4.0 + - name: Prepare Docker image build + run: ./gradlew prepareDockerBuild + - name: Get project version + id: retrieve-version + run: ./gradlew -q version >> "$GITHUB_OUTPUT" + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 with: driver: docker-container - - - name: Login to Gitea container registry + - name: Login to Gitea container registry uses: docker/login-action@v3 with: registry: gitea.woggioni.net username: woggioni password: ${{ secrets.PUBLISHER_TOKEN }} - - name: Build and push gbcs images - uses: docker/build-push-action@v6 + name: Build gbcs Docker image + uses: docker/build-push-action@v5.3.0 with: + context: "docker/build/docker" + platforms: linux/amd64,linux/arm64 push: true pull: true tags: | - "gitea.woggioni.net/woggioni/gbcs:slim" - cache-from: type=registry,ref=gitea.woggioni.net/woggioni/gbcs:buildx - cache-to: type=registry,mode=max,compression=zstd,image-manifest=true,oci-mediatypes=true,ref=gitea.woggioni.net/woggioni/gbcs:buildx + gitea.woggioni.net/woggioni/gbcs:latest + gitea.woggioni.net/woggioni/gbcs:${{ steps.retrieve-version.outputs.VERSION }} target: release + cache-from: type=registry,ref=gitea.woggioni.net/woggioni/gbcs:buildx - - name: Build and push gbcs memcached image - uses: docker/build-push-action@v6 + name: Build gbcs memcached Docker image + uses: docker/build-push-action@v5.3.0 with: + context: "docker/build/docker" + platforms: linux/amd64,linux/arm64 push: true pull: true tags: | - "gitea.woggioni.net/woggioni/gbcs:latest" - "gitea.woggioni.net/woggioni/gbcs:memcached" + gitea.woggioni.net/woggioni/gbcs:memcached + gitea.woggioni.net/woggioni/gbcs:memcached-${{ steps.retrieve-version.outputs.VERSION }} + target: release-memcached cache-from: type=registry,ref=gitea.woggioni.net/woggioni/gbcs:buildx cache-to: type=registry,mode=max,compression=zstd,image-manifest=true,oci-mediatypes=true,ref=gitea.woggioni.net/woggioni/gbcs:buildx - target: release-memcached + - name: Publish artifacts + env: + PUBLISHER_TOKEN: ${{ secrets.PUBLISHER_TOKEN }} + run: ./gradlew publish + diff --git a/Dockerfile b/Dockerfile index 51275c9..e960414 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,46 +1,2 @@ -FROM container-registry.oracle.com/graalvm/native-image:21 AS oracle - -FROM ubuntu:24.04 AS build -COPY --from=oracle /usr/lib64/graalvm/ /usr/lib64/graalvm/ -ENV JAVA_HOME=/usr/lib64/graalvm/graalvm-java21 -USER ubuntu -WORKDIR /home/ubuntu - -RUN mkdir gbcs -WORKDIR /home/ubuntu/gbcs - -COPY --chown=ubuntu:users ./.git ./.git -COPY --chown=ubuntu:users gbcs-base gbcs-base -COPY --chown=ubuntu:users gbcs-api gbcs-api -COPY --chown=ubuntu:users gbcs-memcached gbcs-memcached -COPY --chown=ubuntu:users gbcs-cli gbcs-cli -COPY --chown=ubuntu:users src src -COPY --chown=ubuntu:users settings.gradle settings.gradle -COPY --chown=ubuntu:users build.gradle build.gradle -COPY --chown=ubuntu:users gradle.properties gradle.properties -COPY --chown=ubuntu:users gradle gradle -COPY --chown=ubuntu:users gradlew gradlew - -RUN --mount=type=cache,target=/home/ubuntu/.gradle,uid=1000,gid=1000 ./gradlew --no-daemon clean assemble - -FROM alpine:latest AS base-release -RUN --mount=type=cache,target=/var/cache/apk apk update -RUN --mount=type=cache,target=/var/cache/apk apk add openjdk21-jre -RUN adduser -D luser -USER luser -WORKDIR /home/luser - -FROM base-release AS release -RUN --mount=type=bind,from=build,source=/home/ubuntu/gbcs/gbcs-cli/build,target=/home/luser/build cp build/libs/gbcs-cli-envelope-*.jar gbcs.jar -ENTRYPOINT ["java", "-jar", "/home/luser/gbcs.jar"] - -FROM base-release AS release-memcached -RUN --mount=type=bind,from=build,source=/home/ubuntu/gbcs/gbcs-cli/build,target=/home/luser/build cp build/libs/gbcs-cli-envelope-*.jar gbcs.jar -RUN mkdir plugins -WORKDIR /home/luser/plugins -RUN --mount=type=bind,from=build,source=/home/ubuntu/gbcs/gbcs-memcached/build/distributions,target=/build/distributions tar -xf /build/distributions/gbcs-memcached*.tar -WORKDIR /home/luser -ENTRYPOINT ["java", "-jar", "/home/luser/gbcs.jar"] - -FROM release-memcached as compose -COPY --chown=luser:luser conf/gbcs-memcached.xml /home/luser/.config/gbcs/gbcs.xml \ No newline at end of file +FROM gitea.woggioni.net/woggioni/gbcs:memcached +COPY --chown=luser:luser conf/gbcs-memcached.xml /home/luser/.config/gbcs/gbcs.xml diff --git a/build.gradle b/build.gradle index b7681cb..e9d53f9 100644 --- a/build.gradle +++ b/build.gradle @@ -130,3 +130,9 @@ publishing { } } +tasks.register('version') { + doLast { + println("VERSION=$version") + } +} + diff --git a/docker-compose.yml b/docker-compose.yml index 0c0ba68..597abf4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,6 @@ services: gbcs: build: context: . - target: compose container_name: gbcs restart: unless-stopped ports: diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..5c57268 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,21 @@ +FROM alpine:latest AS base-release +RUN --mount=type=cache,target=/var/cache/apk apk update +RUN --mount=type=cache,target=/var/cache/apk apk add openjdk21-jre +RUN adduser -D luser +USER luser +WORKDIR /home/luser + +FROM base-release AS release +ADD gbcs-cli-envelope-*.jar gbcs.jar +ENTRYPOINT ["java", "-jar", "/home/luser/gbcs.jar"] + +FROM base-release AS release-memcached +ADD --chown=luser:luser gbcs-cli-envelope-*.jar gbcs.jar +RUN mkdir plugins +WORKDIR /home/luser/plugins +RUN --mount=type=bind,source=.,target=/build/distributions tar -xf /build/distributions/gbcs-memcached*.tar +WORKDIR /home/luser +ENTRYPOINT ["java", "-jar", "/home/luser/gbcs.jar"] + +FROM release-memcached as compose +COPY --chown=luser:luser conf/gbcs-memcached.xml /home/luser/.config/gbcs/gbcs.xml \ No newline at end of file diff --git a/docker/build.gradle b/docker/build.gradle new file mode 100644 index 0000000..5b4eb0c --- /dev/null +++ b/docker/build.gradle @@ -0,0 +1,67 @@ +plugins { + id 'base' + alias(catalog.plugins.gradle.docker) +} + +import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage +import com.bmuschko.gradle.docker.tasks.image.DockerPushImage +import com.bmuschko.gradle.docker.tasks.image.DockerTagImage + + +configurations { + docker { + canBeResolved = true + transitive = false + visible = false + canBeConsumed = false + } +} + +dependencies { + docker project(path: ':gbcs-cli', configuration: 'release') + docker project(path: ':gbcs-memcached', configuration: 'release') +} + +Provider cleanTaskProvider = tasks.named(BasePlugin.CLEAN_TASK_NAME) {} + +Provider prepareDockerBuild = tasks.register('prepareDockerBuild', Copy) { + dependsOn cleanTaskProvider + group = 'docker' + into project.layout.buildDirectory.file('docker') + from(configurations.docker) + from(file('Dockerfile')) +} + +Provider dockerBuild = tasks.register('dockerBuildImage', DockerBuildImage) { + group = 'docker' + dependsOn prepareDockerBuild + images.add('gitea.woggioni.net/woggioni/gbcs:latest') + images.add("gitea.woggioni.net/woggioni/gbcs:${version}") +} + +Provider dockerTag = tasks.register('dockerTagImage', DockerTagImage) { + group = 'docker' + repository = 'gitea.woggioni.net/woggioni/gbcs' + imageId = 'gitea.woggioni.net/woggioni/gbcs:latest' + tag = version +} + +Provider dockerTagMemcached = tasks.register('dockerTagMemcachedImage', DockerTagImage) { + group = 'docker' + repository = 'gitea.woggioni.net/woggioni/gbcs' + imageId = 'gitea.woggioni.net/woggioni/gbcs:memcached' + tag = "${version}-memcached" +} + +Provider dockerPush = tasks.register('dockerPushImage', DockerPushImage) { + group = 'docker' + dependsOn dockerTag, dockerTagMemcached + registryCredentials { + url = getProperty('docker.registry.url') + username = 'woggioni' + password = System.getenv().get("PUBLISHER_TOKEN") + } + images = [dockerTag.flatMap{ it.tag }, dockerTagMemcached.flatMap{ it.tag }] +} + + diff --git a/gbcs-cli/build.gradle b/gbcs-cli/build.gradle index 58cda27..7067b7e 100644 --- a/gbcs-cli/build.gradle +++ b/gbcs-cli/build.gradle @@ -21,6 +21,15 @@ tasks.named(JavaPlugin.COMPILE_JAVA_TASK_NAME, JavaCompile) { options.javaModuleMainClass = mainClassName } +configurations { + release { + transitive = false + canBeConsumed = true + canBeResolved = true + visible = true + } +} + envelopeJar { mainModule = 'net.woggioni.gbcs.cli' mainClass = mainClassName @@ -56,6 +65,10 @@ tasks.named(NativeImagePlugin.NATIVE_IMAGE_TASK_NAME, NativeImageTask) { buildStaticImage = true } +artifacts { + release(envelopeJarTaskProvider) +} + publishing { publications { maven(MavenPublication) { @@ -64,3 +77,4 @@ publishing { } } + diff --git a/gbcs-memcached/build.gradle b/gbcs-memcached/build.gradle index abd2869..2714820 100644 --- a/gbcs-memcached/build.gradle +++ b/gbcs-memcached/build.gradle @@ -22,7 +22,15 @@ configurations { } } } + + release { + transitive = false + canBeConsumed = true + canBeResolved = true + visible = true + } } + dependencies { compileOnly project(':gbcs-base') compileOnly project(':gbcs-api') @@ -40,6 +48,10 @@ tasks.named(BasePlugin.ASSEMBLE_TASK_NAME) { dependsOn(bundleTask) } +artifacts { + release(bundleTask) +} + publishing { publications { maven(MavenPublication) { diff --git a/gradle.properties b/gradle.properties index 6af0cd9..83092ab 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,3 +7,4 @@ gbcs.version = 0.0.1 lys.version = 2025.01.10 gitea.maven.url = https://gitea.woggioni.net/api/packages/woggioni/maven +docker.registry.url=gitea.woggioni.net diff --git a/settings.gradle b/settings.gradle index 9122d9b..2742140 100644 --- a/settings.gradle +++ b/settings.gradle @@ -30,5 +30,6 @@ include 'gbcs-api' include 'gbcs-base' include 'gbcs-memcached' include 'gbcs-cli' +include 'docker'