2. 2024-10-01
-
Hanan: IoT/HA - Alarmierung für ältere PErsonen
-
Zangenfeind: Koordination für Müllsammeln
-
Projektarten
-
Stakeholder
-
Projektantrag
2.1. Test Driven development
2.1.1. Continous Testing
-
Grundprinzipien
-
Der Source-Code wird nur geändert, wenn ein Test fehlschlägt
-
Zuerst werden die Tests geschrieben, dann die Methoden implementiert.
-
Unit-Tests so einfach wie möglich.
-
Die Umsetzung in den Methoden ist so einfach wie möglich zu gestalten. MNur der Test soll grün werden. Auch wenn man weiß, dass man später noch refactoren muss.
-
-
Continous Testing
-
Nach Speichern des Codes, werden automatisch Tests durchgeführt
-
-
Stack
package at.htl;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
class MyStackTest {
@Test
void givenNewStack_ThenTheStackIsEmpty() {
var myStack = new MyStack();
//assertThat(myStack.isEmpty()).isTrue();
assertTrue(myStack.isEmpty()); (1)
}
@Test
void givenNewStack_whenPushingOneElement_thenStackIsNotEmpty() {
var myStack = new MyStack(); // <.> // String-Stack
myStack.push("hallo");
assertFalse(myStack.isEmpty());
}
@Test
void givenNewStack_whenPushingOneElementAndPoppingOneElement_thenStackIsEmpty() {
var myStack = new MyStack(); (2)
}
}
3. 2024-10-08
4. 2024-10-21
5. 2024-10-22
5.1. Docker
-
Virtualisierung bezeichnet in der Informatik die Nachbildung eines Hard- oder Software-Objekts durch ein ähnliches Objekt vom selben Typ mit Hilfe einer Abstraktionsschicht. Dadurch lassen sich virtuelle (d. h. nicht-physische) Geräte oder Dienste wie emulierte Hardware, Betriebssysteme, Datenspeicher oder Netzwerkressourcen erzeugen. Dies erlaubt es etwa, Computer-Ressourcen (insbesondere im Server-Bereich) transparent zusammenzufassen oder aufzuteilen, oder ein Betriebssystem innerhalb eines anderen auszuführen. Dadurch können u. a. mehrere Betriebssysteme auf einem physischen Server oder „Host“ ausgeführt werden.[wikipedia]

8. Git branching strategy
8.1. Was ist ein git branch?
-
Ein Git-Branch ist eine unabhängige Version eines Repositories, die es ermöglicht, an neuen Features oder Fixes zu arbeiten, ohne den Hauptcode (meistens im
master
- odermain
-Branch) zu stören. Nach Abschluss der Arbeiten kann der Branch zurück in den Hauptbranch gemergt werden, um die Änderungen zu integrieren.
-
Der main-Branch ist immer lauffähig
-
Die Entwicklung der Features findet auf feature Branches statt.

BEACHTE
|
-
Beurteilungkriterien:
-
Anzahl der Commits (Insights)
-
Anzahl der feature-Branches
-
Qualität der Commit-Messages
-
Issue-Nummer
-
Existenz eines Tasks (Issue) zu jedem Commit
-
-
10. 2024-11-19 [Hanan]

10.4. Was ist Docker?
-
Eine Technologie , um eine Application und alle ihre Abhängigkeiten in einen einzelnen , leicht zu transportierenden Container zu packen.
-
Wird eine Applikation in einem Docker-Container gepackt, so ist sichergestellt , dass die Laufzeitumgebung unverändert bleibt, auch wenn der Container auf einem anderen Hostsystem läuft.
10.5. Wie funktioniert Docker?

-
Dockerfile: Dies ist eine Textdatei, die Anweisungen enthält , um ein Docker-Image zu erstellen.(Kochrezept zum Erstellen des Images).
-
docker build:
-
Mit diesem Befehl wird aus dem Dockerfile ein Docker-Image erstellt. Dieses Image hat alle notwendigen Datien und Abhängigkeiten , um eine Anwendung auszuführen.
-
docker build
-
Docker Registry: Bibliothek oder Lager , wo Docker-Images gespeichert und verwaltet werden.
-
docker pull: Man holt sich mit diesem Befehl ein Docker-Image aus der Docker-Registry.(herunterladen oder pullen)
docker pull
-
docker run: Mit docker run wird aus dem Docker Image ein Docker Container gestartet. Ein Docker Container ist die laufende Instanz eines Docker Images.
docker run
10.6. Leichtgewichtige Virtualisierung VS Schwergewichtige Virtualisierung
Leichtgewichtige Virtualisierung |
Schwergewichtige Virtualisierung |
Die beiden OS sind nicht unabhängig und müssen den selben Kernel benutzen. z.b Linux/Linux, verlangt aber weniger Ressourcenutzung. Beispiele: Docker,Podman |
Die beiden OS sind völlig unabhängig und können verschieden sein. Beispiele: Virtual Box, vmWare |

