CI/CD konzipieren #4
Labels
No labels
bug
duplicate
enhancement
help wanted
high priority
invalid
L
low priority
M
medium priority
needs refinement
question
S
UX research
wontfix
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: local-it/mitgliederverwaltung#4
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Welche Actions sollen erledigt werden?
Welche Tools sollen dafür verwendet werden?
Ich hab bisher meistens mit Jenkins gearbeitet, der ja doch grundlegend anders funktioniert.
Aber wir haben damit bei jedem main-Commit gebuilded, ein docker-image in ein repo gepushed, auf eine Testinstanz deployed und Integrationstests ausgeführt.
Entwicklung erfolgte auf feature-branch ebene. Bei Bedarf konnten wir auch feature-branch deployments zum Testen durchführen, also vorm Mergen von PRs.
Lass gerne schauen was davon wir wann brauchen, aber ich habe das ziemlich gefeiert. So kommt auch niemand auf die Idee manuell Releases zu bauen
Genau wie Simon bin ich großer Fan von review-environments und voll automatisierten releases. Hier ein Vorschlag für das Setup:
Checks
Hier wird überprüft, dass alles im Projekt so funktioniert wie es soll.
mix formatmix testmix compile --warnings-as-errors. In diesem Schritt hat elixir inzwischen einen grundlegenden Typechecker eingebaut, der einfache Fehler erkennen kann.mix hex.audit.Ich lege außerdem gerne ein
just citask an, mit dem man in der lokalen Entwicklungsumgebung alles ausführen kann, was die CI normalerweise überprüft. Das geht schneller, als zu pushen und zu schauen, ob die CI Fehler ausspuckt.Build
Wenn die Checks erfolgreich waren, wird hier ein Container gebaut. Hierfür kann uns Phoenix ein initiales Dockerfile generieren.
Deploy
Der gebaute Container in eine Container-Registry hochgeladen und im Haupt-environment oder in einem temporären Review-environment deployed, je nachdem ob wir auf dem main-Branch oder in einem Pull Request laufen.
Generelles
Migrations & Downtime: Mein Vorschlag ist, die App kurz herunterzufahren, um die Migrations auszuführen. Zero-downtime-migrations sind ein sehr großer Aufwand für verhältnismäßig geringe Vorteile.
Pipeline-Laufzeit: Wir sollten schauen, wie wir möglichst viele Inputs in der CI cachen können. In den Drone docs habe ich dazu auf die schnelle noch nichts gefunden, aber da kriegen wir bestimmt was hin. Zusätzlich sollten wir Jobs innerhalb einer Pipeline möglichst parallel laufen lassen.
Wann läuft die CI? Ich habe gute Erfahrungen damit gemacht, die CI immer für den neuesten commit auf dem main-Branch und in jedem Pull Request laufen zu lassen.
Bin hierdrauf noch gestoßen, dein Vorschlag enthält aber auch schon soweit ich es sehe alle Punkte: https://fly.io/phoenix-files/github-actions-for-elixir-ci/
Hier etwas zu Drone Caching: https://laszlo.cloud/the-ultimate-droneci-caching-guide https://github.com/drone-plugins/drone-meltwater-cache