Laravel Envoy は、リモート サーバーで実行する一般的なタスクを実行するためのツールです。 過小評価されていると思います。私はいつも Envoy が非常に便利だと思っていますが、あまり使われているようには見えません。この記事では、 生産性の向上にどのように役立つかを探ります🚀。 Envoy Envoy Laravel Envoy は Laravel 開発者専用でも Laravel プロジェクトに限定されておらず、 使用できます ❤️。 誰でも まず、 の 2 つの重要な概念について説明します。 Envoy : サーバーの更新やリポジトリのクローン作成などの特定のアクションを表します。 タスク : タスクのコレクションです。 ストーリー 現時点で知っておく必要があるのはこれだけです。すべての機能については、いつでも で読むことができます。 ドキュメント 何を自動化するのでしょうか? この記事では、ほとんどの開発者がアプリケーションをデプロイするときに行う 2 つの作業を自動化します。 Nginx の設定。 SSH キーを生成し、GitHub に追加してプライベート リポジトリにアクセスできるようにします。 はい、わかっています。ほとんどの場合、 CI/CD ワークフローに使用されますが、文字通り 実行できます。 Envoy すべてを 特使のセットアップ まず、ディレクトリを作成しましょう: mkdir tuto && cd $_ を使用している場合は tuto を参照してください。 $ take tuto zsh 次のコマンドを実行して をインストールします。 Envoy composer require laravel/envoy --dev composer がインストールされていることを確認してください。 次に、 というファイルを作成します。はい、 構文を使用します。とてもクールですよね? Envoy.blade.php Blade touch Envoy.blade.php これで完了です。必要なのは 1 つのスクリプトだけです。Laravel や Laravel 関連のプロジェクトに特化する必要はありません。自動化を始めましょう! 😁 Nginx を設定する 新しいサーバーがあり、Nginx をセットアップしたいと考えています。プロセスを分解すると、次のようになります。 サーバーを更新する Nginxをインストールする Nginx を設定する まさにそれが で行うことであり、各ステップを 、プロセス全体を として考えます。 Envoy Task Story それでは、先ほど言ったことを物語に翻訳してみましょう。 @servers(['web' => '[email protected]', 'local' => '127.0.0.1']) @story('setup-nginx') update-server install-nginx copy-nginx-stub configure-nginx @endstory ディレクティブは、後でタスクを実行するサーバーを指定するために使用されます。 @servers さて、各タスクの定義に進みます😁 最初のタスク サーバーのパッケージと依存関係が最新であることを確認します。 update-server @task('update-server', ['on' => ['web']]) echo "Updating server..." apt update && apt upgrade -y @endtask 2 番目のタスク サーバーに Nginx をインストールします。 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 デフォルトの Nginx リンクを削除し、 変数から取得した名前を使用してアプリケーション用の新しいリンクを作成したことに注意してください。 $application_name その変数を使用できるようにするには、それを宣言する必要があるため、 ディレクティブを含める必要があります。 @setup @setup $application_name = 'your-application-name'; @endsetup ここで、3 番目のタスク に進みます。私の場合は、Laravel アプリケーションをデプロイしているので、 で提供されている Nginx 構成ファイルを少し調整して使用します。別のアプリケーションをデプロイする場合は、同じ概念を独自の構成ファイルに適用できます。 copy-nginx-stub ドキュメント 先ほど作成したディレクトリで、次のコマンドを実行します。 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; } } と 現時点ではプレースホルダーであり、変数によって自動的に更新されます。 public_ip app_name タスク自体の記述に移りましょう。 @task('copy-nginx-stub', ['on' => 'local']) scp -P{{ $production_port }} -r ./stubs/nginx.conf {{ $production_host }}:/etc/nginx/sites-available/{{ $application_name }}.conf @endtask このタスクは、リモート サーバーではなくローカル マシン上で実行されます。これを指定するには を使用します。 'on' => 'local' また、必要な変数を使用して ディレクティブを更新することを忘れないでください。 @setup @setup $application_name = 'your-application-name'; $production_port = 22; $production_host = '[email protected]'; @endsetup 4 番目で最後のタスク プレースホルダーを更新し、アプリケーションを正しく提供できるようにします。 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 コマンドに注意してください。これは、各タスクが個別に実行されるため、常にリモート サーバーのホーム ディレクトリから開始されるためです。 cd Nginx のインストール時にすでにシンボリックリンクを作成しているので、今は心配する必要はありません。 これでこのセクションは完了です。スクリプトは次のようになります。 @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 キーの設定 Nginx を設定し、アプリケーションを提供する準備ができたので、SSH キーを生成し、GitHub に公開キーを追加して、プライベート リポジトリをプルできるようにする必要があります。 このため、 を使用するので、開始する前に 必要があります。 GitHub REST API トークンを作成する トークンを作成するときは、「admin:public_key」スコープのみを選択してください。 トークンを作成したので、まずは変数を定義しましょう。 @setup $ssh_key = '~/.ssh/id_rsa_github'; $github_api_key = 'your-github-token'; $email = '[email protected]'; @endsetup この時点で、このプロセスに含まれる手順について疑問に思われるかもしれません。この手順は 2 つのステップに分けられます。 SSHキーを生成する 公開鍵をGitHubにコピーする もう一度、このプロセスが私たちの物語になります: @story('setup-ssh-keys') generate-ssh-keys add-ssh-keys-to-github @endstory 最初のタスク 、次の 1 つのコマンドを実行するだけで実行できます。 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 SSH キーを生成したら、GitHub API を使用して公開キーを GitHub に追加できます。これは、1 つのリクエストで実行できます。 @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 これで完了です。GitHub 開発者設定にアクセスすると、新しく作成されたキーが表示されます。 2 つのセクションを組み合わせると、最終的なスクリプトは次のようになります。 @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 結論 を使用して一般的なタスクを自動化する方法を学びました。これは、ここで説明した機能よりもさらに多くの機能を備えた強力なツールです。アプリケーションのデプロイだけに限定しないでください。Envoy 、文字通り思いつく ターミナル コマンドを自動化できます。 Envoy Envoy あらゆる 次回、同じコマンドを繰り返し実行していることに気付いたときは、ぜひ使用を検討してください。CI/CD よりもはるかに多くの機能があることをお約束します 😛😛