> For the complete documentation index, see [llms.txt](https://guide-agile.wishtack.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://guide-agile.wishtack.io/extreme-programming/integration-continue-livraison-continue-et-deploiement-continu/review-apps.md).

# Review Apps

Certains outils d'intégration continue combinés avec des plateformes de déploiement *(Cf.* [*GitLab Review Apps*](/extreme-programming/integration-continue-livraison-continue-et-deploiement-continu/review-apps.md#gitlab-review-apps) *&* [*Heroku Review Apps*](/extreme-programming/integration-continue-livraison-continue-et-deploiement-continu/review-apps.md#heroku-review-apps)*)* permettent de **créer dynamiquement des environnements de déploiement**.

Cela permet d'adopter l'approche de développement décrite ci-dessous.

Supposons que l'équipe de développement travaille sur deux fonctionnalités en parallèle **payin** *(pour le crowdfunding)* et **cashout** *(pour la récupération de la cagnotte)*.

1. Le code de production est sur la branche `master`.<br>
2. L'équipe crée deux branches `payin` et `cashout` à partir de la branche `master`.<br>
3. A chaque changement *(ou commit)* sur les branches `payin` ou `cashout` *(et si tout se passe bien)*, le produit **est déployé automatiquement sur un environnement créé dynamiquement et accessible depuis une URL** *(ou plusieurs)* créée dynamiquement ; par exemple, **`payin.review.wishtack.com`** et **`cashout.review.wishtack.com`**.<br>
4. Les parties prenantes autorisées peuvent **valider 👍*****(ou rejeter 👎)*** le changement et **par simple clic**, le code est **"merged" dans la branche `master`**.<br>
5. La branche `master` passe automatiquement par les process de "**build**" et "**test**" de l'[Intégration Continue](/extreme-programming/integration-continue-livraison-continue-et-deploiement-continu/integration-continue.md).\
   Dans le cas du [Déploiement Continu](/extreme-programming/integration-continue-livraison-continue-et-deploiement-continu/deploiement-continu.md) : le produit est **automatiquement déployé en production**.\
   Dans le cas de la [Livraison Continue](/extreme-programming/integration-continue-livraison-continue-et-deploiement-continu/livraison-continue.md) : le produit est **automatiquement déployé sur un environnement de validation** *(staging)* et prêt à être déployé en production par **simple clic**.

![Review App Workflow](https://1531174460-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LHD4wSD1i9v5yCa767m%2F-LHJE-ZfoGiJpMWRBOpi%2F-LHJE122XQ2L-FOZN6JX%2Fcontinuous-delivery-review-apps.svg?alt=media\&token=791027f9-7e47-468f-98ec-af3375f501ad)

{% hint style="success" %}
De la même façon qu'il est idéal de définir les User Stories les plus granulaires possibles, il est recommandé de **réduire au minimum la durée de vie d'une branche et la quantité de changements**.

Il est intéressant de ne pas dépasser une **durée de vie d'un jour** pour chaque branche. Quitte à en recréer une nouvelle avec le même nom pour apporter de nouveaux changements.

Cela permet d'éviter le ***git spaghetti*** et les **conflits de merge**.
{% endhint %}

## Exemple

### Pipeline de build, deploy et test de l'Intégration Continue

![GitLab Pipeline](https://1531174460-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LHD4wSD1i9v5yCa767m%2F-LHOGdkWCNnyXfxUaNfP%2F-LHOHEkdjBRekIa3WYFz%2Fgitlab-pipeline.png?alt=media\&token=8f4db7da-0159-4002-9b4f-80b833ecb71a)

### Validation d'une branche *(merge)*

![GitLab Branch Merge](https://1531174460-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LHD4wSD1i9v5yCa767m%2F-LHOGdkWCNnyXfxUaNfP%2F-LHOGsv6N5LtwoH9a_lv%2Fgitlab-merge.png?alt=media\&token=f4e64287-b336-4ea2-9b31-aa751b12ad89)

### Déploiement manuel *(promote)*

![Heroku Promote](https://1531174460-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LHD4wSD1i9v5yCa767m%2F-LHOGdkWCNnyXfxUaNfP%2F-LHOHSif_y3gjp_H537R%2Fheroku-promote.png?alt=media\&token=5d63b8f1-350a-4390-a2d9-3fb9616046db)

### Rollback

![Activity History](https://1531174460-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LHD4wSD1i9v5yCa767m%2F-LHOGdkWCNnyXfxUaNfP%2F-LHOHdKj_f8fA49v6ODS%2Fheroku-activity-list.png?alt=media\&token=b7996479-c014-4fea-bfdb-8c529e4d2a95)

![Heroku Rollback Confirmation](https://1531174460-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LHD4wSD1i9v5yCa767m%2F-LHOGdkWCNnyXfxUaNfP%2F-LHOHmSUCm08Ihg4z_It%2Fheroku-rollback-confirmation.png?alt=media\&token=8943ebd4-2ed4-445c-8b15-bfe3c5a444ab)

## Heroku Review Apps

{% embed url="<https://devcenter.heroku.com/articles/github-integration-review-apps>" %}
Heroku Review Apps
{% endembed %}

## GitLab Review Apps

{% embed url="<https://docs.gitlab.com/ee/ci/review_apps/>" %}
GitLab Review Apps
{% endembed %}
