diff --git a/.env b/.env index 56ebe4f4056af0239d7c3cae56a89cf07d2a16a5..fe4e81ed3c29cdaa2769932d2a352b81cbb23d4d 100644 --- a/.env +++ b/.env @@ -1,2 +1,2 @@ -POSTGRES_USER=myappdba -POSTGRES_PASSWORD=ndfndsf13sff +DB_USER=myappdba +DB_PASSWORD=ndfndsf13sff diff --git a/Dockerfile b/Dockerfile index 8bbcb682b1f572e2922529b5b873a311f9cd838a..f5f2d03c3e7bb22a7ba8e69f71be18c7eb82b0d6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,12 +6,32 @@ WORKDIR /myproject COPY pom.xml . COPY src src -RUN --mount=type=cache,id=mvncache,target=/root/.m2/repository,rw \ +RUN --mount=type=cache,id=mvncache,target=/root/.m2/repository,rw \ mvn -B package -FROM eclipse-temurin:11.0.13_8-jre-alpine -COPY --from=build /myproject/target/*-with-dependencies.jar \ +# Create a custom Java runtime from the dev env. +RUN MODULES=`jdeps --ignore-missing-deps --list-deps target/DemoCI-1.0-SNAPSHOT-withdependencies.jar| grep -v -e jdk.compiler -e sun.security.krb5 | tr '\n' ','| tr -d "[:space:]"|head -c -1` \ + && $JAVA_HOME/bin/jlink \ + --add-modules $MODULES\ + --strip-debug \ + --no-man-pages \ + --no-header-files \ + --compress=2 \ + --output /javaruntime + +FROM debian:bullseye-slim +# Copy the JRE from the dev build env +ENV JAVA_HOME=/opt/java/openjdk +ENV PATH "${JAVA_HOME}/bin:${PATH}" +COPY --from=build /javaruntime $JAVA_HOME + +# Copy the uber Jar from the dev build env +COPY --from=build /myproject/target/*-withdependencies.jar \ /myapp.jar -ENTRYPOINT ["java", "-jar"] -CMD ["/myapp.jar"] +# Adds the wait script (see variable in docker-compose.yml) +ENV WAIT_VERSION 2.7.2 +ADD https://github.com/ufoscout/docker-compose-wait/releases/download/$WAIT_VERSION/wait /wait +RUN chmod +x /wait + +ENTRYPOINT ["/bin/sh", "-c", "/wait && java -jar /myapp.jar"] diff --git a/compose_build_run.sh b/compose_build_run.sh new file mode 100755 index 0000000000000000000000000000000000000000..f0dd276cf11c9423a01d2396e14ac685a33529df --- /dev/null +++ b/compose_build_run.sh @@ -0,0 +1,6 @@ +#!/bin/bash +./docker_env.sh + +COMPOSE_DOCKER_CLI_BUILD=1 \ +DOCKER_BUILDKIT=1 \ + docker-compose up --build diff --git a/docker-compose.yml b/docker-compose.yml index 495e505b69390c307f2901b8539f3e88a4a1843a..eeccfde038460fe4970e2eac2e6a5d05b59a73de 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,25 +1,30 @@ services: app: build: . - image: bruno/democi + image: ${DOCKER_REPO_NAME}/${IMAGE_NAME}:${IMAGE_TAG} depends_on: - - postgres - networks: - - datanet + - db environment: - POSTGRES_USER: ${PG_USER:-demodba} - POSTGRES_PASSWORD: ${PG_PASSWORD:-secret} + # The host and TCP port to wait for + # Wait host must be installed in the docker image (see Dockerfile) + WAIT_HOSTS: db:5432 - postgres: + DB_URL: ${DB_URL:-jdbc:postgresql://db:5432/}${DB_NAME:-demodb} + DB_USER: ${DB_USER:-demodba} + DB_PASSWORD: ${DB_PASSWORD:-secret} + DB_NAME: ${DB_NAME:-demodb} + + db: restart: always image: postgres:14 environment: - POSTGRES_USER: ${PG_USER:-demodba} - POSTGRES_PASSWORD: ${PG_PASSWORD:-secret} + POSTGRES_USER: ${DB_USER:-demodba} + POSTGRES_PASSWORD: ${DB_PASSWORD:-secret} + POSTGRES_DB: ${DB_NAME:-demodb} volumes: - pg_data:/var/lib/postgresql/data -# ports: -# - "5432:5432" - networks: - - datanet + ports: + - "5432:5432" +volumes: + pg_data: \ No newline at end of file diff --git a/docker_build.sh b/docker_build.sh index ccab3b220be7248a5734f78018bd3c371ee47fd2..ea62729d9a80f624aa6f925a525b7e1cf98983b0 100755 --- a/docker_build.sh +++ b/docker_build.sh @@ -1,2 +1,4 @@ -source ./docker_env.sh -DOCKER_BUILDKIT=1 docker build -t ${DOCKER_REPO_NAME}/${IMAGE_NAME} . +#!/bin/bash +./docker_env.sh +DOCKER_BUILDKIT=1 \ + docker build -t ${DOCKER_REPO_NAME}/${IMAGE_NAME}:${IMAGE_TAG} . diff --git a/docker_env.sh b/docker_env.sh index ac6f550b11a2d753ee4003a02e58a0fc4fda17df..acdb72fcbb3ed09758a67699ddedc0dd5d2a33b3 100755 --- a/docker_env.sh +++ b/docker_env.sh @@ -1,3 +1,3 @@ DOCKER_REPO_NAME=brunoe IMAGE_NAME=`echo ${PWD##*/}| tr '[:upper:]' '[:lower:]'` - +IMAGE_TAG=`git rev-parse --abbrev-ref HEAD` diff --git a/docker_push.sh b/docker_push.sh index 4acd476e13440c23822342fd560386c836648ff5..d398d883b10b9738918ad7460dc3eaad2003985f 100755 --- a/docker_push.sh +++ b/docker_push.sh @@ -1,2 +1,3 @@ -source ./docker_env.sh +#!/bin/bash +./docker_env.sh docker push ${DOCKER_REPO_NAME}/${IMAGE_NAME} diff --git a/docker_run.sh b/docker_run.sh index adf1426d153fedf1c7daeb64683d3f252fb4db85..ac4c776b881295a2cad2e0adbc6e2ac97e29b6f4 100755 --- a/docker_run.sh +++ b/docker_run.sh @@ -1,2 +1,3 @@ +#!/bin/bash source ./docker_env.sh docker run --rm -it ${DOCKER_REPO_NAME}/${IMAGE_NAME} diff --git a/pom.xml b/pom.xml index a9277d8848b31ff9ff464f64d2c295beec0374c6..102741ce81cf1679df7468ce41d1c38392e41af9 100644 --- a/pom.xml +++ b/pom.xml @@ -8,9 +8,8 @@ <artifactId>DemoCI</artifactId> <version>1.0-SNAPSHOT</version> - <name>MyApp3</name> - <!-- FIXME change it to the project's website --> - <url>http://www.example.com</url> + <name>DemoCI</name> + <url>https://github.com/ebpro/DemoCI</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> @@ -26,6 +25,18 @@ <scope>test</scope> </dependency> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>1.18.22</version> + </dependency> + + <dependency> + <groupId>org.postgresql</groupId> + <artifactId>postgresql</artifactId> + <version>42.3.0</version> + </dependency> + <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> @@ -47,14 +58,18 @@ <goal>shade</goal> </goals> <configuration> + <minimizeJar>false</minimizeJar> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>fr.univtln.bruno.App</mainClass> + </transformer> + <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> + <resource>META-INF/services/java.sql.Driver</resource> </transformer> </transformers> <shadedArtifactAttached>true</shadedArtifactAttached> - <shadedClassifierName>with-dependencies</shadedClassifierName> <!-- Any name that makes sense --> + <shadedClassifierName>withdependencies</shadedClassifierName> </configuration> </execution> </executions> diff --git a/src/main/java/fr/univtln/bruno/App.java b/src/main/java/fr/univtln/bruno/App.java index a27217a7d633bce9317a8b234a446054b8d83657..d8e4dbd2a602eee0dc6313e675ed20120b5fd4a1 100644 --- a/src/main/java/fr/univtln/bruno/App.java +++ b/src/main/java/fr/univtln/bruno/App.java @@ -1,13 +1,31 @@ package fr.univtln.bruno; -/** - * Hello world! - * - */ -public class App -{ - public static void main( String[] args ) - { - System.out.println( "Hello World!" ); +import lombok.extern.java.Log; + +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Map; +import java.util.Optional; + +@Log +public class App { + + public static void main(String[] args) throws ClassNotFoundException { + Map<String, String> env = System.getenv(); + final String DB_NAME = Optional.ofNullable(env.get("DB_NAME")).orElse("demodb"); + final String DB_URL = Optional.ofNullable(env.get("DB_URL")).orElse("jdbc:postgresql://localhost:5432/" + DB_NAME); + final String DB_USER = Optional.ofNullable(env.get("DB_USER")).orElse("demodba"); + final String DB_PASSWORD = Optional.ofNullable(env.get("DB_PASSWORD")).orElse("secret"); + + log.info(DB_URL+" "+DB_USER+" "+DB_PASSWORD); + + try (Connection connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) { + DatabaseMetaData database = connection.getMetaData(); + log.info(database.getDatabaseProductName() + " " + database.getDatabaseProductVersion()); + } catch (SQLException throwables) { + throwables.printStackTrace(); + } } }