• Czas czytania ~8 min
  • 30.06.2023

Laravel Envoy to narzędzie do wykonywania typowych zadań uruchamianych na zdalnych serwerach.

Uważam, że jest niedoceniany, nie widzę, aby był używany zbyt często, mimo że zawsze uważałem, że Envoy jest bardzo przydatny. W tym artykule omówimy, w jaki sposób Envoy możesz zwiększyć produktywność🚀.

Laravel Envoy nie jest przeznaczony wyłącznie dla programistów Laravel lub ograniczony do projektów Laravel, każdy może z niego ❤️ korzystać.

Najpierw omówmy dwie kluczowe koncepcje w:

  1. Tasks: which represents a specific action like updating the server or cloning a repository.
  2. Stories: which is a collection of Tasks.

To wszystko, co musisz wiedzieć na razie, zawsze możesz przeczytać o wszystkich funkcjach w Envoydokumentacji.

Co automatyzujemy?

W tym artykule zautomatyzujemy 2 rzeczy, które większość programistów robi podczas wdrażania aplikacji:

  1. Configuring Nginx.
  2. Generating SSH keys and adding them to GitHub to be able to access private repositories.

Tak, wiem, większość przypadków Envoy jest używana do przepływów pracy ciągłej integracji/ciągłego wdrażania, ale może zrobić WSZYSTKO, dosłownie.

Instalator

programu Envoy Najpierw utwórzmy katalog

$ take tuto if you are using zsh.

ZainstalujEnvoy, uruchamiając następujące polecenie:Upewnij się,

composer require laravel/envoy --dev

że masz zainstalowany kompozytor.

Teraz utwórz plik o nazwie Envoy.blade.php. Tak, będziemy używać składni, super fajnieBlade, prawda?

To wszystko! Wszystko czego potrzebujesz to jeden skrypt. Nie musi to być specyficzne dla Laravela lub jakiegokolwiek projektu związanego z Laravel. Zacznijmy automatyzować! 😁

Skonfiguruj Nginx Mamy zupełnie nowy serwer i chcemy skonfigurować Nginx

. Jeśli podzielimy proces, będzie to wyglądało to tak:

  1. Update the server
  2. Install Nginx
  3. Skonfiguruj Nginx Mamy zupełnie nowy serwer i chcemy skonfigurować Nginx

To jest dokładnie to, co będziemy robić z Envoy, pomyśl o każdym kroku jako , a cały proces jako TaskStory.

Przetłumaczmy więc to, co właśnie powiedzieliśmy, na historię: dyrektywa służy do określenia serwerów,

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

@servers na których będziemy później uruchamiać nasze zadania.

Teraz możemy przystąpić do definiowania każdego zadania 😁Nasze pierwsze zadanie zapewni, że pakiety i zależności serwera są aktualne:Drugie zadanie install-nginx update-server zainstaluje Nginx na naszym serwerze:

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

Zauważ, że usunęliśmy domyślny link Nginx i utworzyliśmy nowy dla naszej aplikacji, z nazwą pochodzącą od zmiennej$application_name.

@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

Aby móc użyć tej zmiennej, musisz ją zadeklarować, więc musimy uwzględnić dyrektywę@setup:

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

Teraz możemy przejść do trzeciego zadania copy-nginx-stub. W moim przypadku wdrażam aplikację Laravel, więc użyję pliku konfiguracyjnego Nginx dostarczonego przez dokumentację, z kilkoma poprawkami. Jeśli wdrażasz inną aplikację, możesz zastosować tę samą koncepcję do własnego pliku konfiguracji.

W katalogu, który właśnie utworzyliśmy, uruchom następujące polecenie:Następnie wklej następującą zawartość do edytora, zapisz ją i wyjdź:

mkdir stubs; nano stubs/nginx.conf

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;
    }
}

Symbole public_ip zastępcze i są na razie i app_name zostaną automatycznie zaktualizowane naszymi zmiennymi.

Przejdźmy do pisania samego zadania: To zadanie zostanie wykonane na naszej maszynie lokalnej,

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

a nie na zdalnym serwerze. Określamy to za pomocą 'on' => 'local'.

I nie zapomnij zaktualizować @setup dyrektywy o niezbędne zmienne:Czwarte i ostatnie zadanie configure-nginx zaktualizuje symbole zastępcze, abyśmy mogli poprawnie obsługiwać aplikację:

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

@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

Zanotuj cd polecenie. Dzieje się tak dlatego, że każde zadanie jest wykonywane osobno, więc zawsze rozpoczyna się z katalogu domowego zdalnego serwera.

Stworzyliśmy już dowiązanie symboliczne podczas instalacji Nginx, nie musimy się o to teraz martwić.

I skończyliśmy dla tej sekcji! Twój skrypt powinien wyglądać tak:

@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

Konfiguracja

klucza SSH Teraz, gdy skonfigurowaliśmy Nginx i jest on gotowy do obsługi naszej aplikacji, musimy wygenerować klucze ssh i dodać klucz publiczny do Github, abyśmy mogli pobrać prywatne repozytoria.

W tym celu użyjemy GitHub REST API, więc zanim zaczniemy, musisz utworzyć token.

Podczas tworzenia tokenu upewnij się, że wybierasz tylko zakres "admin:public_key".

Po utworzeniu tokenu zacznijmy od zdefiniowania kilku zmiennych:

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

W tym momencie możesz zastanawiać się nad krokami związanymi z tym procesem. Cóż, możemy podzielić to na dwa kroki:Po raz kolejny ten proces będzie naszą historią:Pierwsze zadanie generate-ssh-keys, można wykonać, uruchamiając jedno polecenie:

  1. Generate SSH keys
  2. Copy the public key to Github

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

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

Po wygenerowaniu kluczy SSH możemy dodać klucz publiczny do Github za pomocą interfejsu API Github. Można to zrobić za pomocą jednej prośby:

@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

I to wszystko! Jeśli odwiedzisz ustawienia programisty Github, powinieneś zobaczyć nowo utworzony klucz.

Łącząc te dwie sekcje, ostateczny skrypt powinien wyglądać następująco:

@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

Wniosek

Nauczyliśmy się automatyzować Envoy typowe zadania. Jest to potężne narzędzie o jeszcze większych możliwościach niż te, które tutaj omówiliśmy. Nie ograniczaj się tylko do wdrażania aplikacji, możesz zautomatyzować KAŻDE polecenie terminala, dosłownie wszystko, Envoy co przyjdzie Ci do głowy.

Następnym razem, gdy będziesz powtarzać te same polecenia, rozważ jego użycie, obiecuję ci, że robi znacznie więcej niż CI / CD 😛😛

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297