Ruby: Deployment mit GitHub Actions

Wie Sie Ihren Ruby-Code mit GitHub Actions bereitstellen

👋 Willkommen bei der Stackhero-Dokumentation!

Stackhero bietet eine einsatzbereite Ruby Cloud Lösung, die zahlreiche Vorteile bietet, darunter:

  • Deployen Sie Ihre Anwendung in Sekundenschnelle mit einem einfachen git push.
  • Verwenden Sie Ihren eigenen Domainnamen und profitieren Sie von der automatischen Konfiguration von HTTPS-Zertifikaten für erhöhte Sicherheit.
  • Genießen Sie beruhigende automatische Backups, Ein-Klick-Updates und eine einfache, transparente und vorhersehbare Preisgestaltung.
  • Erhalten Sie optimale Performance und robuste Sicherheit dank einer privaten und dedizierten VM.

Sparen Sie Zeit und vereinfachen Sie Ihr Leben: Es dauert nur 5 Minuten, um die Ruby Cloud Hosting Lösung von Stackhero auszuprobieren!

GitHub Actions ermöglicht es Ihnen, Aufgaben wie das Deployment Ihres Ruby-Codes auf Ihren Produktionsservern zu automatisieren. Manuelle Schritte sind nicht erforderlich.

In dieser Anleitung erfahren Sie, wie Sie GitHub Actions sicher und zuverlässig einrichten, um Ihren Ruby-Code automatisch sowohl in Staging- als auch in Produktionsumgebungen zu deployen. Dieser Ansatz sorgt für konsistente Deployments und minimiert das Fehlerrisiko.

Zu Beginn arbeiten Sie mit zwei Branches in Ihrem GitHub-Repository: staging und production. Immer wenn Sie Code in einen dieser Branches pushen, werden Ihre Änderungen automatisch auf die entsprechende Stackhero-Instanz deployed.

Das Einrichten einer Staging-Instanz ist optional. Sie können dieser Anleitung auch nur mit einer Produktionsinstanz folgen, jedoch wird dringend empfohlen, sowohl Staging- als auch Produktionsumgebungen einzurichten. Dies gilt als Best Practice in der Branche und hilft, Fehler zu erkennen, bevor sie Ihre Produktionsnutzer erreichen.

Bevor Sie starten, stellen Sie sicher, dass Sie über ein GitHub-Konto und ein Repository mit Ihrem Ruby-Code verfügen.

Öffnen Sie Ihr Stackhero-Dashboard und erstellen Sie zwei Ruby-Services: einen für Staging und einen für Produktion. Zur besseren Übersicht empfiehlt es sich, diese Services in "Production" und "Staging" umzubenennen.

Sie haben noch kein Stackhero-Konto? Sie können sich in wenigen Minuten kostenlos registrieren und anschließend Ihre Ruby Cloud-Services mit nur wenigen Klicks erstellen.

Beispiel für Production- und Staging-ServicesBeispiel für Production- und Staging-Services

Damit GitHub Actions Ihren Code deployen kann, müssen Sie SSH-Schlüssel einrichten. So stellen Sie sicher, dass nur autorisierte Aktionen auf Ihre Stackhero-Services zugreifen können und Ihre Deployments geschützt sind.

Sie können ein neues SSH-Schlüsselpaar auf Ihrem Rechner generieren mit:

ssh-keygen -C "" -f /tmp/ssh_key -N ""

Lesen Sie anschließend den gerade erstellten öffentlichen Schlüssel aus:

cat /tmp/ssh_key.pub

Wählen Sie im Stackhero-Dashboard Ihren "production" Ruby-Service aus und klicken Sie auf "Configure". Service-Einstellungen abrufenService-Einstellungen abrufen

Dann:

  1. Unter SSH public keys klicken Sie auf Add a public key.
  2. Bei Description geben Sie GitHub Action ein.
  3. Bei Key fügen Sie den Inhalt Ihres öffentlichen Schlüssels von Ihrem Rechner ein.

Service-Einstellungen abrufenService-Einstellungen abrufen

Gehen Sie nun auf die GitHub-Website und öffnen Sie Ihr Projekt.

Navigieren Sie zu Settings > Environments und klicken Sie auf New environment. GitHub-Umgebungen konfigurierenGitHub-Umgebungen konfigurieren

Geben Sie Ihrer Umgebung den Namen "production" und speichern Sie sie. Umgebung festlegenUmgebung festlegen

Klicken Sie auf den Button No restriction und wählen Sie Selected branches and tags. Umgebungsrestriktionen festlegenUmgebungsrestriktionen festlegen

Klicken Sie auf Add deployment branch or tag rule, geben Sie als Pattern "production" ein und fügen Sie die Regel hinzu. Umgebungs-Branch festlegenUmgebungs-Branch festlegen Umgebungs-Branch festlegenUmgebungs-Branch festlegen

Um Ihren privaten SSH-Schlüssel sicher zu speichern, gehen Sie zu Environment secrets und klicken Sie auf Add secret. Secret hinzufügenSecret hinzufügen

