Comment exécuter travis-ci localement


524

Je viens de rejoindre un projet et je suis nouveau sur travis-ci. Je préfère ne pas avoir à pousser chaque petit changement vers .travis.yml et chaque petit changement que je fais à la source pour exécuter la construction. Avec jenkins, vous pouvez télécharger jenkins et l'exécuter localement. Est-ce que travis offre quelque chose comme ça?

Remarque: j'ai vu le clis travis-ci et l'ai téléchargé, mais tout ce qu'il semble faire est d'appeler leur API, qui se connecte ensuite à mon dépôt github, donc si je ne pousse pas, peu importe que je redémarre la dernière version.


3
Vous devriez pouvoir exécuter les tests localement sans avoir à exécuter Travis CI. Consultez la section "script" du fichier .travis.yml pour voir quelle commande exécuter.
Konstantin Haase

69
Mais simplement exécuter les tests n'est pas le problème - souvent une construction Travis échoue à cause des étapes de configuration et d'installation de la install:section, et c'est probablement celles-ci qui préoccupent le plus la question.
Brandon Rhodes

4
J'ajouterai que dans les projets complexes, diverses raisons (par exemple, différentes versions ponctuelles ou interactions système de l'exécution, des tests intrinsèquement sensibles au temps, par exemple des tests de temporisation, etc.), les tests eux-mêmes peuvent parfois se comporter différemment dans un environnement local et sur Travis CI. .
circlespainter

Réponses:


200

Ce processus vous permet de reproduire complètement n'importe quel travail de construction Travis sur votre ordinateur. Vous pouvez également interrompre le processus à tout moment et déboguer. Voici un exemple où je reproduis parfaitement les résultats du travail # 191.1 sur php-school / cli-menu .

Conditions préalables

  • Vous avez un dépôt public sur GitHub
  • Vous avez exécuté au moins une version sur Travis
  • Vous avez installé Docker sur votre ordinateur

Configurer l'environnement de génération

Référence: https://docs.travis-ci.com/user/common-build-problems/

  1. Créez votre propre ID de build temporaire

    BUILDID="build-$RANDOM"
    
  2. Affichez le journal de construction , ouvrez le bouton Afficher plus pour les INFORMATIONS SUR LE TRAVAILLEUR et recherchez la ligne INSTANCE, collez-la ici et exécutez (remplacez la balise après les deux-points par la plus récente disponible) :

    INSTANCE="travisci/ci-garnet:packer-1512502276-986baf0"
    
  3. Exécutez le serveur sans tête

    docker run --name $BUILDID -dit $INSTANCE /sbin/init
    
  4. Exécutez le client attaché

    docker exec -it $BUILDID bash -l
    

Exécutez le travail

Vous êtes maintenant dans votre environnement Travis. Courez su - travispour commencer.

Cette étape est bien définie mais elle est plus fastidieuse et manuelle. Vous trouverez toutes les commandes que Travis exécute dans l'environnement. Pour ce faire, recherchez tout dans la colonne de droite qui a une balise comme 0.03s.

Sur le côté gauche, vous verrez les commandes réelles. Exécutez ces commandes, dans l'ordre.

Résultat

C'est le bon moment pour exécuter la historycommande. Vous pouvez redémarrer le processus et relire ces commandes pour exécuter le même test sur une base de code mise à jour.

  • Si votre repo est privé: ssh-keygen -t rsa -b 4096 -C "YOUR EMAIL REGISTERED IN GITHUB"alors cat ~/.ssh/id_rsa.pubet cliquez ici pour ajouter une clé
  • Pour info: vous pouvez à git pullpartir de l'intérieur du docker charger des validations depuis votre boîte de développement avant de les pousser vers GitHub
  • Si vous souhaitez modifier les commandes exécutées par Travis, il vous incombe de déterminer comment cela se traduit en un travail .travis.yml.
  • Je ne sais pas comment nettoyer l'environnement Docker, ça a l'air compliqué, peut-être que cela fuit la mémoire

