fb pixel

Laravel Envoy czyli prosty menadżer zadań via SSH

|

Laravel Envoy to prosty menadżer zadań wykonywanych przez SSH, inspirowany Pythonowskim Fabricem.

Dzisiaj miała miejsce premiera nowego dodatku do Lavarela. Nietypowo, bo nie wg. zakładanego planu wypuszczania nowych wersji, ale należy pamiętać, że to jest zew. dodatek, a nie część samego Laravela. Przyznam, że ucieszył mnie ten „ficzer” bo bardzo lubię proste, minimalistyczne i spełniające swoje zadania narzędzia, a takim niewątpliwie jest Envoy. Poza tym łatwiej jest „PHPowcowi” skorzystać z natywnych narzędzi niż często męczyć się z rozwiązaniami napisanymi w Pythonie czy Rubym.

Co mamy w pierwszej wersji tego menadżera?

  • prosta, minimalistyczna składnia definiowania zadań
  • wykorzystywanie ustawień ~/.ssh/config
  • równoległe wykonywanie zadań na kilku serwerach
  • zatrzymywanie kolejki jeżeli jedno z zadań zawiedzie
  • makra grupujące zadania
  • integracja z HipChatem

Instalacja

Do działania Envoya potrzebujemy PHP 5.4 oraz najnowszego Laravela 4.1, który od tej wersji został wyposażony w bibliotekę do obsługi SSH. Instalacja jest banalna i sprowadza się do pobrania envoy.phar z repozytorium na GitHubie i analogicznie jak to jest z Composerem, dorzuceniem pliku do miejsca, z którego możemy go globalnie wywoływać (np. /usr/local/bin). Na swoim OS X mam to wrzucone lokalnie (w sensie dla jednego usera w katalogu domowym) w ~/workspace/envoy.phar, a wywołanie załatwione prostym aliasem w .bash_profile: alias envoy="php54 ~/workspace/envoy.phar".

Konfiguracja i użycie

Do definiowania zadań i konfiguracji Envoya korzystamy ze… składni Blade’a. Prościej i bardziej intuicyjnie być nie może, nie sądzę aby ktokolwiek miał z tym problemy. W katalogu głównym projektu tworzymy plik konfiguracyjny Envoy.blade.php:

@servers(['produkcja' => 'webmastah@192.168.1.1', 'deweloperka' => 'webmastah@192.168.1.2'])

@task('update', ['on' => ['produkcja', 'deweloperka']])
    git pull origin {{ $branch }}
    php artisan migrate
@endtask

Prawda, że proste? W @servers definiujemy listę serwerów z których chcemy skorzystać, a w @task nadajemy mu nazwę, przypisujemy do serwera/serwerów i definiujemy co ma zrobić. Możemy także przekazać parametr, w tym wypadku $branch.

Całość odpalamy z konsoli poleceniem envoy run update --branch=master.

W przypadku wielu zadań możemy je sobie pogrupować wg schematu:

@macro('deploy')
    task1
    task2
@endmacro

@task('task1')
    //definicja pierwszego zadania
@endtask

@task('task2')
    //definicja drugiego zadania
@endtask

i uruchomić poprzez envoy run deploy. Banalne.

Integracja z HipChatem

Na „dzień dobry” Envoy przychodzi do nas z wsparciem dla HipChata. Pewnie nie wszyscy z tego korzystacie (popularne w pracy zespołowej), my owszem więc tym bardziej to nas ucieszyło i skłoniło do szybkiego testu jak to wygląda w praktyce.

@after
    @hipchat('token', 'room', 'from')
@endafter

Opcjonalnie jako czwarty parametr można wstawić własny komunikat. Swoją drogą konstrukcja @after sugeruje, że tych integracji może być więcej i, że będzie można tego „post hooka” wykorzystać do innych własnych celów.

Przy okazji testów znalazłem też małego „fakapa”, a w zasadzie pominięcie jednej istotnej rzeczy: portu do łączenia się po SSH. Wygląda na to, że Taylor Otwell zapomniał sobie o tym, ze masa hostów ma poustawiane inne porty niż domyślny 22.

laravel

Zgłosiłem i pewnie szybko to zostanie poprawione, a tymczasem jak ktoś potrzebuje to proponuje obejście. Jak pisałem na wstępie Envoy korzysta z systemowego ~/.ssh/config w związku z czym wystarczy zdefiniować tam hosta wraz z odpowiadającym mu portem, a w konfiguracji Envoya zamiast hosta podać ten ustawiony alias.

Dodaj na LinkedIn
Mirosław Okoński
Przede wszystkim admin, potem webdeveloper choć kiedyś było odwrotnie. Obecnie Full Stack Engineer, CTO i System Architect. Po godzinach fan dobrych seriali, których nigdy nie ma czasu obejrzeć. Kawożłop. Miłośnik piwa i Metaxy. W czasie pomiędzy kontuzjami biega.