본문 바로가기

Laravel Envoy

번역일: 2026년 6월 20일

Laravel Envoy

소개

Laravel Envoy는 원격 서버에서 반복적으로 수행하는 작업을 자동화해주는 도구입니다. Blade 스타일의 문법을 사용하여 배포, Artisan 명령 실행 등 다양한 태스크를 간결하게 정의할 수 있습니다. Envoy는 현재 Mac과 Linux 운영체제를 지원하며, Windows에서는 WSL2를 통해 사용할 수 있습니다.

설치

Composer로 프로젝트에 Envoy를 설치합니다:

composer require laravel/envoy --dev

설치가 완료되면 vendor/bin 디렉터리에서 Envoy 바이너리를 실행할 수 있습니다:

php vendor/bin/envoy

태스크 작성

태스크 정의

태스크는 Envoy의 기본 단위입니다. 태스크에는 원격 서버에서 실행할 셸 명령을 정의합니다. 예를 들어, 큐 워커 서버에서 php artisan queue:restart를 실행하는 태스크를 만들 수 있습니다.

모든 Envoy 태스크는 프로젝트 루트의 Envoy.blade.php 파일에 작성합니다. 아래는 기본적인 예시입니다:

@servers(['web' => ['user@192.168.1.1'], 'workers' => ['user@192.168.1.2']]) @task('restart-queues', ['on' => 'workers']) cd /home/user/example.com php artisan queue:restart @endtask

파일 상단의 @servers 선언에서 서버 목록을 배열로 정의하고, 태스크의 on 옵션에서 해당 서버 이름을 참조합니다. @servers 선언은 반드시 한 줄로 작성해야 합니다. @task 블록 안에는 태스크 실행 시 서버에서 수행할 셸 명령을 작성합니다.

로컬 태스크

서버 IP를 127.0.0.1로 지정하면 해당 태스크를 로컬 컴퓨터에서 실행할 수 있습니다:

@servers(['localhost' => '127.0.0.1'])

Envoy 태스크 가져오기

@import 디렉티브를 사용하면 다른 Envoy 파일의 태스크와 스토리를 현재 파일로 불러올 수 있습니다. 가져온 파일의 태스크는 직접 정의한 것처럼 그대로 실행할 수 있습니다:

@import('vendor/package/Envoy.blade.php')

다중 서버

Envoy를 사용하면 여러 서버에서 동일한 태스크를 손쉽게 실행할 수 있습니다. @servers 선언에 서버를 추가하고 각 서버에 고유한 이름을 부여한 뒤, 태스크의 on 배열에 실행할 서버 이름을 나열하면 됩니다:

@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2']) @task('deploy', ['on' => ['web-1', 'web-2']]) cd /home/user/example.com git pull origin {{ $branch }} php artisan migrate --force @endtask

병렬 실행

기본적으로 태스크는 서버마다 순차적으로 실행됩니다. 즉, 첫 번째 서버에서 태스크가 완료된 후 두 번째 서버에서 실행이 시작됩니다. 여러 서버에서 동시에 태스크를 실행하려면 parallel 옵션을 추가하세요:

@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2']) @task('deploy', ['on' => ['web-1', 'web-2'], 'parallel' => true]) cd /home/user/example.com git pull origin {{ $branch }} php artisan migrate --force @endtask

Setup

태스크 실행 전에 PHP 코드를 먼저 실행해야 할 경우 @setup 디렉티브를 사용합니다. 이 블록 안의 코드는 태스크가 시작되기 전에 로컬에서 실행됩니다:

@setup $now = new DateTime; @endsetup

태스크 실행 전에 외부 PHP 파일을 로드해야 한다면 Envoy.blade.php 파일 상단에 @include 디렉티브를 사용하세요:

@include('vendor/autoload.php') @task('restart-queues') # ... @endtask

변수

Envoy 태스크를 실행할 때 커맨드라인 인수로 값을 전달할 수 있습니다:

php vendor/bin/envoy run deploy --branch=master

전달된 값은 Blade의 출력 구문으로 태스크 안에서 사용할 수 있습니다. @if, 반복문 같은 Blade 구문도 그대로 활용할 수 있습니다. 아래 예시는 $branch 변수가 존재할 때만 git pull을 실행합니다:

@servers(['web' => ['user@192.168.1.1']]) @task('deploy', ['on' => 'web']) cd /home/user/example.com @if ($branch) git pull origin {{ $branch }} @endif php artisan migrate --force @endtask

스토리

스토리는 여러 태스크를 하나의 이름으로 묶어서 순서대로 실행하는 기능입니다. 예를 들어 deploy 스토리에 update-codeinstall-dependencies 태스크를 포함시키면, deploy 하나만 실행해도 두 태스크가 연속으로 실행됩니다:

