chore: refactor docker compose env's
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
# Version control
|
||||
.git
|
||||
.github
|
||||
|
||||
# Gradle build outputs / caches (must always be rebuilt fresh inside the image)
|
||||
.gradle
|
||||
build/
|
||||
.kotlin
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# IDE
|
||||
.idea
|
||||
.vscode
|
||||
.run
|
||||
*.iml
|
||||
*.iws
|
||||
*.ipr
|
||||
|
||||
# Docker-only local files (secrets/env must never be baked into the image)
|
||||
docker/.env
|
||||
docker/*.env.docker
|
||||
docker/*.secret
|
||||
|
||||
# Misc
|
||||
*.hprof
|
||||
.gradle-docker-cache/
|
||||
@@ -109,7 +109,7 @@ jobs:
|
||||
chmod -R 777 "$GRADLE_CACHE_DIR"
|
||||
|
||||
- name: Run tests in Docker
|
||||
run: docker compose -f docker/docker-compose-test.yaml run --rm tests
|
||||
run: docker compose -f docker/docker-compose-test.yaml run tests
|
||||
|
||||
- name: Shut down Docker services
|
||||
if: always()
|
||||
|
||||
@@ -58,40 +58,6 @@ tasks.withType<Test>().configureEach {
|
||||
jvmArgs("-javaagent:$agentJar")
|
||||
}
|
||||
}
|
||||
tasks.test {
|
||||
dependsOn("copyEnv")
|
||||
}
|
||||
|
||||
tasks.register<Copy>("copyEnv") {
|
||||
group = "docker"
|
||||
description = "copy the default dotenv file"
|
||||
from("docker")
|
||||
into("docker")
|
||||
rename {
|
||||
it.removeSuffix(".template")
|
||||
}
|
||||
include(".env.template")
|
||||
eachFile {
|
||||
if (File("docker/$name").exists()) {
|
||||
exclude()
|
||||
}
|
||||
}
|
||||
val files =
|
||||
buildList {
|
||||
add(File("docker/postgresql.secret"))
|
||||
if (!project.hasProperty("ci")) {
|
||||
add(File("docker/pgadmin.secret"))
|
||||
}
|
||||
}
|
||||
outputs.files(*files.toTypedArray())
|
||||
doLast {
|
||||
files.forEach {
|
||||
if (!it.exists()) {
|
||||
it.writeText("changeit")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation("io.ktor:ktor-server-core-jvm")
|
||||
|
||||
+13
-1
@@ -1,12 +1,24 @@
|
||||
Installation
|
||||
============
|
||||
|
||||
To run the stack:
|
||||
To run the stack in production:
|
||||
|
||||
```shell
|
||||
docker compose -f docker\docker-compose-prod.yaml -p event-demo up -d
|
||||
```
|
||||
|
||||
To run only the app dependencies in development mode and run the app localy (not in docker):
|
||||
|
||||
```shell
|
||||
docker compose -f docker\docker-compose-dev.yaml up -d
|
||||
```
|
||||
|
||||
To run the tests in docker (it's designed for the CI):
|
||||
|
||||
```shell
|
||||
docker compose -f docker\docker-compose-test.yaml up -d
|
||||
```
|
||||
|
||||
Api url:
|
||||
- [Backend API](http://api.traefik.me/)
|
||||
- [Frontend web site](http://app.traefik.me/) (WIP)
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
REDIS_URL=redis://redis:6379
|
||||
POSTGRESQL_URL=jdbc:postgresql://postgresql/event-demo
|
||||
RABBITMQ_URL=rabbitmq
|
||||
@@ -1 +0,0 @@
|
||||
PGADMIN_DEFAULT_EMAIL=
|
||||
+4
-4
@@ -1,5 +1,5 @@
|
||||
# Stage 1: Cache Gradle dependencies
|
||||
FROM gradle:latest AS cache
|
||||
FROM gradle:9.6.1-jdk21-alpine AS cache
|
||||
RUN mkdir -p /home/gradle/cache_home
|
||||
ENV GRADLE_USER_HOME=/home/gradle/cache_home
|
||||
COPY build.gradle.* gradle.properties /home/gradle/app/
|
||||
@@ -7,7 +7,7 @@ WORKDIR /home/gradle/app
|
||||
RUN gradle build -i -x check
|
||||
|
||||
# Stage 2: Build Application
|
||||
FROM gradle:latest AS build
|
||||
FROM gradle:9.6.1-jdk21-alpine AS build
|
||||
COPY --from=cache /home/gradle/cache_home /home/gradle/.gradle
|
||||
COPY --chown=gradle:gradle . /home/gradle/src
|
||||
WORKDIR /home/gradle/src
|
||||
@@ -16,8 +16,8 @@ WORKDIR /home/gradle/src
|
||||
RUN gradle buildFatJar --no-daemon
|
||||
|
||||
# Stage 3: Create the Runtime Image
|
||||
FROM amazoncorretto:21 AS runtime
|
||||
FROM eclipse-temurin:21-jre-alpine AS runtime
|
||||
EXPOSE 8080
|
||||
RUN mkdir /app
|
||||
COPY --from=build /home/gradle/src/build/libs/*.jar /app/event-demo-all.jar
|
||||
COPY --from=build /home/gradle/src/build/libs/*-all.jar /app/event-demo-all.jar
|
||||
ENTRYPOINT ["java","-jar","/app/event-demo-all.jar"]
|
||||
@@ -1,5 +0,0 @@
|
||||
name: event-demo-ci
|
||||
include:
|
||||
- path:
|
||||
- parts/docker-compose-databases.yaml
|
||||
- parts/docker-compose-databases-expose.yaml
|
||||
@@ -1,4 +1,4 @@
|
||||
name: event-demo-test
|
||||
name: event-demo-dev
|
||||
include:
|
||||
- path:
|
||||
- parts/docker-compose-databases.yaml
|
||||
@@ -6,3 +6,12 @@ include:
|
||||
- parts/docker-compose-tools.yaml
|
||||
- parts/docker-compose-tools-local.yaml
|
||||
- parts/docker-compose-traefik.yaml
|
||||
|
||||
services:
|
||||
postgresql:
|
||||
environment:
|
||||
POSTGRES_PASSWORD: "changeit"
|
||||
|
||||
pgadmin:
|
||||
environment:
|
||||
PGADMIN_DEFAULT_PASSWORD: "changeit"
|
||||
@@ -5,3 +5,16 @@ include:
|
||||
- parts/docker-compose-app.yaml
|
||||
- parts/docker-compose-tools.yaml
|
||||
- parts/docker-compose-traefik.yaml
|
||||
|
||||
services:
|
||||
postgresql:
|
||||
environment:
|
||||
POSTGRES_PASSWORD_FILE: /run/secrets/postgresql_password
|
||||
volumes:
|
||||
- ./postgresql.secret:/run/secrets/postgresql_password:ro
|
||||
|
||||
pgadmin:
|
||||
environment:
|
||||
PGADMIN_DEFAULT_PASSWORD_FILE: /run/secrets/pgadmin_password
|
||||
volumes:
|
||||
- ./pgadmin.secret:/run/secrets/pgadmin_password:ro
|
||||
@@ -4,3 +4,8 @@ include:
|
||||
- parts/docker-compose-databases.yaml
|
||||
- parts/docker-compose-test.yaml
|
||||
- parts/docker-compose-traefik.yaml
|
||||
|
||||
services:
|
||||
postgresql:
|
||||
environment:
|
||||
POSTGRES_PASSWORD: "changeit"
|
||||
@@ -12,6 +12,8 @@ services:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
env_file:
|
||||
- ../.env.docker
|
||||
labels:
|
||||
- "traefik.http.routers.api.rule=Host(`api.traefik.me`)"
|
||||
- "traefik.http.services.api.loadbalancer.server.port=8080"
|
||||
|
||||
@@ -22,7 +22,6 @@ services:
|
||||
image: postgres:18.4
|
||||
command: postgres -c 'max_connections=500'
|
||||
environment:
|
||||
POSTGRES_PASSWORD_FILE: /run/secrets/postgresql_password
|
||||
POSTGRES_USER: event-demo
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "sh -c 'pg_isready -U event-demo'"]
|
||||
@@ -31,7 +30,6 @@ services:
|
||||
retries: 10
|
||||
volumes:
|
||||
- postgresql_data:/var/lib/postgresql
|
||||
- ../postgresql.secret:/run/secrets/postgresql_password:ro
|
||||
|
||||
rabbitmq:
|
||||
image: rabbitmq:4-management-alpine
|
||||
|
||||
@@ -15,6 +15,8 @@ services:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
env_file:
|
||||
- ../.env.docker
|
||||
|
||||
volumes:
|
||||
gradle-cache:
|
||||
@@ -2,10 +2,7 @@ services:
|
||||
pgadmin:
|
||||
image: dpage/pgadmin4
|
||||
environment:
|
||||
PGADMIN_DEFAULT_EMAIL: $PGADMIN_DEFAULT_EMAIL
|
||||
PGADMIN_DEFAULT_PASSWORD_FILE: /run/secrets/pgadmin_password
|
||||
secrets:
|
||||
- pgadmin_password
|
||||
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-admin@event-demo.dev}
|
||||
volumes:
|
||||
- pgadmin_data:/var/lib/pgadmin
|
||||
configs:
|
||||
@@ -45,9 +42,5 @@ configs:
|
||||
}
|
||||
}
|
||||
|
||||
secrets:
|
||||
pgadmin_password:
|
||||
file: ../pgadmin.secret
|
||||
|
||||
volumes:
|
||||
pgadmin_data:
|
||||
@@ -13,12 +13,12 @@ jwt {
|
||||
}
|
||||
|
||||
redis {
|
||||
url = "redis://redis:6379"
|
||||
url = "redis://localhost:6379"
|
||||
url = ${?REDIS_URL}
|
||||
}
|
||||
|
||||
postgresql {
|
||||
url = "jdbc:postgresql://postgresql/event-demo"
|
||||
url = "jdbc:postgresql://localhost:5432/event-demo"
|
||||
url = ${?POSTGRESQL_URL}
|
||||
|
||||
username = "event-demo"
|
||||
@@ -29,7 +29,7 @@ postgresql {
|
||||
}
|
||||
|
||||
rabbitmq {
|
||||
url = "rabbitmq"
|
||||
url = "localhost"
|
||||
url = ${?RABBITMQ_URL}
|
||||
|
||||
port = "5672"
|
||||
|
||||
@@ -26,11 +26,13 @@ import eventDemo.testHelpers.createNewUser
|
||||
import eventDemo.testHelpers.testKoinApplicationWithConfig
|
||||
import io.kotest.assertions.nondeterministic.eventually
|
||||
import io.kotest.assertions.nondeterministic.until
|
||||
import io.kotest.assertions.retry
|
||||
import io.kotest.core.spec.style.FunSpec
|
||||
import io.kotest.matchers.collections.shouldContainExactly
|
||||
import io.kotest.matchers.equals.shouldBeEqual
|
||||
import io.kotest.matchers.equals.shouldEqual
|
||||
import io.kotest.matchers.nulls.shouldNotBeNull
|
||||
import io.kotest.matchers.should
|
||||
import io.kotest.matchers.types.shouldBeInstanceOf
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@@ -49,7 +51,8 @@ class GameSimulationTest :
|
||||
tags(Tag.Postgresql)
|
||||
|
||||
test("Simulation of a game") {
|
||||
withTimeout(10.seconds) {
|
||||
should {
|
||||
retry(maxRetry = 3, timeout = 20.seconds) {
|
||||
disableRandomForTest()
|
||||
val gameId = GameId()
|
||||
val user1 = createNewUser("user1")
|
||||
@@ -269,12 +272,13 @@ class GameSimulationTest :
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
context(user: User)
|
||||
private suspend inline fun <reified T : Notification> MutableList<Notification>.waitNotification(crossinline block: T.() -> Boolean): T {
|
||||
println("NOTIFICATION WAITING: ${T::class.simpleName} for user: ${user.username}")
|
||||
return eventually(3.seconds) {
|
||||
return eventually(5.seconds) {
|
||||
filterIsInstance<T>()
|
||||
.first { block(it) }
|
||||
.also { remove(it) }
|
||||
|
||||
Reference in New Issue
Block a user