Skip to content

Tag 22 Continuous Deployment, MongoDB und Spring Data

SteffenRothenberg edited this page Apr 8, 2023 · 1 revision

Continous Deployment:

Wir wollen, dass unsere App automatisch deployed wird (bei uns auf fly.io), nachdem wir unsere Software weiterentwickelt und

auf den Mainbranch gemerged haben.

Voraussetzung: Dockerfile ist im Hauptverzeichnis und App muss gelauncht sein.

Dann:

  1. Erstelle im Ordner .github/workflows die Datei deploy.yml
Bildschirmfoto 2023-04-04 um 22 35 01
  1. 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.

  1. Token auf fly.io erstellen, um github zu authorisieren: auf fly.io auf Account und dann Access Tokens
Bildschirmfoto 2023-04-04 um 23 57 06 ------------------------------------------------------------------

dann Token createn und kopieren

Bildschirmfoto 2023-04-05 um 00 03 13 ------------------------------------------------------------------

dann in github auf das Projekt gehen und auf Settings:

Bildschirmfoto 2023-04-05 um 00 07 57 ------------------------------------------------------------------- und da auf Secrets and Variables --> Actions Bildschirmfoto 2023-04-05 um 00 11 47 -------------------------------------------------------------------

dann auf new repository secret

und dann WICHTIG!! beim Name FLY_API_KEY angeben und bei Secret den kopierten Token einfügen.

Bildschirmfoto 2023-04-05 um 00 15 31 -------------------------------------------------------------------

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
Bildschirmfoto 2023-04-05 um 00 29 29

MongoDB

Folien MongoDB

In der Docker App oben in der Suchleiste mongo eingeben und docker official image auswählen, zunächst pull und dann run

Bildschirmfoto 2023-04-05 um 00 50 02

dann öffnet sich ein Fenster, da die Optional Settings auswählen und wie auf dem Bild ausfüllen (27017 ist der Standardport).

Bildschirmfoto 2023-04-04 um 11 36 40


Nächster Schritt: MongoDB Compass runterladen und installieren(Version für Apple-M1-Chip) und öffnen. Klick auf Connect.

Bildschirmfoto 2023-04-05 um 01 05 28 -------------------------------------------------------------------

Klick auf Create Database bzw. das Plus neben Databases und dann vergib Namen für Database und Collection:

Bildschirmfoto 2023-04-05 um 01 24 51

Klick auf ADD DATA, dann insert Document, um der Collection etwas hinzuzufügen

Bildschirmfoto 2023-04-05 um 01 29 32

Spring Data

  • Wir erstellen ein Springboot Projekt erstellen mit einer Controller-, Service- und Repository-Klasse.
Bildschirm­foto 2023-04-05 um 13 42 28
  • Wir benötigen die Dependencies SpringWeb und zusätzlich noch die Spring Data MongoDB:
Bildschirm­foto 2023-04-05 um 13 46 51
  • 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:
Bildschirm­foto 2023-04-06 um 09 27 08
  • 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.

Bildschirm­foto 2023-04-06 um 09 56 20
  • Als nächstes erstellen wir die Service-Klasse und erstellen ein private final von dem TodoRepo-Interface.
Bildschirm­foto 2023-04-06 um 09 59 22
  • Nun das Repository als Interface erstellen:
Bildschirm­foto 2023-04-06 um 10 06 06
  • 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.

Bildschirm­foto 2023-04-08 um 11 44 40
  • zum testen können wir im Postman nun per Post Todos hinzufügen und uns diese mit dem Get abrufen.
Bildschirm­foto 2023-04-08 um 11 48 17
  • 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)
Bildschirm­foto 2023-04-08 um 11 48 35
  • um der Datenbank einen bestimmten Titel mitzugeben, müssen wir in die application.properties und dort spring.data.mongodb.database="ausgewählterNameDerDb"
Bildschirm­foto 2023-04-08 um 11 53 16
  • 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.
Bildschirm­foto 2023-04-08 um 12 02 38

Clone this wiki locally