paint-brush
Laravel Envoy - Cách tự động hóa những công việc nhàm chántừ tác giả@oussamamater
1,009 lượt đọc
1,009 lượt đọc

Laravel Envoy - Cách tự động hóa những công việc nhàm chán

từ tác giả Oussama Mater9m2024/07/10
Read on Terminal Reader

dài quá đọc không nổi

Laravel Envoy có thể giúp bạn tự động hóa các tác vụ tẻ nhạt và nó có thể làm được nhiều việc hơn là chỉ CI/CD. Hãy xem cách chúng ta có thể sử dụng nó để tự động thiết lập Nginx và thêm khóa SSH vào GitHub.
featured image - Laravel Envoy - Cách tự động hóa những công việc nhàm chán
Oussama Mater HackerNoon profile picture

Laravel Envoy là một công cụ để thực thi các tác vụ phổ biến mà bạn chạy trên các máy chủ từ xa của mình.


Tôi tin rằng Envoy bị đánh giá thấp; Tôi không thấy nó được sử dụng thường xuyên mặc dù tôi luôn thấy nó cực kỳ hữu ích. Trong bài viết này, chúng ta sẽ khám phá cách Envoy có thể giúp tăng năng suất của bạn🚀.


Laravel Envoy không dành riêng cho các nhà phát triển Laravel hay giới hạn cho các dự án Laravel, ai cũng có thể sử dụng ❤️.


Đầu tiên, hãy thảo luận về hai khái niệm chính trong Envoy :


  1. Nhiệm vụ : Điều này thể hiện một hành động cụ thể như cập nhật máy chủ hoặc sao chép kho lưu trữ.


  2. Câu chuyện : là tập hợp các Nhiệm vụ.


Đó là tất cả những gì bạn cần biết bây giờ; bạn luôn có thể đọc về tất cả các tính năng trong tài liệu .

Chúng tôi đang tự động hóa cái gì?

Trong bài viết này, chúng tôi sẽ tự động hóa 2 việc mà hầu hết các nhà phát triển đều làm khi triển khai ứng dụng của họ:


  1. Cấu hình Nginx.


  2. Tạo khóa SSH và thêm chúng vào GitHub để có thể truy cập vào kho lưu trữ riêng tư.


Có, tôi biết, phần lớn thời gian Envoy được sử dụng cho quy trình công việc CI/CD, nhưng nó có thể thực hiện MỌI THỨ , theo nghĩa đen.

Thiết lập phái viên

Đầu tiên, hãy tạo một thư mục:

 mkdir tuto && cd $_


$ take tuto nếu bạn đang sử dụng zsh .


Cài đặt Envoy bằng cách chạy lệnh sau:

 composer require laravel/envoy --dev


Hãy chắc chắn rằng bạn đã cài đặt trình soạn nhạc.


Bây giờ, hãy tạo một tệp có tên Envoy.blade.php . Vâng, chúng ta sẽ sử dụng cú pháp Blade , cực hay phải không?

 touch Envoy.blade.php


Đó là nó! Tất cả những gì bạn cần chỉ là một kịch bản duy nhất. Nó không nhất thiết phải dành riêng cho Laravel hoặc bất kỳ dự án nào liên quan đến Laravel. Hãy bắt đầu tự động hóa! 😁

Định cấu hình Nginx

Chúng tôi có một máy chủ hoàn toàn mới và chúng tôi muốn thiết lập Nginx. Nếu chúng ta chia nhỏ quy trình, nó sẽ như thế này:


  1. Cập nhật máy chủ
  2. Cài đặt Nginx
  3. Định cấu hình Nginx


Đó chính xác là những gì chúng ta sẽ làm với Envoy ; hãy coi mỗi bước là một Task và toàn bộ quá trình là một Story .


Vì vậy, hãy dịch những gì chúng ta vừa nói thành một câu chuyện:

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


Lệnh @servers được sử dụng để chỉ định các máy chủ mà chúng ta sẽ chạy các tác vụ của mình sau này.


Bây giờ chúng ta có thể tiến hành xác định từng nhiệm vụ 😁


update-server nhiệm vụ đầu tiên của chúng tôi sẽ đảm bảo rằng các gói và phần phụ thuộc của máy chủ được cập nhật:

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


Nhiệm vụ thứ hai install-nginx sẽ cài đặt Nginx trên máy chủ của chúng tôi:

 @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


