# Déploiement automatique

Nous souhaitons maintenant déployer notre site web sur le serveur de production directement à partir d'un serveur Git, chaque fois que nous créons un **Tag**, ou **etiquette**.

Une étiquette est une manière de signaler qu'une version dans Git est prêt pour production. Souvent on lui donne une étiquette de forme numérique, par exemple "3.1.1".

## Configuration des Tags

D'abord, nous allons **protéger** nos tags dans Gitlab, en précisant que seulement des tags d'un certain format puissent être déployé en production.

Naviguez dans **Settings → Repository → Protected Tags**.

![](/files/md4V6oS9IJprZQTDJmab)

Tapez `*.*.*` dans la barre de recherche, puis cliquer sur "Create wildcard tag". Sélectionner le role `Maintainers` (seulement les utilisateurs privilégiés auront le droit à déployer); puis cliquer sur "Protect".

![](/files/ZRtXbY10R0KaIuUwvsn4)

## Créer un Tag

Navigez dans **Code → Tags**. Ici, on peut ajouter un Tag en lui donnant un nomme de la forme X.X.X par exemple (`1.0.0`).

Git va désormais reconnaitre l'état actuel de notre code et l'associer à cette version. On pourrait revenir dessus si jamais il y a une erreur ponctuelle à résoudre.

## Déclencher un dépoloiement grâce à un Tag

Idéalement, lorsque nous créons un Tag, Gitlab déploie automatiquement notre site web pour nous. C'est possible !

Nous devons écrire un script qui se connectera à notre serveur de production (avec `ssh`) et copiera les fichiers de notre site web dans le bon répertoire (avec `scp`).

### Créer des variables secretes

Nous savons que pour créer une connexion SSH, il faudrait 3 informations :

* le nom d'utilisateur
* l'adresse IP ou le nom d'hôte de la machine de production
* la clé privé SSH

Nous allons créer des variables dans Gitlab pour stocker ses valeurs.

Naviguez dans **Settings → CI/CD → Variables**.

![](/files/8XGDsWTLZYqScdezgJCv)

Ajoutez 3 variables :

Pour le nom d'hote : ![](/files/RrQQAAF7XqVmjkSTYpZD)

Pour le nom d'utilisateur, remplacez "kevin.nguni.fr" par votre utilisateur que vous utilisez pour se connecter au serveur. ![](/files/nl6xAAwzzusSdnxB7Ff7)

Pour la clé ssh : ![](/files/P3Z5rLj5tSaiYKequSjG)

### Rediger une script automatisé

Naviguez dans **Build → Pipeline Editor**, et créer un nouveau Pipeline.

Collez le code suivant :

```yaml
stages:
  - deploy

deploy-job:
  stage: deploy
  tags:
    - general
  only:
    - tags
  image: alpine:latest
  script:    
    - chmod og= $ID_RSA
    - apk update && apk add openssh-client
    - scp -i $ID_RSA -o StrictHostKeyChecking=no index.html $USERNAME@$HOSTNAME:/var/www/html/$USERNAME/
```

Testez en créant un Tag dans **Code →Tags**. Ensuite naviguez dans **Build → Pipelines** pour voir la tâche s'éxecuter toute seule.

Si tout se passe correctement, Gitlab va connecter à votre compte et déposer votre fichier dans le bon dossier automatiquement !

Vous pouvez par la suite tester ! Ouvrez un navigateur web, et naviguer vers le lien suivant, en remplaçant `VOTRE_NOM_UTILISATEUR` par votre nom d'utilisateur pour accéder au serveur :

```
https://unixshell.hetic.glassworks.tech/VOTRE_NOM_UTILISATEUR/index.html
```

Vous devriez voir votre page !

## Testons la pipeline

Retournons à notre terminal.

D'abord, récupérez la version la plus à jour de notre projet.

```bash
git pull
```

Ensuite, apporter une modification quelquonque à la page `index.html`.

Créer une sauvegarde locale, et envoyez la au serveur.

```bash
git add .
git commit -m "Ajoute d'un autre paragraphe"
git push
```

Retournez à Gitlab, et créez un Tag, avec un numéro de version plus elevé, par exemple, `1.0.1`.

Attendez que votre tâche automatisé soit terminée, et rechargez votre page sur `https://unixshell.hetic.glassworks.tech`. Votre modification a été dépolyée !


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.glassworks.tech/unix-shell/git/410-git/050-cd.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