22
Dans les journaux sous, instance:je ne vois pas de chemin d'image Docker valide, juste quelque chose comme travis-ci-garnet-trusty-1512502259-986baf0. Essayé travisci/ci-garnet:$INSTANCEet travisci/$INSTANCE- ne fonctionne pas, ne trouve pas l'image. Aussi, la simple prise du suffixe (c.-à-d. travisci/ci-garnet:packer-1512502259-986baf0) N'a pas fonctionné.
Roy Shilkrot

4
Je rencontre le même problème - l'image mentionnée dans les informations d'instance ne peut pas être téléchargée. De plus, j'ai essayé l' travisci/ci-garnet:packer-1512502276-986baf0image qui est suggérée dans les documents Travis . Celui-ci est disponible, mais obsolète. Par exemple, CMake est bien plus ancien que celui disponible dans Travis. Aucune nouvelle version de ci-garnetn'a été téléchargée sur Docker Hub au cours des six derniers mois, alors qu'auparavant, il y avait de nombreuses mises à jour par mois.
skalee

7
Votre lien de référence ne fonctionne plus - c'est-à-dire que la section «Exécution locale d'une image Docker basée sur un conteneur» a été supprimée de cette page. Peut-être que la différence dans la sortie de l'instance était due au fait de ne pas avoir sudo: requireddéfini? Dans une version actuelle de la mienne, je vois travis-ci-sardonyx-xenial-1547455603-2c98a19que je peux mapper sur travisci / ci-sardonyx: packer-1547455648-2c98a19
maxschlepzig

4
pour moi en utilisant la dernière version de travisci / ci-garnet sur docker hub (travisci / ci-garnet: packer-1515445631-7dfb2e1) a fait l'affaire
taleb

3
Si vous travaillez sur une instance de travis spécifique à une langue, vous pouvez également utiliser l'image dédiée, comme celle en python .
Zaccharie Ramzi du

162

Travis-ci propose une nouvelle infrastructure basée sur des conteneurs qui utilise Docker. Cela peut être très utile si vous essayez de dépanner une construction travis-ci en la reproduisant localement. Ceci est tiré de la documentation de Travis CI .

Dépannage local dans une image Docker

Si vous rencontrez des problèmes pour localiser le problème exact dans une build, il est souvent utile d'exécuter la build localement. Pour ce faire, vous devez utiliser notre infrastructure basée sur des conteneurs (c'est-à-dire avoir sudo: falsedans votre .travis.yml) et savoir quelle image Docker vous utilisez sur Travis CI.

Exécution locale d'une image Docker basée sur un conteneur

  1. Téléchargez et installez le moteur Docker .
  2. Sélectionnez une image dans Docker Hub . Si vous n'utilisez pas de sélection d'image spécifique à la langue ci-ruby. Ouvrez un terminal et démarrez une session Docker interactive à l'aide de l'URL de l'image:

    docker run -it travisci/ubuntu-ruby:18.04 /bin/bash
    
  3. Passer à l' travisutilisateur:

    su - travis
    
  4. Clonez votre référentiel git dans le /dossier de l'image.
  5. Installez manuellement toutes les dépendances.
  6. Exécutez manuellement votre commande de construction Travis CI.

6
@DustinGraham, cela dépend de la configuration du projet en cours de construction par Travis CI. Dans le projet sur lequel je travaillais, la commande build était configurée dans le fichier .travis.yml sous le script: sous-section et était make test.
Scott McLeod

102
> Manually install any dependencies Cela semble être un bon moyen de se retrouver avec des résultats qui ne correspondent pas aux versions régulières de Travis.
Gerry

6
@Gerry En installant manuellement les dépendances, je suppose qu'il veut dire exécuter manuellement les commandes que vous avez dans votre fichier de configuration travis qui gèrent l'installation des dépendances. Ce sont donc les mêmes commandes que travis CI ferait, mais pas automatisées.
Chathan Driehuys

8
J'ai l'impression que c'est la réponse à ma question d'une manière ou d'une autre mais le Manually tun your Travis CI build command... Comme quoi? Comment? Qu'Est-ce que c'est? J'ai un .travis.ymldossier. J'ai essayé travis-build mais c'est une impasse.
Brandon

