Heutzutage basieren Softwareentwicklungsprozesse auf schnellen und zuverlässigen Bereitstellungszyklen. Manuelle Bereitstellungsprozesse sind zeitaufwändig, fehleranfällig und nicht skalierbar. Genau hier kommt GitHub Actions ins Spiel. GitHub Actions ist ein leistungsstarkes Tool für Continuous Integration und Continuous Deployment (CI/CD), mit dem Sie automatisierte Workflows direkt in Ihrem GitHub-Repository erstellen können. Dieser Artikel wird die automatische Bereitstellung einer Node.js-API mit GitHub Actions eingehend untersuchen. Unser Ziel ist es, sicherzustellen, dass der Leser sowohl über theoretisches Wissen verfügt als auch praktische Anwendungen einfach durchführen kann.
1. Einführung: Die Bedeutung der automatischen Bereitstellung und die Rolle von GitHub Actions
In modernen Softwareentwicklungsprozessen ist die Bereitstellung, die Phase nach dem Schreiben des Codes, ein kritischer Schritt, in dem die Anwendung die Benutzer erreicht. Traditionelle manuelle Bereitstellungsmethoden nehmen den Entwicklern viel Zeit in Anspruch und bergen das Risiko menschlicher Fehler. Die automatische Bereitstellung bietet eine Lösung für diese Probleme und ermöglicht es Entwicklungs- und Betriebsteams (DevOps), effizienter zu arbeiten. GitHub Actions ist eines der beliebtesten Tools, das diese Automatisierung ermöglicht.
1.1. Vorteile der automatischen Bereitstellung
- Geschwindigkeit: Neue Funktionen und Korrekturen werden den Benutzern schneller zur Verfügung gestellt.
- Zuverlässigkeit: Das Risiko menschlicher Fehler wird reduziert und die Bereitstellungsprozesse werden konsistenter.
- Effizienz: Entwickler können sich auf das Schreiben von Code konzentrieren, anstatt sich mit Bereitstellungsprozessen zu beschäftigen.
- Skalierbarkeit: Steigende Bereitstellungsanforderungen können ohne manuellen Eingriff erfüllt werden.
- Einfache Rücknahme: Automatische Bereitstellungssysteme bieten die Möglichkeit, eine fehlerhafte Bereitstellung einfach zurückzunehmen.
1.2. Was ist GitHub Actions?
GitHub Actions ist eine von GitHub angebotene CI/CD-Plattform. Dank der über YAML-Dateien definierten Workflows können Sie eine Reihe von Aufgaben automatisch ausführen. Zu diesen Aufgaben gehören das Ausführen von Tests, die Codeanalyse, das Erstellen von Docker-Images und die Bereitstellung. GitHub Actions bietet eine breite Palette an Plattform- und Tool-Unterstützung und passt sich so an unterschiedliche Projektanforderungen an.
1.3. Warum GitHub Actions?
- Kostenlose Ebene: Bietet eine kostenlose Nutzung für Open-Source-Projekte.
- Einfache Integration: Funktioniert direkt integriert mit dem GitHub-Repository.
- Breite Community-Unterstützung: Es gibt eine große Anzahl vorgefertigter Aktionen und Workflow-Vorlagen.
- Flexibilität: Funktioniert mit verschiedenen Programmiersprachen und Plattformen.
- Skalierbarkeit: Kann je nach steigenden Projektanforderungen einfach skaliert werden.
2. Erforderliche Werkzeuge und Vorbereitungen
Für die automatische Bereitstellung einer Node.js-API mit GitHub Actions sind bestimmte Tools und Vorbereitungen erforderlich. In diesem Abschnitt werden die notwendigen Voraussetzungen und Installationsschritte detailliert behandelt.
2.1. Konten und Zugriffsrechte
- GitHub-Konto: Sie benötigen ein GitHub-Konto.
- Bereitstellungsumgebungskonto: Sie benötigen ein Konto für die Umgebung, in der Sie bereitstellen möchten (z. B. AWS, Azure, Heroku).
- API-Schlüssel und Anmeldeinformationen: Sie müssen die für den Zugriff auf die Bereitstellungsumgebung erforderlichen API-Schlüssel und Anmeldeinformationen sicher speichern (GitHub Secrets).
2.2. Node.js und npm/yarn
- Node.js: Node.js muss installiert sein, damit Ihre API funktioniert.
- npm oder yarn: Sie müssen einen der Paketmanager npm oder yarn verwenden, um Abhängigkeiten zu verwalten.
2.3. Projektstruktur
Eine bestimmte Struktur Ihres Projekts erleichtert den Bereitstellungsprozess. Die empfohlene Projektstruktur ist wie folgt:
my-node-api/
├── .github/workflows/ # GitHub Actions Workflows
│ └── deploy.yml
├── src/ # API-Quellcode
│ ├── index.js
│ └── ...
├── package.json # Projektabhängigkeiten und Skripte
├── .gitignore # Dateien, die von Git nicht verfolgt werden sollen
└── README.md
2.4. GitHub Secrets
Es ist nicht sicher, API-Schlüssel, Datenbankpasswörter und andere sensible Informationen direkt im GitHub-Repository zu speichern. Daher müssen Sie diese Informationen als GitHub Secrets speichern. GitHub Secrets sind verschlüsselte Umgebungen, auf die nur GitHub Actions Workflows zugreifen können.
So richten Sie GitHub Secrets ein:
- Gehen Sie in Ihrem GitHub-Repository zum Tab "Settings".
- Suchen Sie den Abschnitt "Secrets" und klicken Sie darauf.
- Klicken Sie auf die Schaltfläche "New repository secret", um ein neues Secret zu erstellen.
- Geben Sie den Secret-Namen und den Wert ein.
3. Erstellen eines GitHub Actions Workflows
GitHub Actions Workflows werden durch YAML-Dateien definiert, die sich im Verzeichnis `.github/workflows` befinden. In diesem Abschnitt erstellen wir ein Beispiel für einen Workflow, der zum automatischen Bereitstellen einer Node.js-API erforderlich ist.
3.1. Erstellen einer YAML-Datei
Erstellen Sie eine Datei namens `deploy.yml` im Verzeichnis `.github/workflows`. Diese Datei definiert den Bereitstellungs-Workflow.
3.2. Grundlegende Struktur des Workflows
Die grundlegende Struktur der YAML-Datei ist wie folgt:
name: Node.js API Bereitstellung
on:
push:
branches:
- main # Wird ausgelöst, wenn in diesen Branch gepusht wird
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Code Abrufen
uses: actions/checkout@v3
- name: Node.js Installation
uses: actions/setup-node@v3
with:
node-version: '16.x'
- name: Abhängigkeiten installieren
run: npm install
- name: Tests ausführen
run: npm test
- name: Bereitstellung
run: |
# Hier kommen die Bereitstellungsbefehle
echo "Bereitstellung erfolgreich!"
3.3. Detaillierte Beschreibung des Workflows
- name: Gibt den Namen des Workflows an.
- on: Gibt die Ereignisse an, die den Workflow auslösen. In diesem Beispiel lösen `push`-Ereignisse in den `main`-Branch den Workflow aus.
- jobs: Definiert die Jobs, die im Workflow ausgeführt werden. In diesem Beispiel gibt es nur einen Job namens `deploy`.
- runs-on: Gibt die virtuelle Umgebung an, in der der Job ausgeführt wird. In diesem Beispiel wird `ubuntu-latest` verwendet.
- steps: Definiert die Schritte, die innerhalb des Jobs ausgeführt werden. Jeder Schritt kann eine Aktion oder ein Befehl sein.
- uses: Wird verwendet, um eine vorgefertigte Aktion zu verwenden. Beispielsweise ruft die Aktion `actions/checkout@v3` den Code aus dem Repository ab.
- run: Wird verwendet, um Shell-Befehle auszuführen. Beispielsweise installiert der Befehl `npm install` die Abhängigkeiten.
3.4. Bereitstellungsschritt
Der Bereitstellungsschritt enthält die Befehle, die zum Bereitstellen Ihrer Anwendung in der Zielumgebung erforderlich sind. Diese Befehle variieren je nach der Umgebung, in der Sie bereitstellen. Beispielsweise können Sie die Heroku CLI verwenden, um in Heroku bereitzustellen.
- name: Bereitstellung
run: |
heroku login
heroku git:remote -a my-heroku-app
git push heroku main
In diesem Beispiel meldet sich der Befehl `heroku login` bei Heroku an, der Befehl `heroku git:remote` fügt der Heroku-Anwendung ein Remote hinzu und der Befehl `git push heroku main` sendet den Code an Heroku.
4. Workflow-Beispiele je nach Bereitstellungsumgebung
Es ist möglich, mit GitHub Actions in verschiedene Bereitstellungsumgebungen bereitzustellen. In diesem Abschnitt werden Workflow-Beispiele für gängige Bereitstellungsumgebungen vorgestellt.
4.1. Bereitstellung in Heroku
Heroku ist eine Cloud-basierte Anwendungsplattform. Um in Heroku bereitzustellen, können Sie die folgenden Schritte ausführen:
- Erstellen Sie ein Heroku-Konto.
- Installieren Sie die Heroku CLI.
- Erstellen Sie eine Anwendung in Heroku.
- Fügen Sie in GitHub Secrets ein Secret namens `HEROKU_API_KEY` hinzu. Dieses Secret sollte Ihren Heroku-API-Schlüssel enthalten.
- Verwenden Sie den folgenden Workflow:
name: Bereitstellung auf Heroku
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Code abrufen
uses: actions/checkout@v3
- name: Node.js installieren
uses: actions/setup-node@v3
with:
node-version: '16.x'
- name: Abhängigkeiten installieren
run: npm install
- name: Tests ausführen
run: npm test
- name: Bereitstellung auf Heroku
run: |
git remote add heroku https://git.heroku.com/your-heroku-app-name.git
git push heroku main:main -f
4.2. Bereitstellung auf AWS EC2
AWS EC2 ist ein von Amazon Web Services angebotener Dienst für virtuelle Server. Um auf EC2 bereitzustellen, können Sie die folgenden Schritte ausführen:
- Erstellen Sie ein AWS-Konto.
- Erstellen Sie einen virtuellen Server in EC2.
- Erstellen Sie die SSH-Schlüssel, die erforderlich sind, um sich per SSH mit dem EC2-Server zu verbinden.
- Fügen Sie in GitHub Secrets Secrets namens `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` und `SSH_PRIVATE_KEY` hinzu.
- Verwenden Sie den folgenden Workflow:
name: Bereitstellung auf AWS EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Code abrufen
uses: actions/checkout@v3
- name: Node.js installieren
uses: actions/setup-node@v3
with:
node-version: '16.x'
- name: Abhängigkeiten installieren
run: npm install
- name: Tests ausführen
run: npm test
- name: Bereitstellung auf AWS EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /path/to/your/app
git pull origin main
npm install
pm2 restart your-app-name
4.3. Bereitstellung mit Docker
Docker ist eine Plattform, die es ermöglicht, Anwendungen in Containern zu verpacken und bereitzustellen. Um mit Docker bereitzustellen, können Sie die folgenden Schritte ausführen:
- Erstellen Sie ein Docker-Konto.
- Erstellen Sie eine Dockerfile für Ihr Projekt.
- Fügen Sie in GitHub Secrets Secrets namens `DOCKER_USERNAME` und `DOCKER_PASSWORD` hinzu.
- Verwenden Sie den folgenden Workflow:
name: Bereitstellung mit Docker
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Code abrufen
uses: actions/checkout@v3
- name: Docker installieren
uses: docker/setup-buildx-action@v2
- name: Bei Docker anmelden
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Docker-Image erstellen und veröffentlichen
uses: docker/build-push-action@v3
with:
context: .
push: true
tags: your-docker-username/your-app-name:latest
5. Integration der Testautomatisierung
Ein wichtiger Bestandteil des automatischen Bereitstellungsprozesses ist die Testautomatisierung. Das Testen des Codes vor der Bereitstellung ermöglicht die frühzeitige Erkennung von Fehlern und verbessert die Qualität der Anwendung.
5.1. Testskripte definieren
In der Datei `package.json` Ihres Projekts müssen Sie die Testskripte definieren. Zum Beispiel:
{
"name": "my-node-api",
"version": "1.0.0",
"scripts": {
"test": "jest"
},
"dependencies": {
"express": "^4.17.1"
},
"devDependencies": {
"jest": "^27.0.0"
}
}
In diesem Beispiel verwendet das `test`-Skript das `jest`-Testframework. Wenn der Befehl `npm test` ausgeführt wird, werden die Jest-Tests ausgeführt.
5.2. Hinzufügen eines Testschritts zum GitHub Actions-Workflow
Um einen Testschritt zum GitHub Actions-Workflow hinzuzufügen, können Sie den Befehl `npm test` mit dem Befehl `run` ausführen. Zum Beispiel:
- name: Tests ausführen
run: npm test
Wenn die Tests fehlschlagen, wird der Workflow gestoppt und die Bereitstellung erfolgt nicht. Dies verhindert die Bereitstellung von fehlerhaftem Code.
5.3. Veröffentlichen von Testergebnissen
Um die Testergebnisse in der GitHub Actions-Oberfläche zu veröffentlichen, können Sie Aktionen von Drittanbietern verwenden. Beispielsweise können Sie mit der Aktion `dorny/test-reporter` Ergebnisse aus verschiedenen Testframeworks in GitHub Actions importieren.
6. Rollback-Strategien
Obwohl automatisierte Bereitstellungsprozesse Fehler minimieren, kann es dennoch vorkommen, dass eine fehlerhafte Bereitstellung erfolgt. In diesem Fall ist es wichtig, schnell einen Rollback durchzuführen.
6.1. Warum ist ein Rollback erforderlich?
- Fehlerhafter Code: Der bereitgestellte Code kann unerwartete Fehler enthalten.
- Inkompatibilität: Die neue Version ist möglicherweise nicht mit den vorhandenen Systemen kompatibel.
- Leistungsprobleme: Die neue Version kann Leistungsprobleme verursachen.
6.2. Rollback-Strategien
- Zurücksetzen auf die letzte erfolgreiche Bereitstellung: Die einfachste Methode ist, auf die vorherige erfolgreiche Bereitstellung zurückzusetzen. Dies ist in der Regel eine Funktion, die von der Bereitstellungsumgebung bereitgestellt wird.
- Code-Rücknahme (Revert): Sie können einen fehlerhaften Commit zurücknehmen (revert) und eine neue Bereitstellung durchführen.
- Blau/Grün-Bereitstellung: Mithilfe von zwei verschiedenen Umgebungen (blau und grün) können Sie die neue Version in der grünen Umgebung testen und, falls keine Probleme auftreten, den Datenverkehr in die grüne Umgebung umleiten. Im Fehlerfall können Sie den Datenverkehr wieder in die blaue Umgebung umleiten.
6.3. Automatisierung der Rücknahme mit GitHub Actions
Es ist möglich, Rücknahmeprozesse mit GitHub Actions zu automatisieren. Beispielsweise können Sie einen Workflow erstellen, der bei Erkennung eines Fehlers automatisch auf die vorherige erfolgreiche Bereitstellung zurücksetzt.
7. Sicherheitsaspekte
Die Gewährleistung der Sicherheit in automatisierten Bereitstellungsprozessen ist von entscheidender Bedeutung. Sensible Informationen (API-Schlüssel, Passwörter usw.) müssen sicher gespeichert und sicher in die Bereitstellungsumgebung übertragen werden.
7.1. Die Bedeutung von GitHub Secrets
Wie bereits erwähnt, ist es nicht sicher, sensible Informationen direkt im GitHub-Repository zu speichern. Daher müssen Sie diese Informationen als GitHub Secrets speichern. GitHub Secrets sind verschlüsselte Umgebungen, auf die nur von GitHub Actions-Workflows zugegriffen werden kann.
7.2. Zugriffskontrolle
Sie müssen die Personen, die Zugriff auf das GitHub-Repository haben, sorgfältig verwalten. Sie sollten nur den erforderlichen Personen Zugriffsberechtigungen erteilen. Darüber hinaus müssen Sie die Sicherheit der Konten gewährleisten, die Zugriff auf die Bereitstellungsumgebung haben.
7.3. Code-Überprüfung (Code Review)
Die Überprüfung von Codeänderungen vor der Bereitstellung ermöglicht die frühzeitige Erkennung von Sicherheitslücken und Fehlern. Die Code-Überprüfung ist ein sicherheitskritischer Schritt.
7.4. Abhängigkeitssicherheit
Sie müssen die Sicherheit der in Ihrem Projekt verwendeten Abhängigkeiten regelmäßig überprüfen. Durch die Aktualisierung von Abhängigkeiten mit Sicherheitslücken können Sie die Sicherheit Ihrer Anwendung erhöhen.
8. Überwachung und Alarmierung (Monitoring & Alerting)
Die Überwachung der Leistung und des Zustands der Anwendung nach der Bereitstellung ist wichtig, um potenzielle Probleme frühzeitig zu erkennen. Überwachungs- und Alarmsysteme erkennen unerwartetes Verhalten der Anwendung und ermöglichen Ihnen, schnell zu reagieren.
8.1. Überwachungsmetriken
Die folgenden grundlegenden Metriken sollten überwacht werden:
- CPU-Auslastung: Die Überwachung der CPU-Auslastung des Servers hilft Ihnen, Leistungsprobleme zu erkennen.
- Speicherauslastung: Die Überwachung der Speicherauslastung des Servers hilft Ihnen, Speicherlecks und unzureichende Speicherprobleme zu erkennen.
- Festplattenauslastung: Die Überwachung der Festplattenauslastung des Servers hilft Ihnen, Probleme mit der Festplattenkapazität zu erkennen.
- Netzwerkverkehr: Die Überwachung des Netzwerkverkehrs des Servers hilft Ihnen, anormale Verkehrszunahmen und Sicherheitsbedrohungen zu erkennen.
- Fehlerrate: Die Überwachung der Fehlerrate der Anwendung hilft Ihnen, die Häufigkeit und Schwere von Fehlern zu verfolgen.
- Antwortzeit: Die Überwachung der Antwortzeit der Anwendung hilft Ihnen, Leistungsprobleme zu erkennen.
8.2. Alarmsysteme
Alarmsysteme senden automatisch Warnungen, wenn bestimmte Metriken einen bestimmten Schwellenwert überschreiten. Diese Warnungen können über verschiedene Kanäle wie E-Mail, SMS oder Slack gesendet werden.
8.3. Überwachungswerkzeuge
Beliebte Überwachungswerkzeuge sind:
- Prometheus: Ein Open-Source-Überwachungs- und Alarmsystem.
- Grafana: Ein Open-Source-Tool zur Visualisierung von Daten.
- New Relic: Eine Cloud-basierte Plattform zur Leistungsüberwachung.
- Datadog: Eine Cloud-basierte Überwachungs- und Sicherheitsplattform.
9. Beispiele aus dem echten Leben und Fallstudien
In diesem Abschnitt werden Beispiele aus dem echten Leben und Fallstudien zur automatischen Bereitstellung von Node.js-APIs mit GitHub Actions vorgestellt.
9.1. E-Commerce-Plattform
Eine E-Commerce-Plattform verwendet GitHub Actions, um sicherzustellen, dass neue Funktionen und Korrekturen schnell für Benutzer bereitgestellt werden. Dank GitHub Actions werden automatisch Tests ausgeführt und der Code auf Heroku bereitgestellt, wenn Entwickler ihren Code in den `main`-Branch pushen. Dadurch wird der Bereitstellungsprozess erheblich beschleunigt und das Risiko der Bereitstellung fehlerhaften Codes reduziert.
9.2. SaaS-Anwendung
Eine SaaS-Anwendung verwendet GitHub Actions, um Bereitstellungen in verschiedenen Umgebungen für verschiedene Kunden durchzuführen. Dank GitHub Actions wurde für jeden Kunden ein separater Workflow definiert und sichergestellt, dass die Bereitstellung speziell für die Umgebung jedes Kunden erfolgt. Dies hat den Bereitstellungsprozess flexibler und skalierbarer gemacht.
10. Häufig gestellte Fragen
- 10.1. Ist GitHub Actions kostenlos?
- GitHub Actions ist für Open-Source-Projekte kostenlos. Für private Projekte gibt es ein bestimmtes Nutzungslimit. Wenn Sie dieses Limit überschreiten, müssen Sie eine Gebühr entrichten.
- 10.2. Welche Plattformen unterstützt GitHub Actions?
- GitHub Actions unterstützt die Plattformen Linux, Windows und macOS.
- 10.3. Welche Programmiersprachen unterstützt GitHub Actions?
- GitHub Actions unterstützt jede Programmiersprache. In Workflows können Sie die gewünschte Programmiersprache und die gewünschten Tools verwenden.
- 10.4. Was kann ich mit GitHub Actions tun?
- Mit GitHub Actions können Sie viele Prozesse automatisieren, wie z. B. das Ausführen von Tests, die Codeanalyse, das Erstellen von Docker-Images, die Bereitstellung und die Verwaltung der Infrastruktur.
- 10.5. Wie lerne ich GitHub Actions?
- Um GitHub Actions zu lernen, können Sie die offizielle Dokumentation von GitHub, Online-Schulungen und Beispielprojekte einsehen.
11. Ergebnis und Zusammenfassung
GitHub Actions ist ein leistungsstarkes und flexibles Tool für die automatisierte Bereitstellung von Node.js-APIs. In diesem Artikel haben wir detailliert untersucht, was GitHub Actions ist, wie es verwendet wird und wie es für verschiedene Bereitstellungsumgebungen konfiguriert wird. Wir haben die Vorteile der automatischen Bereitstellung, die Integration der Testautomatisierung, Rücknahmestrategien, Sicherheitsaspekte und Überwachungs-/Alarmsysteme behandelt. Ich hoffe, dieser Artikel ist eine nützliche Ressource für Entwickler, die Node.js-APIs mit GitHub Actions automatisch bereitstellen möchten.
Wichtige Hinweise:
- Aktualisieren Sie Ihre GitHub Actions-Workflows regelmäßig und scannen Sie sie auf Sicherheitslücken.
- Verwalten Sie GitHub Secrets sorgfältig und schützen Sie Ihre sensiblen Daten.
- Überwachen Sie regelmäßig die Leistung und den Zustand Ihrer Anwendung und konfigurieren Sie Alarmsysteme.
- Stellen Sie durch Code-Reviews sicher, dass Fehler und Sicherheitslücken frühzeitig erkannt werden.
Merkmal | GitHub Actions | Jenkins | CircleCI |
---|---|---|---|
Integration | Vollständig in GitHub integriert | Integriert mit Plugins | Integriert mit GitHub und anderen VCS |
Preisgestaltung | Kostenlos für Open-Source-Projekte, nutzungsbasiert für private Projekte | Open Source und kostenlos, aber es fallen Infrastrukturkosten an | Kostenlose Ebene verfügbar, kostenpflichtig für mehr Ressourcen |
Benutzerfreundlichkeit | YAML-basiert, leicht zu erlernen | Die Benutzeroberfläche kann komplex sein, erfordert Anpassung mit Plugins | YAML-basiert, einfach zu bedienen |
Skalierbarkeit | Wird automatisch von GitHub skaliert | Kann je nach Infrastruktur skaliert werden | Cloud-basiert, automatische Skalierbarkeit |
Bereitstellungsumgebung | Vorteile | Nachteile |
---|---|---|
Heroku | Einfache Einrichtung, schnelle Bereitstellung | Begrenzte Anpassungsmöglichkeiten, kann kostspielig sein |
AWS EC2 | Volle Kontrolle, anpassbar | Einrichtung und Verwaltung können komplex sein |
Docker | Portabilität, Konsistenz | Lernkurve, Verwaltung kann komplex sein |