-
Quentin Duchemin authoredQuentin Duchemin authored
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.
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
s'occupe de tout cela pour vous, tout en s'assurant que les URL soient adaptés à la machine de test, par exemple.
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.
En cas d'erreur, vous pouvez lancer des commandes manuellement, relancer le service, changer les fichiers de configurations, etc, pour diagnostiquer.
Lorsque le test a fonctionné, on se rend sur la page 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
).
Déploiement en production
On se rend 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.
Si des volumes sont déclarés external
(ce que nous ne recommendons pas), il faut les créer manuellement au prélable.
Certains services présentes des cas particuliers : regardez bien leur README avant de lancer les commandes qui suivent. On peut ensuite se rendre dans le dossier et lancer, en général :
# Tirer la nouvelle version des images
docker-compose pull
# (Re)création des volumes, des réseaux, des conteneurs
docker-compose up -d
# Lecture des logs
docker-compose logs -f
Attention : un conteneur noté Unhealthy
à cause d'un mauvais HEALTHCHECK
sera exclu de Traefik, même s'il fonctionne bien!
Exemple de test et de déploiement complet
Je me rends sur pica01-test
et je teste la nouvelle version de l'image :
$ 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 ====
Creating mattermost-db ... done
Creating mattermost-app ... done
==== 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 et je constate que tout fonctionne.
Je me rends de nouveau sur le pipeline 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 :
$ ssh qduchemi@pica02.picasoft.net
qduchemi@pica02:~$ cd /DATA/docker/dockerfiles/pica-etherpad
qduchemi@pica02:/DATA/docker/dockerfiles$ docker-compose pull
Pulling mattermost-db ... done
Pulling mattermost ... done
qduchemi@pica02:/DATA/docker/dockerfiles$ docker-compose up -d
Recreating mattermost-db ... done
Recreating mattermost-app ... done
qduchemi@pica02:/DATA/docker/dockerfiles$ docker-compose logs -f
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.
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
.