2
@Brandon Dans votre .travis.yml, il y a généralement une sous-section de script qui est invoquée par travis pour construire votre source. Le point de cette réponse est de configurer un environnement local identique à celui sur lequel travis fonctionnerait. Ensuite, vous invoquerez ces commandes vous-même au lieu de compter sur travis pour les exécuter pour vous. De cette façon, vous pouvez voir les effets de l'exécution de chaque commande vous-même dans cet environnement - cela peut donner un aperçu d'un problème de construction que vous pourriez avoir sur travis qui autrement ne serait pas accessible.
Scott McLeod

86

MISE À JOUR: J'ai maintenant une réponse clé en main complète, tout-en-un, voir https://stackoverflow.com/a/49019950/300224 . Cela n'a pris que 3 ans pour comprendre!

Selon la documentation de Travis: https://github.com/travis-ci/travis-ci, il y a une concoction de projets qui se complètent pour fournir le service Web Travis CI que nous connaissons et aimons. Le sous-ensemble de projets suivant semble autoriser les make testfonctionnalités locales à l'aide de .travis.ymldans votre projet:

travis-build

travis-build crée le script de construction pour chaque travail. Il prend la configuration du .travis.ymlfichier et crée un bashscript qui est ensuite exécuté dans l'environnement de construction par travis-worker.

livres de cuisine travis

travis-cookbooks contient les livres de cuisine Chef qui sont utilisés pour approvisionner les environnements de construction.

travis-travailleur

travis-worker est responsable de l'exécution des scripts de construction dans un environnement propre. Il diffuse la sortie du journal vers travis-logs et envoie les mises à jour d'état (début / fin de génération) à travis-hub.

(Les autres sous-projets sont responsables de la communication avec GitHub, leur interface Web, leur courrier électronique et leur API.)


4
Je pense qu'un projet utilisant uniquement ces trois composants et effectuant des make testfonctions serait formidable. Commentez si vous souhaitez travailler avec moi.
William Entriken

4
Il y a un fil à ce sujet sur le repo de travis .
hurrymaplelad

5
GitHub est en panne aujourd'hui à cause de DDOS github.com/blog/1981-large-scale-ddos-attack-on-github-com C'est pourquoi nous avons besoin de tests locaux
William Entriken

20
Comment installer et exécuter réellement travis-build? Il n'y a pas d'instructions dans le dépôt.
DisgruntledGoat

1
@sindhus Non, désolé. La seule solution que j'ai trouvée est de bifurquer le dépôt, continuer à apporter mes modifications jusqu'à ce que Travis fonctionne, puis copier le fichier de configuration dans le dépôt principal et faire un commit. Edit: à bien y penser, vous pouvez utiliser une branche temporaire pour cela, supprimer la branche distante une fois terminée et rebaser / écraser les commits en une seule.
DisgruntledGoat

23

Semblable à Scott McLeod mais cela génère également un script bash pour exécuter les étapes à partir du .travis.yml.

Dépannage localement dans Docker avec un script Bash généré

# choose the image according to the language chosen in .travis.yml
$ docker run -it -u travis quay.io/travisci/travis-jvm /bin/bash

# now that you are in the docker image, switch to the travis user
sudo - travis

# Install a recent ruby (default is 1.9.3)
rvm install 2.3.0
rvm use 2.3.0

# Install travis-build to generate a .sh out of .travis.yml
cd builds
git clone https://github.com/travis-ci/travis-build.git
cd travis-build
gem install travis
# to create ~/.travis
travis version
ln -s `pwd` ~/.travis/travis-build
bundle install

# Create project dir, assuming your project is `AUTHOR/PROJECT` on GitHub
cd ~/builds
mkdir AUTHOR
cd AUTHOR
git clone https://github.com/AUTHOR/PROJECT.git
cd PROJECT
# change to the branch or commit you want to investigate
travis compile > ci.sh
# You most likely will need to edit ci.sh as it ignores matrix and env
bash ci.sh