Lesen Sie Ihren privaten Schlüssel von Ihrem Rechner aus:

cat /tmp/ssh_key

Für Name geben Sie STACKHERO_SSH_PRIVATE_KEY ein. Für Value fügen Sie den Inhalt Ihres privaten Schlüssels ein. SSH Private Key Secret festlegenSSH Private Key Secret festlegen

Fügen Sie anschließend den Endpoint Ihres Ruby-Services als Umgebungsvariable hinzu. Klicken Sie auf Add variable unter Environment variables. Variablen festlegenVariablen festlegen

Für Name geben Sie STACKHERO_ENDPOINT ein. Für Value fügen Sie den Endpoint Ihres Ruby-Services ein, den Sie im Stackhero-Dashboard finden. Endpoint-Variable festlegenEndpoint-Variable festlegen

Wenn Sie einen eigenen Domainnamen für Ihren Service eingerichtet haben, verwenden Sie bitte diesen anstelle von <XXXXXX>.stackhero-network.com.

Sobald Ihre Schlüssel in Stackhero und GitHub hinterlegt sind, können Sie sie aus Sicherheitsgründen von Ihrem Rechner löschen.

rm /tmp/ssh_key /tmp/ssh_key.pub

Erstellen Sie auf Ihrem lokalen Rechner im Git-Repository ein Verzeichnis namens .github/workflows. Legen Sie darin eine Datei mit dem Namen deploy-to-stackhero.yml an.

# Datei: .github/workflows/deploy-to-stackhero.yml

name: Deploy to Stackhero
run-name: Deploy branch "${{ github.ref_name }}" to Stackhero

on:
  push:
    # Liste der Branches, die nach einem git push das Deployment auslösen.
    # Vergessen Sie nicht, eine Umgebung mit dem Branch-Namen in GitHub (unter "Settings"/"Environments") anzulegen.
    # Fügen Sie dann das entsprechende Secret "STACKHERO_SSH_PRIVATE_KEY" und die Variable "STACKHERO_ENDPOINT" in dieser Umgebung hinzu.
    branches: [ "production", "staging" ]

jobs:
  Deploy:
    environment: ${{ github.ref_name }}
    runs-on: ubuntu-latest
    steps:
    - uses: stackhero-io/github-actions-deploy-to-stackhero@v1
      with:
        # Das Secret "STACKHERO_SSH_PRIVATE_KEY" und die Variable "STACKHERO_ENDPOINT" müssen in der jeweiligen Branch-Umgebung auf GitHub unter "Settings"/"Environments" definiert sein.
        ssh_private_key: ${{ secrets.STACKHERO_SSH_PRIVATE_KEY }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}

Nachdem Sie die Workflow-Datei erstellt haben, können Sie Ihre Änderungen committen.

git add -A .
git commit -m "Add GitHub Actions to deploy to Stackhero"

Erstellen Sie anschließend einen Production-Branch.

git checkout -b production

Zum Schluss pushen Sie Ihre Änderungen zu GitHub.

git push --set-upstream origin production

Mit diesem letzten git push wird Ihr Code in den production-Branch auf GitHub hochgeladen. GitHub Actions startet dann automatisch und deployed Ihren Code auf Ihre Stackhero-Instanz.

Um Ihren Workflow in Aktion zu sehen, besuchen Sie die GitHub-Seite Ihres Projekts und klicken Sie auf Actions. GitHub Actions, die nach Production deployed habenGitHub Actions, die nach Production deployed haben

Herzlichen Glückwunsch, Sie haben soeben Continuous Deployment für Production mit GitHub Actions eingerichtet.

Das Einrichten der Staging-Umgebung erfolgt nach dem gleichen Prinzip wie für Production. Wiederholen Sie einfach die oben genannten Schritte und ersetzen Sie überall production durch staging, wo es erforderlich ist.

Sobald Ihre Staging-Umgebung eingerichtet ist, können Sie einen Staging-Branch erstellen.

git checkout -b staging

Pushen Sie Ihren Staging-Branch zu GitHub.

git push --set-upstream origin staging

GitHub Actions wird nun automatisch Ihren Staging-Branch auf die dafür vorgesehene Stackhero Ruby-Instanz für Staging deployen.

Um Ihre Deployments zusätzlich abzusichern, empfiehlt es sich, die Branches production und staging zu schützen. Das bedeutet, dass direkte Pushes eingeschränkt werden und Änderungen nur über Pull Requests erfolgen können. Teammitglieder mit den entsprechenden Berechtigungen können Pull Requests für staging prüfen und freigeben. Sobald alles passt, können die Änderungen auf die gleiche Weise in production gemerged werden.

Mit diesem Workflow erhöhen Sie die Sicherheit (nur autorisierte Nutzer können auf staging und production deployen) und die Zuverlässigkeit (alle neuen Features werden zunächst in Staging getestet, bevor sie in Produktion gehen). So stellen Sie reibungslose Deployments sicher und halten Ihre Produktionsumgebung stabil.