Cómo ejecutar travis-ci localmente

524

Me acabo de unir a un proyecto y soy nuevo en travis-ci. Prefiero no tener que empujar cada pequeño cambio a .travis.yml y cada pequeño cambio que hago en la fuente para ejecutar la compilación. Con jenkins puedes descargar jenkins y ejecutarlo localmente. ¿Travis ofrece algo como esto?

Nota: He visto el cli de travis-ci y lo descargué, pero todo lo que parece hacer es llamar a su API, que luego se conecta a mi repositorio de github, por lo que si no presiono, no importará que reinicie La última construcción.

Sam Hammamy
fuente
3
Debería poder ejecutar las pruebas localmente sin tener que ejecutar Travis CI. Consulte la sección "script" de .travis.yml para ver qué comando ejecutar.
Konstantin Haase
69
Pero simplemente ejecutar las pruebas no es el problema: a menudo una compilación de Travis falla debido a los pasos de configuración e instalación de la install:sección, y es probable que estos sean los temas que más preocupan.
Brandon Rhodes
44
Agregaré que en proyectos complejos hay una variedad de razones (por ejemplo, diferentes puntos de liberación o interacciones del sistema del tiempo de ejecución, pruebas intrínsecamente sensibles al tiempo, por ejemplo, pruebas de tiempo de espera, etc.), las pruebas en sí mismas a veces pueden comportarse de manera diferente en un entorno local y en Travis CI .
circlepainter

Respuestas:

200

Este proceso le permite reproducir completamente cualquier trabajo de compilación de Travis en su computadora. Además, puede interrumpir el proceso en cualquier momento y depurar. A continuación se muestra un ejemplo donde reproduzco perfectamente los resultados del trabajo # 191.1 en php-school / cli-menu .

Prerrequisitos

  • Tienes un repositorio público en GitHub
  • Ejecutó al menos una compilación en Travis
  • Tienes Docker configurado en tu computadora

Configurar el entorno de compilación

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

  1. Crea tu propia ID de compilación temporal

    BUILDID="build-$RANDOM"
    
  2. Vea el registro de compilación , abra el botón Mostrar más para INFORMACIÓN DEL TRABAJADOR y encuentre la línea INSTANCE, péguela aquí y ejecútela (reemplace la etiqueta después de los dos puntos por la más nueva disponible) :

    INSTANCE="travisci/ci-garnet:packer-1512502276-986baf0"
    
  3. Ejecute el servidor sin cabeza

    docker run --name $BUILDID -dit $INSTANCE /sbin/init
    
  4. Ejecute el cliente adjunto

    docker exec -it $BUILDID bash -l
    

Ejecutar el trabajo

Ahora ya está dentro de su entorno Travis. Corre su - travispara comenzar.

Este paso está bien definido pero es más tedioso y manual. Encontrará todos los comandos que Travis ejecuta en el entorno. Para hacer esto, busque todo en la columna derecha que tenga una etiqueta como 0.03s.

En el lado izquierdo verá los comandos reales. Ejecute esos comandos, en orden.

Resultado

Ahora es un buen momento para ejecutar el historycomando. Puede reiniciar el proceso y reproducir esos comandos para ejecutar la misma prueba en una base de código actualizada.

  • Si tu repositorio es privado: ssh-keygen -t rsa -b 4096 -C "YOUR EMAIL REGISTERED IN GITHUB"a continuación cat ~/.ssh/id_rsa.puby haga clic aquí para añadir una clave
  • FYI: puede git pullcargar desde el Docker desde el cuadro de desarrollo antes de enviarlos a GitHub
  • Si desea cambiar los comandos que ejecuta Travis, es SU responsabilidad averiguar cómo eso se traduce nuevamente en un funcionamiento .travis.yml.
  • No sé cómo limpiar el entorno Docker, parece complicado, tal vez esto pierde memoria
