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