Déployer une application Laravel avec Deployer et GitHub Actions - Partie 1/2

Déployer une application Laravel avec Deployer et GitHub Actions - Partie 1/2

Tech web
Cloche d'abonnement aux notifications | |
  • Recevoir les notifications

Automatiser ses déploiements peut se révéler intéressant et pratique, faisant gagner du temps et limitant les erreurs humaines.

En 2018, GitHub a lancé le service Action permettant d’automatiser des processus sur sa plateforme. Grâce à un fichier de configuration placé dans son dépôt GitHub, il est possible d’exécuter une suite de tests, de déployer une app, etc.

Deployer est un outil PHP se focalisant sur le déploiement d’applications sans interruption de service, un fichier de configuration fixe les différents paramètres et une commande permet d’exécuter les opérations.

J’ai décidé de combiner ces outils pour gérer les déploiements de mon application.

Cet article se découpe en deux étapes :

  1. Configuration de Deployer en local
  2. Configuration de Deployer avec GitHub Actions

Configuration de Deployer en local

Tout d’abord, le paquet Deployer doit être installé via Composer.

composer require deployer/dist –dev

Deployer utilise un système de tâches qu’il exécute l’une après l’autre pour effectuer le déploiement. Un certain nombre de tâches sont présentes de base, d’autres peuvent être créées manuellement. Ces tâches peuvent être exécutées sur la machine locale ou sur le serveur vers lequel on souhaite déployer.

En l’occurrence, mon serveur ne propose pas d’environnement NodeJS ni la commande npm, je suis donc contraint de compiler mes assets sur ma machine locale. Pour cela, j’ai créé les deux tâches suivantes :

<?php
// recipe/recipe.php

namespace Deployer ;

// Installe les différents paquets NPM sur la machine locale
task('local:npminstall', function () {
    runLocally('npm install');
});

// Permet de compiler les assets
task('local:npmbuild', function () {
    runLocally('npm run production');
});

Maintenant le fichier deploy.php :

<?php
 
namespace Deployer;

require_once 'vendor/autoload.php';
require __DIR__ . '/recipe/recipe.php';
require 'recipe/common.php';
require 'recipe/laravel.php';
require 'contrib/rsync.php';
require 'contrib/php-fpm.php';
require 'contrib/npm.php';

set('application', 'Mon Application');
set('repository', 'git@github.com:monorganisation/mondepot.git'); // A remplacer par le lien de votre dépôt
set('composer_options', 'install --verbose --prefer-dist --no-progress --no-interaction --optimize-autoloader');
set('default_stage', 'dev');
set('ssh_multiplexing', true); // Si le script est exécuter sur Windows, il est peut-être nécessaire de passer cette valeur à false
set('keep_releases', 5);

host('ftp.mondomaine.com') // Adresse FTP fournie par mon hébergeur
    ->set('remote_user', 'moncomptessh') // Nom d’utilisateur SSH
    ->set('deploy_path', '/var/www/html/') // Chemin absolu du dossier dans lequel déployer l’application
    ->set('labels', ['stage' => 'prod']) // Catégorie du déploiement
    ->set('rsync_src', __DIR__ . DIRECTORY_SEPARATOR . 'public') // Indique d’où les fichiers compilés doivent être copiés
    ->set('rsync_dest','{{release_path}}/public'); // Indique la destination de cette copie
 
task('deploy', [
    'deploy:info',
    'deploy:setup',
    'deploy:lock',
    'deploy:release',
    'deploy:update_code', // Exécute un git clone du dépôt
    'deploy:shared',
    'deploy:vendors', // Exécute composer install
    'local:npminstall',
    'local:npmbuild',
    'local:htaccess',
    'rsync',
    'deploy:writable',
    'deploy:clear_paths',
    'deploy:symlink',
    'artisan:migrate', // Migrer la base de donnée
    'artisan:storage:link',
    'deploy:unlock',
    'deploy:cleanup',
    'deploy:success',
]);
 
after('deploy:failed', 'deploy:unlock');

Le script s’exécute en lançant la commande suivante :

./vendor/bin/dep deploy -- stage=prod

Peut-être constaterez-vous une erreur ou qu’un mot de passe vous est demandé. En effet, toutes les commandes exécutées passent par un tunnel SSH entre votre machine locale et le serveur distant. Ce tunnel requiert une authentification. Le plus pratique est d’ajouter sa clé publique SSH au serveur distant. Chaque hébergeur peut proposer une marche à suivre différente pour le faire, jetez un œil aux FAQ.

Il est maintenant temps de se connecter au serveur via un logiciel FTP comme FileZilla. En effet, il est nécessaire de configurer votre fichier .env et le .htaccess.

Voici les dossiers et fichiers que vous devriez avoir à la racine de votre hébergement. Le dossier « current » est un lien vers le dernier déploiement. Les 5 derniers déploiements se trouvent dans le dossier « releases ». Finalement, le dossier shared contient les éléments qui sont communs à toutes les releases, comme le fichier .env.

fichiers-deployer

Tout d’abord, ouvrez le fichier .htaccess et ajouter-y les lignes suivantes :

RewriteEngine on
RewriteRule ^((?!public/).*)$ current/public/$1 [L,NC]

Cela permet de faire pointer les requêtes vers la release la plus récente (« current »).

Maintenant, ouvrez le fichier « shared/.env ». Celui-ci doit être vide, remplissez-le avec les informations relatives à votre application.

Finalement, exécutez la commande suivante dans votre hébergement pour charger la configuration de votre fichier .env:

php artisan config:cache

A présent, vous devriez avoir un script de déploiement qui vous permet de mettre à jour facilement votre application depuis votre machine locale.

La deuxième partie de cet article, où l’on découvrira comment configurer Deployer avec GitHub Actions sera publiée ultérieurement.

Catégories :
Tech web

Tags :
PHP Laravel

Vous avez aimé cet article ? Suivez-nous sur Facebook pour ne rien manquer !