paint-brush
Laravel Envoy – So automatisieren Sie den langweiligen Kramvon@oussamamater
1,005 Lesungen
1,005 Lesungen

Laravel Envoy – So automatisieren Sie den langweiligen Kram

von Oussama Mater9m2024/07/10
Read on Terminal Reader

Zu lang; Lesen

Laravel Envoy kann Ihnen dabei helfen, mühsame Aufgaben zu automatisieren, und es kann viel mehr als nur CI/CD. Sehen wir uns an, wie wir damit die Einrichtung von Nginx und das Hinzufügen von SSH-Schlüsseln zu GitHub automatisieren können.
featured image - Laravel Envoy – So automatisieren Sie den langweiligen Kram
Oussama Mater HackerNoon profile picture

Laravel Envoy ist ein Tool zum Ausführen allgemeiner Aufgaben, die Sie auf Ihren Remote-Servern ausführen.


Ich glaube, Envoy wird unterschätzt. Ich sehe nicht, dass es sehr oft verwendet wird, obwohl ich es immer sehr nützlich fand. In diesem Artikel werden wir untersuchen, wie Envoy Ihnen helfen kann, Ihre Produktivität zu steigern🚀.


Laravel Envoy ist nicht exklusiv für Laravel-Entwickler oder auf Laravel-Projekte beschränkt, jeder kann es verwenden ❤️.


Lassen Sie uns zunächst zwei Schlüsselkonzepte in Envoy besprechen:


  1. Aufgaben : Dies stellt eine bestimmte Aktion dar, beispielsweise das Aktualisieren des Servers oder das Klonen eines Repository.


  2. Stories : eine Sammlung von Aufgaben.


Das ist alles, was Sie im Moment wissen müssen. Alle Funktionen können Sie jederzeit in der Dokumentation nachlesen.

Was automatisieren wir?

In diesem Artikel automatisieren wir zwei Dinge, die die meisten Entwickler beim Bereitstellen ihrer Anwendungen tun:


  1. Nginx konfigurieren.


  2. Generieren von SSH-Schlüsseln und Hinzufügen dieser zu GitHub, um auf private Repositories zugreifen zu können.


Ja, ich weiß, meistens wird Envoy für CI/CD-Workflows verwendet, aber es kann buchstäblich ALLES.

Envoy-Einrichtung

Lassen Sie uns zunächst ein Verzeichnis erstellen:

 mkdir tuto && cd $_


$ take tuto , wenn Sie zsh verwenden.


Installieren Sie Envoy , indem Sie den folgenden Befehl ausführen:

 composer require laravel/envoy --dev


Stellen Sie sicher, dass Sie Composer installiert haben.


Erstellen Sie nun eine Datei namens Envoy.blade.php . Ja, wir werden die Blade Syntax verwenden, super cool, oder?

 touch Envoy.blade.php


Das ist alles! Sie benötigen lediglich ein einziges Skript. Es muss nicht spezifisch für Laravel oder ein Laravel-bezogenes Projekt sein. Beginnen wir mit der Automatisierung! 😁

Konfigurieren Sie Nginx

Wir haben einen brandneuen Server und möchten Nginx einrichten. Wenn wir den Prozess aufschlüsseln, würde er folgendermaßen aussehen:


  1. Aktualisieren des Servers
  2. Installieren Sie Nginx
  3. Konfigurieren Sie Nginx


Und genau das werden wir mit Envoy tun: Betrachten Sie jeden Schritt als eine Task und den gesamten Prozess als eine Story .


Übersetzen wir also das gerade Gesagte in eine Geschichte:

 @servers(['web' => '[email protected]', 'local' => '127.0.0.1']) @story('setup-nginx') update-server install-nginx copy-nginx-stub configure-nginx @endstory


Mit der Direktive @servers geben wir die Server an, auf denen wir unsere Aufgaben später ausführen werden.


Jetzt können wir mit der Definition der einzelnen Aufgaben fortfahren 😁


Unsere erste Aufgabe update-server stellt sicher, dass die Pakete und Abhängigkeiten des Servers auf dem neuesten Stand sind:

 @task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask


Die zweite Aufgabe install-nginx installiert Nginx auf unserem Server:

 @task('install-nginx', ['on' => ['web']]) echo "Installing nginx..." apt install nginx -y rm /etc/nginx/sites-enabled/default /etc/nginx/sites-available/default touch /etc/nginx/sites-available/{{ $application_name }}.conf ln -s /etc/nginx/sites-available/{{ $application_name }}.conf /etc/nginx/sites-enabled/{{ $application_name }}.conf @endtask