William Entriken
fuente
22
En los registros debajo de instance:No puedo ver una ruta de imagen de acoplador válida, solo algo así travis-ci-garnet-trusty-1512502259-986baf0. Intenté travisci/ci-garnet:$INSTANCEy travisci/$INSTANCEno funciona, no puedo encontrar la imagen. Además, simplemente tomar el postfix (es decir travisci/ci-garnet:packer-1512502259-986baf0) no funcionó.
Roy Shilkrot
44
Tengo el mismo problema: la imagen mencionada en la información de la instancia no se puede descargar. Además, he probado la travisci/ci-garnet:packer-1512502276-986baf0imagen que se sugiere en los documentos de Travis . Este está disponible, pero anticuado. Por ejemplo, CMake es mucho más antiguo que uno disponible en Travis. No ci-garnetse ha cargado ninguna versión nueva de Docker Hub en los últimos seis meses, mientras que anteriormente había muchas actualizaciones por mes.
skalee
77
Su enlace de referencia ya no funciona, es decir, la sección 'Ejecutar una imagen de Docker basada en contenedor localmente' se eliminó de esa página. ¿Quizás la diferencia en el resultado de la instancia se debe a que no se ha sudo: requiredconfigurado? En una versión actual mía, veo travis-ci-sardonyx-xenial-1547455603-2c98a19cuál puedo asignar a travisci / ci-sardonyx: packer-1547455648-2c98a19
maxschlepzig
44
para mí, usar la última versión de travisci / ci-garnet en Docker Hub (travisci / ci-garnet: packer-1515445631-7dfb2e1) hizo el truco
taleb
3
Si está trabajando en una instancia de travis específica del idioma, también puede usar la imagen dedicada, como la de Python .
Zaccharie Ramzi
162

Travis-ci ofrece una nueva infraestructura basada en contenedores que utiliza docker. Esto puede ser muy útil si está intentando solucionar un problema de travis-ci al reproducirlo localmente. Esto se toma de la documentación de Travis CI .

Solución de problemas localmente en una imagen Docker

Si tiene problemas para localizar el problema exacto en una compilación, a menudo ayuda a ejecutar la compilación localmente. Para hacer esto, debe utilizar nuestra infraestructura basada en contenedores (es decir, tener sudo: falseen su .travis.yml) y saber qué imagen de Docker está utilizando en Travis CI.

Ejecutar una imagen de Docker basada en contenedor localmente

  1. Descargue e instale el motor Docker .
  2. Seleccione una imagen de Docker Hub . Si no está utilizando una selección de imagen específica del idioma ci-ruby. Abra una terminal e inicie una sesión interactiva de Docker con la URL de la imagen:

    docker run -it travisci/ubuntu-ruby:18.04 /bin/bash
    
  3. Cambiar al travisusuario:

    su - travis
    
  4. Clona tu repositorio git en la /carpeta de la imagen.
  5. Instale manualmente cualquier dependencia.
  6. Ejecute manualmente el comando de compilación de Travis CI.
Scott McLeod
fuente
66
@DustinGraham, eso depende de cómo se haya configurado para construir el proyecto que está construyendo Travis CI. En el proyecto en el que estaba trabajando, el comando de compilación se configuró en el archivo .travis.yml bajo el script: subsección y fue make test.
Scott McLeod
102
> Manually install any dependencies Eso suena como una buena manera de terminar con resultados que no coinciden con las versiones regulares de Travis.
Gerry
66
@Gerry Al instalar dependencias manualmente, supongo que quiere decir ejecutar manualmente los comandos que tiene en su archivo de configuración de travis que manejan la instalación de dependencias. Entonces, son los mismos comandos que travis CI estaría haciendo, solo que no automatizados.
Chathan Driehuys
8
Siento que esta es la respuesta a mi pregunta de alguna manera, pero Manually tun your Travis CI build command... ¿Qué? ¿Cómo? ¿Qué es? Tengo un .travis.ymlarchivo Intenté travis-build pero es un callejón sin salida.
Brandon
2
@Brandon Dentro de su .travis.yml generalmente hay una subsección de script que invoca Travis para construir su fuente. El objetivo de esta respuesta es configurar un entorno local que sea idéntico al que travis estaría operando. A continuación, invocará estos comandos usted mismo en lugar de depender de travis para ejecutarlos por usted. De esta manera, puede ver los efectos de ejecutar cada comando usted mismo dentro de este entorno; esto puede proporcionar información sobre un problema de compilación que uno podría tener en Travis que de otro modo no sería accesible.
Scott McLeod
86

ACTUALIZACIÓN: ahora tengo una respuesta completa, llave en mano, consulte https://stackoverflow.com/a/49019950/300224 . ¡Solo tomó 3 años para darse cuenta!

Según la documentación de Travis: https://github.com/travis-ci/travis-ci hay una mezcla de proyectos que se unen para ofrecer el servicio web Travis CI que conocemos y amamos. El siguiente subconjunto de proyectos parece permitir la make testfuncionalidad local usando el .travis.ymlen su proyecto:

travis-build

travis-build crea el script de compilación para cada trabajo. Toma la configuración del .travis.ymlarchivo y crea un bashscript que luego travis-worker ejecuta en el entorno de compilación.

libros de cocina travis

travis-cookbooks contiene los libros de cocina Chef que se utilizan para aprovisionar los entornos de construcción.

travis-trabajador

