Sprache:

Suche

Laravel-Bereitstellungen mit Envoy - Schritt-für-Schritt-Anleitung

  • Teilen:
Laravel-Bereitstellungen mit Envoy - Schritt-für-Schritt-Anleitung

Laravel Envoy ist eines der nützlichsten Tools im Laravel-Ökosystem und ich benutze es fast jeden Tag. Fast jedes Projekt, an dem ich arbeite, bekommt sein eigenes Envoy-Skript, um die Bereitstellung super einfach zu machen.

Envoy ist ein Task-Runner, und zwar ein einfacher. Es ist nicht Laravel-spezifisch (es ist nicht einmal PHP-spezifisch), aber es nutzt die Blade-Templating-Sprache als Möglichkeit, Aktionen zu skripten. Laravel-Entwickler werden sich also sofort wohlfühlen. Obwohl Sie Envoy verwenden können, um Deployment-Skripte für so ziemlich jede Technologie zu schreiben, die Sie gerade verwenden, werde ich mich hier nur mit Laravel beschäftigen. Ich glaube aber nicht, dass es viel braucht, um es auch für andere Anwendungen einzusetzen.

Lesen Sie auch: Beste Quellen zum Erlernen der Laravel-Entwicklung

Wie andere Laravel-Tools wird Envoy mit Composer installiert und sollte einfach als Teil Ihres CI/CD-Workflows einzurichten sein.

Schritt Nr. 1 - Envoy global installieren

Führen Sie den folgenden Befehl aus, um envoy global auf Ihrem Rechner zu installieren

composer global require laravel/envoy

Schritt #2 - SSH-Konfiguration

Um mit dem Live-Server zu kommunizieren, müssen Sie SSH-Schlüssel auf Ihrem lokalen Rechner gespeichert haben, die Sie einfach verwenden, um sich per SSH in diese bestimmte Instanz einzuwählen. Es ist einfach, die SSH-Details in ~/.ssh/config Datei, die wir im nächsten Schritt verwenden werden.

Host deploy-myapp
    HostName hostipaddress
    User username
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/key
    IdentitiesOnly yes

Sie können überspringen UseKeychain und AddKeystoAgent wenn Sie keine Passphrase für Ihre SSH-Schlüssel haben.

Schritt#3 - Konfigurieren Sie Envoy.blade.php

Erstellen Sie eine Datei namens Envoy.blade.php im Stammverzeichnis Ihres Laravel-Projekts und fügen Sie den folgenden Code für grundlegende Aufgaben ein. Die Datei ist ziemlich geradlinig und selbsterklärend. Zum besseren Verständnis haben wir bereits Kommentare eingefügt.

{{-- servers array, deploy-myapp is the ssh hostname added in the config file in the prev step. --}}
@servers(['web'=>'deploy-myapp'])

{{-- add the git repo, specify branch(if you want to target specific branch), app_dir is the directory on your server, however you've configured it.
releases_dir as it'll be used to clone into those directories. --}}
@setup
$repo = '[email protected]:usernam/myrepo.git';
$branch = "branch";
$app_dir      = '/var/www/mywebsite.com';
$releases_dir =  $app_dir . '/releases';
$release_dir  =  $app_dir . '/releases/' . date('YmdHis');

{{-- we'll be only storing last 3 no of releases and remove all rest. --}}
$keep = 3;

{{-- for permissions --}}
$writable = [
'storage'
];

{{-- shared files/directories --}}
$shared = [
'storage' => 'd',
'.env' => 'f',
];
@endsetup

{{-- define list of tasks to be executed on deploy runner --}}
@macro('deploy',['on'=>'web'])
fetch_repo
run_composer
update_permissions
assets_install
migrate
clean
update_symlinks
@endmacro

{{-- get and clone the repository in the releases directory. --}}
@task('fetch_repo')
[ -d {{ $releases_dir  }} ] || mkdir -p {{ $releases_dir }};
git clone {{ $repo }}  --branch={{ $branch }} {{ $release_dir }};
echo "Repository has been cloned";
@endtask

{{-- copy .env files and run composer install to install the dependencies --}}
@task('run_composer')
cd {{ $release_dir }};
cp .env.stage .env
composer install --prefer-dist --no-interaction;
echo "Composer dependencies have been installed";
@endtask

{{-- configure project files/folder permissions --}}
@task('update_permissions')
@foreach($writable as $item)
    chmod -R 755 {{ $release_dir }}/{{ $item }}
    chmod -R g+s {{ $release_dir }}/{{ $item }}
    chgrp -R www-data {{ $release_dir }}/{{ $item }}
    echo "Permissions have been set for  {{ $release_dir }}/{{ $item }}"
@endforeach
chmod -R ug+rwx {{ $release_dir }}
chgrp -R www-data {{ $release_dir }}
echo "Permissions have been set for  {{ $release_dir }}"
@endtask

{{-- run and build assets using npm --}}
@task('assets_install')
cd {{ $release_dir }};
npm install && npm run production;
@endtask

{{-- migrate database if any new changes --}}
@task('migrate')
php {{ $release_dir }}/artisan migrate --force --no-interaction;
@endtask


{{-- Clean old releases --}}
@task('clean')
echo "Clean old releases";
cd {{ $releases_dir }};
rm -rf $(ls -t | tail -n +{{ $keep }});
@endtask

{{-- update symlinks --}}
@task('update_symlinks')
[ -d {{ $app_dir }}/shared ] || mkdir -p {{ $app_dir }}/shared;

@foreach($shared as $item => $type)

    #// if the item passed exists in the shared folder and in the release folder then
    #// remove it from the release folder;
    #// or if the item passed not existis in the shared folder and existis in the release folder then
    #// move it to the shared folder

    if ( [ -{{ $type }} '{{ $app_dir }}/shared/{{ $item }}' ] && [ -{{ $type }} '{{ $release_dir }}/{{ $item }}' ] );
    then
    rm -rf {{ $release_dir }}/{{ $item }};
    echo "rm -rf {{ $release_dir }}/{{ $item }}";
    elif ( [ ! -{{ $type }} '{{ $app_dir }}/shared/{{ $item }}' ]  && [ -{{ $type }} '{{ $release_dir }}/{{ $item }}' ] );
    then
    mv {{ $release_dir }}/{{ $item }} {{ $app_dir }}/shared/{{ $item }};
    echo "mv {{ $release_dir }}/{{ $item }} {{ $app_dir }}/shared/{{ $item }}";
    fi

    ln -nfs {{ $app_dir }}/shared/{{ $item }} {{ $release_dir }}/{{ $item }}
    echo "Symlink has been set for {{ $release_dir }}/{{ $item }}"
@endforeach

ln -nfs {{ $release_dir }} {{ $app_dir }}/current;
chgrp -h www-data {{ $app_dir }}/current;
echo "All symlinks have been set"
@endtask

 

Lesen Sie auch: Rollen und Berechtigungen in Laravel

Schritt Nr. 4 - Verzeichnispfad auf dem Server festlegen

Bisher lautete der Pfad zum Stammverzeichnis in den apache/nginx-Konfigurationsdateien etwa so /var/www/mywebsite.com/public. Dies müssen wir ändern in /var/www/mywebsite.com/current/public da sie auf die aktuelle Version verweisen sollte.

Schritt Nr. 5 - Einsetzen

Führen Sie nun einfach den folgenden Befehl aus, und Sie werden sehen, dass die Bereitstellung in kürzester Zeit erfolgt, ohne dass mehrere Befehle manuell ausgeführt werden müssen.

envoy run deploy

Abschließende Worte

Jetzt sollten Sie in der Lage sein, eine Laravel-Anwendung mit Envoy ohne Ausfallzeiten bereitzustellen. Wenn Sie Fragen zu diesem Artikel haben, können Sie unten einen Kommentar hinterlassen oder Sie können uns auch fragen auf Twitter.

Lesen Sie auch: Warum Laravel wählen

TWT Staff

TWT Staff

Writes about Programming, tech news, discuss programming topics for web developers (and Web designers), and talks about SEO tools and techniques