diff --git a/.gitignore b/.gitignore index eede1c1..b576082 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ # Ignore Gradle build output directory build +/logs/ diff --git a/build.gradle.kts b/build.gradle.kts index 7b0174c..001ec8d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("java") + id("application") id("maven-publish") } @@ -9,6 +10,10 @@ if (version == "UNSET" && gradle.startParameter.taskNames.any { it.startsWith("p throw GradleException("You must set -Pversion=... (use publish.sh / publishCICD.sh)") } +application { + mainClass.set("com.r35157.nenjim.kicker.impl.ref.KickerImpl") +} + repositories { mavenLocal() @@ -46,6 +51,23 @@ tasks.withType { options.compilerArgs.add("--enable-preview") } +val dockerLibsDir = layout.buildDirectory.dir("docker/libs") + +tasks.register("prepareDockerLibs") { + group = "distribution" + description = "Copies all runtime dependencies (transitive) to build/docker/libs" + + // Hvis du også vil bygge dit eget jar samtidig, så lad den stå – ellers kan du fjerne den. + dependsOn(tasks.named("jar")) + + into(dockerLibsDir) + + // Kun deps (transitivt) + from(configurations.runtimeClasspath) + + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + publishing { publications { create("mavenJava") { diff --git a/build.sh b/build.sh index b25e4e6..d854bec 100755 --- a/build.sh +++ b/build.sh @@ -1,6 +1,45 @@ +#!/usr/bin/env bash +set -euo pipefail + +JREVERSION=25.0.2-0 + export VERSION=$(git describe --tags --exact-match 2>/dev/null \ || git symbolic-ref --short -q HEAD \ || git rev-parse --short HEAD) -echo "Building $VERSION..." -./gradlew -Pversion=$VERSION jar +GITHASH=$(git rev-parse --short=8 HEAD) + +export VERSION_LONG=${VERSION}_${GITHASH} + +# Build this artifact +echo "Building 'NenjimKicker v${VERSION_LONG}'..." +./gradlew -Pversion=$VERSION jar prepareDockerLibs +# Prepare container dependencies +mkdir -p build/docker/conf +cd build/docker +cp ../../src/main/docker/start.sh start.sh +cp ../libs/kicker-impl-ref-*.jar libs +cp ../../conf/* conf +sed -e "s|_VERSION_|${VERSION}|g" \ + -e "s|_JREVERSION_|${JREVERSION}|g" \ + ../../src/main/docker/Dockerfile_template > Dockerfile + +# Build the container +GROUP=r35157 +NAME=nenjimkicker +BASETAG=dockerreg.r35157.com/${GROUP}/${NAME} +HASHTAG=${BASETAG}:${GITHASH}_amd64 +VERSIONTAG=${BASETAG}:${VERSION}_amd64 +LATESTTAG=${BASETAG}:latest_amd64 +CANONICALNAME=${HASHTAG} + +docker build -t ${CANONICALNAME} . +docker tag ${CANONICALNAME} ${VERSIONTAG} +docker tag ${CANONICALNAME} ${LATESTTAG} + +# Prepare publishing script +sed -e "s|_HASHTAG_|${HASHTAG}|g" \ + -e "s|_VERSIONTAG_|${VERSIONTAG}|g" \ + -e "s|_LATESTTAG_|${LATESTTAG}|g" \ + ../../src/main/docker/publish_template.sh > publish.sh +chmod 755 publish.sh diff --git a/clean.sh b/clean.sh index d97f0e1..1360dac 100755 --- a/clean.sh +++ b/clean.sh @@ -1 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + ./gradlew clean ; rm -rf build diff --git a/conf/log4j2.xml b/conf/log4j2.xml new file mode 100644 index 0000000..3412f1c --- /dev/null +++ b/conf/log4j2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/publish.sh b/publish.sh index 5f925a9..bb61727 100755 --- a/publish.sh +++ b/publish.sh @@ -1,6 +1,12 @@ +#!/usr/bin/env bash +set -euo pipefail + export VERSION=$(git describe --tags --exact-match 2>/dev/null \ || git symbolic-ref --short -q HEAD \ || git rev-parse --short HEAD) -echo "Building and publishing $VERSION..." +echo "Publishing artifact to local Maven repo ($VERSION)..." ./gradlew -Pversion=$VERSION publishToMavenLocal + +echo "Publishing docker container to public 'dockerreg.r35157.com' ($VERSION)..." +./build/docker/publish.sh diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..cce4cd0 --- /dev/null +++ b/run.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -euo pipefail + +./gradlew run \ + -Dlog4j.configurationFile="$PWD/config/log4j2.xml" \ + --args="foo bar baz" diff --git a/src/main/docker/Dockerfile_template b/src/main/docker/Dockerfile_template new file mode 100644 index 0000000..4d9cc6b --- /dev/null +++ b/src/main/docker/Dockerfile_template @@ -0,0 +1,42 @@ +FROM dockerreg.r35157.com/r35157/jre:_JREVERSION__amd64 + +LABEL maintainer="Minimons " + +# Setup environment +ENV APP_HOME=/usr/local/software/nenjimkicker +WORKDIR /usr/local/software +USER root + +RUN mkdir nenjimkicker-_VERSION_ \ + && ln -s nenjimkicker-_VERSION_ nenjimkicker +WORKDIR nenjimkicker +RUN mkdir libs + +# These dirs are expected to be overshadowed by host mounts +RUN mkdir conf logs + +# Set timezone +ENV TZ=Europe/Copenhagen +RUN apt-get update +RUN apt-get install -y tzdata \ + && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ + && echo $TZ > /etc/timezone \ + && dpkg-reconfigure -f noninteractive tzdata + +# Clean-up +RUN apt-get autoremove -y \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install application and configuration (Do this as late as possible to be able to reuse layers between builds) +COPY start.sh . +COPY conf/* conf/ +COPY libs/*.jar libs/ + +RUN chmod 755 ./start.sh \ + && chmod -R a+rX /usr/local/software/nenjimkicker-_VERSION_ + +USER user:user + +CMD ["./start.sh"] + diff --git a/src/main/docker/publish_template.sh b/src/main/docker/publish_template.sh new file mode 100644 index 0000000..5ac51fe --- /dev/null +++ b/src/main/docker/publish_template.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "Publishing '_HASHTAG_', '_VERSIONTAG_' and '_LATESTTAG_'..." +docker push _HASHTAG_ +docker push _VERSIONTAG_ +docker push _LATESTTAG_ + +echo "Publishing completed!" diff --git a/src/main/docker/start.sh b/src/main/docker/start.sh new file mode 100755 index 0000000..fd154a3 --- /dev/null +++ b/src/main/docker/start.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -euo pipefail + +shopt -s nullglob + +jars=(libs/*.jar) +if (( ${#jars[@]} == 0 )); then + echo "ERROR: No JARs found in libs/" >&2 + exit 1 +fi + +CLASSPATH=$(IFS=:; echo "${jars[*]}") + +exec java \ + -Dlog4j.configurationFile=/usr/local/software/nenjimkicker/conf/log4j2.xml \ + -cp "$CLASSPATH" \ + com.r35157.nenjim.kicker.impl.ref.Main diff --git a/src/main/java/com/r35157/nenjim/kicker/impl/ref/Main.java b/src/main/java/com/r35157/nenjim/kicker/impl/ref/Main.java new file mode 100644 index 0000000..fe4cadf --- /dev/null +++ b/src/main/java/com/r35157/nenjim/kicker/impl/ref/Main.java @@ -0,0 +1,31 @@ +package com.r35157.nenjim.kicker.impl.ref; + +import com.r35157.nenjim.kicker.NenjimKicker; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class Main { + static void main(String[] args) throws Exception { + try { + new Main(args).service(); + } catch(Throwable t) { + log.error("Error initializing NenjimKicker - " + t.getMessage()); + } + } + + public Main(String[] args) throws Exception { + kicker = new NenjimKickerImpl(); + log.info("Initializing NenjimKicker..."); + log.info("Ready!"); + + kicker.noop(); + Thread.sleep(Long.MAX_VALUE); + } + + private void service() throws Exception { + } + + private static final Logger log = LogManager.getLogger(Main.class); + + private final NenjimKicker kicker; +} diff --git a/src/main/java/com/r35157/nenjim/kicker/impl/ref/KickerImpl.java b/src/main/java/com/r35157/nenjim/kicker/impl/ref/NenjimKickerImpl.java similarity index 84% rename from src/main/java/com/r35157/nenjim/kicker/impl/ref/KickerImpl.java rename to src/main/java/com/r35157/nenjim/kicker/impl/ref/NenjimKickerImpl.java index 0fcb363..457158d 100644 --- a/src/main/java/com/r35157/nenjim/kicker/impl/ref/KickerImpl.java +++ b/src/main/java/com/r35157/nenjim/kicker/impl/ref/NenjimKickerImpl.java @@ -1,8 +1,8 @@ package com.r35157.nenjim.kicker.impl.ref; -import com.r35157.nenjim.kicker.Kicker; -import com.r35157.nenjim.kicker.NenjimProcess; import com.r35157.nenjim.hubd.Context; +import com.r35157.nenjim.kicker.NenjimKicker; +import com.r35157.nenjim.kicker.NenjimProcess; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; @@ -11,13 +11,15 @@ import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; -public class KickerImpl implements Kicker { +public class NenjimKickerImpl implements NenjimKicker { - static void main() throws Exception { - new KickerImpl(); - } + public NenjimKickerImpl() throws InterruptedException { + lock = new Object(); + running = 0; + processes = new ConcurrentHashMap<>(); + processThreads = new ConcurrentHashMap<>(); + nextProcessId = new AtomicInteger(1); - public KickerImpl() throws InterruptedException { startProcess("com.r35157.nenjim.kicker.impl.ref.Dummy"); log.info("Waiting for all processes to finish!"); @@ -95,11 +97,11 @@ public class KickerImpl implements Kicker { } } - private static final Logger log = LogManager.getLogger(KickerImpl.class); + private static final Logger log = LogManager.getLogger(NenjimKickerImpl.class); - private final Object lock = new Object(); - private int running = 0; - private final ConcurrentHashMap processes = new ConcurrentHashMap<>(); - private final ConcurrentHashMap processThreads = new ConcurrentHashMap<>(); - private final AtomicInteger nextProcessId = new AtomicInteger(1); + private int running; + private final Object lock; + private final ConcurrentHashMap processes; + private final ConcurrentHashMap processThreads; + private final AtomicInteger nextProcessId; }