Beachten Sie, dass wir den Standard-Nginx-Link entfernt und einen neuen für unsere Anwendung erstellt haben, wobei der Name aus der Variable $application_name stammt.


Um diese Variable verwenden zu können, müssen Sie sie deklarieren. Daher müssen wir die Direktive @setup einbinden:

 @setup $application_name = 'your-application-name'; @endsetup

Nun können wir mit der dritten Aufgabe copy-nginx-stub fortfahren. In meinem Fall stelle ich eine Laravel-Anwendung bereit, daher verwende ich die in den Dokumenten bereitgestellte Nginx-Konfigurationsdatei mit ein paar Anpassungen. Wenn Sie eine andere Anwendung bereitstellen, können Sie dasselbe Konzept auf Ihre eigene Konfigurationsdatei anwenden.


Führen Sie in dem Verzeichnis, das wir gerade erstellt haben, den folgenden Befehl aus:

 mkdir stubs; nano stubs/nginx.conf


Fügen Sie dann den folgenden Inhalt in den Editor ein, speichern Sie ihn und beenden Sie ihn:

 server { listen 80; listen [::]:80; server_name public_ip; root /var/www/app_name/public; add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; index index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } error_page 404 /index.php; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.0-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } }

Die public_ip und app_name sind vorerst Platzhalter und werden automatisch mit unseren Variablen aktualisiert.


Fahren wir mit dem Schreiben der Aufgabe selbst fort:

 @task('copy-nginx-stub', ['on' => 'local']) scp -P{{ $production_port }} -r ./stubs/nginx.conf {{ $production_host }}:/etc/nginx/sites-available/{{ $application_name }}.conf @endtask


Diese Aufgabe wird auf unserem lokalen Computer ausgeführt, statt auf dem Remote-Server. Wir geben dies mit 'on' => 'local' an.


Und vergessen Sie nicht, die @setup Direktive mit den erforderlichen Variablen zu aktualisieren:

 @setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; @endsetup



Die vierte und letzte Aufgabe configure-nginx aktualisiert die Platzhalter, damit wir die Anwendung korrekt bereitstellen können:

 @task('configure-nginx', ['on' => 'web']) echo "Configuring nginx..." cd /etc/nginx/sites-available/ sed -i 's/app_name/{{ $application_name }}/g' {{ $application_name }}.conf sed -i 's/public_ip/{{ $production_ip }}/g' {{ $application_name }}.conf @endtask


Beachten Sie den Befehl cd . Dies liegt daran, dass jede Aufgabe separat ausgeführt wird und daher immer im Home-Verzeichnis des Remote-Servers gestartet wird.


Den symbolischen Link haben wir bereits bei der Installation von Nginx erstellt, darum müssen wir uns jetzt nicht mehr kümmern.


Und wir sind mit diesem Abschnitt fertig! Ihr Skript sollte folgendermaßen aussehen:

 @servers(['web' => '[email protected]', 'local' => '127.0.0.1']) @setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; @endsetup @story('setup-nginx') update-server install-nginx copy-nginx-stub configure-nginx @endstory @task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask @task('install-nginx', ['on' => ['web']]) echo "Installing nginx..." apt install nginx -y rm /etc/nginx/sites-enabled/default /etc/nginx/sites-available/default touch /etc/nginx/sites-available/{{ $application_name }}.conf ln -s /etc/nginx/sites-available/{{ $application_name }}.conf /etc/nginx/sites-enabled/{{ $application_name }}.conf @endtask @task('copy-nginx-stub', ['on' => 'local']) scp -P{{ $production_port }} -r ./stubs/nginx.conf {{ $production_host }}:/etc/nginx/sites-available/{{ $application_name }}.conf @endtask @task('configure-nginx', ['on' => 'web']) echo "Configuring nginx..." cd /etc/nginx/sites-available/ sed -i 's/app_name/{{ $application_name }}/g' {{ $application_name }}.conf sed -i 's/public_ip/{{ $production_ip }}/g' {{ $application_name }}.conf @endtask

SSH-Schlüsselkonfiguration

Nachdem wir Nginx nun konfiguriert haben und es bereit ist, unsere Anwendung bereitzustellen, müssen wir SSH-Schlüssel generieren und den öffentlichen Schlüssel zu GitHub hinzufügen, damit wir die privaten Repositories abrufen können.


Hierzu verwenden wir die GitHub REST API . Bevor wir beginnen, müssen Sie also ein Token erstellen .


Achten Sie beim Erstellen Ihres Tokens darauf, dass Sie nur den Bereich „admin:public_key“ auswählen.


Nachdem Sie nun Ihr Token erstellt haben, beginnen wir mit der Definition einiger Variablen:

 @setup $ssh_key = '~/.ssh/id_rsa_github'; $github_api_key = 'your-github-token'; $email = '[email protected]'; @endsetup

