Skip to content
Snippets Groups Projects
guide_deploiement.md 5.95 KiB
Newer Older
# Déployer un service

Dès lors que la chaîne d'intégration a construit une image Docker, il est possible de tester et de déployer le service concerné.

## Test du service

Avant de mettre un service en production, il faut vérifier que le service se lance bien comme prévu. Pour ce faire, on se rend sur une machine virtuelle de test (exemple : `pica01-test.picasoft.net`) et on se rend dans `/DATA/docker/dockerfiles`.

Il faut être connecté au registre de test pour la suite : on s'assure de bien avoir exécuté la commande `docker login registry.test.picasoft.net`. Les identifiants sont sur le [pass](https://gitlab.utc.fr/picasoft/interne/pass).

Pour que le service réponde à nos critères, il faut s'assurer qu'il démarre **indépendamment** de ce qui existe sur la machine. Le script [`docker_test.sh`](./docker_test.sh) s'occupe de tout cela pour vous.
Il suffit de lancer la commande `$ ./docker_test.sh <nom du dossier, e.g. pica-mattermost>`.

Vérifiez que les logs ne produisent aucune erreur et que le service fonctionne bien sur l'infrastructure de test.

## Déploiement en production

Lorsque le test a fonctionné, on se rend sur la page [Pipelines](https://gitlab.utc.fr/picasoft/projets/dockerfiles/pipelines) on choisit la pipeline correspondant au commit de modification que l'on a testé, et on lance le push de l'image sur le registre de production (`push-prod`).

On se rend enfin sur la machine de production, dans le dossier `/DATA/docker/dockerfiles`.

Si on déploie un service pour la première fois, il faudra copier les fichiers `*.secrets.example` en `*.secrets`, et remplacer les valeurs d'example par des valeurs **secrètes**.

Il faut être connecté au registre de production pour la suite : on s'assure de bien avoir exécuté la commande `docker login registry.picasoft.net`. Les identifiants sont sur le [pass](https://gitlab.utc.fr/picasoft/interne/pass).

 On peut alors utiliser le script [`docker_prod.sh`](./docker_prod.sh), qui automatise quelques étapes.
 Il suffit de lancer la commande `$ ./docker_prod.sh <nom du dossier>`.

Attention : un conteneur noté `Unhealthy` à cause d'un mauvais `HEALTHCHECK` sera **exclu** de Traefik, même s'il fonctionne bien!

## Exemple de déploiement

Je me rends sur `pica01-test` et je teste la nouvelle version de l'image :

```bash
$ ssh qduchemi@pica01-test.picasoft.net
qduchemi@pica01-test:~$ cd /DATA/docker/dockerfiles
qduchemi@pica01-test:/DATA/docker/dockerfiles$ ./docker_test.sh pica-mattermost
Starting procedure for pica-mattermost/...

==== Create dumb secret files ====
	File pica-mattermost//secrets/mattermost-db.secrets created

==== Stop and remove existing containers ====
Network docker_default is external, skipping

==== RESET HARD and pull Dockerfiles repository ====
Using branch  master, is this correct ? [y/N]
y
HEAD is now at 472e0d7 [Mattermost] Bump to version 5.19.0
Username for 'https://gitlab.utc.fr': qduchemi
Password for 'https://qduchemi@gitlab.utc.fr':
Already up-to-date.

==== Replace production URL with testing URL in all files ====
	Found in ./entrypoint.sh
	Found in ./docker-compose.yml

==== Remove and re-create named external volumes ====
mattermost-config
mattermost-config
mattermost-data
mattermost-data
mattermost-plugins
mattermost-plugins
mattermost-db
mattermost-db

==== Remove old images ====
Error: No such image: registry.test.picasoft.net/pica-mattermost:5.19.0
Error: No such image: postgres:9.4-alpine

==== Pull new versions of images ====
Pulling mattermost-db ... done
Pulling mattermost    ... done

==== Lauch pica-mattermost/ and restore repository ====
Creating mattermost-db ... done
Creating mattermost-app ... done
HEAD is now at 472e0d7 [Mattermost] Bump to version 5.19.0

==== Print logs (use Ctrl+C to stop) ====
Attaching to mattermost-app, mattermost-db
[...]
```

Je vérifie que les logs sont ok, je se rend sur [team.test.picasoft.net](https://team.test.picasoft.net) et je constate que tout fonctionne.

Je me rends de nouveau sur le [pipeline](https://gitlab.utc.fr/picasoft/projets/dockerfiles/pipelines/54707) et je lance manuellement l'étape `push-prod` pour pousser l'image sur le registre de production.

Je me rends ensuite sur la machine de production (`pica02` à ce jour) et je lance la nouvelle version du service :
```bash
$ ssh qduchemi@pica02.picasoft.net
qduchemi@pica02:~$ cd /DATA/docker/dockerfiles
qduchemi@pica02:/DATA/docker/dockerfiles$ ./docker_prod.sh pica-mattermost
Starting procedure for pica-mattermost...

==== Pull Dockerfiles repository ====
Using branch  master, is this correct ? [y/N]
y
Username for 'https://gitlab.utc.fr': qduchemi
Password for 'https://qduchemi@gitlab.utc.fr':
Déjà à jour.

==== Pull new versions of images ====
Pulling mattermost-db ... done
Pulling mattermost    ... done

==== Ensure named external volumes are created ====
mattermost-config
mattermost-data
mattermost-plugins
mattermost-db

==== Lauch pica-mattermost ====
Recreating mattermost-db ... done
Recreating mattermost-app ... done

==== Print logs (use Ctrl+C to stop) ====
Attaching to mattermost-app, mattermost-db
```

J'attends que l'application ait démarré, je vérifie que tout est ok sur [team.picasoft.net](https://team.picasoft.net).

La mise à jour est terminée ! :)

## Troubleshooting

Cette section répertorie les problèmes anecdotiques indépendants des modifications des fichiers.

### Erreurs de connexion à la base de données

Si le conteneur `*-app` n'arrive pas à se connecter à la BDD du conteneur `*-db`, il est possible que `*-db` soit en train de tourner avec des anciens identifiants. Pour corriger ce problème **sur la VM de test**, il faudra:

* effacer les conteneurs `*-app` et `*-db`
* effacer leurs volumes
* créer à nouveau leurs volumes
* relancer le script `./docker_test.sh`.

**Note:** Le script s'occupe déjà d'effacer et créer à nouveau les volumes, mais ça ne fonctionne pas dans le cas de `pica-etherpad`, probablement dû à un bug de `docker-compose config --volumes` qui retourne `etherpad-db-volume` et non `etherpad-db`.