Skip to content

Mettre en place un process de deploiement avec Manala🔗

Vue d'ensemble🔗

Le process de Release / Deploy permet de deployer un projet sur un serveur distant.

Il est constitué de deux phases :

  • Release : création d'une archive contenant les sources du projet, ses dépendances (PHP et JS) et le résultat de ses compilations (build CSS et JS notamment). Puis publication de l'archive sur un dépôt git privé (différent du dépôt accueillant les sources projet).
  • Deploy : installation de l'archive sur un serveur distant à partir du dépô t git de release.

Le cookbook qui suit décrit toutes les étapes à réaliser pour configurer et utiliser ce processus de deploiement sur un projet vierge.

Pré-requis🔗

Logiciels🔗

Espaces de travail🔗

Configuration🔗

Mettre a jour la configuration Manala🔗

Ajouter au .manala.yaml, la configuration SSH permettant de se connecter aux serveurs de staging et production :

1
2
3
4
5
6
7
8
system:
  # ...
  ssh:
    client:
      config: |
        Host *.rix.link
            User app
            ForwardAgent yes

Note

Si les hosts diffèrent, créer une entrée pour chacun d'eux.

Puis ajouter une nouvelle section deliveries :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# ...

############
# Releases #
############

deliveries:
  # Production
  - &release
    tier: production
    ref: main
    repo: git@git.elao.com:monProjet/mon-projet-release.git # Le repo privé de release
    # Release
    delivery_tasks:
      # Les commandes à exécuter afin de s'assurer que tous les fichiers necessaries à l'exécution du projet sont présents.
      - shell: make install@production
      - shell: make build@production
    delivery_add:
      # Listes des fichiers et dossiers à inclure dans l'archive.
      - bin
      - config
      - public
      - src
      - templates
      - translations
      - vendor
      - node_modules
      - migrations
      - composer.*
      - Makefile
      - .env.local.php
      # - ... À completer en fonction des besoins du projet
    # Deploy
    deploy_hosts:
      - ssh_host: projet.client.prod.elao.run # Hostname du serveur
    deploy_dir: /srv/app/projet # Chemin dans lequel doit être installé le projet sur le serveur
    deploy_shared_dirs:
      # Dossier partagé entre les releases
      - var/jwt
      - var/log
      # - ...
    deploy_tasks:
      # Tâches à exécuter lors du deploy (ex: dump des secrets, migrations doctrine, …)
      - shell: make secrets@production
      - shell: make warmup@production
    deploy_post_tasks:
      # Tâches à exécuter après un deploy réussi
      - shell: sudo /bin/systemctl reload php8.1-fpm

  # Staging:
  - <<: *release
    tier: staging
    ref: staging
    # Release
    delivery_tasks:
      # Les tâches de préparation de la release Staging viennent remplacer celles de production.
      - shell: make install@staging
      - shell: make build@staging
    # Deploy
    deploy_hosts:
      - ssh_host: projet.client.staging.elao.run
    deploy_tasks:
      - shell: make secrets@staging
      - shell: make warmup@staging

Note

La section staging "hérite" de la configuration de production grace aux références YAML. On ne spécifie donc que ce qui change dans cette section. On peut surcharger n'importe quelle configuration de prod, par exemple le deploy_dir si besoin._

Déclarer les tâches Make🔗

Le déploiement et la release décrits ci-dessus s'appuient sur un certain nombre de commandes Make.

Déclarer dans le Makefile :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
###########
# Install #
###########

install@production: export APP_ENV = prod
install@production:
    # Composer
    composer install --verbose --no-progress --no-interaction --prefer-dist --optimize-autoloader --no-scripts --no-dev
    # NPM
    npm install --no-audit --no-progress --color=always

install@staging: export APP_ENV = prod
install@staging:
    # Composer
    composer install --verbose --no-progress --no-interaction --prefer-dist --optimize-autoloader --no-scripts
    # NPM
    npm install --no-audit --no-progress --color=always

#########
# Build #
#########

build@production: export APP_ENV = prod
build@production:
    npx encore production --color

build@staging: export APP_ENV = prod
build@staging:
    npx encore production --color

##########
# Warmup #
##########

warmup@production: export APP_ENV = prod
warmup@production:
    # Symfony cache
    bin/console cache:warmup --ansi --no-debug
    # Doctrine migrations
    bin/console doctrine:migrations:migrate --no-debug --no-interaction --allow-no-migration

# Note: This task is invoked after a deployment to staging
warmup@staging: export APP_ENV = prod
warmup@staging:
    # Symfony cache
    bin/console cache:warmup --ansi --no-debug
    # Doctrine migrations
    bin/console doctrine:migrations:migrate --no-debug --no-interaction --allow-no-migration

###########
# Secrets #
###########

secrets@production:
    gomplate --input-dir=secrets/production --output-map='{{ .in | replaceAll ".gohtml" "" }}'
    composer dump-env prod

secrets@staging:
    gomplate --input-dir=secrets/staging --output-map='{{ .in | replaceAll ".gohtml" "" }}'
    composer dump-env prod

Versionner les modifications🔗

  • Exécutez manala up pour générer les fichiers de configuration dans .manala.
  • Versionnez les modifications des fichiers .manala.yamlet Makefile et du dossier .manala.

Utilisation🔗

Etape 1 : créer une archive avec make release@staging ou make release@production. Etape 2 : déployer la dernière release avec make deploy@staging ou make deploy@production.

Vous pouvez également déclencher les releases et déploiements directement depuis Github

Configuration avancée et cas particuliers🔗

Cas particulier d'un mono-repo🔗

Dans le cas d'un mono-repo avec plusieurs apps à deployer, par exemple : mon-projet/api et mon-projet/client.

  • Chaque app doit avoir sont repository de release dédié.
  • Chaque app doit avoir son Makefile dédié.

Modifier le fichier manala.yaml comme suit :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#...
deliveries:
  # Api production
  - &delivery_api
    app: api # Doit correspondre au dossier /api
    tier: production
    ref: main
    repo: git@git.elao.com:monProjet/mon-projet-api-release.git
    # ... Reste de la configuration
  # Client production
  - &delivery_client
    app: client # Doit correspondre au dossier /client
    tier: production
    ref: main
    repo: git@git.elao.com:monProjet/mon-projet-client-release.git
    # ... Reste de la configuration
  # Api staging
  - <<: *delivery_api
      tier: staging
      ref: staging
      # ... Reste de la configuration
  # Client staging
  - <<: *delivery_client
      tier: staging
      ref: staging
      # ... Reste de la configuration

Continuous Integration (CI)🔗

Voir la documentation Manala à ce sujet, ainsi que le cookbook Github Actions.

Connexion SSH aux serveurs🔗

Ajouter la section SSH dans le Makefile :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#######
# SSH #
#######

## SSH to staging server
ssh@staging: SHELL := $(or $(DOCKER_SHELL),$(SHELL))
ssh@staging:
    ssh app@projet.client.staging.rix.link

## Ssh to production server
ssh@production: SHELL := $(or $(DOCKER_SHELL),$(SHELL))
ssh@production:
  ssh app@projet.client.prod.rix.link

Last update: December 20, 2024