diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e94661b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM openjdk:17-alpine as builder + +WORKDIR app +COPY . . +RUN ./gradlew assemble + +FROM openjdk:17-alpine + +WORKDIR app +COPY --from=builder /app/build/libs/candlesticks-1.1.1.jar . +EXPOSE 9000 +CMD ["java", "-jar", "/app/candlesticks-1.1.1.jar"] \ No newline at end of file diff --git a/Makefile b/Makefile index dc2d20c..b409749 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,5 @@ test: - docker-compose up -d --wait - ./gradlew flywayMigrate - ./gradlew clean test - docker compose down + docker-compose up postgres tests run: - docker-compose up -d --wait - ./gradlew flywayMigrate - ./gradlew run + docker-compose up java postgres candlesticks diff --git a/build.gradle.kts b/build.gradle.kts index 60f67e3..aeb62ad 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -39,6 +39,7 @@ object DependencyVersions { const val hikariCP = "4.0.3" const val typesafeConfig = "1.4.2" const val exposed = "0.38.2" + const val flyway = "8.5.13" } dependencies { @@ -62,6 +63,7 @@ dependencies { implementation("org.postgresql:postgresql:${DependencyVersions.postgres}") implementation("com.zaxxer:HikariCP:${DependencyVersions.hikariCP}") + implementation("org.flywaydb:flyway-core:${DependencyVersions.flyway}") implementation("org.jetbrains.exposed:exposed-core:${DependencyVersions.exposed}") implementation("org.jetbrains.exposed:exposed-dao:${DependencyVersions.exposed}") @@ -77,3 +79,18 @@ tasks.test { exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL } } + +tasks.withType { + manifest { + attributes["Main-Class"] = "MainKt" + } + + val dependencies = configurations + .runtimeClasspath + .get() + .map(::zipTree) + + from(dependencies) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + diff --git a/docker-compose.yml b/docker-compose.yml index 34b89e4..2ebd4a8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -26,6 +26,35 @@ services: interval: 10s timeout: 5s retries: 5 + start_period: 30s + candlesticks: + depends_on: + - postgres + - java + container_name: candlesticks + restart: on-failure + build: . + ports: + - "8080:8080" +# networks: +# - postgres + network_mode: host + environment: + POSTGRES_USER: ${POSTGRES_USER:-postgres} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + DATABASE_HOST: ${DATABASE_HOST:-localhost} + tests: + depends_on: + - postgres + container_name: tests + network_mode: host + environment: + POSTGRES_USER: ${POSTGRES_USER:-postgres} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + DATABASE_HOST: ${DATABASE_HOST:-localhost} + build: + context: . + dockerfile: ./src/test/Dockerfile-tests networks: postgres: diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index 30e0e85..611be51 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -6,6 +6,7 @@ import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import configs.DataSourceConfig +import org.flywaydb.core.Flyway import org.jetbrains.exposed.sql.Database import repositories.InstrumentRepository import repositories.InstrumentRepositoryImpl @@ -30,8 +31,12 @@ fun main() { val quoteStream = QuoteStream() val config = ConfigFactory.load() - val dataSource = DataSourceConfig.fromConfig(config).toHikariDataSource() + val dataSourceConfig = DataSourceConfig.fromConfig(config) + val flyway = Flyway.configure().dataSource(dataSourceConfig.url, dataSourceConfig.user, dataSourceConfig.password).load() + flyway.migrate() + + val dataSource by lazy{ dataSourceConfig.toHikariDataSource() } Database.connect(dataSource) instrumentStream.connect { event -> diff --git a/src/test/Dockerfile-tests b/src/test/Dockerfile-tests new file mode 100644 index 0000000..77f3c92 --- /dev/null +++ b/src/test/Dockerfile-tests @@ -0,0 +1,3 @@ +FROM gradle:7.2-jdk-alpine +COPY . . +ENTRYPOINT ["gradle", "test"] \ No newline at end of file diff --git a/src/test/kotlin/integration/Utils.kt b/src/test/kotlin/integration/DBUtils.kt similarity index 66% rename from src/test/kotlin/integration/Utils.kt rename to src/test/kotlin/integration/DBUtils.kt index 2a4f3a3..27e161e 100644 --- a/src/test/kotlin/integration/Utils.kt +++ b/src/test/kotlin/integration/DBUtils.kt @@ -3,6 +3,7 @@ package integration import Quote import com.typesafe.config.ConfigFactory import configs.DataSourceConfig +import org.flywaydb.core.Flyway import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.deleteAll import org.jetbrains.exposed.sql.selectAll @@ -10,11 +11,16 @@ import org.jetbrains.exposed.sql.transactions.transaction import repositories.InstrumentTable import repositories.QuoteTable -object Utils { - private val config = ConfigFactory.load() - private val dataSource = DataSourceConfig.fromConfig(config).toHikariDataSource() +object DBUtils { + val config = ConfigFactory.load() + val dataSourceConfig = DataSourceConfig.fromConfig(config) + + val flyway = Flyway.configure().dataSource(dataSourceConfig.url, dataSourceConfig.user, dataSourceConfig.password).load() + init { + flyway.migrate() + val dataSource by lazy{ dataSourceConfig.toHikariDataSource() } Database.connect(dataSource) } diff --git a/src/test/kotlin/integration/InstrumentRepositoryTest.kt b/src/test/kotlin/integration/InstrumentRepositoryTest.kt index cc1d12e..204906d 100644 --- a/src/test/kotlin/integration/InstrumentRepositoryTest.kt +++ b/src/test/kotlin/integration/InstrumentRepositoryTest.kt @@ -2,14 +2,9 @@ package integration import Generators.generateISIN import Instrument -import Quote -import com.typesafe.config.ConfigFactory -import configs.DataSourceConfig -import org.jetbrains.exposed.sql.Database import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import repositories.InstrumentRepositoryImpl -import java.math.BigDecimal import kotlin.test.assertEquals class InstrumentRepositoryTest { @@ -17,7 +12,7 @@ class InstrumentRepositoryTest { @BeforeEach fun beforeEach() { - Utils.clearDatabase() + DBUtils.clearDatabase() } @Test diff --git a/src/test/kotlin/integration/QuoteRepositoryTest.kt b/src/test/kotlin/integration/QuoteRepositoryTest.kt index 6b59fca..6f3396d 100644 --- a/src/test/kotlin/integration/QuoteRepositoryTest.kt +++ b/src/test/kotlin/integration/QuoteRepositoryTest.kt @@ -4,22 +4,16 @@ import Candlestick import Generators.generateAndPopulateRandomInstrumentsWithQuotes import Generators.generateISIN import Generators.generateInstrument -import Instrument import Quote -import com.typesafe.config.ConfigFactory -import configs.DataSourceConfig -import org.jetbrains.exposed.sql.Database import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import repositories.InstrumentRepositoryImpl -import repositories.QuoteRepository import repositories.QuoteRepositoryImpl import java.math.BigDecimal import java.time.Clock import java.time.Instant import java.time.ZoneId import java.time.temporal.ChronoUnit -import kotlin.random.Random import kotlin.test.assertContains import kotlin.test.assertEquals import kotlin.test.assertFails @@ -30,7 +24,7 @@ class QuoteRepositoryTest { @BeforeEach fun beforeEach() { - Utils.clearDatabase() + DBUtils.clearDatabase() } @Test @@ -46,7 +40,7 @@ class QuoteRepositoryTest { assertEquals(1, quoteRepository.createQuote(q, Instant.now())) } - val insertedQuotes = Utils.getAllQuotes().map { it.copy(price = it.price.stripTrailingZeros()) } + val insertedQuotes = DBUtils.getAllQuotes().map { it.copy(price = it.price.stripTrailingZeros()) } assertEquals(3, insertedQuotes.size) quotes.map { q -> @@ -67,10 +61,10 @@ class QuoteRepositoryTest { val quote = Quote(instrument.isin, BigDecimal("123.12")) assertEquals(1, quoteRepository.createQuote(quote, Instant.now())) - assertEquals(1, Utils.getAllQuotes().size) + assertEquals(1, DBUtils.getAllQuotes().size) instrumentRepository.deleteInstrument(instrument.isin) - assertEquals(0, Utils.getAllQuotes().size) + assertEquals(0, DBUtils.getAllQuotes().size) } @Test