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 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 có thể giúp tăng năng suất của bạn🚀. Envoy Envoy 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, có thể sử dụng ❤️. ai cũng Đầu tiên, hãy thảo luận về hai khái niệm chính trong : Envoy : Đ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ữ. Nhiệm vụ : là tập hợp các Nhiệm vụ. Câu chuyện Đó 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ọ: Cấu hình Nginx. 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 được sử dụng cho quy trình công việc CI/CD, nhưng nó có thể thực hiện , theo nghĩa đen. Envoy MỌI THỨ Thiết lập phái viên Đầu tiên, hãy tạo một thư mục: mkdir tuto && cd $_ nếu bạn đang sử dụng . $ take tuto zsh Cài đặt bằng cách chạy lệnh sau: Envoy 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 . Vâng, chúng ta sẽ sử dụng cú pháp , cực hay phải không? Envoy.blade.php Blade 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: Cập nhật máy chủ Cài đặt Nginx Định cấu hình Nginx Đó chính xác là những gì chúng ta sẽ làm với ; hãy coi mỗi bước là một và toàn bộ quá trình là một . Envoy Task 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 đượ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. @servers Bây giờ chúng ta có thể tiến hành xác định từng nhiệm vụ 😁 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: update-server @task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask Nhiệm vụ thứ hai sẽ cài đặt Nginx trên máy chủ của chúng tôi: 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 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 . 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 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. copy-nginx-stub docs 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; } } và 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. public_ip app_name 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 với các biến cần thiết: @setup @setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; @endsetup Nhiệm vụ thứ tư và cuối cùng 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: 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 Lưu ý lệnh . Đ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. cd 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 , vì vậy trước khi bắt đầu, bạn cần . API GitHub REST 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: Tạo khóa SSH 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, , có thể được thực hiện bằng cách chạy một lệnh duy nhất: 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 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 để 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; có thể tự động hóa KỲ lệnh đầu cuối nào, theo nghĩa đen là bất cứ điều gì bạn nghĩ đến. Envoy Envoy BẤT 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 😛😛