Laravel Envoy est un outil permettant d'exécuter les tâches courantes que vous exécutez sur vos serveurs distants. Je pense est sous-estimé ; Je ne le vois pas utilisé très souvent même si je l’ai toujours trouvé très utile. Dans cet article, nous explorerons comment peut vous aider à augmenter votre productivité🚀. Envoy Envoy Laravel Envoy n'est pas exclusif aux développeurs Laravel ni limité aux projets Laravel, peut l'utiliser ❤️. tout le monde Tout d'abord, discutons de deux concepts clés dans : Envoy : Cela représente une action spécifique comme la mise à jour du serveur ou le clonage d'un référentiel. Tâches : qui est une collection de tâches. Stories C'est tout ce que vous devez savoir pour l'instant ; vous pouvez toujours en savoir plus sur toutes les fonctionnalités dans la . documentation Qu’automatisons-nous ? Dans cet article, nous allons automatiser 2 choses que la plupart des développeurs font lors du déploiement de leurs applications : Configuration de Nginx. Générer des clés SSH et les ajouter à GitHub pour pouvoir accéder aux référentiels privés. Oui, je sais, la plupart du temps, est utilisé pour les flux de travail CI/CD, mais il peut faire, littéralement. Envoy TOUT Configuration de l'envoyé Tout d'abord, créons un répertoire : mkdir tuto && cd $_ si vous utilisez . $ take tuto zsh Installez en exécutant la commande suivante : Envoy composer require laravel/envoy --dev Assurez-vous que Composer est installé. Maintenant, créez un fichier appelé . Oui, nous utiliserons la syntaxe , super cool, non ? Envoy.blade.php Blade touch Envoy.blade.php C'est ça! Tout ce dont vous avez besoin est un seul script. Il n'est pas nécessaire que cela soit spécifique à Laravel ou à tout projet lié à Laravel. Commençons par l'automatisation ! 😁 Configurer Nginx Nous avons un tout nouveau serveur et nous souhaitons configurer Nginx. Si nous décomposons le processus, cela donnerait ceci : Mettre à jour le serveur Installer Nginx Configurer Nginx C'est exactement ce que nous allons faire avec ; considérez chaque étape comme une et l'ensemble du processus comme une . Envoy Task Story Alors, traduisons ce que nous venons de dire en une histoire : @servers(['web' => '[email protected]', 'local' => '127.0.0.1']) @story('setup-nginx') update-server install-nginx copy-nginx-stub configure-nginx @endstory La directive est utilisée pour spécifier les serveurs sur lesquels nous exécuterons nos tâches ultérieurement. @servers Maintenant, nous pouvons procéder à la définition de chaque tâche 😁 Notre première tâche veillera à ce que les packages et dépendances du serveur soient à jour : update-server @task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask La deuxième tâche installera Nginx sur notre serveur : install-nginx @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 Notez que nous avons supprimé le lien Nginx par défaut et en avons créé un nouveau pour notre application, dont le nom provient de la variable . $application_name Pour pouvoir utiliser cette variable, vous devez la déclarer, nous devons donc inclure la directive : @setup @setup $application_name = 'your-application-name'; @endsetup Maintenant, nous pouvons passer à la troisième tâche . Dans mon cas, je déploie une application Laravel, j'utiliserai donc le fichier de configuration Nginx fourni par la , avec quelques ajustements. Si vous déployez une autre application, vous pouvez appliquer le même concept à votre propre fichier de configuration. copy-nginx-stub documentation Dans le répertoire que nous venons de créer, exécutez la commande suivante : mkdir stubs; nano stubs/nginx.conf Ensuite, collez le contenu suivant dans l'éditeur, enregistrez-le et quittez : 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; } } et sont des espaces réservés pour le moment et seront automatiquement mis à jour avec nos variables. public_ip app_name Passons à l'écriture de la tâche elle-même : @task('copy-nginx-stub', ['on' => 'local']) scp -P{{ $production_port }} -r ./stubs/nginx.conf {{ $production_host }}:/etc/nginx/sites-available/{{ $application_name }}.conf @endtask Cette tâche sera exécutée sur notre machine locale au lieu du serveur distant. Nous spécifions cela en utilisant . 'on' => 'local' Et n'oubliez pas de mettre à jour la directive avec les variables nécessaires : @setup @setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; @endsetup La quatrième et dernière tâche mettra à jour les espaces réservés, afin que nous puissions servir correctement l'application : configure-nginx @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 Notez la commande . En effet, chaque tâche est exécutée séparément et démarre donc toujours à partir du répertoire personnel du serveur distant. cd Nous avons déjà créé le lien symbolique lors de l'installation de Nginx, nous n'avons plus à nous en préoccuper maintenant. Et nous en avons fini avec cette section ! Votre script devrait ressembler à ceci : @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 Configuration de la clé SSH Maintenant que nous avons configuré Nginx et qu'il est prêt à servir notre application, nous devons générer des clés SSH et ajouter la clé publique à GitHub afin de pouvoir extraire les référentiels privés. Pour cela, nous utiliserons , donc avant de commencer, vous devez . l'API REST GitHub créer un jeton Lors de la création de votre jeton, assurez-vous de sélectionner uniquement la portée « admin:public_key ». Maintenant que vous avez créé votre token, commençons par définir quelques variables : @setup $ssh_key = '~/.ssh/id_rsa_github'; $github_api_key = 'your-github-token'; $email = '[email protected]'; @endsetup À ce stade, vous vous interrogez peut-être sur les étapes impliquées dans ce processus. Eh bien, nous pouvons le décomposer en deux étapes : Générer des clés SSH Copiez la clé publique sur GitHub Une fois de plus, ce processus sera notre histoire : @story('setup-ssh-keys') generate-ssh-keys add-ssh-keys-to-github @endstory La première tâche, , peut être effectuée en exécutant une seule commande : generate-ssh-keys @task('generate-ssh-keys', ['on' => ['web']]) echo "Generating ssh keys..." ssh-keygen -t ed25519 -f {{ $ssh_key }} -N '' -q -C "{{ $email }}" @endtask Une fois que nous avons généré nos clés SSH, nous pouvons ajouter la clé publique à GitHub à l'aide de l'API GitHub. Cela peut être fait avec une seule demande : @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 Et c'est tout! Si vous visitez vos paramètres de développeur GitHub, vous devriez voir votre clé nouvellement créée. En combinant les deux sections, votre script final devrait ressembler à ceci : @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 Conclusion Nous avons appris à utiliser pour automatiser les tâches courantes. C'est un outil puissant avec encore plus de fonctionnalités que celles que nous avons explorées ici. Ne vous limitez pas au simple déploiement de vos applications ; peut automatiser N'IMPORTE commande de terminal, littéralement tout ce qui vous vient à l'esprit. Envoy Envoy QUELLE La prochaine fois que vous vous retrouverez à répéter les mêmes commandes, pensez à l'utiliser, je vous promets qu'il fait bien plus que CI/CD 😛😛