travis-worker es responsable de ejecutar los scripts de compilación en un entorno limpio. Transmite la salida del registro a travis-logs y envía actualizaciones de estado (inicio / finalización de la compilación) a travis-hub.

(Los otros subproyectos son responsables de comunicarse con GitHub, su interfaz web, correo electrónico y su API).

William Entriken
fuente
44
Creo que un proyecto para usar solo esos tres componentes y realizar la make testfunción sería genial. Comenta si te gustaría trabajar en eso conmigo.
William Entriken
44
Hay un hilo sobre esto en el repositorio de Travis .
hurrymaplelad
55
GitHub está caído hoy debido a DDOS github.com/blog/1981-large-scale-ddos-attack-on-github-com Es por eso que necesitamos pruebas locales
William Entriken
20
¿Cómo instalo y ejecuto realmente travis-build? No hay instrucciones en el repositorio.
DisgruntledGoat
1
@sindhus No, lo siento. La única solución que he encontrado es bifurcar el repositorio, seguir haciendo mis cambios hasta que Travis funcione, luego copiar el archivo de configuración al repositorio principal y realizar una confirmación. Editar: ahora que lo pienso, podría usar una rama temporal para eso, eliminar la rama remota una vez que esté hecha y volver a formar / aplastar confirmaciones en una sola.
DisgruntledGoat
23

Similar a Scott McLeod, pero esto también genera un script bash para ejecutar los pasos desde .travis.yml.

Solución de problemas localmente en Docker con un script Bash generado

# 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
eregon
fuente
Pude seguir los pasos hasta travis # to create ~/.travis. Travis necesita un comando para ejecutarse.
Eivind Gussiås Løkseth
3
sudo - travisdebería ser su - travis.
Berend de Boer
1
Al hacer el paso de compilación obtengo:/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 aún no ha resuelto este problema: aquí está la solución para deshacerse 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
¿Travis compila y ya no es válido? Veo una compilación de comando desconocida: / travis -h no lo muestra: ////
Dawid Drozd
16

Use wwtd (lo que haría Travis) ruby gem para ejecutar las pruebas en su máquina local más o menos como se ejecutarían en travis.

Volverá a crear la matriz de compilación y ejecutará cada configuración, ideal para configurar la comprobación de cordura antes de presionar.

gem i wwtd
wwtd
más asqueroso
fuente
nota importante: solo rubysoporte
msangel
debería ser posible añadir soporte para otros idiomas también, ya que los depósitos a cabo medidas de ejecución
Grosser
Eso es increíble. ¡Funciona genial! ¡Gracias!
ppetraki
14

tl; dr Use la imagen especificada en https://docs.travis-ci.com/user/common-build-problems/#troubleshooting-locally-in-a-docker-image en combinación con https://github.com/ travis-ci / travis-build # use-as-addon-for-travis-cli .


EDITAR 2019-12-06

#troubleshooting-locally-in-a-docker-imagese reemplazó la sección #running-builds-in-debug-modeque también describe cómo SSH para el trabajo que se ejecuta en modo de depuración .

EDITAR 2019-07-26

#troubleshooting-locally-in-a-docker-imagela sección ya no es parte de los documentos; este es el por qué


Sin embargo, todavía está en la historia de git: https://github.com/travis-ci/docs-travis-ci-com/pull/2193 .

Busque versiones de imagen (bastante antiguas, no se pueden encontrar nuevas) en: https://travis-ci.org/travis-ci/docs-travis-ci-com/builds/230889063#L661 .



Quería inspeccionar por qué una de las pruebas en mi compilación falló con un error que no obtengo localmente.

Trabajó.

Lo que realmente funcionó fue usar la imagen especificada en Solución de problemas localmente en una página de documentos de Docker Image . En mi caso lo fue travisci/ci-garnet:packer-1512502276-986baf0.

Pude agregar los travise compilesiguientes pasos descritos en 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

Todo .travis.ymlse ejecutó como se esperaba (dependencias instaladas, pruebas ejecutadas, ...).

Tenga en cuenta que antes de ejecutar bash ci.shtuve que cambiar --branch\=\'\'\a --branch\=master\(ver el penúltimo sed -i ...comando) en ci.sh.

Si eso no funciona, el siguiente comando ayudará a identificar el número de línea de destino y puede editar la línea 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$

No funcionó

Seguí la respuesta aceptada para esta pregunta pero no encontré la imagen ( travis-ci-garnet-trusty-1512502259-986baf0) mencionada instanceen https://hub.docker.com/u/travisci/ .

La versión de construcción de trabajador apunta a travis-ci / worker commit y sus referencias de travis-worker-installquay.io/travisci/ como registro de imágenes. Entonces lo intenté.

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

