Não é segredo para os desenvolvedores que a criação de um novo serviço envolve muitas configurações de rotina: scripts de construção, dependências, testes, docker, descritores k8s. Como estamos fazendo este trabalho, os modelos IDE atuais não são suficientes. No corte, minhas tentativas de automatizar cada botão "fazer bem" de plataforma cruzada acompanhado de código, exemplos e o resultado final.
Se a perspectiva de criar serviços em um clique com subsequente implantação automática no Digital Ocean parece tentadora, este artigo é para você.
Vamos começar a criar nosso template e antes de tudo considerar a organização da montagem. Apesar do amor de muitos pelo maven por sua simplicidade e declaratividade, usaremos o gradle, por ser mais moderno e permitir que você escreva um script de construção na mesma linguagem do projeto. Além do plug-in Kotlin em si, precisamos de mais um:
plugins {
kotlin("jvm") version "1.4.30"
// jvm
id("org.beryx.runtime") version "1.12.1"
}
Das dependências, o framework Kotlin Ktor "nativo" foi escolhido como o framework do servidor . Para teste, um monte de JUnit + Hamkrest é usado com seu DSL expressivo, que permite que você escreva testes desta forma:
assertThat("xyzzy", startsWith("x") and endsWith("y") and !containsSubstring("a"))
Juntando tudo, com foco em Java 15+
dependencies {
implementation("com.github.ajalt.clikt:clikt:3.1.0")
implementation("io.ktor:ktor-server-netty:1.5.1")
testImplementation("org.junit.jupiter:junit-jupiter:5.8.0-M1")
testImplementation("com.natpryce:hamkrest:1.8.0.1")
testImplementation("io.mockk:mockk:1.10.6")
}
application {
mainClass.set("AppKt")
}
tasks {
test {
useJUnitPlatform()
}
compileKotlin {
kotlinOptions.jvmTarget = "15"
}
}
entry-point , , ( Hamkrest).
, Kotlin codestyle - .editorsconfig:
[*.{kt, kts, java, xml, html, js}]
max_line_length = 120
indent_size = 2
continuation_indent_size = 2
, , , , , .
gradle clean test runtime
( build/image) , build/image/bin
Dockerfile, . :
# syntax = docker/dockerfile:experimental
FROM gradle:jdk15 as builder
WORKDIR /app
COPY src ./src
COPY build.gradle.kts ./build.gradle.kts
RUN --mount=type=cache,target=./.gradle gradle clean test install
FROM openjdk:15 as backend
WORKDIR /root
COPY --from=builder /app/build/install/app ./
jdk ( jvm) c jstack/jmap jdk.
Docker Compose:
version: "3.9"
services:
backend:
build: .
command: bin/app
ports:
- "80:80"
, jdk/gradle,
docker-compose up
? Digital Ocean - . , Apps Platform ... ! Docker , , , , , . 5$ :
master , , .
Por fim, tudo o que é descrito no artigo está documentado em detalhes no arquivo README.md do modelo, para que, após a criação do projeto, a construção e implantação subsequentes não causem dificuldades.
Você pode usar o modelo para obter um repositório pronto simplesmente clicando no botão "Use this template"
no GitHub:
github.com/demidko/Projekt-portable
Ou, se você precisar de uma opção jar autoexecutável sem um jvm portátil:
github.com/demidko / Projekt-jar
Depois disso, resta apenas escrever a lógica :) Como qualquer abordagem, este template tem suas falhas, por isso é interessante ouvir sugestões, comentários e críticas.