mirror of
https://github.com/fhswf/aki_prj23_transparenzregister.git
synced 2026-02-13 22:17:38 +01:00
Reworked the diagramm a bit and added it into the documentation with a
short text.
This commit is contained in:
2 files changed
+46
-18
No files matched your search
@@ -854,11 +854,11 @@ Eine Schritt-für-Schritt-Beschreibung verdeutlicht den Prozess:
|
||||
Die Workflows werden für Pushes und PRs aus dem entsprechenden Branch heraus ausgeführt.
|
||||
|
||||
Bei Pushen und PRs werden die Workflows aus dem entsprechenden Branch verwendet.
|
||||
GitHub Actions führen alle `jobs` parallel aus, im Gegensatz zu sequentiellen Abläufen bei anderen CI/CD-Tools wie z.B. Jenkins.
|
||||
GitHub Actions ermöglichen parametrisierte Matrix Builds.
|
||||
GitHub-Actions führen alle `jobs` parallel aus, im Gegensatz zu sequentiellen Abläufen bei anderen CI/CD-Tools wie z.B. Jenkins.
|
||||
GitHub-Actions ermöglichen parametrisierte Matrix Builds.
|
||||
|
||||
Sie müssen in den Repository-Einstellungen unter `Actions` aktiviert werden.
|
||||
Eine vollständige Schemabeschreibung für GitHub `workflows` findet sich [hier](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions).
|
||||
Eine vollständige Schemabeschreibung für GitHub-`workflows` findet sich [hier](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions).
|
||||
|
||||
#### Implementierte Workflows
|
||||
|
||||
@@ -890,10 +890,10 @@ Für dieses Projekt wurden folgende Workflows implementiert:
|
||||
- Für verschiedene Docker-Container gibt es spezifische Abhängigkeitsdefinitionen in unserem Poetry-Python-Projekt, die pro `target` in der Dockerfile nachinstalliert werden.
|
||||
|
||||
- **Documentation-Action**:
|
||||
- Baut die Dokumentation mit `sphinx` und lädt sie als GitHub Pages hoch.
|
||||
- Baut die Dokumentation mit `sphinx` und lädt sie als GitHub-Pages hoch.
|
||||
- Der Dokumentationsbau erstellt eine HTML-Webseite mit Sphinx.
|
||||
- Die Dokumentation wird nur in Pull Requests oder auf dem `main`-Branch bereitgestellt und kann heruntergeladen werden.
|
||||
- Die Bereitstellung der Dokumentation erfolgt nur auf dem `main`-Branch und wird als externe Webseite auf den GitHub Pages veröffentlicht.
|
||||
- Die Bereitstellung der Dokumentation erfolgt nur auf dem `main`-Branch und wird als externe Webseite auf den GitHub-Pages veröffentlicht.
|
||||
|
||||
|
||||
#### Self-Hosted Act-Runner
|
||||
@@ -907,9 +907,9 @@ Die Einrichtung gemäß der GitHub-Anleitung war relativ einfach, stieß jedoch
|
||||
4. Einige KI-Modelle lassen sich auf dem Raspberry Pi nicht ausführen, da er nicht genügend RAM hat.
|
||||
5. Geringe Parallelisierung und langsame Prozessoren führen zu langen Wartezeiten bei Tests und Linting-Ergebnissen.
|
||||
6. Das Risiko, von GitHub aufgrund zu vieler Downloads gesperrt zu werden, ist geringer.
|
||||
7. GitHub Actions sind für Open-Source-Projekte kostenlos, weshalb es relativ wenig Dokumentation zum Hosting eigener Runner gibt.
|
||||
7. GitHub-Actions sind für Open-Source-Projekte kostenlos, weshalb es relativ wenig Dokumentation zum Hosting eigener Runner gibt.
|
||||
|
||||
Letztendlich wurde uns jedoch die Nutzung von GitHub Actions über den FH-SWF-Account ermöglicht, sodass der self-hosted Runner nicht zum Einsatz kommen musste.
|
||||
Letztendlich wurde uns jedoch die Nutzung von GitHub-Actions über den FH-SWF-Account ermöglicht, sodass der self-hosted Runner nicht zum Einsatz kommen musste.
|
||||
Zur Zeit Nutze ich persönlich den Gitea's Act Runner welcher ein Fork von GitHubs self-hosted Runner ist.
|
||||
Es ist also möglich diesen zu Nutzen.
|
||||
Dies hat aber eindeutige Grenzen und ist bei weitem nicht so komfortabel, ist aber mit nicht ARM32/64 Geräten gut möglich.
|
||||
@@ -932,9 +932,9 @@ Dependabot, der GitHub OWASP-Scanner, ermöglicht es, den Standard-Branch eines
|
||||
Abhängig von der Konfiguration kann Dependabot Handlungsempfehlungen aussprechen oder automatisch Pull Requests erstellen, um Sicherheitslücken zu schließen.
|
||||
Für unser Projekt ist der Einsatz von Dependabot aktuell nicht geplant.
|
||||
Dies liegt daran, dass es mit `pip-audit` redundant wäre und erst nach Abschluss der aktiven Entwicklungsphase des Projekts Vorteile bietet.
|
||||
Dependabot kann Routineaufgaben übernehmen, insbesondere, wenn GitHub Actions implementiert sind und vorgeschlagene Änderungen sofort testen.
|
||||
Dependabot kann Routineaufgaben übernehmen, insbesondere, wenn GitHub-Actions implementiert sind und vorgeschlagene Änderungen sofort testen.
|
||||
Dependabot unterstützt eine Vielzahl von Programmiersprachen und Tools zur Abhängigkeitsverwaltung.
|
||||
Es ermöglicht nicht nur Scans von Python-Abhängigkeiten, sondern auch das Scannen und Aktualisieren von GitHub Actions.
|
||||
Es ermöglicht nicht nur Scans von Python-Abhängigkeiten, sondern auch das Scannen und Aktualisieren von GitHub-Actions.
|
||||
|
||||
Natürlich wäre es einfach möglich nur Dependabot zu nutzen. Da ich aber im beruflichen Kontext `pip-audit` verwende, war dies einfacher.
|
||||
|
||||
@@ -1082,6 +1082,34 @@ Daher wurde bei der Präsentation dieser Werkzeuge die Zustimmung des Teams für
|
||||
|
||||
Die Zustimmung wurde erteilt, und ein erster Entwurf der Pipelines und Tools wurde in Betrieb genommen.
|
||||
|
||||
### Übersicht über den CI/CD Workflow
|
||||
|
||||
Das folgende diagramm zeigt den CI/CD und DevOps Arbeitsfluss.
|
||||
|
||||
```{eval-rst}
|
||||
.. drawio-figure:: workflow.drawio
|
||||
:format: png
|
||||
:page-index: 1
|
||||
```
|
||||
|
||||
Zu sehen sind 4 verschiedene Git-Branches.
|
||||
Die oberen beiden Zeilen stellen die lokale Entwicklung eines neuen Features oder eines Bugfixes dar.
|
||||
Dabei wird neuer Code und Tests geschrieben. Hierdurch wird durch PyCharm und VS-Code visualisiert.
|
||||
Dieses wird dann in einen neuen Branch committed.
|
||||
Hier wird dieser `New Feature/local` genannt.
|
||||
Diese wird für jeden Commit, hier als Node eingezeichnet, durch pre-commit mit `ruff`, `mypy`, `black` und vielen 28 anderen Werkzeugen validiert.
|
||||
In dem oben dargestellten Beispiel wird nach einem zweiten Commit auf GitHub gepusht.
|
||||
Hier durch einen grünen Pfeil dargestellt. Dieser Push wird dann von GitHub getestet.
|
||||
In dem Beispielarbeitsfluss wird noch ein weiterer Commit nachgelegt und hinterher gepusht.
|
||||
Anschließend wird ein Merge-Request erstellt. Um diese zu mergen, müssen sowohl die GitHub Actions passen als auch ein Review erfolgen.
|
||||
Der so neue Merge-Commit auf dem `main`-Branch von GitHub triggerd noch einmal die Tests und baut sowohl neue Docker Images als auch eine neue Dokumentation via Sphinx.
|
||||
Die Docker-Images werden dann vom Portainer auf dem `jupiter.fh-swf.de`-Server gepulled und deployed.
|
||||
Die Dokumentation wird als neue Projektdokumentation auf den GitHub-Pages gebaut.
|
||||
Die Deployments sind hier durch blaue Pfeile dargestellt.
|
||||
Zuletzt kann die so neue Version vom `main`-Branch wieder auf den lokalen Server gepulled werden.
|
||||
Dabei installiert `pre-commit` eventuell neue Dependencies via `poetry`.
|
||||
Damit ist die Entwicklung eines neuen Features abgeschlossen und der Arbeitszyklus kann für ein neues Feature oder einen Bugfix neu begonnen werden.
|
||||
|
||||
### Fazit
|
||||
|
||||
Es gibt zahlreiche hilfreiche Werkzeuge für die Softwareentwicklung.
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
<mxfile host="Electron" modified="2024-01-24T18:43:22.998Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.7.5 Chrome/114.0.5735.289 Electron/25.8.1 Safari/537.36" etag="B75qHCE6lUqOrBC_ty-s" version="21.7.5" type="device">
|
||||
<mxfile host="Electron" modified="2024-01-24T19:14:15.171Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.7.5 Chrome/114.0.5735.289 Electron/25.8.1 Safari/537.36" etag="7hYHdn8OXyrXXB3PG939" version="21.7.5" type="device">
|
||||
<diagram id="yPxyJZ8AM_hMuL3Unpa9" name="simple gitflow">
|
||||
<mxGraphModel dx="1247" dy="734" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1100" pageHeight="850" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="1PlrHrnYgf8SPTkEUP_g-68" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxCell id="1PlrHrnYgf8SPTkEUP_g-68" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="673" y="460" as="sourcePoint" />
|
||||
<mxPoint x="673.39" y="540" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="1PlrHrnYgf8SPTkEUP_g-90" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="1PlrHrnYgf8SPTkEUP_g-89">
|
||||
<mxCell id="1PlrHrnYgf8SPTkEUP_g-90" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" edge="1" parent="1" source="1PlrHrnYgf8SPTkEUP_g-89">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="729" y="460" as="sourcePoint" />
|
||||
<mxPoint x="728.77" y="540" as="targetPoint" />
|
||||
@@ -88,9 +88,6 @@
|
||||
<mxCell id="9hBKPDzoitwpIBdzFDQ7-32" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-purple;gradientColor=none;strokeColor=#000000;" parent="1" vertex="1">
|
||||
<mxGeometry x="419.5" y="245" width="30" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="9hBKPDzoitwpIBdzFDQ7-33" style="edgeStyle=orthogonalEdgeStyle;curved=1;rounded=0;html=1;exitX=1;exitY=0.5;exitPerimeter=0;entryX=0;entryY=0.5;entryPerimeter=0;endArrow=none;endFill=0;jettySize=auto;orthogonalLoop=1;strokeWidth=4;fontSize=15;" parent="1" source="9hBKPDzoitwpIBdzFDQ7-34" target="9hBKPDzoitwpIBdzFDQ7-26" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="9hBKPDzoitwpIBdzFDQ7-34" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-purple;gradientColor=none;strokeColor=#000000;" parent="1" vertex="1">
|
||||
<mxGeometry x="492.5" y="245" width="30" height="30" as="geometry" />
|
||||
</mxCell>
|
||||
@@ -161,19 +158,19 @@
|
||||
<mxCell id="1PlrHrnYgf8SPTkEUP_g-26" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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LDLine truncated
|
||||
<mxGeometry x="442.25" y="275" width="50" height="50" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="1PlrHrnYgf8SPTkEUP_g-30" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxCell id="1PlrHrnYgf8SPTkEUP_g-30" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="434.24" y="283.25" as="sourcePoint" />
|
||||
<mxPoint x="434" y="450" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="1PlrHrnYgf8SPTkEUP_g-31" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxCell id="1PlrHrnYgf8SPTkEUP_g-31" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="507.74" y="283.25" as="sourcePoint" />
|
||||
<mxPoint x="507.5" y="450" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="1PlrHrnYgf8SPTkEUP_g-32" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxCell id="1PlrHrnYgf8SPTkEUP_g-32" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="590" y="380" as="sourcePoint" />
|
||||
<mxPoint x="590" y="200" as="targetPoint" />
|
||||
@@ -272,6 +269,9 @@
|
||||
<mxCell id="1PlrHrnYgf8SPTkEUP_g-171" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIGhlaWdodD0iMTAyNCIgd2lkdGg9IjEwMjQiPiYjeGE7PHBhdGggZmlsbD0iIzFCMUYyMyIgdHJhbnNmb3JtPSJzY2FsZSg2NCkiIGQ9Ik04IDBDMy41OCAwIDAgMy41OCAwIDhDMCAxMS41NCAyLjI5IDE0LjUzIDUuNDcgMTUuNTlDNS44NyAxNS42NiA2LjAyIDE1LjQyIDYuMDIgMTUuMjFDNi4wMiAxNS4wMiA2LjAxIDE0LjM5IDYuMDEgMTMuNzJDNCAxNC4wOSAzLjQ4IDEzLjIzIDMuMzIgMTIuNzhDMy4yMyAxMi41NSAyLjg0IDExLjg0IDIuNSAxMS42NUMyLjIyIDExLjUgMS44MiAxMS4xMyAyLjQ5IDExLjEyQzMuMTIgMTEuMTEgMy41NyAxMS43IDMuNzIgMTEuOTRDNC40NCAxMy4xNSA1LjU5IDEyLjgxIDYuMDUgMTIuNkM2LjEyIDEyLjA4IDYuMzMgMTEuNzMgNi41NiAxMS41M0M0Ljc4IDExLjMzIDIuOTIgMTAuNjQgMi45MiA3LjU4QzIuOTIgNi43MSAzLjIzIDUuOTkgMy43NCA1LjQzQzMuNjYgNS4yMyAzLjM4IDQuNDEgMy44MiAzLjMxQzMuODIgMy4zMSA0LjQ5IDMuMSA2LjAyIDQuMTNDNi42NiAzLjk1IDcuMzQgMy44NiA4LjAyIDMuODZDOC43IDMuODYgOS4zOCAzLjk1IDEwLjAyIDQuMTNDMTEuNTUgMy4wOSAxMi4yMiAzLjMxIDEyLjIyIDMuMzFDMTIuNjYgNC40MSAxMi4zOCA1LjIzIDEyLjMgNS40M0MxMi44MSA1Ljk5IDEzLjEyIDYuNyAxMy4xMiA3LjU4QzEzLjEyIDEwLjY1IDExLjI1IDExLjMzIDkuNDcgMTEuNTNDOS43NiAxMS43OCAxMC4wMSAxMi4yNiAxMC4wMSAxMy4wMUMxMC4wMSAxNC4wOCAxMCAxNC45NCAxMCAxNS4yMUMxMCAxNS40MiAxMC4xNSAxNS42NyAxMC41NSAxNS41OUMxMy43MSAxNC41MyAxNiAxMS41MyAxNiA4QzE2IDMuNTggMTIuNDIgMCA4IDBaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPiYjeGE7PC9zdmc+;" vertex="1" parent="1">
|
||||
<mxGeometry x="703.77" y="550" width="50" height="50" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="1PlrHrnYgf8SPTkEUP_g-172" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/webp,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Line truncated
|
||||
<mxGeometry x="598.75" y="480" width="47.5" height="47.5" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
|
||||
Reference in new issue
Block a user