-
Notifications
You must be signed in to change notification settings - Fork 2
Tag 22 Continuous Deployment, MongoDB und Spring Data
Wir wollen, dass unsere App automatisch deployed wird (bei uns auf fly.io), nachdem wir unsere Software weiterentwickelt und
Voraussetzung: Dockerfile ist im Hauptverzeichnis und App muss gelauncht sein.
Dann:
- Erstelle im Ordner .github/workflows die Datei deploy.yml
- Füge folgenden Code in die deploy.yml ein und passe ihn entsprechend an:
name: Deploy to fly.io #wähle einen Namen
on:
push:
branches:
- main
jobs:
build-frontend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '18'
- name: Build Frontend
run: |
cd frontend
npm install
npm run build
- uses: actions/upload-artifact@v2
with:
name: frontend-build
path: frontend/build/
build-backend:
runs-on: ubuntu-latest
needs: build-frontend
steps:
- uses: actions/checkout@v2
- name: Set up JDK
uses: actions/setup-java@v2
with:
java-version: '19' #wähle entsprechende Javaversion
distribution: 'adopt'
- uses: actions/download-artifact@v2
with:
name: frontend-build
path: backend/src/main/resources/static
- name: Build with maven
run: mvn -B package --file backend/pom.xml
- uses: actions/upload-artifact@v2
with:
name: app.jar
path: backend/target/app.jar
deploy-fly:
runs-on: ubuntu-latest
needs: build-backend
environment:
name: production-fly.io
url: https://driver-app.fly.dev #hier die url angeben, unter der die app deployed wird, damit sie in github verlinkt wird
env:
FLY_API_TOKEN: ${{ secrets.FLY_API_KEY }} # FLY_API_KEY Müssen wir im Github Repository angeben bei new repository secret(s.u.)
steps:
- uses: actions/checkout@v2
- uses: actions/download-artifact@v2
with:
name: app.jar
path: backend/target
- uses: superfly/flyctl-actions/setup-flyctl@master
- run: flyctl deploy # Deployed die Anwendung. Das ganze funktioniert aber wie gesagt nur,
# wenn die App vorher gelauncht wurde.
- Token auf fly.io erstellen, um github zu authorisieren: auf fly.io auf Account und dann Access Tokens
------------------------------------------------------------------
dann Token createn und kopieren
------------------------------------------------------------------
dann in github auf das Projekt gehen und auf Settings:
-------------------------------------------------------------------
und da auf Secrets and Variables --> Actions
-------------------------------------------------------------------
dann auf new repository secret
und dann WICHTIG!! beim Name FLY_API_KEY angeben und bei Secret den kopierten Token einfügen.
-------------------------------------------------------------------
beim anschließenden commit in intelliJ auch die automatisch erstellte Datei fly.toml committen, fertig.
ESLint ist beim deployen strenger als sonst, dadurch können Warnungen, z.B. bei useEffects angezeigt werden, die wir ignorieren wollen. Das geht mit folgendem Kommentar in intelliJ:
//eslint-disable-next-line
In der Docker App oben in der Suchleiste mongo eingeben und docker official image auswählen, zunächst pull und dann run
dann öffnet sich ein Fenster, da die Optional Settings auswählen und wie auf dem Bild ausfüllen (27017 ist der Standardport).

Nächster Schritt: MongoDB Compass runterladen und installieren(Version für Apple-M1-Chip) und öffnen. Klick auf Connect.
-------------------------------------------------------------------
Klick auf Create Database bzw. das Plus neben Databases und dann vergib Namen für Database und Collection:
Klick auf ADD DATA, dann insert Document, um der Collection etwas hinzuzufügen
- Wir erstellen ein Springboot Projekt erstellen mit einer Controller-, Service- und Repository-Klasse.
- Wir benötigen die Dependencies SpringWeb und zusätzlich noch die Spring Data MongoDB:
- Wenn wir an einem Projekt arbeiten das wir zu einem früheren Zeitpunkt gestartet haben benötigen wir folgende MongoDB-Dependency in unserer pom.xml:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> - In der Datenklasse müssen wir die ID für Springboot als @Id deklarieren damit die "String Id;" auch als diese erkannt wird:
- Zusätzlich müssen wir die Klasse noch mit der @Data Annotation versehen damit dort der Constructor und die Getter/Setter-Methoden erstellt werden.
*Die Controller-Klasse erstellen wir regulär so wie wir es bis jetzt gemacht haben.
- Als nächstes erstellen wir die Service-Klasse und erstellen ein private final von dem TodoRepo-Interface.
- Nun das Repository als Interface erstellen:
-
haben wir das Repo erstellt können wir die Methode in der Service-Klasse abändern, wir benötigen nicht mehr die getAll-Methode und reichen diese ans Repo weiter, da das Repo nun ein Interface ist, gibt es hier vorbestimmte Methoden die wir abfragen können. Um uns nun unsere Produkte anzeigen zu lassen nutzen wir nun die todoRepo.findAll Methode.
-
Als nächstes erstellt wir ein Post-Mapping in unserer Controller-Klasse mit einem @RequestBody, rufen diese wieder in der Serviceklasse auf und benutzen dann dort die repo.save Methode um ein Todo an unsere Datenbank weiterzugeben.
- zum testen können wir im Postman nun per Post Todos hinzufügen und uns diese mit dem Get abrufen.
- schauen wir jetzt in unserem Kompass nach sehen wir dass dort eine Test-Datenbank steht in der wir unser soeben erstelltes Todo finden. (der Name der DB bezieht sich dann auf die Daten-Klasse die erstellt wurde)
- um der Datenbank einen bestimmten Titel mitzugeben, müssen wir in die application.properties und dort
spring.data.mongodb.database="ausgewählterNameDerDb"
- Auch wenn unsere DB vorgefertigte Methoden mit der sie arbeitet können wir zusätzlich Methoden erstellen die im Hintergrund ausgeführt werden.
Wir können beispielsweise eine Methode erstellen die uns einer Liste aller Produkte desselben Namens mitgibt. Und eine in der wir alle mit einem bestimmten Name ausschließen möchten.