J'ai pu suivre les étapes jusqu'à travis # to create ~/.travis. Travis a besoin d'une commande pour s'exécuter.
Eivind Gussiås Løkseth

3
sudo - travisdevrait être su - travis.
Berend de Boer

1
Lors de la compilation, j'obtiens:/home/travis/.rvm/rubies/ruby-2.4.1/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- travis/support (LoadError)
Berend de Boer

2
@BerenddeBoer: Si vous n'avez toujours pas compris ce problème: voici la solution pour vous en débarrasser cd ~/.travis/travis-build/ bundle install bundler add travis bundler binstubs travis cd <REPO_YOU_WANT_TO_RUN_COMPILE_IN> ~/.travis/travis-build/bin/travis compile
Venkateshwaran Selvaraj

2
travis compile ni plus valide? Je vois une commande inconnue se compiler: / travis -h ne l'affiche pas: ////
Dawid Drozd

16

Utilisez wwtd (que ferait travis) ruby gem pour exécuter des tests sur votre machine locale à peu près comme ils le feraient sur travis.

Il recréera la matrice de construction et exécutera chaque configuration, idéal pour vérifier la configuration avant de pousser.

gem i wwtd
wwtd

note importante: rubysupport uniquement
msangel

il devrait être possible d'ajouter également la prise en charge d'autres langues, car il s'exécute pour exécuter des étapes
grosser

C'est malade. Fonctionne très bien! Merci!
ppetraki

14

tl; dr Utilisez l'image spécifiée sur https://docs.travis-ci.com/user/common-build-problems/#troubleshooting-locally-in-a-docker-image en combinaison avec https://github.com/ travis-ci / travis-build # use-as-addon-for-travis-cli .


MODIFIER 2019-12-06

#troubleshooting-locally-in-a-docker-imageLa section a été remplacée par celle #running-builds-in-debug-modequi décrit également la procédure de connexion SSH au travail exécuté en mode débogage .

MODIFIER 2019-07-26

#troubleshooting-locally-in-a-docker-imagela section ne fait plus partie de la documentation; Voici pourquoi


Cependant, c'est toujours dans l'histoire de git: https://github.com/travis-ci/docs-travis-ci-com/pull/2193 .

Recherchez les versions d'image (assez anciennes, impossible à trouver) sur: https://travis-ci.org/travis-ci/docs-travis-ci-com/builds/230889063#L661 .



Je voulais vérifier pourquoi l' un des tests de ma version a échoué avec une erreur que je n'obtiens pas localement.

Travaillé.

Ce qui a réellement fonctionné, c'est l'utilisation de l'image spécifiée dans Dépannage local dans une page de documentation Docker Image . Dans mon cas, ça l'était travisci/ci-garnet:packer-1512502276-986baf0.

J'ai pu ajouter travise compileles étapes suivantes décrites sur https://github.com/travis-ci/travis-build#use-as-addon-for-travis-cli .

dm@z580:~$ docker run --name travis-debug -dit travisci/ci-garnet:packer-1512502276-986baf0 /sbin/init
dm@z580:~$ docker images
REPOSITORY                       TAG                          IMAGE ID            CREATED             SIZE
travisci/ci-garnet               packer-1512502276-986baf0    6cbda6a950d3        11 months ago       10.2GB
dm@z580:~$ docker exec -it travis-debug bash -l
root@912e43dbfea4:/# su - travis
travis@912e43dbfea4:~$ cd builds/
travis@912e43dbfea4:~/builds$ git clone https://github.com/travis-ci/travis-build
travis@912e43dbfea4:~/builds$ cd travis-build
travis@912e43dbfea4:~/builds/travis-build$ mkdir -p ~/.travis
travis@912e43dbfea4:~/builds/travis-build$ ln -s $PWD ~/.travis/travis-build
travis@912e43dbfea4:~/builds/travis-build$ gem install bundler
travis@912e43dbfea4:~/builds/travis-build$ bundle install --gemfile ~/.travis/travis-build/Gemfile
travis@912e43dbfea4:~/builds/travis-build$ bundler binstubs travis
travis@912e43dbfea4:~/builds/travis-build$ cd ..
travis@912e43dbfea4:~/builds$ git clone --depth=50 --branch=master https://github.com/DusanMadar/PySyncDroid.git DusanMadar/PySyncDroid
travis@912e43dbfea4:~/builds$ cd DusanMadar/PySyncDroid/
travis@912e43dbfea4:~/builds/DusanMadar/PySyncDroid$ ~/.travis/travis-build/bin/travis compile > ci.sh
travis@912e43dbfea4:~/builds/DusanMadar/PySyncDroid$ sed -i 's,--branch\\=\\\x27\\\x27,--branch\\=master,g' ci.sh
travis@912e43dbfea4:~/builds/DusanMadar/PySyncDroid$ bash ci.sh

Tout a .travis.ymlété exécuté comme prévu (dépendances installées, tests exécutés, ...).

Notez qu'avant d'exécuter, bash ci.shj'ai dû changer --branch\=\'\'\pour --branch\=master\(voir l'avant-dernière sed -i ...commande) dans ci.sh.

Si cela ne fonctionne pas, la commande ci-dessous vous aidera à identifier le numéro de ligne cible et vous pouvez modifier la ligne manuellement.

travis@912e43dbfea4:~/builds/DusanMadar/PySyncDroid$ cat ci.sh | grep -in branch
840:    travis_cmd git\ clone\ --depth\=50\ --branch\=\'\'\ https://github.com/DusanMadar/PySyncDroid.git\ DusanMadar/PySyncDroid --echo --retry --timing
889:export TRAVIS_BRANCH=''
899:export TRAVIS_PULL_REQUEST_BRANCH=''
travis@912e43dbfea4:~/builds/DusanMadar/PySyncDroid$

Ça n'a pas marché.

A suivi la réponse acceptée pour cette question mais n'a pas trouvé l'image ( travis-ci-garnet-trusty-1512502259-986baf0) mentionnée par instanceà https://hub.docker.com/u/travisci/ .

La version du générateur de travail pointe vers la validation travis-ci / worker et ses références install-travis-worker enquay.io/travisci/ tant que registre d'images. J'ai donc essayé.

dm@z580:~$ docker run -it -u travis quay.io/travisci/travis-python /bin/bash
travis@370c23a773c9:/$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.5 LTS
Release:    12.04
Codename:   precise
travis@370c23a773c9:/$
dm@z580:~$ docker images 
REPOSITORY                       TAG                          IMAGE ID            CREATED             SIZE
quay.io/travisci/travis-python   latest                       753a216d776c        3 years ago         5.36GB

Certainement pas Trusty (Ubuntu 14.04) et pas petit non plus.


1
L' approche travaillée l'a fait pour moi. Mais en plus, je devais définir l' http_proxyenvironnement pour moi git clone. Par défaut, git clonelance l' gnutls_handshakeexception. Je déteste donc imposer l'installation d'une bundlerversion particulière gem install bundler -v 1.16.6car elle a bundler binstubs traviséchoué précédemment. Améliorez la bundlerversion requise en exécutant `bundle info travis`
palik

1
C'est la meilleure réponse ici, car elle explique comment compiler travis.ymldans un script shell exécutable. Bien fait! La seule amélioration serait un mécanisme permettant d'éviter le remplacement manuel de la chaîne lors de la spécification de la branche à partir de laquelle créer.
Ben Johnson

1
@BenJohnson J'ai ajouté une sedcommande qui répond au point que vous avez soulevé . Voir la commande avant d'exécuter bash ci.sh.
Dušan Maďar

Le lien * Dépannage local dans une image Docker * ne fonctionne plus
juliangonzalez

1
@juliangonzalez édité avec les meilleures informations que j'ai pu creuser.
Dušan Maďar

7

Vous pouvez essayer Trevor , qui utilise Docker pour exécuter votre build Travis.

De sa description:

J'ai souvent besoin d'exécuter des tests pour plusieurs versions de Node.js. Mais je ne veux pas changer de version manuellement en utilisant n / nvm ou pousser le code vers Travis CI juste pour exécuter les tests.