Lưu ý rằng chúng tôi đã xóa liên kết Nginx mặc định và tạo một liên kết mới cho ứng dụng của mình, với tên đến từ biến $application_name .


Để có thể sử dụng biến đó, bạn cần phải khai báo nó nên chúng ta cần thêm chỉ thị @setup :

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

Bây giờ, chúng ta có thể chuyển sang nhiệm vụ thứ ba copy-nginx-stub . Trong trường hợp của mình, mình đang triển khai một ứng dụng Laravel nên sẽ sử dụng file cấu hình Nginx do docs cung cấp, kèm theo một vài chỉnh sửa. Nếu bạn đang triển khai một ứng dụng khác, bạn có thể áp dụng khái niệm tương tự cho tệp cấu hình của riêng mình.


Trong thư mục chúng ta vừa tạo, hãy chạy lệnh sau:

 mkdir stubs; nano stubs/nginx.conf


Sau đó, dán nội dung sau vào trình chỉnh sửa, lưu và thoát:

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

public_ipapp_name hiện là phần giữ chỗ và sẽ được tự động cập nhật với các biến của chúng tôi.


Hãy chuyển sang viết nhiệm vụ:

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


Tác vụ này sẽ được thực thi trên máy cục bộ của chúng tôi thay vì máy chủ từ xa. Chúng tôi chỉ định điều này bằng cách sử dụng 'on' => 'local' .


Và đừng quên cập nhật lệnh @setup với các biến cần thiết:

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



Nhiệm vụ thứ tư và cuối cùng configure-nginx sẽ cập nhật các phần giữ chỗ, để chúng ta có thể phục vụ ứng dụng một cách chính xác:

 @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


Lưu ý lệnh cd . Điều này là do mỗi tác vụ được thực thi riêng biệt nên nó luôn bắt đầu từ thư mục chính của máy chủ từ xa.


Chúng tôi đã tạo liên kết tượng trưng khi cài đặt Nginx, bây giờ chúng tôi không phải lo lắng về nó.


Và chúng ta đã hoàn thành phần này! Kịch bản của bạn sẽ trông như thế này:

 @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

Cấu hình khóa SSH

Bây giờ chúng ta đã định cấu hình Nginx và nó đã sẵn sàng phục vụ ứng dụng của chúng ta, chúng ta cần tạo khóa SSH và thêm khóa chung vào GitHub để có thể lấy các kho lưu trữ riêng tư.


Để làm điều này, chúng tôi sẽ sử dụng API GitHub REST , vì vậy trước khi bắt đầu, bạn cần tạo mã thông báo .


Khi tạo mã thông báo, hãy đảm bảo rằng bạn chỉ chọn phạm vi "admin:public_key".


Bây giờ bạn đã tạo mã thông báo của mình, hãy bắt đầu bằng cách xác định một số biến:

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

Tại thời điểm này, bạn có thể thắc mắc về các bước liên quan đến quy trình này. Vâng, chúng ta có thể chia nó thành hai bước:


  1. Tạo khóa SSH


  2. Sao chép khóa chung vào GitHub


Một lần nữa, quá trình này sẽ là câu chuyện của chúng ta:

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


Tác vụ đầu tiên, generate-ssh-keys , có thể được thực hiện bằng cách chạy một lệnh duy nhất:

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


Khi chúng tôi đã tạo khóa SSH, chúng tôi có thể thêm khóa chung vào GitHub bằng API GitHub. Điều này có thể được thực hiện với một yêu cầu duy nhất:

 @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

Và thế là xong! Nếu bạn truy cập cài đặt dành cho nhà phát triển GitHub, bạn sẽ thấy khóa mới tạo của mình.


Bằng cách kết hợp hai phần, tập lệnh cuối cùng của bạn sẽ trông như thế này:

 @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

Phần kết luận

Chúng tôi đã học cách sử dụng Envoy để tự động hóa các tác vụ thông thường. Đó là một công cụ mạnh mẽ với nhiều khả năng hơn những gì chúng tôi đã khám phá ở đây. Đừng giới hạn bản thân chỉ triển khai các ứng dụng của mình; Envoy có thể tự động hóa BẤT KỲ lệnh đầu cuối nào, theo nghĩa đen là bất cứ điều gì bạn nghĩ đến.


Lần tới khi bạn thấy mình lặp lại các lệnh tương tự, hãy cân nhắc sử dụng nó, tôi hứa với bạn rằng nó còn hiệu quả hơn CI/CD 😛😛