Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:modul:ffit:3-jahr:cicd:learningunits:lu09:b [2026/04/06 16:22] – apeter | de:modul:ffit:3-jahr:cicd:learningunits:lu09:b [2026/04/07 14:55] (aktuell) – apeter | ||
|---|---|---|---|
| Zeile 7: | Zeile 7: | ||
| Damit man von ausserhalb der AWS-Umgebung auf diesen Backend-Container zugriefen kann wurde in der BZZ-AWS-Build-Umgebung ein Forwarding aktiviert, welches HTTP-Anfragen, | Damit man von ausserhalb der AWS-Umgebung auf diesen Backend-Container zugriefen kann wurde in der BZZ-AWS-Build-Umgebung ein Forwarding aktiviert, welches HTTP-Anfragen, | ||
| - | Allgemein: '' | + | Allgemein: '' |
| + | Konkrete Beispiele: | ||
| + | * " | ||
| + | * " | ||
| <code ini> | <code ini> | ||
| Zeile 16: | Zeile 19: | ||
| </ | </ | ||
| - | Das bedeutet, dass im Frontend sichergestellt werden muss, dass Aufrufe des Backends die richtige URL (/ | + | Das bedeutet, dass im Frontend sichergestellt werden muss, dass Aufrufe des Backends die richtige URL verwenden. |
| + | ^ Pipeline ^ Frontend ^ | ||
| + | | < | ||
| <code bash> | <code bash> | ||
| - | | + | npm install |
| - | REACT_APP_API_BASE=/ | + | REACT_APP_API_BASE=/ |
| - | | + | npm run build |
| </ | </ | ||
| - | + | </ | |
| - | < | + | < |
| const API_BASE = process.env.REACT_APP_API_BASE; | const API_BASE = process.env.REACT_APP_API_BASE; | ||
| ... | ... | ||
| Zeile 32: | Zeile 36: | ||
| fetch(`${API_BASE}/ | fetch(`${API_BASE}/ | ||
| </ | </ | ||
| + | </ | ||
| - | Konkrete Beispiele: | + | Dasselbe gilt natürlich auch für das Backend, dessen Container richtig benannt und dessen Port korrekt gesetzt werden muss. |
| - | * " | + | |
| - | ''"'' | + | ^ Pipeline ^ Backend ^ |
| + | | < | ||
| + | <code bash> | ||
| + | BACKEND_CONTAINER | ||
| + | ... | ||
| + | docker build -t $BACKEND_CONTAINER backend/ | ||
| + | docker run -d \ | ||
| + | --name $BACKEND_CONTAINER \ | ||
| + | ... | ||
| + | $BACKEND_CONTAINER | ||
| + | </ | ||
| + | </ | ||
| + | <code python> | ||
| + | flask_app = create_app() | ||
| + | flask_app.run(debug=True, | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Die Datenbank muss wiederum so konfiguriert werden, dass sie vom Backend angesprochen werden kann. | ||
| + | <WRAP center round info 60%> | ||
| + | Die Credentials werden hier im Klartext verwendet, damit die Funktionsweise klarer ist. In der Praxis werden natürlich Secrets dafür verwendet. | ||
| + | </ | ||
| + | |||
| + | |||
| + | ^ Pipeline Backend ^ Pipeline Datenbank ^ | ||
| + | | < | ||
| + | <code bash> | ||
| + | DB_CONTAINER | ||
| + | DB_USER | ||
| + | DB_PASSWORD | ||
| + | DB_NAME | ||
| + | ... | ||
| + | -e DATABASE_URL=" | ||
| + | </ | ||
| + | </ | ||
| + | <code bash> | ||
| + | docker run -d \ | ||
| + | --name $DB_CONTAINER \ | ||
| + | -e POSTGRES_USER=$DB_USER \ | ||
| + | -e POSTGRES_PASSWORD=$DB_PASSWORD \ | ||
| + | -e POSTGRES_DB=$DB_NAME \ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Beispiel-Deployment ==== | ||
| + | Alle Stages für das Deployment von https:// | ||
| + | |||
| + | <code bash> | ||
| + | pipeline { | ||
| + | agent any | ||
| + | |||
| + | environment { | ||
| + | PROJECT_NAME | ||
| + | BRANCH_NAME | ||
| + | REPO_URL | ||
| + | TARGET_DIR | ||
| + | SONAR_SCANNER_OPTS = " | ||
| + | BACKEND_CONTAINER | ||
| + | DB_CONTAINER | ||
| + | DB_VOLUME | ||
| + | DB_USER | ||
| + | DB_PASSWORD | ||
| + | DB_NAME | ||
| + | } | ||
| + | |||
| + | stages { | ||
| + | stage('Checkout') { | ||
| + | steps { | ||
| + | git branch: BRANCH_NAME, | ||
| + | url: REPO_URL | ||
| + | } | ||
| + | } | ||
| + | |||
| + | stage(' | ||
| + | when { | ||
| + | expression { false } | ||
| + | } | ||
| + | steps { | ||
| + | sh ''' | ||
| + | echo "Starting DB with workspace $WORKSPACE" | ||
| + | |||
| + | docker stop $DB_CONTAINER || true | ||
| + | docker rm $DB_CONTAINER || true | ||
| + | |||
| + | docker run -d \ | ||
| + | --name $DB_CONTAINER \ | ||
| + | --network infra-net \ | ||
| + | -e POSTGRES_USER=$DB_USER \ | ||
| + | -e POSTGRES_PASSWORD=$DB_PASSWORD \ | ||
| + | -e POSTGRES_DB=$DB_NAME \ | ||
| + | -v $DB_VOLUME:/ | ||
| + | -v $WORKSPACE/ | ||
| + | postgres: | ||
| + | ''' | ||
| + | } | ||
| + | } | ||
| + | |||
| + | stage(' | ||
| + | when { | ||
| + | expression { false } | ||
| + | } | ||
| + | steps { | ||
| + | sh ''' | ||
| + | TABLE_EXISTS=$(docker exec $DB_CONTAINER psql -U $DB_USER -d $DB_NAME -tAc " | ||
| + | if [ " | ||
| + | echo " | ||
| + | docker exec -i $DB_CONTAINER psql -U $DB_USER -d $DB_NAME < database/ | ||
| + | else | ||
| + | echo " | ||
| + | fi | ||
| + | ''' | ||
| + | } | ||
| + | } | ||
| + | |||
| + | stage(' | ||
| + | when { | ||
| + | expression { false } | ||
| + | } | ||
| + | steps { | ||
| + | dir(' | ||
| + | sh ''' | ||
| + | npm install | ||
| + | GENERATE_SOURCEMAP=false \ | ||
| + | NODE_OPTIONS=" | ||
| + | PUBLIC_URL=/ | ||
| + | REACT_APP_API_BASE=/ | ||
| + | npm run build | ||
| + | ''' | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | stage(' | ||
| + | when { | ||
| + | expression { false } | ||
| + | } | ||
| + | steps { | ||
| + | sh ''' | ||
| + | echo " | ||
| + | |||
| + | mkdir -p " | ||
| + | rm -rf " | ||
| + | |||
| + | cp -r frontend/ | ||
| + | ''' | ||
| + | } | ||
| + | } | ||
| + | |||
| + | stage(' | ||
| + | when { | ||
| + | expression { false } | ||
| + | } | ||
| + | steps { | ||
| + | sh ''' | ||
| + | docker build -t $BACKEND_CONTAINER backend/ | ||
| + | |||
| + | docker stop $BACKEND_CONTAINER || true | ||
| + | docker rm $BACKEND_CONTAINER || true | ||
| + | |||
| + | docker run -d \ | ||
| + | --name $BACKEND_CONTAINER \ | ||
| + | --network infra-net \ | ||
| + | -e DATABASE_URL=" | ||
| + | $BACKEND_CONTAINER | ||
| + | ''' | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </ | ||
| - | '' | ||