Laravel Envoy

시작하기

라라벨 Envoy는 원격 서버에서 정의된 공통의 작업을 수행하기 위한 깔끔하고 간결한 문법을 제공합니다. 블레이드 스타일의 문법을 사용하여 손쉽게 배포, 아티즌 명령어 등의 작업을 설정할 수 있습니다. 현재 Envoy 는 맥과 리눅스 OS를 지원하고 있습니다.

설치하기

먼저 Composer의 global require 명령어를 통해서 Envoy를 설치합니다.

composer global require laravel/envoy

글로벌 Composer 라이브러리는 때로는 패키지 버전의 충돌을 일으키기 때문에 composer global require 명령의 대안으로 cgr사용을 고려할 수도 있습니다. cgr 라이브러리의 설치 방법은 GitHub에서 찾을 수 있습니다.

{note} ~/.composer/vendor/bin 디렉토리를 여러분의 PATH에 추가하여 터미널에서 envoy 명령어를 실행할 때 envoy를 바로 찾을 수 있도록 설정하십시오.

Envoy 업데이트 하기

설치 한 Envoy를 업데이트 할 때도 Composer를 사용합니다. composer global update 명령어는 설치된 글로벌 Composer 패키지를 업데이트 할 것입니다:

composer global update

작업 작성하기

모든 Envoy 작업들은 프로젝트 루트 디렉토리에 있는 Envoy.blade.php 파일에 정의되어 있어야 합니다. 다음은 간단한 예제 입니다.

@servers(['web' => ['[email protected]']])

@task('foo', ['on' => 'web'])
    ls -la
@endtask

위에서 보시다 시피 @servers 배열이 파일의 최상단에 정의되어 작업을 지정할 때 on 옵션을 사용할 때 해당 서버를 참조할 수 있습니다. @task 선언 안에서 여러분은 작업이 실행될 때 서버에서 구동시킬 Bash 코드를 작성해야 합니다.

로컬에서 실행될 스크립트는 서버의 IP 주소를 127.0.0.1 로 지정할 수 있습니다:

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

설정하기

때로는 Envoy 작업이 실행되기 전에 어떤 PHP 코드를 실행시켜야 될 필요가 있을 수 있습니다. 이 경우 다른 작업들이 실해되기 전에 @setup 지시어를 통해서 변수를 선언하고 다른 일반적인 PHP 작업을 실행할 수 있습니다:

@setup
    $now = new DateTime();

    $environment = isset($env) ? $env : "testing";
@endsetup

만약 작업이 실행되기 전에 다른 PHP 파일을 포함시켜야할 필요가 있다면, Envoy.blade.php 파일의 상단에 @include 지시어를 사용할 수 있습니다:

@include('vendor/autoload.php')

@task('foo')
    # ...
@endtask

변수들

필요한 경우 커맨드라인을 사용하여 Envoy 작업에 옵션 값을 전달할 수 있습니다:

envoy run deploy --branch=master

블래이드의 "echo" 문법을 통해서 작업의 옵션에 엑세스가 가능합니다. 작업의 반복문 안에서 if 구문을 사용할 수도 있습니다. 예를 들어 git pull 명령을 실행하기 전에 $branch 변수가 존재하는지 확인해 보겠습니다:

@servers(['web' => '192.168.1.1'])

@task('deploy', ['on' => 'web'])
    cd site

    @if ($branch)
        git pull origin {{ $branch }}
    @endif

    php artisan migrate
@endtask

스토리

스토리는 하나의 편리한 이름으로 그룹을 묶어 작고 개별적인 작업들을 큰 작업을 구성합니다. 하나의 예제로, deploy 스토리는 그 정의 안에서 작업의 이름들을 나열함으로써 gitcomposer 작업들을 실행할 수 있습니다:

@servers(['web' => '192.168.1.1'])

@story('deploy')
    git
    composer
@endstory

@task('git')
    git pull origin master
@endtask

@task('composer')
    composer install
@endtask

스토리가 작성되고 나면, 일반적인 작업처럼 실행할 수 있습니다:

envoy run deploy

여러대의 서버

Envoy 는 여러분이 여러대의 서버에 서 손쉽게 작업이 실행할 수 있게 해줍니다. 먼저 @servers 선언부분에 추가 서버를 더합니다. 각각의 서버는 고유한 이름을 가져야 합니다. 추가적인 서버들을 정의하고 나면, 작업의 on 배열안에서 각각의 서버들을 나열하면 됩니다:

@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2'])

@task('deploy', ['on' => ['web-1', 'web-2']])
    cd site
    git pull origin {{ $branch }}
    php artisan migrate
@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 site
    git pull origin {{ $branch }}
    php artisan migrate
@endtask

작업 실행하기

Envoy.blade.php 파일에 정의되어 있는 작업이나 스토리를 실행하려면 실행하고자 하는 작업 또는 스토리의 이름을 Envoy의 run 명령어를 전달하여 실행하면 됩니다. Envoy 는 작업을 실행하고 작업이 실행된 서버에서 그 결과를 표시할 것입니다:

envoy run task

작업 실행 확인하기

서버에 특정 작업을 실행하기 전에 확인 메시지를 추가하고 싶은 경우에는, 작업 실행 부분에 confirm 지시어를 사용할 수 있습니다. 이 옵션은 위험한 작업을 할 경우에 특히 유용합니다:

@task('deploy', ['on' => 'web', 'confirm' => true])
    cd site
    git pull origin {{ $branch }}
    php artisan migrate
@endtask

알림

슬랙

Envoy 는 또한 각각의 작업이 실행된 후에 슬랙을 통해서 알림을 보내는 작업을 지원합니다. @slack 지시어는 슬랙 Hook URL 과 채널 이름을 인자로 받습니다. Slack 의 설정 패널의 Incoming WebHooks 통합 페이지에서 후킹 URL을 생성하여 찾을 수 있습니다. 여러분은 전체 웹훅 URL 을 @slack 지시어에 전달하면 됩니다:

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

채널 인자는 다음 중 하나를 지정할 수 있습니다:

  • 채널로 알림을 보낼 때: #채널
  • 유저에게 알림을 보낼 때: @유저