Déploiement sans contrôle de source avec VitoDeploy : guide d'un workflow PHP entièrement personnalisé

Quand le déploiement Git n'est plus une option

De nombreuses équipes maintiennent des processus d'approvisionnement hérités ou des pipelines déjà industrialisées. Imposer Git comme seul point d'entrée du déploiement crée des frictions : synchronisation automatique non désirée, outils d'infrastructure déjà en place, procédures FTP/SFTP conservées, ou besoin d'un déploiement atomique par échange de répertoires.

Le type de site PHP Blank dans VitoDeploy

VitoDeploy introduit le type de site "PHP Blank" pour découpler la création du site de tout repository. Comparé au site PHP classique :

Caractéristique Site PHP standard PHP Blank
Contrôle de source Git obligatoire Entièrement optionnel
Contenu initial Code du repository Répertoire vide
Mécanisme de déploiement Pull Git + scripts Scripts personnalisés uniquement
Contrôle du workflow Processus prédéfinis Libre choix de l'équipe
Utilisation typique Workflow Git standard Chaîne d'outils propriétaire

Création d'un site PHP Blank

La validation est allégée. Seuls le répertoire web et la version PHP demeurent obligatoires.

// app/Models/SiteTypes/BlankPHP.php
public function validationRules(array $payload): array
{
    return [
        'php_version' => [
            'required',
            Rule::in($this->site->server->availablePhpVersions()),
        ],
        'public_path' => [
            'nullable',
            'string',
            'max:255',
            'regex:/^[a-zA-Z0-9._\-\/]+$/,
            'not_regex:/\.\./,
        ],
    ];
}

Définir un script de déploiement personnalisé

Le coeur du mécanisme réside dans un script shell entièrement modifiable. L'exemple ci-dessous illustre un déploiement bleu/vert rudimentaire par lien symbolique.

#!/bin/bash
set -euo pipefail

DOMAIN="example.com"
BASE="/home/vito/${DOMAIN}"
RELEASES="${BASE}/releases"
CURRENT="${BASE}/live"
TIMESTAMP=$(date +%s)
DEST="${RELEASES}/build-${TIMESTAMP}"

mkdir -p "${DEST}"

# Synchronisation depuis une source distante ou locale
rsync -avz --delete --exclude=".env" /data/builds/app/ "${DEST}/"

# Mise à jour atomique du lien symbolique
ln -sfn "${DEST}" "${CURRENT}"

# Rechargement du pool PHP-FPM
sudo systemctl reload php8.2-fpm

# Conservation des cinq derniers builds
cd "${RELEASES}"
ls -t | tail -n +6 | xargs -r rm -rf

Logique de déploiement dans VitoDeploy

Le moteur de déploiement distingue les modes classique et moderne. Si aucun script n'est configuré, l'opération échoue explicitement.

// app/Services/Deployment/DeploySite.php
public function execute(Site $site, string $mode = 'modern'): Deployment
{
    if (empty($site->deploymentScript?->body)) {
        throw new MissingDeploymentScriptException();
    }

    $typeData = $site->type_data ?? [];

    if ($mode === 'classic' || empty($typeData['modern_deployment'])) {
        return $this->runClassic($site);
    }

    return $this->runModern($site);
}

Intégrations courantes

  • CI/CD externe : Jenkins, GitLab CI ou GitHub Actions poussent les artefacts vers le serveur avant d'invoquer l'API VitoDeploy.
  • Outils d'infrastructure : Ansible ou Terraform préparent l'environnement, VitoDeploy exécute le script final.
  • Transfert de fichiers : rsync, scp ou sftp restent compatibles.

Architecture recommandée

[Pipeline CI/CD] --(rsync/scp)--> [Serveur VitoDeploy] --(script PHP Blank)--> [Rechargement service]
        ^
        |
[API VitoDeploy] <-- [Retour d'état]

Points d'attention

  • Structure des répertoires : utiliser releases/ et un lien symbolique current pour permettre l'échange atomique.
  • Synchronisation : privilégier rsync avec suppression pour garantir la cohérence.
  • Gestion des services : recharger (reload) plutôt que redémarrer (restart) PHP-FPM pour minimiser l'indisponibilité.
  • Rétention : limiter le nombre de builds conservés pour éviter l'engorgement du disque.
  • Validation post-déploiement : ajouter une sonde HTTP ou une commande de vérification à la fin du script.

Étiquettes: VitoDeploy PHP-Blank zero-downtime CI/CD rsync

Publié le 25 juin à 20h43