10.7. Docker Registries
-
ist ein Remote-Repository zum Abspeichern von Docker Images
-
kann privat und öffentlich(public) sein
10.8. Docker Image
-
Ein Docker Image enthält alle notwendigen Dateien, Einstellungen und Abhängigkeiten , um eine Anwendung auszuführen.
10.9. Docker Container
-
Ein Docker Container ist die laufende Instanz von einem Docker Image und wird mit docker run erstellt
10.10. Docker-Wiederholung
10.10.3. Volume
-
Bits and Bytes, die man schreiben und lessen kann (→ File)
-
2 Arten von Volumes:
-
bind mount
-
volume
-
10.10.4. BuildContext
-
Der Docker Build Context ist der Satz von Dateien, die Docker benötigt, um ein Docker-Image zu erstellen. Wenn Sie den Befehl docker build ausführen, übergeben Sie Docker einen Pfad zu einem Verzeichnis als Build Context. Docker sendet dann den Inhalt dieses Verzeichnisses (rekursiv) an den Docker-Daemon.
-
Der Build Context enthält typischerweise die Dockerfile und alle Dateien, die in der Dockerfile referenziert werden, wie z.B. Quellcode, Konfigurationsdateien und Abhängigkeiten.
Beispiel:docker build -t my-image:latest .
-
In diesem Beispiel ist das aktuelle Verzeichnis (.) der Build Context. Docker wird alle Dateien und Unterverzeichnisse im aktuellen Verzeichnis an den Docker-Daemon senden, um das Image zu erstellen.
12. 2024-12-17 [Hanan]
12.1. Beziehungen - Assoziation
-
Die Assoziation zwischen einem Akteur und einem Anwendungsfall wird durch eine einfache Linie dargestellt. Diese Linie symbolisiert die Interaktion, jedoch keine Datenflussrichtung.
-
Beispiel:
-
Ein Benutzer interagiert mit einem System, z. B. ein Kunde führt eine Bestellung durch.
-
12.2. Use case
-
Ein Beispiel für einen Use Case:
-
Ein Kunde kauft ein Auto.
-
-
Grund:
-
Der Kunde benötigt ein Transportmittel, um Güter von A nach B zu befördern.
-
12.3. includes vs extends
-
extends
-
Wird verwendet, wenn ein Anwendungsfall optional erweitert werden kann. Beispiel: 'Registrierung abschließen' kann optional 'Gutschein anwenden' erweitern.
-
-
include
-
Wird verwendet, wenn ein Anwendungsfall zwingend einen anderen Anwendungsfall beinhaltet, um korrekt zu funktionieren. Beispiel: 'Zahlung verarbeiten' beinhaltet zwingend 'Rechnungsdetails prüfen'.
-
12.4. Zustandsmaschine
-
Eine Zustandsmaschine zeigt die verschiedenen Zustände eines Objekts und die möglichen Übergänge zwischen diesen Zuständen.
-
Ein Fußballspiel kann mehrere Zustände haben
-
In Vorbereitung - Startzustand, z.B. Mannschaften werden aufgestellt.
-
Ablauf - Das Spiel wird gespielt.
-
Abbruch - Das Spiel wird vorzeitig beendet.
-
Pause - Halbzeitpause
-
Abschluss - Endzustand, z.B.Spielende
-
14. 2025-02-04
14.1. Entwurfsentscheidungen
14.1.1. Schritt 1: Erarbeiten des Zielsystems
-
Was ist mir wichtig?
-
Bsp: Auswahl einer Datenbank für Ermittlung eines Produkts zu einem gewissen EAN-Code
-
kostenfrei
-
Zugriff über API möglich
-
keine Zugriffsbeschränkungen (möglichst viele Anfragen pro Tag)
-
möglichst viele Produkte sollen enthalten sein
-
ev. Eintragen eigener (neuer) Produkte
-
16. 2025-02-25 Docker
16.1. nginx mit Docker
-
Aufgabenstellung: ein nginx-Image mittels Docker starten.
-
Wenn http://localhost:8080 dann "Hallo <Vorname> <Nachname>"
-
docker image ls docker pull nginx # mit Bind Mount docker run --name nginx \ --rm \ -v $PWD/www-data:/usr/share/nginx/html \ -p 8080:80 \ -d nginx:1.27-alpine docker container stop nginx && docker container rm nginx # Mit Docker Volume docker run --name nginx \ --rm \ -v www-data:/usr/share/nginx/html \ -p 8080:80 \ -d nginx:1.27-alpine docker exec -it nginx /bin/ash docker cp www-data/index.html nginx:/usr/share/nginx/html
Nur der root user darf Ports unter 1000 verwenden, daher verwenden wir 8080 |
17. 2025-03-04 Dockerfile
public class Main {
public static void main(String[] args) {
System.out.println("Hello Chris!");
}
}
FROM eclipse-temurin:21
COPY Main.java /usr/local/src/
WORKDIR /usr/local/src/
RUN javac Main.java
CMD ["java","Main"]
docker build --tag hello-chris . # Bauen des Images anhand des Dockerfiles docker run hello-chris # Starten des Container mir dem gebauten Image
17.1. Vereinbarung
-
Programmieren einer User Story
-
Erstellen eines Docker Container
-
Erstellen eines Verezichnisses
compose
im project-root -
Erstellen eines Dockerfiles für ein beliebiges maven-PRojekt mit Textausgabe
-
Verwenden des maven-Images
-
mvn package
-
Java-Programm - gibt das Datum und die Uhrzeit auf der Console aus und gibt an ob das aktuelle Jahr ein Schaltjahr ist und wann das nächste Schaltjahr ist.
-
-
19. 2025-03-11
19.2. Docker
19.2.1. Lab
-
Das Dockerimage des Nachbarn ausführen
-
Multistage-Build mit 2 Stages
-
Sämtliche Files werden in das Docker-Image kopiert, daher ist es wichtig, dass nur die notwendigen Files im Build-Context sind. |
FROM eclipse-temurin:21 AS builder
COPY Main.java /usr/local/src/
WORKDIR /usr/local/src/
RUN javac Main.java
CMD ["java","Main"]
# Build the image
FROM eclipse-temurin:21
RUN mkdir -p /opt/app
COPY --from=builder /usr/local/src/*.class /opt/app/
WORKDIR /opt/app/
CMD ["java","Main"]
docker build --tag hello-chris .
docker login ghcr.io docker build --tag ghcr.io/htl-leonding/hello-world-chris:latest . docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE ghcr.io/htl-leonding/hello-world-chris latest bf8419a868f2 14 seconds ago 478MB ...

docker push ghcr.io/htl-leonding/hello-world-chris:latest

docker run ghcr.io/htl-leonding/hello-world-chris:latest
Hello Chris!
20. 2025-03-18
20.1. Microservices
-
Package by Feature als Vorstufe zu microservices.
-
Microservices: Eine Applikation wird fachl,ich in mehrere kleinere (unabhängige) Services aufgeteilt. Eine Koordinationsschicht ermöglicht die Kommunikation zwischen den Services.
20.2. Verteilungsdiagramm (Deployment Diagram)
-
Stellt dar, auf welcher Hardware welche Softwarekomponenten laufen.
21. 2025-03-24
21.1. assertj-db

-
Dependency in pom.xml eintragen
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-db</artifactId>
<version>3.0.0</version>
<scope>test</scope>
</dependency>
-
jdbc-Verbindung von unserer Testklasse zur Datenbank erstellen
private final static DataSource dataSource = Database.getDataSource();
// ...
var conn = AssertDbConnectionFactory.of(dataSource).create();
-
den Inhalt der Datenbanktabelle auf der Console ausgeben
import org.assertj.db.type.Table;
import static org.assertj.db.output.Outputs.output;
//...
Table contactTable = conn.table("contact").build();
output(contactTable).toConsole();
-
einen Vergleich durchführen
assertThat(contactTable).row(0)
.value("c_name").isEqualTo("John Doe")
.value("c_email").isEqualTo("john.doe@fmail.com")
.value("c_dob").isEqualTo(LocalDate.of(1990, 6, 23))
.value("c_id").isEqualTo(1);
@Test
void t010_createGroups_Ok() {
// Arrange
groupRepository.deleteAll();
// Act
Map<Character, Group> groups = t.createGroups("ABCDEF");
// Assert
// check table
Table table = new Table(ds, "T_GROUP");
output(table).toConsole();
assertThat(table).hasNumberOfRows(6)
.column("G_GROUP")
.value().isEqualTo('A')
.value().isEqualTo('B')
.value().isEqualTo('C')
.value().isEqualTo('D')
.value().isEqualTo('E')
.value().isEqualTo('F');
// check Map
org.assertj.core.api.Assertions.assertThat(groups).hasSize(6);
org.assertj.core.api.Assertions.assertThat(groups).containsOnlyKeys('A', 'B', 'C', 'D', 'E', 'F');
org.assertj.core.api.Assertions.assertThat(groups.values())
.usingElementComparator((t1, t2) -> t1.groupLetter.compareTo(t2.groupLetter))
.contains(
new Group('A'),
new Group('B'),
new Group('C'),
new Group('D'),
new Group('E'),
new Group('F')
);
}
23. 2025-04-08
23.1. wie kann man in Projekten REST-api’s verwenden?
-
api’s können abgefragt werden mittels:
-
Browser (eher nur GET)
-
standalone-Applikationen wie Postman und Insomnia
-
(Java-)Programme mittels http-client
-
curl und httpie (cli)
-
curl "http://opengtindb.org?ean=4337256824132&cmd=query&queryid=400000000"
-
http "http://opengtindb.org?ean=4337256824132&cmd=query&queryid=400000000"
-
-
REST-assured (Test-Framework)
-
REST-client (IDEA-Plugin oder auch für VSCode)
-
Browser-Plugin für REST
-
23.2. Marshalling / Unmarshalling
Java-Objekt -→ JSON-String : Marshalling JSON-String -→ Java-Objekt : Unmarshalling
-
Library: Jackson
-
https://www.baeldung.com/jackson-deserialize-json-unknown-properties
24. Docker Context
-
In der pom.xml muss das manifest konfiguriert werden, damit die Main-Klasse gefunden wird.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>at.htl</groupId>
<artifactId>webserver</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<archive>
<manifest>
<mainClass>at.htl.ServerSingleThreaded</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
-
beim Erstellen eines Docker Images ist darauf zu achten, dass der Build Context korrekt ist.
-
Sämtliche Files werden vom Build Context in die Docker Ausführungsumgebung kopiert.
-
Mit COPY werden dann die Files von dem Build Context in das Docker Image kopiert.
docker build --tag webserver --file src/main/docker/Dockerfile .
FROM maven:3.9.9-eclipse-temurin-21 AS builder ARG MAIN_CLASS=ServerSingleThreaded COPY src/main/java/at/htl/$MAIN_CLASS.java /usr/local/src/ WORKDIR /usr/local/src/ RUN javac $MAIN_CLASS.java CMD ["java", "$MAIN_CLASS"] # Build the image FROM eclipse-temurin:21 RUN mkdir -p /opt/app COPY --from=builder /usr/local/src/*.class /opt/app/at/htl/ WORKDIR /opt/app CMD ["java","at.htl.ServerSingleThreaded"]
docker run --rm -it webserver /bin/bash
docker run --rm -p 8080:8080 --name webserver webserver
25. 2025-04-29
-
Zuerst wird für jedes Softwareprodukt eine eigene docker-compose.yaml Datei erstellt.
-
Anschließend werden diese Docker-Compose-Dateien in eine gemeinsame Datei zusammengeführt und dort koordiniert ausgeführt.
services:
postgres:
image: postgres
restart: always
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: app
POSTGRES_DB: db
healthcheck:
test: [ "CMD-SHELL", "pg_isready" ]
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Vor der Arbeit mit docker compose ins Verzeichnis wechseln, in dem das docker-compose.yaml File liegt.
|
;docker compose -f ../compose/postgres.yaml up
docker compose ls
docker compose --file=postgres.yaml exec -it postgres bash
PGPASSWORD=app pg_dump --username=app db
-
PGPASSWORD=app
ist eine Umgebungsvarianble, die für den nachfolgenden Aufruf vonpg_dump
zur Verfügung steht.
docker compose --file=postgres.yaml exec -it postgres pg_dump --username=app db | gzip > sql.gz
-
Ergebnis ist ein gzip-komprimiertes File mit dem Namen sql.gz
26. 2025-05-19
26.2. 2025-05-20
netstat -ant | grep 5432
tcp46 0 0 *.5432 *.* LISTEN fd2f59fb6fe26d56 stream 0 0 8611bcf93543214b 0 0 0 /var/run/pppconfd
-
Der * bedeutet, dass der Port auf alle Netzwerk-Interfaces horcht.
-
bei Linux würde -antp auch die dazugehörigen Prozesse anzeigen.
netstat -antp
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:30631 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.54:53 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN - tcp6 0 0 127.0.0.1:45323 :::* LISTEN 17575/./jetbrains-t tcp6 0 0 127.0.0.1:52829 :::* LISTEN 17575/./jetbrains-t tcp6 0 0 :::22 :::* LISTEN - tcp6 0 0 ::1:631 :::* LISTEN -
netstat -ant | grep LISTEN
tcp46 0 0 *.5432 *.* LISTEN tcp46 0 0 *.6000 *.* LISTEN tcp6 0 0 *.53 *.* LISTEN tcp4 0 0 *.53 *.* LISTEN tcp4 0 0 127.0.0.1.61559 *.* LISTEN tcp4 0 0 127.0.0.1.7239 *.* LISTEN tcp4 0 0 127.0.0.1.61549 *.* LISTEN tcp4 0 0 127.0.0.1.26621 *.* LISTEN ... tcp4 0 0 127.0.0.1.49211 *.* LISTEN tcp4 0 0 127.0.0.1.9151 *.* LISTEN tcp4 0 0 *.57621 *.* LISTEN tcp4 0 0 127.0.0.1.1025 *.* LISTEN tcp4 0 0 *.88 *.* LISTEN tcp6 0 0 *.88 *.* LISTEN tcp4 0 0 127.0.0.1.8021 *.* LISTEN tcp6 0 0 ::1.8021 *.* LISTEN tcp4 0 0 *.445 *.* LISTEN tcp6 0 0 *.445 *.* LISTEN
-
Hier sieht man, dass manche Ports nur von intern (localhost) angesprochen werden können.
-
bei MacOS würde man folgenden Befehl verwenden:
lsof -i -P -n | grep LISTEN
rapportd 606 stuetz 8u IPv4 0xb6e2667869e70684 0t0 TCP *:50607 (LISTEN) rapportd 606 stuetz 12u IPv6 0x889aaa34d19a9844 0t0 TCP *:50607 (LISTEN) ControlCe 777 stuetz 8u IPv4 0x61d2a85b9b674e58 0t0 TCP *:7000 (LISTEN) ControlCe 777 stuetz 9u IPv6 0x452349c57bc733f0 0t0 TCP *:7000 (LISTEN) ControlCe 777 stuetz 10u IPv4 0x3b84959d8ee716c8 0t0 TCP *:5000 (LISTEN) ControlCe 777 stuetz 11u IPv6 0x26c0035d85e7504a 0t0 TCP *:5000 (LISTEN) Spotify 929 stuetz 78u IPv4 0xe4fbdca9704406b8 0t0 TCP *:57621 (LISTEN) Spotify 929 stuetz 82u IPv4 0x48d0e223be6fb0c6 0t0 TCP *:50597 (LISTEN) FinderSyn 957 stuetz 3u IPv4 0x9c9117e56e3bd34f 0t0 TCP 127.0.0.1:1025 (LISTEN) jetbrains 1128 stuetz 103u IPv6 0xbb8988425aee7c3f 0t0 TCP 127.0.0.1:49274 (LISTEN) jetbrains 1128 stuetz 267u IPv6 0xaf1596bddf6de4f0 0t0 TCP 127.0.0.1:52829 (LISTEN) Dropbox 1132 stuetz 154u IPv4 0x81dd39f69271770e 0t0 TCP 127.0.0.1:17600 (LISTEN) Dropbox 1132 stuetz 155u IPv4 0x4e68170e700218e2 0t0 TCP 127.0.0.1:17603 (LISTEN) tor 1138 stuetz 6u IPv4 0xd162863dccd6f047 0t0 TCP 127.0.0.1:9151 (LISTEN) tor 1138 stuetz 11u IPv4 0x7a379cd8dd421acb 0t0 TCP 127.0.0.1:9150 (LISTEN) cloud-dri 1170 stuetz 4u IPv4 0x37958c0585a9a952 0t0 TCP 127.0.0.1:49211 (LISTEN) cloud-dri 1170 stuetz 10u IPv4 0x5137ea581752d249 0t0 TCP 127.0.0.1:50634 (LISTEN) idea 6925 stuetz 32u IPv6 0xfa4db57756db584c 0t0 TCP 127.0.0.1:63343 (LISTEN) embedding 7573 stuetz 5u IPv6 0x8d634d0b00a6be49 0t0 TCP [::1]:52870 (LISTEN) embedding 7573 stuetz 6u IPv6 0x6304b015ccbac77 0t0 TCP 127.0.0.1:52870 (LISTEN) TextMate 72369 stuetz 15u IPv6 0x9d3a1c4167f22dd0 0t0 TCP [::1]:52698 (LISTEN) Google 78808 stuetz 44u IPv6 0x5b7c244ead49ed28 0t0 TCP [::1]:7679 (LISTEN) idea 81281 stuetz 15u IPv6 0x41a6de76702cdc4d 0t0 TCP 127.0.0.1:63342 (LISTEN) idea 81281 stuetz 571u IPv6 0x4b51db0cf7be0613 0t0 TCP 127.0.0.1:61912 (LISTEN) embedding 81895 stuetz 5u IPv6 0x56b4f81ee5b74a4 0t0 TCP [::1]:59523 (LISTEN) embedding 81895 stuetz 6u IPv6 0xcb0112bbb40a43d0 0t0 TCP 127.0.0.1:59523 (LISTEN) adb 99562 stuetz 8u IPv4 0x80ca7d7734ab36f4 0t0 TCP 127.0.0.1:5037 (LISTEN)
27. 2025-05-27
docker compose -f webserver.yaml up --build
watch docker compose ps
watch … führt das Kommando wiederholt aus
Every 2.0s: docker compose ps Toms-MBP-2022.local: 09:30:58 in 0.089s (0) NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS compose-postgres-1 postgres "docker-entrypoint.s…" postgres About a minute ago Up About a minute (healthy) 0.0.0.0:5432->5432/tcp compose-webserver-1 webserver "/__cacert_entrypoin…" webserver About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp
28. 2025-06-03
28.1. Übung
-
Erstellen eines Java-Webservers, der auf eine Datenbank zugreift.
-
Aus der Datenbank werden die Daten einer Tabelle ausgelesen und als html-table dargestellt.
-
Es ist ein Tabelle GREETING zu erstellen mit den Spalten:
-
ID (integer, primary key)
-
GREETING_TEXT (varchar(255)) zB "Hallo Welt", "Hallo Chris", "Hallo Hanan"
-
-
Aufruf mit http://localhost:8080/greeting/1 -→ "Hallo Welt"
-
Aufruf mit http://localhost:8080/greeting/2 -→ "Hallo Chris"
-
Aufruf mit http://localhost:8080/greeting/3 -→ "Hallo Hanan"
-
Die Datenbank ist eine Postgres-Datenbank, die in einem Docker-Container läuft.
-
Bauen Sie anschließend eine gh-actions-pipeline, die ein Docker-Image des Webservers baut und dieses in der GitHub Container Registry speichert.
28.2. gh-actions
dig . ns dig htl-leonding.at ns dig htl-leonding.atdir at ns ns dig at ns dig ac.at ns dig htl-leonding.at ns dig www.htl-leonding.at ns dig www.htl-leonding.ac.at ns cd compose docker compose ps docker compose up watch docker compose ps cd compose watch docker compose ps cd compose docker compose exec -it webserver bash git status git add . git commit -m "docker compose fertig" git remote add origin git@github.com:htl-leonding/docker-monorepo-3ahitm.git git branch -M main\ngit push -u origin main mkdir -p .github/workflows git status git add . git status git commit -m "Erste pipeline erstellt" git push origin main git commit -m "Java in gh-runner" git add . git commit -m "Java in gh-runner" git push origin main git add . git push origin main git add . git commit -m "Java in gh-runner" git push origin main cd webserver mvn --batch-mode package --file pom.xml history cat ~/.zsh_history