Definitivamente no es de confianza (Ubuntu 14.04) y tampoco es pequeño.

Dušan Maďar
fuente
1
El enfoque trabajado lo hizo por mí. Pero además tuve que establecer el http_proxyentorno por el bien de git clone. Por defecto git clonelanza gnutls_handshakeexcepción. Así que me gustaría forzar la instalación de una bundlerversión en particular gem install bundler -v 1.16.6porque bundler binstubs travisfallé previamente. Mejore la bundlerversión requerida ejecutando `bundle info travis`
palik
1
Esta es la mejor respuesta aquí, porque explica cómo compilar travis.ymlen un script de shell ejecutable. ¡Bien hecho! La única mejora para esto sería un mecanismo por el cual evitar el reemplazo manual de la cadena al especificar la rama desde la cual construir.
Ben Johnson el
1
@BenJohnson He agregado un sedcomando que aborda el punto que hizo. Vea el comando antes de ejecutar bash ci.sh.
Dušan Maďar
El enlace * Solución de problemas localmente en una imagen de Docker * ya no funciona
juliangonzalez
1
@juliangonzalez editó con la mejor información que pude cavar.
Dušan Maďar
7

Puedes probar Trevor , que usa Docker para ejecutar tu versión de Travis.

De su descripción:

A menudo necesito ejecutar pruebas para múltiples versiones de Node.js. Pero no quiero cambiar las versiones manualmente usando n / nvm o enviar el código a Travis CI solo para ejecutar las pruebas.

Por eso creé Trevor. Lee .travis.yml y ejecuta pruebas en todas las versiones que solicitó, al igual que Travis CI. Ahora, puede probar antes de presionar y mantener limpio su historial de git.

Travis
fuente
2
FYI para aquellos que buscan probar esto ... no es compatible con PHP
Craig Wayne
2
parece ser exclusivamente para node.js. sería bueno extenderlo
João Neto
6

No estoy seguro de cuál fue su razón original para ejecutar Travis localmente, si solo quería jugar con él, entonces deje de leer aquí, ya que es irrelevante para usted.

Si ya tiene experiencia con Travis alojado y desea obtener la misma experiencia en su propio centro de datos, siga leyendo.

Desde diciembre de 2014, Travis CI ofrece una versión local de Enterprise.

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

El precio también es parte del artículo:

La licencia se realiza por asientos, donde cada licencia incluye 20 usuarios. El precio comienza en $ 6,000 por licencia, que incluye 20 usuarios y 5 compilaciones simultáneas. Hay una opción premium con construcciones ilimitadas por $ 8,500.

Radek Simko
fuente
3
De hecho, también estaba interesado en esto. Estoy tratando de configurar un trabajo de travis para un proyecto realmente incómodo. Todos esos commits el 26 de abril estaban jugando con el archivo .travis.yml ( github.com/gregturn/issue-aggregator/commits/master ). Desearía que hubiera una manera más fácil de modificar la configuración sin tener que presionar cada edición.
gregturn
44
@gregturn Una solución fea pero que reduce el estrés que se me ocurrió fue clonar mi repositorio en un segundo repositorio de GitHub. Entonces, el repositorio whackamolees una copia del proyecto en el que realmente quiero trabajar, y puedo configurar un trabajo de construcción temporal de Travis para ese proyecto mientras resuelvo los inconvenientes de la automatización de la construcción. Una vez que lo haya logrado, elimine las docenas de compromisos "Uy" y diríjase al verdadero repositorio de GitHub. (Y probablemente quitar la whackamolecesión temporal de GitHub y el trabajo de Travis correspondiente.)
tripleee
3
Me pregunto si la tarifa de licencia de $ 6000 es única o anual.
Erik
0

Es posible SSH en el entorno de Travis CI a través de un host de rebote. La función no está integrada en Travis CI, pero se puede lograr con los siguientes pasos.

  1. En el host de rebote, cree un travisusuario y asegúrese de que puede usar SSH.
  2. Ponga estas líneas en la script:sección de su .travis.yml(por ejemplo, al final).

    - 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
    

    ¿Dónde $bouncehostipestá la IP / host de su host de rebote y $sshpasswordes su contraseña SSH definida? Estas variables se pueden agregar como variables cifradas .

  3. Empuja los cambios. Debería poder hacer una conexión SSH a su host de rebote.

Fuente: Shell en Travis CI Build Environment .


Aquí está el ejemplo 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

Ver: c-mart/travis-shellen GitHub .


Consulte también: Cómo reproducir un entorno de compilación travis-ci para la depuración

kenorb
fuente