@servers(['web' => ['user@192.168.1.1']]) @story('deploy') update-code install-dependencies @endstory @task('update-code') cd /home/user/example.com git pull origin master @endtask @task('install-dependencies') cd /home/user/example.com composer install @endtask

스토리는 태스크와 동일한 방식으로 실행합니다:

php vendor/bin/envoy run deploy

태스크와 스토리가 실행되는 과정에서 다양한 훅을 사용할 수 있습니다. Envoy가 지원하는 훅 종류는 @before, @after, @error, @success, @finished입니다. 훅 안의 코드는 PHP로 해석되며, 원격 서버가 아닌 로컬에서 실행됩니다.

각 훅은 여러 개 정의할 수 있으며, Envoy.blade.php 파일에 작성된 순서대로 실행됩니다.

`@before`

각 태스크가 실행되기 전에 호출됩니다. 실행될 태스크 이름이 $task 변수로 전달됩니다:

@before if ($task === 'deploy') { // ... } @endbefore

`@after`

각 태스크가 실행된 후에 호출됩니다. 실행된 태스크 이름이 $task 변수로 전달됩니다:

@after if ($task === 'deploy') { // ... } @endafter

`@error`

태스크가 실패(종료 코드가 0보다 큰 경우)할 때마다 호출됩니다. 실패한 태스크 이름이 $task 변수로 전달됩니다:

@error if ($task === 'deploy') { // ... } @enderror

`@success`

모든 태스크가 오류 없이 완료되었을 때 호출됩니다:

@success // ... @endsuccess

`@finished`

모든 태스크 실행이 끝난 후 성공 여부에 관계없이 항상 호출됩니다. 완료된 태스크의 종료 코드가 $exitCode 변수로 전달되며, 값은 null이거나 0 이상의 정수입니다:

@finished if ($exitCode > 0) { // 하나 이상의 태스크에서 오류가 발생했습니다... } @endfinished

태스크 실행

Envoy.blade.php에 정의한 태스크나 스토리를 실행하려면 Envoy의 run 명령에 실행할 이름을 전달합니다. 실행 중에는 원격 서버의 출력이 실시간으로 화면에 표시됩니다:

php vendor/bin/envoy run deploy

실행 전 확인

서버에서 태스크를 실행하기 전에 사용자 확인을 받고 싶다면 태스크 선언에 confirm 옵션을 추가하세요. 데이터베이스 마이그레이션처럼 되돌리기 어려운 작업에 특히 유용합니다:

@task('deploy', ['on' => 'web', 'confirm' => true]) cd /home/user/example.com git pull origin {{ $branch }} php artisan migrate @endtask

알림

Slack

Envoy는 태스크 실행 후 Slack으로 알림을 보내는 기능을 지원합니다. @slack 디렉티브에 Slack 웹훅 URL과 채널 또는 사용자 이름을 전달하면 됩니다. Slack 관리 패널에서 "Incoming WebHooks" 연동을 생성하여 웹훅 URL을 발급받을 수 있습니다.

첫 번째 인수로 웹훅 URL 전체를, 두 번째 인수로 채널명(#channel) 또는 사용자명(@user)을 전달합니다:

@finished @slack('webhook-url', '#bots') @endfinished

기본적으로 실행된 태스크에 대한 설명 메시지가 전송됩니다. 세 번째 인수를 전달하면 메시지를 직접 지정할 수 있습니다:

@finished @slack('webhook-url', '#bots', '배포가 완료되었습니다.') @endfinished

Discord

Envoy는 Discord 알림도 지원합니다. @discord 디렉티브에 Discord 웹훅 URL을 전달합니다. Discord 서버 설정에서 "웹후크(Webhook)"를 생성하고 메시지를 받을 채널을 지정하면 웹훅 URL을 얻을 수 있습니다:

@finished @discord('discord-webhook-url') @endfinished

Telegram

Telegram 알림도 지원합니다. @telegram 디렉티브에 Telegram Bot ID와 Chat ID를 전달합니다. BotFather로 새 봇을 생성하여 Bot ID를 얻고, @username_to_id_bot으로 Chat ID를 확인할 수 있습니다:

@finished @telegram('bot-id','chat-id') @endfinished

Microsoft Teams

Microsoft Teams 알림도 지원합니다. @microsoftTeams 디렉티브는 Teams 웹훅 URL(필수), 메시지, 테마 색상(success, info, warning, error), 그리고 옵션 배열을 인수로 받습니다. Teams의 수신 웹훅(Incoming Webhook)을 생성하여 웹훅 URL을 발급받을 수 있습니다. 제목, 요약, 섹션 등 다양한 메시지 커스터마이징 옵션은 Microsoft Teams 공식 문서를 참고하세요:

@finished @microsoftTeams('webhook-url') @endfinished

이 문서는 Laravel 공식 문서(MIT)를 한국 개발자를 위해 번역·재구성한 것입니다.

번역일: 2026년 6월 20일