An dieser Stelle fragen Sie sich vielleicht, welche Schritte dieser Prozess umfasst. Nun, wir können ihn in zwei Schritte unterteilen:


  1. SSH-Schlüssel generieren


  2. Kopieren Sie den öffentlichen Schlüssel nach GitHub


Dieser Prozess wird noch einmal unsere Geschichte sein:

 @story('setup-ssh-keys') generate-ssh-keys add-ssh-keys-to-github @endstory


Die erste Aufgabe, generate-ssh-keys , kann durch Ausführen eines einzigen Befehls erledigt werden:

 @task('generate-ssh-keys', ['on' => ['web']]) echo "Generating ssh keys..." ssh-keygen -t ed25519 -f {{ $ssh_key }} -N '' -q -C "{{ $email }}" @endtask


Sobald wir unsere SSH-Schlüssel generiert haben, können wir den öffentlichen Schlüssel mithilfe der GitHub-API zu GitHub hinzufügen. Dies kann mit einer einzigen Anfrage erfolgen:

 @task('add-ssh-keys-to-github', ['on' => ['web']]) echo "Adding ssh keys to github..." key=$(cat {{ $ssh_key }}.pub) curl --request POST \ --url https://api.github.com/user/keys \ --header 'Accept: application/vnd.github+json' \ --header 'Authorization: Bearer {{ $github_api_key }}' \ --header 'Content-Type: application/json' \ --header 'X-GitHub-Api-Version: 2022-11-28' \ --data '{ "title": "[Envoy] Public key", "key": "'"$key"'" }' @endtask

Und das war’s! Wenn Sie Ihre GitHub-Entwicklereinstellungen aufrufen, sollten Sie Ihren neu erstellten Schlüssel sehen.


Durch die Kombination der beiden Abschnitte sollte Ihr endgültiges Skript folgendermaßen aussehen:

 @servers(['web' => '[email protected]', 'local' => '127.0.0.1']) @setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; $ssh_key = '~/.ssh/id_rsa_github'; $github_api_key = 'your-github-token'; $email = '[email protected]'; @endsetup @story('setup-nginx') update-server install-nginx copy-nginx-stub configure-nginx @endstory @story('setup-ssh-keys') generate-ssh-keys add-ssh-keys-to-github @endstory @task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask @task('install-nginx', ['on' => ['web']]) echo "Installing Nginx..." apt install nginx -y rm /etc/nginx/sites-enabled/default /etc/nginx/sites-available/default touch /etc/nginx/sites-available/{{ $application_name }}.conf ln -s /etc/nginx/sites-available/{{ $application_name }}.conf /etc/nginx/sites-enabled/{{ $application_name }}.conf @endtask @task('copy-nginx-stub', ['on' => 'local']) scp -P{{ $production_port }} -r ./stubs/nginx.conf {{ $production_host }}:/etc/nginx/sites-available/{{ $application_name }}.conf @endtask @task('configure-nginx', ['on' => 'web']) echo "Configuring nginx..." cd /etc/nginx/sites-available/ sed -i 's/app_name/{{ $application_name }}/g' {{ $application_name }}.conf sed -i 's/public_ip/{{ $production_ip }}/g' {{ $application_name }}.conf @endtask @task('generate-ssh-keys', ['on' => ['web']]) echo "Generating ssh keys..." ssh-keygen -t ed25519 -f {{ $ssh_key }} -N '' -q -C "{{ $email }}" @endtask @task('add-ssh-keys-to-github', ['on' => ['web']]) echo "Adding ssh keys to github..." key=$(cat {{ $ssh_key }}.pub) curl --request POST \ --url https://api.github.com/user/keys \ --header 'Accept: application/vnd.github+json' \ --header 'Authorization: Bearer {{ $github_api_key }}' \ --header 'Content-Type: application/json' \ --header 'X-GitHub-Api-Version: 2022-11-28' \ --data '{ "title": "creating from script", "key": "'"$key"'" }' @endtask

Abschluss

Wir haben gelernt, wie man mit Envoy gängige Aufgaben automatisiert. Es ist ein leistungsstarkes Tool mit noch mehr Funktionen, als wir hier erkundet haben. Beschränken Sie sich nicht nur auf die Bereitstellung Ihrer Anwendungen; Envoy kann JEDEN Terminalbefehl automatisieren, buchstäblich alles, was Ihnen in den Sinn kommt.


Wenn Sie das nächste Mal dieselben Befehle wiederholen, sollten Sie es verwenden. Ich verspreche Ihnen, es kann viel mehr als CI/CD 😛😛