paint-brush
Laravel Envoy - 지루한 작업을 자동화하는 방법~에 의해@oussamamater
1,009 판독값
1,009 판독값

Laravel Envoy - 지루한 작업을 자동화하는 방법

~에 의해 Oussama Mater9m2024/07/10
Read on Terminal Reader

너무 오래; 읽다

Laravel Envoy는 지루한 작업을 자동화하는 데 도움을 줄 수 있으며 CI/CD 이상의 기능을 수행할 수 있습니다. 이를 사용하여 Nginx 설정을 자동화하고 GitHub에 SSH 키를 추가하는 방법을 살펴보겠습니다.
featured image - Laravel Envoy - 지루한 작업을 자동화하는 방법
Oussama Mater HackerNoon profile picture

Laravel Envoy는 원격 서버에서 실행하는 일반적인 작업을 실행하기 위한 도구입니다.


저는 Envoy 과소평가되었다고 생각합니다. 항상 매우 유용하다고 생각했지만 자주 사용되지는 않습니다. 이 기사에서는 Envoy 생산성을 높이는 데 어떻게 도움이 되는지 살펴보겠습니다🚀.


Laravel Envoy는 Laravel 개발자에게만 국한되거나 Laravel 프로젝트에만 국한되지 않으며 누구나 사용할 수 있습니다 ❤️.


먼저 Envoy 의 두 가지 핵심 개념을 살펴보겠습니다.


  1. 작업 : 서버 업데이트 또는 저장소 복제와 같은 특정 작업을 나타냅니다.


  2. Stories : 태스크 모음입니다.


지금은 이것이 당신이 알아야 할 전부입니다. 언제든지 문서 의 모든 기능에 대해 읽을 수 있습니다.

우리는 무엇을 자동화하고 있나요?

이 문서에서는 대부분의 개발자가 애플리케이션을 배포할 때 수행하는 두 가지 작업을 자동화합니다.


  1. Nginx 구성.


  2. 개인 저장소에 액세스할 수 있도록 SSH 키를 생성하고 이를 GitHub에 추가합니다.


예, 알아요. 대부분의 경우 Envoy CI/CD 워크플로에 사용되지만 문자 그대로 모든 작업을 수행할 수 있습니다.

특사 설정

먼저 디렉터리를 생성해 보겠습니다.

 mkdir tuto && cd $_


$ take tuto zsh 사용하는 경우 tuto를 사용하세요.


다음 명령을 실행하여 Envoy 설치합니다.

 composer require laravel/envoy --dev


작곡가가 설치되어 있는지 확인하십시오.


이제 Envoy.blade.php 라는 파일을 만듭니다. 예, 우리는 Blade 구문을 사용할 것입니다. 정말 멋지죠?

 touch Envoy.blade.php


그게 다야! 필요한 것은 단일 스크립트뿐입니다. Laravel이나 Laravel 관련 프로젝트에만 국한될 필요는 없습니다. 자동화를 시작해보자! 😁

Nginx 구성

우리는 새로운 서버를 가지고 있으며 Nginx를 설정하고 싶습니다. 프로세스를 세분화하면 다음과 같습니다.


  1. 서버 업데이트
  2. Nginx 설치
  3. 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


두 번째 작업 install-nginx 서버에 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

이제 세 번째 작업인 copy-nginx-stub 으로 이동할 수 있습니다. 제 경우에는 Laravel 애플리케이션을 배포할 예정이므로 docs 에서 제공하는 Nginx 구성 파일을 몇 가지 수정하여 사용할 것입니다. 다른 애플리케이션을 배포하는 경우 동일한 개념을 자체 구성 파일에 적용할 수 있습니다.


방금 만든 디렉터리에서 다음 명령을 실행합니다.

 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_ipapp_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



네 번째이자 마지막 작업 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

이 시점에서 이 프로세스와 관련된 단계가 궁금할 수 있습니다. 글쎄, 우리는 그것을 두 단계로 나눌 수 있습니다:


  1. SSH 키 생성


  2. 공개 키를 GitHub에 복사하세요.


다시 한번, 이 과정이 우리의 이야기가 될 것입니다:

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


첫 번째 작업인 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에 공개 키를 추가할 수 있습니다. 이 작업은 단일 요청으로 수행할 수 있습니다.

 @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 개발자 설정을 방문하면 새로 생성된 키가 표시됩니다.


두 섹션을 결합하면 최종 스크립트는 다음과 같아야 합니다.

 @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 문자 그대로 마음에 떠오르는 모든 터미널 명령을 자동화할 수 있습니다.


다음에 동일한 명령을 반복하게 된다면 이 명령을 사용해 보십시오. CI/CD보다 훨씬 더 많은 기능을 수행할 것을 약속합니다 😛😛