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 symboliquecurrentpour 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.