À l'aide de docker-composer avec CI - façon de traiter avec les codes de sortie et automatiquement conteneurs liés?
Dès maintenant notre Jenkins agents de générer un menu fixe-composer.yml pour chacun de nos Rails de projets, puis exécutez le panneau-composer jusqu'. Le docker-composer.yml a un principal "web" conteneur qui a rbenv et toutes nos autres Rails de dépendances à l'intérieur. Il est lié à une base de données de conteneur qui contient le test Postgres DB.
Le problème vient quand nous en avons besoin pour exécuter les tests et de générer des codes de sortie. Notre serveur CI se déploient uniquement si le script de test renvoie la sortie à 0, mais docker-composer retourne toujours 0, même si l'un des conteneur des commandes de l'échec.
L'autre problème est que la DB conteneur s'exécute indéfiniment, même après que le conteneur web est fait de lancer les tests, donc docker-compose up
ne retourne jamais.
Est-il un moyen d'utiliser docker-composer pour ce processus? Nous devrions être en mesure d'exécuter les conteneurs, mais après la sortie du conteneur web est le remplir et le renvoyer du code de sortie. Maintenant nous sommes coincés manuellement à l'aide de docker à tourner la DB conteneur et exécuter le conteneur web avec l'option --link.
Vous devez vous connecter pour publier un commentaire.
Depuis la version
1.12.0
, vous pouvez utiliser le--exit-code-from
option.De la documentation:
docker-compose
1.12.0 et au-dessus. Peut-être que c'est votre cas aussi. Un exemple pourrait être:docker-compose up --exit-code-from test-unit
. Notez que cela n'a pas fonctionné pour moi jusqu'à ce que j'ai ajouté unset -e
au début de mon script.--exit-code-from
ne fonctionne pas avec-d
bien. Il va jeter ces erreurs:using --exit-code-from implies --abort-on-container-exit
et--abort-on-container-exit and -d cannot be combined.
docker-compose run
est le moyen le plus simple pour obtenir la sortie de statuts que vous désirez. Par exemple:Sinon, vous avez la possibilité de inspecter la mort des conteneurs. Vous pouvez utiliser le
-f
drapeau, pour obtenir le statut de sortie.Comme pour la db conteneur qui ne revient jamais, si vous utilisez
docker-compose up
alors vous aurez besoin de sigkill que le conteneur; ce n'est probablement pas ce que vous voulez. Au lieu de cela, vous pouvez utiliserdocker-compose up -d
pour exécuter vos contenants automatiquement, manuellement et de tuer les conteneurs lors de votre test est terminé.docker-compose run
devrait exécuter conteneurs liés pour vous, mais j'ai entendu chatter sur de SORTE qu'à propos d'un bug empêchant que de travailler comme prévu actuellement.docker-compose logs
-T
Bâtiment sur kojiro réponse:
docker-compose ps -q | xargs docker inspect -f '{{ .State.ExitCode }}' | grep -v '^0' | wc -l | tr -d ' '
Renvoie combien de non-0 codes de sortie ont été retournés. 0 si tout s'est arrêté avec le code 0.
docker-compose ps
, par exemple:docker-compose ps | grep -c "Exit 1"
vous donnera le temps où "Sortie 1" correspond à l'affichage dedocker-compose ps
(qui offre un joli imprimé tableau de synthèse des résultats). Les codes de sortie sont répertoriés dans la colonne "Etat".Si vous êtes prêt à utiliser
docker-compose run
manuellement le coup d'envoi de vos tests, l'ajout de la--rm
drapeau, curieusement, les causes de Composer afin de refléter avec précision votre commande statut de sortie.Voici mon exemple:
Utilisation
docker wait
pour obtenir le code de sortie:foo
est le "nom de projet". Dans l'exemple ci-dessus, j'ai précisé de façon explicite, mais si vous ne fournissez pas, c'est le nom du répertoire.bar
est le nom que vous donnez au système sous test dans votre menu fixe-composer.yml.Noter que
docker logs -f
fait la bonne chose, aussi, de sortir lorsque le conteneur s'arrête. Ainsi, vous pouvez mettreentre les
docker-compose up
et ladocker wait
de sorte que vous pouvez regarder vos tests.--exit-code-from SERVICE
et--abort-on-container-exit
ne fonctionnent pas dans les scénarios où vous en avez besoin pour exécuter tous les conteneurs à la fin, mais ne parviennent pas si l'un d'eux est sorti début. Un exemple pourrait être si en cours d'exécution 2 test des costumes en même temps dans différents conteneurs.Avec @spenthil de la suggestion, vous pouvez envelopper
docker-compose
dans un script qui va échouer si les contenants de faire.Ensuite sur votre serveur CI simplement changer
docker-compose up
à./docker-compose.sh up
.Vous pouvez le voir exister statut:
docker-compose ps | grep servicename | grep -v 'Exit 0' && echo "Automation or integration tests failed." && exit 1
docker-rails vous permet de spécifier lequel le contenant du code d'erreur est renvoyé au processus principal, de sorte que vous serveur CI peut déterminer le résultat. C'est une excellente solution pour l'IC et de développement pour les rails avec docker.
Par exemple
dans votre
docker-rails.yml
donnera leweb
conteneurs code de sortie comme un résultat de la commandedocker-rails ci test
.docker-rails.yml
est juste une méta wrapper autour de la normedocker-compose.yml
qui vous donne le potentiel d'hériter et la réutilisation de la même configuration de base pour les différents environnements de développement vs test vs parallel_tests.Dans le cas, vous pouvez exécuter de plus docker-composition de services avec le même nom sur un moteur docker, et que vous ne connaissez pas le nom exact:
echo %?
- retourne le code de sortie de test-chrome serviceAvantages: