Come eseguire travis-ci localmente


524

Ho appena aderito a un progetto e sono nuovo in travis-ci. Preferirei non dover inviare ogni piccola modifica a .travis.yml e ogni piccola modifica che faccio alla fonte per eseguire la build. Con jenkins puoi scaricare jenkins ed eseguirlo localmente. Travis offre qualcosa del genere?

Nota: ho visto il travis-ci cli e l'ho scaricato, ma tutto ciò che sembra fare è chiamare la loro API, che quindi si collega al mio repository github, quindi se non spingo, non importa che riavvio l'ultima build.


3
Dovresti essere in grado di eseguire i test localmente senza dover eseguire Travis CI. Controlla la sezione "script" di .travis.yml per vedere quale comando eseguire.
Konstantin Haase,

69
Ma il semplice fatto di eseguire i test non è il problema: spesso una build di Travis fallisce a causa dei passaggi di installazione e installazione nella install:sezione, ed è probabilmente questi i temi di cui la domanda è più preoccupata.
Brandon Rhodes,

4
Aggiungerò che in progetti complessi una varietà di ragioni (ad esempio differenti rilasci di punti o interazioni di sistema del runtime, test intrinsecamente sensibili al tempo, ad esempio test di timeout ecc.) I test stessi a volte possono comportarsi diversamente su un ambiente locale e su Travis CI .
Circlepainter,

Risposte:


200

Questo processo consente di riprodurre completamente qualsiasi processo di compilazione di Travis sul computer. Inoltre, è possibile interrompere il processo in qualsiasi momento ed eseguire il debug. Di seguito è riportato un esempio in cui riproduco perfettamente i risultati del lavoro n. 191.1 su php-school / cli-menu .

Prerequisiti

  • Hai un repository pubblico su GitHub
  • Hai eseguito almeno una build su Travis
  • Docker è installato sul tuo computer

Imposta l'ambiente di compilazione

Riferimento: https://docs.travis-ci.com/user/common-build-problems/

  1. Crea il tuo ID di build temporaneo

    BUILDID="build-$RANDOM"
    
  2. Visualizza il registro di costruzione , apri il pulsante Mostra altro per INFORMAZIONI SUL LAVORATORE e trova la riga ISTANZA, incollala qui ed esegui (sostituisci il tag dopo i due punti con quello più recente disponibile) :

    INSTANCE="travisci/ci-garnet:packer-1512502276-986baf0"
    
  3. Esegui il server senza testa

    docker run --name $BUILDID -dit $INSTANCE /sbin/init
    
  4. Esegui il client collegato

    docker exec -it $BUILDID bash -l
    

Esegui il lavoro

Ora sei all'interno del tuo ambiente Travis. Corri su - travisper iniziare.

Questo passaggio è ben definito ma è più noioso e manuale. Troverai tutti i comandi che Travis esegue nell'ambiente. Per fare questo, cerca tutto nella colonna di destra che ha un tag simile 0.03s.

Sul lato sinistro vedrai i comandi effettivi. Esegui questi comandi, in ordine.

Risultato

Ora è un buon momento per eseguire il historycomando. È possibile riavviare il processo e riprodurre quei comandi per eseguire lo stesso test su una base di codice aggiornata.

  • Se il tuo repository è privato: ssh-keygen -t rsa -b 4096 -C "YOUR EMAIL REGISTERED IN GITHUB"quindi cat ~/.ssh/id_rsa.pube fai clic qui per aggiungere una chiave
  • Cordiali saluti: è possibile git pulldall'interno della finestra mobile caricare i commit dalla propria casella di sviluppo prima di inviarli a GitHub
  • Se si desidera modificare i comandi eseguiti da Travis, è VOSTRA responsabilità capire come ciò si traduca in un funzionamento .travis.yml.
  • Non so come ripulire l'ambiente Docker, sembra complicato, forse questo perde memoria

22
Nei registri sotto instance:non riesco a vedere un percorso immagine docker valido, solo qualcosa del genere travis-ci-garnet-trusty-1512502259-986baf0. Ho provato travisci/ci-garnet:$INSTANCEe travisci/$INSTANCE- non funziona, non riesco a trovare l'immagine. Anche solo prendere il postfix (cioè travisci/ci-garnet:packer-1512502259-986baf0) non ha funzionato.
Roy Shilkrot,

4
Sto riscontrando lo stesso problema: l'immagine menzionata nelle informazioni sull'istanza non può essere scaricata. Inoltre, ho provato l' travisci/ci-garnet:packer-1512502276-986baf0immagine che è suggerita nei documenti Travis . Questo è disponibile, ma obsoleto. Ad esempio, CMake è molto più vecchio di quello disponibile in Travis. Nessuna nuova versione di ci-garnetè stata caricata su Docker Hub negli ultimi sei mesi, mentre prima c'erano molti aggiornamenti al mese.
Skalee,

7
Il link di riferimento non funziona più, ovvero la sezione "Esecuzione locale di un'immagine Docker basata su contenitore" è stata rimossa da quella pagina. Forse la differenza nell'output dell'istanza era dovuta al fatto di non aver sudo: requiredimpostato? In una mia build attuale vedo travis-ci-sardonyx-xenial-1547455603-2c98a19che posso mappare su travisci / ci-sardonyx: packer-1547455648-2c98a19
maxschlepzig

4
per me usare l'ultima versione di travisci / ci-garnet su docker hub (travisci / ci-garnet: packer-1515445631-7dfb2e1) ha fatto il trucco
taleb

3
Se stai lavorando su un'istanza di travis specifica della lingua, puoi anche usare l'immagine dedicata, come quella di Python .
Zaccharie Ramzi,

162

Travis-ci offre una nuova infrastruttura basata su container che utilizza la finestra mobile. Questo può essere molto utile se stai cercando di risolvere un build di travis-ci riproducendolo localmente. Questo è tratto dalla documentazione di Travis CI .

Risoluzione dei problemi localmente in un'immagine Docker

Se hai problemi a rintracciare il problema esatto in una build, spesso aiuta a eseguire la build localmente. Per fare ciò è necessario utilizzare la nostra infrastruttura basata su container (ovvero, averesudo: false nella tua .travis.yml) e sapere quale immagine Docker stai utilizzando su Travis CI.

Esecuzione locale di un'immagine Docker basata su contenitore

  1. Scarica e installa il Docker Engine .
  2. Seleziona un'immagine da Docker Hub . Se non stai utilizzando una selezione di immagini specifica della lingua ci-ruby. Apri un terminale e avvia una sessione Docker interattiva usando l'URL dell'immagine:

    docker run -it travisci/ubuntu-ruby:18.04 /bin/bash
    
  3. Passa travisall'utente:

    su - travis
    
  4. Clona il tuo repository git in / cartella dell'immagine.
  5. Installa manualmente eventuali dipendenze.
  6. Esegui manualmente il comando di build di Travis CI.

6
@DustinGraham, dipende da come è stato configurato il progetto in fase di realizzazione da parte di Travis CI. Nel progetto a cui stavo lavorando, il comando build era configurato nel file .travis.yml sotto lo script: sottosezione ed era make test.
Scott McLeod,

102
> Manually install any dependencies Sembra un buon modo per finire con risultati che non corrispondono alle normali build di Travis.
Gerry,

6
@Gerry Installando dipendenze manualmente, suppongo che intenda eseguire manualmente i comandi che hai nel file di configurazione di Travis che gestiscono l'installazione delle dipendenze. Quindi sono gli stessi comandi che avrebbe fatto Travis CI, ma non automatizzati.
Chathan Driehuys,

8
Sento che questa è la risposta alla mia domanda in qualche modo ma il Manually tun your Travis CI build command... Tipo, cosa? Come? Che cos'è? Ho un .travis.ymlfile Ho provato travis-build ma è un vicolo cieco.
Brandon,

2
@Brandon All'interno di .travis.yml di solito c'è una sottosezione di script che viene invocata da travis per creare la tua fonte. Il punto di questa risposta è impostare un ambiente locale identico a quello su cui opererebbe Travis. Successivamente invocherai questi comandi tu stesso invece di affidarti a travis per eseguirli per te. In questo modo puoi vedere gli effetti dell'esecuzione di ogni comando da solo all'interno di questo ambiente - questo può dare un'idea di un problema di costruzione che potresti avere travis che altrimenti non sarebbe accessibile.
Scott McLeod,

86

AGGIORNAMENTO: ora ho una chiave chiavi in ​​mano completa, una risposta all-in-one, vedi https://stackoverflow.com/a/49019950/300224 . Ci sono voluti solo 3 anni per capire!

Secondo la documentazione di Travis: https://github.com/travis-ci/travis-ci esiste una combinazione di progetti che colludono per fornire il servizio Web di Travis CI che conosciamo e amiamo. Il seguente sottoinsieme di progetti sembra consentire la make testfunzionalità locale utilizzando il .travis.ymlnel progetto:

travis-build

travis-build crea lo script build per ogni lavoro. Prende la configurazione dal .travis.ymlfile e crea uno bashscript che viene quindi eseguito nell'ambiente di build da travis-worker.

Travis-libri di cucina

travis-cookbooks contiene i libri di cucina dello Chef che vengono utilizzati per il provisioning degli ambienti di costruzione.

travis-lavoratore

travis-worker è responsabile dell'esecuzione degli script di build in un ambiente pulito. Trasmette l'output del registro a travis-log e invia gli aggiornamenti di stato (inizio / fine della costruzione) a travis-hub.

(Gli altri sottoprogetti sono responsabili della comunicazione con GitHub, la loro interfaccia web, la posta elettronica e la loro API.)


4
Credo che un progetto che utilizzi solo questi tre componenti e svolga make testfunzioni sarebbe fantastico. Commenta se ti piacerebbe lavorarci su con me.
William Entriken,

4
C'è un filo su questo nel repository travis .
hurrymaplelad,

5
GitHub è inattivo oggi a causa di DDOS github.com/blog/1981-large-scale-ddos-attack-on-github-com Questo è il motivo per cui abbiamo bisogno di test locali
William Entriken

20
Come posso effettivamente installare ed eseguire travis-build? Non ci sono istruzioni nel repository.
DisgruntledGoat

1
@sindhus No, scusa. L'unica soluzione che ho trovato è fork del repository, continuare ad apportare le modifiche fino a quando Travis non funziona, quindi copiare il file di configurazione nel repository principale ed effettuare un commit. Modifica: vieni a pensarci bene, potresti usare un ramo temporaneo per quello, cancellare il ramo remoto una volta fatto e rebase / squash si impegna in uno.
DisgruntledGoat

23

Simile a Scott McLeod, ma questo genera anche uno script bash per eseguire i passaggi da .travis.yml.

Risoluzione dei problemi localmente in Docker con uno script Bash generato

# 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

Sono stato in grado di seguire i passaggi fino a travis # to create ~/.travis. Travis ha bisogno di un comando per eseguire.
Eivind Gussiås Løkseth,

3
sudo - travisdovrebbe essere su - travis.
Berend de Boer,

1
Quando eseguo il passo di compilazione ottengo:/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: se non hai ancora capito questo problema: ecco la soluzione per sbarazzarti del problema 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
compilazione travis né più valida? Vedo compilare un comando sconosciuto: / travis -h non lo mostra: ////
Dawid Drozd,

16

Usa la gemma di rubino wwtd (cosa farebbe Travis) per eseguire i test sulla tua macchina locale più o meno come farebbero su Travis.

Ricreerà la matrice di build ed eseguirà ogni configurazione, ottimo per l'impostazione del controllo di integrità prima di spingere.

gem i wwtd
wwtd

nota importante: solo rubysupporto
msangel

dovrebbe essere possibile aggiungere il supporto anche per altre lingue poiché viene eseguito il
bombardamento

È malato. Funziona alla grande! Grazie!
ppetraki,

14

tl; dr Usa l'immagine specificata su https://docs.travis-ci.com/user/common-build-problems/#tro troubleshooting-locally-in-a-docker- image in combinazione con https://github.com/ travis-ci / travis-build # use-as-addon-for-travis-cli .


EDIT 2019-06-06

#troubleshooting-locally-in-a-docker-imagela sezione è stata sostituita dalla #running-builds-in-debug-modequale descrive anche come eseguire SSH sul lavoro in esecuzione in modalità debug .

MODIFICA 26-07-2019

#troubleshooting-locally-in-a-docker-imagela sezione non fa più parte dei documenti; Ecco perché


Tuttavia, è ancora nella storia di git: https://github.com/travis-ci/docs-travis-ci-com/pull/2193 .

Cerca versioni (piuttosto vecchie, non riuscite a trovare versioni più recenti) su: https://travis-ci.org/travis-ci/docs-travis-ci-com/builds/230889063#L661 .



Volevo verificare perché uno dei test nella mia build non è riuscito con un errore che non riesco a ottenere localmente.

Lavorato.

Ciò che effettivamente ha funzionato è stato usare l'immagine specificata in Risoluzione dei problemi localmente in una pagina di documenti Immagine Docker . Nel mio caso lo eratravisci/ci-garnet:packer-1512502276-986baf0 .

Sono stato in grado di aggiungere i travise compileseguenti passaggi descritti su 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

Tutto da è .travis.ymlstato eseguito come previsto (dipendenze installate, test eseguiti, ...).

Nota che prima di correre bash ci.shho dovuto cambiare --branch\=\'\'\in --branch\=master\(vedi il penultimo sed -i ...comando) in ci.sh.

Se il problema persiste, il muggito del comando ti aiuterà a identificare il numero della linea di destinazione e puoi modificare la linea manualmente.

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$

Non ha funzionato

Seguita la risposta accettata per questa domanda, ma non ha trovato l'immagine ( travis-ci-garnet-trusty-1512502259-986baf0) di cui parla instancea https://hub.docker.com/u/travisci/ .

Costruisci i punti versione di travis-ci / worker commit e i relativi riferimenti di installazione di travis-workerquay.io/travisci/ come registro immagini. Quindi l'ho provato.

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

Sicuramente non fidato (Ubuntu 14.04) e neanche piccolo.


1
L' approccio funzionante l'ha fatto per me. Ma ho dovuto anche impostare l' http_proxyambiente per il gusto di git clone. Di default git clonegenera gnutls_handshakeun'eccezione. Quindi odio imporre l'installazione di una bundlerversione particolare gem install bundler -v 1.16.6perché bundler binstubs travisprecedentemente fallita. Migliora la bundlerversione richiesta eseguendo `bundle info travis`
palik

1
Questa è la migliore risposta qui, perché spiega come compilare travis.ymluno script di shell eseguibile. Ben fatto! L'unico miglioramento di questo sarebbe un meccanismo attraverso il quale evitare la sostituzione manuale della stringa quando si specifica il ramo da cui costruire.
Ben Johnson,

1
@BenJohnson Ho aggiunto un sedcomando che affronta il punto che hai sollevato . Vedi il comando prima di eseguire bash ci.sh.
Dušan Maďar,

Il collegamento * Risoluzione dei problemi localmente in un'immagine Docker * non funziona più
juliangonzalez

1
@juliangonzalez modificato con le migliori informazioni che ho potuto scavare.
Dušan Maďar,

7

Potresti provare Trevor , che utilizza Docker per eseguire la tua build Travis.

Dalla sua descrizione:

Ho spesso bisogno di eseguire test per più versioni di Node.js. Ma non voglio cambiare manualmente le versioni usando n / nvm o inviare il codice a Travis CI solo per eseguire i test.

Ecco perché ho creato Trevor. Legge .travis.yml ed esegue i test in tutte le versioni richieste, proprio come Travis CI. Ora, puoi testare prima di spingere e mantenere pulita la tua cronologia git.


2
Cordiali saluti per coloro che cercano di provare questo ... non supporta PHP
Craig Wayne,

2
sembra essere esclusivamente per node.js. sarebbe bello estenderlo
João Neto,

6

Non sono sicuro di quale sia stata la tua ragione originale per eseguire Travis localmente, se solo giocarci, quindi smetti di leggere qui perché è irrilevante per te.

Se hai già esperienza con Travis ospitato e desideri ottenere la stessa esperienza nel tuo data center, continua a leggere.

Da dicembre 2014 Travis CI offre una versione Enterprise locale.

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

Anche il prezzo fa parte dell'articolo:

La licenza viene effettuata per postazione, dove ogni licenza include 20 utenti. Il prezzo parte da $ 6.000 per licenza, che include 20 utenti e 5 build simultanee. C'è un'opzione premium con build illimitate per $ 8.500.


3
In realtà ero interessato anche a questo. Sto cercando di configurare un lavoro travis per un progetto davvero imbarazzante. Tutti quei commit il 26 aprile stavano armeggiando con il file .travis.yml ( github.com/gregturn/issue-aggregator/commits/master ). Vorrei che ci fosse un modo più semplice per armeggiare con la configurazione senza dover eseguire il push di ogni singola modifica.
gregturn,

4
@gregturn Una brutta soluzione per ridurre lo stress che mi è venuta in mente è stata quella di clonare il mio repository su un secondo repository GitHub. Quindi il repository whackamoleè una copia del progetto su cui voglio davvero lavorare e posso creare un lavoro di costruzione temporanea di Travis per quel progetto mentre lavoro i nodi dell'automazione della costruzione. Una volta che l'ho inchiodato, respingi le dozzine di impegni "oops" e spingi al vero repository GitHub. (E probabilmente rimuovere il whackamolerepository GitHub e il lavoro Travis corrispondente.)
Tripleee,

3
Mi chiedo se il canone di licenza di $ 6000 sia una tantum o annuale.
Erik,

0

È possibile accedere a SSH nell'ambiente Travis CI tramite un host di rimbalzo. La funzione non è integrata in Travis CI, ma può essere ottenuta con i seguenti passaggi.

  1. Sull'host di rimbalzo, crea l' travisutente e assicurati di poterlo SSH.
  2. Inserisci queste righe nella script:sezione del tuo .travis.yml(ad es. Alla fine).

    - 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
    

    Dove si $bouncehostiptrova l'IP / host dell'host di rimbalzo e $sshpasswordla password SSH definita. Queste variabili possono essere aggiunte come variabili crittografate .

  3. Spingere le modifiche. Dovresti essere in grado di stabilire una connessione SSH al tuo host di rimbalzo.

Fonte: Shell in Travis CI Build Environment .


Ecco l'esempio completo:

# 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

Vedi: c-mart/travis-shellsu GitHub .


Vedi anche: Come riprodurre un ambiente di costruzione travis-ci per il debug

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.