Déployer une application Symfony et Vue.js sur Cloud Run
Tags: symfony, vue, cloudrun, javascript
Published: 2024-02-02 12:43:21

Chez [ESENS](https://www.esensconsulting.com/), nous alternons de nombreux projets sur des stack techniques modernes et variées, aussi bien pour le compte de nos clients, que dans le cadre de nos développements et travaux en interne.

Dans ce contexte, et pour assurer la formation continue de nos équipes et rester à la pointe de notre savoir-faire technologique, nous avons créé le concept "Pizza Shop", une application permettant à chacun de nos collaborateurs de monter en compétences sur les dernières versions des langages, outils et frameworks de leur choix.

Dans cet article, l'idée est de vous montrer comment nous avons créé une version de Pizza Shop avec Symfony et Vue.js pour pouvoir la déployer ensuite sur un service [Cloud Run](https://cloud.google.com/run?hl=fr) de Google Cloud Platform...

Bonne lecture !

##Application Symfony et Vue.js

[Symfony](https://symfony.com/what-is-symfony) est un framework de création d'applications web basées sur des composants PHP.

Avec Symfony les interfaces graphiques peuvent être faites en utilisant pure HTML et CSS, mais nous avons décidé d’utiliser [Vue.js](https://vuejs.org/) pour profiter des fonctionnalités d’un framework moderne basé sur des composants.

Les différentes commandes affichées dans l'article sont valables pour un environnement Linux Ubuntu, mais en suivant les liens associés il est également possible de voir les commandes pour les autres systèmes d'exploitation.

##Création du projet Symfony

Etant donné que Symfony est un framework PHP, il est d’abord nécessaire d’installer [Composer](https://getcomposer.org/) pour la gestion de dépendances:

```
curl -Ss getcomposer.org/installer | php

sudo mv composer.phar /usr/local/bin/composer
```

Ensuite, on doit installer [Symfony CLI](https://symfony.com/download):

```
wget https://get.symfony.com/cli/installer -O - | bash
```

On peut alors initializer un projet:

`symfony new --webapp pizza-shop`

On installe le dependances

```php
cd pizza-shop

composer install
```

Et enfin on lance l’application:

`symfony server:start`

L’application démo est alors déployée en local :

![application démo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fecuj8c0kote49szuzgx.png)

##Ajout de Vue.js

Pour utiliser Vue.js dans un projet Symfony, on se sert du package [symfony/webpack-encore-bundle](https://symfony.com/doc/current/frontend.html#frontend-webpack-encore). En utilisant cet outil, et en ajoutant la configuration webpack dans le fichier webpack.config.js, il suffit de créer des composants Vue dans le dossier “assets” et de les insérer au DOM dans un fichier app.js en utilisant la fonction [app.mount()](https://vuejs.org/api/application.html#app-mount).

Ensuite, Symfony peut accéder à ces composants dans les fichiers html.twig sous la forme des node du DOM.

##Déploiement

Chez ESENS, nos applications sont déployées sur Cloud Run, une offre serverless de type Container as a Service (CAAS) proposée par Google Cloud Platform, et équivalent à Container App d’Azure ou Fargate pour AWS.

Notre objectif principal est ici de créer une image Docker avec notre application pour ensuite la déployer.

##Construction de l’image Docker

La construction de l’image Docker de l’application est faite en passant par un Dockerfile multi étape :

![Dockerfile multi étape](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/54yahzs1e3ajmgfncshk.png)

Dans la première étape, on fait l’installation des dépendances PHP du projet Symfony en utilisant une image Docker contenant Composer. 

Dans l’étape suivante, on fait le build des composants Vue.js en exécutant le script build qui fait appel à webpack-encore. On utilise une image node:18-alpine pour sa légèreté. 

Ensuite, on utilise une image PHP avec Apache pour héberger notre application, et on copie ensuite le fichier vhosts.conf avec notre configuration Apache. Le contenu du fichier est affiché dans l’image suivante :

![contenu du fichier](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8fzvr2r6llch090uexlq.png)

Enfin, on copie les librairies PHP depuis l’image compose-install, le code généré dans l'étape webpack builder, et on donne le droit à l'utilisateur www-data sur les différents fichiers de l’application.
Déploiement sur Cloud Run

Pour déployer notre application sur Cloud Run depuis notre poste on a d’abord besoin de :

1. [Créer un projet Google Cloud](https://cloud.google.com/resource-manager/docs/creating-managing-projects?hl=fr).
2. [Vérifier que la facturation est activée pour votre projet Google Cloud](https://cloud.google.com/billing/docs/how-to/verify-billing-enabled?hl=fr#console).
3. Installer gcloud CLI sur le poste de travail 

Ensuite on peut initializer le gcloud CLI : 

`gcloud init`

Et définir le projet qu’on a créé comme le projet  par défaut de notre service Cloud Run :

`gcloud config set project PROJECT_ID`

Enfin, on peut déployer notre service avec la commande suivante :

`gcloud run deploy pizza-shop  --source . --region=europe-west9 --port=80 --allow-unauthenticated`

Avec cette commande, nous spécifions pizza-shop comme le nom du service, europe-west9 (Paris) pour la région où le service va être déployé, le port où notre service va recevoir les appels et on autorise les appels non authentifiés pour que le service soit accessible au public.

Lors de l'exécution de cette commande, on doit accepter d’activer les API nécessaires pour le déploiement et fonctionnement du service. 

![exécution de cette commande](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lu10hwj1uyq7jp27i6c6.png)

A la fin du déploiement, on a une URL publique avec notre application Pizza Shop.

![URL publique](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9om15g65ya16oeqf24p5.png)

En allant sur l’URL, on peut alors accéder à notre application :

![accéder à l'application](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hzfjt244vawh80lkhpaz.png)

##Industrialisation

La méthode décrite est pertinente pour un déploiement simple depuis notre poste.

En revanche, dans un contexte d’industrialisation de l’application, il est nécessaire de créer une chaîne de CI/CD.

Chez ESENS, nous avons implémenté une chaîne pour déployer nos projets sur Cloud Run qui utilise des jobs sur GitHub Actions pour activer les API nécessaires, construire l’image Docker, la pousser sur Google Artifact Registry (GAR), pour ensuite la déployer sur Cloud Run. Le tout, en communiquant avec GCP en utilisant Workload Identity.

Et voilà le travail ! On espère que ça vous a inspiré !

------------------------------

Article rédigé par Andrés, Tech Lead Cloud & IoT et membre de la DT ESENS.

Retrouvez tous nos articles tech sur le [Blog ESENS](https://www.esensconsulting.com/blog) !

Vous êtes à la recherche d’un nouveau challenge technique ? Découvrez la dream team et rejoignez-nous en postulant à nos [offres d'emploi](https://www.welcometothejungle.com/fr/companies/esens-consulting) !