Ce n'est pas un secret pour les développeurs que la création d'un nouveau service implique beaucoup de configuration de routine: scripts de construction, dépendances, tests, docker, descripteurs k8s. Puisque nous faisons ce travail, les modèles IDE actuels ne suffisent pas. Sous la coupe, mes tentatives d'automatiser chaque bouton "bien faire" multiplateforme accompagné de code, d'exemples et du résultat final.
Si les perspectives de création de services en un clic avec déploiement automatique ultérieur dans Digital Ocean vous semblent tentantes, alors cet article est pour vous.
Commençons par créer notre modèle et considérons tout d'abord l'organisation de l'assemblage. Malgré l'amour de beaucoup pour maven pour sa simplicité et son caractère déclaratif, nous utiliserons gradle, car il est plus moderne et vous permet d'écrire un script de construction dans le même langage que le projet. En plus du plugin Kotlin lui-même, nous en avons besoin d'un autre:
plugins {
kotlin("jvm") version "1.4.30"
// jvm
id("org.beryx.runtime") version "1.12.1"
}
Parmi les dépendances, le framework "natif" de Kotlin Ktor a été choisi comme framework de serveur . Pour les tests, un tas de JUnit + Hamkrest est utilisé avec son DSL expressif, qui vous permet d'écrire des tests de cette manière:
assertThat("xyzzy", startsWith("x") and endsWith("y") and !containsSubstring("a"))
Tout rassembler, en se concentrant sur 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 , , .
Enfin, tout ce qui est décrit dans l'article est documenté en détail dans le fichier README.md du modèle, de sorte qu'après la création du projet, la génération et le déploiement ultérieurs ne posent pas de problèmes.
Vous pouvez utiliser le modèle pour obtenir un référentiel prêt à l'emploi en cliquant simplement sur le bouton "Use this template"
sur GitHub:
github.com/demidko/Projekt-portable
Ou, si vous avez besoin d'une option jar auto-exécutable sans jvm portable:
github.com/demidko / Projekt-jar
Après cela, il ne reste plus qu'à écrire la logique :) Comme toute approche, ce template n'est pas sans défauts, il est donc intéressant d'entendre des suggestions, des commentaires et des critiques.