C'est pourquoi j'ai créé Trevor. Il lit .travis.yml et exécute des tests dans toutes les versions que vous avez demandées, tout comme Travis CI. Maintenant, vous pouvez tester avant de pousser et garder votre historique Git propre.


2
FYI pour ceux qui cherchent à essayer ceci ... ne supporte pas PHP
Craig Wayne

2
semble être exclusivement pour node.js. serait bien de le prolonger
João Neto

6

Je ne sais pas quelle était votre raison d'origine pour exécuter Travis localement, si vous vouliez simplement jouer avec, alors arrêtez de lire ici car cela ne vous concerne pas.

Si vous avez déjà de l'expérience avec Travis hébergé et que vous souhaitez obtenir la même expérience dans votre propre centre de données, lisez la suite.

Depuis décembre 2014, Travis CI propose une version Entreprise sur site.

http://blog.travis-ci.com/2014-12-19-introducing-travis-ci-enterprise/

Le prix fait également partie de l'article:

La licence se fait par siège, où chaque licence comprend 20 utilisateurs. Le prix commence à 6 000 $ par licence, ce qui comprend 20 utilisateurs et 5 versions simultanées. Il y a une option premium avec des versions illimitées pour 8500 $.


3
Cela m'intéressait également. J'essaye de configurer un travail de travis pour un projet vraiment maladroit. Tous ces commits du 26 avril manipulaient le fichier .travis.yml ( github.com/gregturn/issue-aggregator/commits/master ). Je souhaite qu'il y ait un moyen plus simple de bricoler la configuration sans avoir à pousser chaque édition.
gregturn

4
@gregturn Une solution de contournement laide mais réduisant le stress que j'ai trouvée consistait à cloner mon référentiel vers un deuxième référentiel GitHub. Le dépôt whackamoleest donc une copie du projet sur lequel je veux vraiment travailler, et je peux configurer un travail de construction Travis temporaire pour ce projet pendant que je résout les problèmes de l'automatisation de la construction. Une fois que j'ai cloué, rebasez les dizaines de commits "oups" et passez au vrai dépôt GitHub. (Et supprimez probablement le whackamoledépôt GitHub et le travail Travis correspondant.)
tripleee

3
Je me demande si les frais de licence de 6 000 $ sont uniques ou annuels.
Erik

0

Il est possible de SSH à l'environnement Travis CI via un hôte de rebond. La fonctionnalité n'est pas intégrée à Travis CI, mais elle peut être obtenue par les étapes suivantes.

  1. Sur l'hôte de rebond, créez un travisutilisateur et assurez-vous que vous pouvez y accéder en SSH.
  2. Mettez ces lignes dans la script:section de votre .travis.yml(par exemple à la fin).

    - echo travis:$sshpassword | sudo chpasswd
    - sudo sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/' /etc/ssh/sshd_config
    - sudo service ssh restart
    - sudo apt-get install sshpass
    - sshpass -p $sshpassword ssh -R 9999:localhost:22 -o StrictHostKeyChecking=no travis@$bouncehostip
    

    Où se $bouncehostiptrouve l'IP / l'hôte de votre hôte de rebond et $sshpasswordvotre mot de passe SSH défini. Ces variables peuvent être ajoutées en tant que variables chiffrées .

  3. Poussez les changements. Vous devriez pouvoir établir une connexion SSH avec votre hôte de rebond.

Source: Shell dans Travis CI Build Environment .


Voici l'exemple complet:

# use the new container infrastructure
sudo: required
dist: trusty

language: python
python: "2.7"

script:
- echo travis:$sshpassword | sudo chpasswd
- sudo sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/' /etc/ssh/sshd_config
- sudo service ssh restart
- sudo apt-get install sshpass
- sshpass -p $sshpassword ssh -R 9999:localhost:22 -o StrictHostKeyChecking=no travisci@$bouncehostip

Voir: c-mart/travis-shellsur GitHub .


Voir aussi: Comment reproduire un environnement de construction travis-ci pour le débogage

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.