Como executar o travis-ci localmente

524

Acabei de ingressar em um projeto e sou novo no travis-ci. Prefiro não precisar enviar todas as pequenas alterações para .travis.yml e todas as pequenas alterações que faço na fonte para executar a compilação. Com o jenkins, você pode fazer o download do jenkins e executar localmente. O travis oferece algo parecido com isto?

Nota: Eu vi o travis-ci cli e o baixei, mas tudo o que parece fazer é chamar sua API, que se conecta ao meu repositório do github; portanto, se eu não pressionar, não importará que eu reinicie a última compilação.

Sam Hammamy
fonte
3
Você deve poder executar os testes localmente sem precisar executar o Travis CI. Confira a seção "script" do .travis.yml para ver qual comando executar.
Konstantin Haase
69
Mas apenas a execução dos testes não é o problema - geralmente uma compilação do Travis falha por causa das etapas de instalação e instalação na install:seção, e é provavelmente sobre estas as questões que mais preocupam.
Brandon Rhodes
4
Acrescentarei que em projetos complexos uma variedade de razões (por exemplo, lançamentos de pontos diferentes ou interações do sistema no tempo de execução, testes intrinsecamente sensíveis ao tempo, por exemplo, testes de tempo limite ecc). .
circlespainter

Respostas:

200

Esse processo permite reproduzir completamente qualquer trabalho de criação do Travis no seu computador. Além disso, você pode interromper o processo a qualquer momento e depurar. Abaixo está um exemplo em que reproduzo perfeitamente os resultados do trabalho nº 191.1 no php-school / cli-menu .

Pré-requisitos

  • Você tem um repositório público no GitHub
  • Você executou pelo menos uma construção no Travis
  • Você tem o Docker configurado no seu computador

Configurar o ambiente de construção

Referência: https://docs.travis-ci.com/user/common-build-problems/

  1. Crie seu próprio ID de construção temporário

    BUILDID="build-$RANDOM"
    
  2. Visualize o log de compilação , abra o botão mostrar mais para INFORMAÇÕES DO TRABALHADOR e encontre a linha INSTANCE, cole-a aqui e execute (substitua a marca após os dois pontos pela mais nova disponível) :

    INSTANCE="travisci/ci-garnet:packer-1512502276-986baf0"
    
  3. Execute o servidor sem cabeça

    docker run --name $BUILDID -dit $INSTANCE /sbin/init
    
  4. Execute o cliente conectado

    docker exec -it $BUILDID bash -l
    

Execute o trabalho

Agora você está dentro do seu ambiente Travis. Corra su - travispara começar.

Este passo é bem definido, mas é mais tedioso e manual. Você encontrará todos os comandos que o Travis executa no ambiente. Para fazer isso, procure por tudo na coluna da direita que tenha uma tag como 0.03s.

No lado esquerdo, você verá os comandos reais. Execute esses comandos, em ordem.

Resultado

Agora é uma boa hora para executar o historycomando. Você pode reiniciar o processo e reproduzir esses comandos para executar o mesmo teste em uma base de código atualizada.

  • Se o seu repo é privado: ssh-keygen -t rsa -b 4096 -C "YOUR EMAIL REGISTERED IN GITHUB"em seguida, cat ~/.ssh/id_rsa.pube clique aqui para adicionar uma chave
  • FYI: você pode, git pullde dentro do docker, carregar confirmações da sua caixa de desenvolvimento antes de enviá-las ao GitHub
  • Se você quiser alterar os comandos que o Travis executa, é SUA responsabilidade descobrir como isso se traduz novamente em um trabalho .travis.yml.
  • Não sei como limpar o ambiente do Docker, parece complicado, talvez isso vaze memória
William Entriken
fonte
22
Nos logs em instance:Não consigo ver um caminho de imagem do docker válido, apenas algo parecido travis-ci-garnet-trusty-1512502259-986baf0. Tentei travisci/ci-garnet:$INSTANCEe travisci/$INSTANCE- não funciona, não consigo encontrar a imagem. Também apenas pegar o postfix (ie travisci/ci-garnet:packer-1512502259-986baf0) não funcionou.
Roy Shilkrot
4
Estou com o mesmo problema - a imagem mencionada nas informações da instância não pode ser baixada. Além disso, tentei a travisci/ci-garnet:packer-1512502276-986baf0imagem sugerida nos documentos do Travis . Este está disponível, mas desatualizado. Por exemplo, o CMake é muito mais antigo que o disponível no Travis. Nenhuma nova versão do ci-garnetfoi carregada no Docker Hub nos últimos seis meses, enquanto anteriormente havia muitas atualizações por mês.
skalee
7
Seu link de referência não funciona mais - por exemplo, a seção 'Executando uma imagem do Docker com base em contêiner localmente' foi removida dessa página. Talvez a diferença na saída da instância se devesse a não ter sudo: requireddefinido? Em uma compilação atual do meu Eu vejo travis-ci-sardonyx-xenial-1547455603-2c98a19que eu pode mapear para travisci / ci-sardônica: packer-1547455648-2c98a19
maxschlepzig
4
para mim, usando a versão mais recente do travisci / ci-garnet no docker hub (travisci / ci-garnet: packer-1515445631-7dfb2e1) fez o truque
taleb
3
Se você estiver trabalhando em uma instância específica do idioma do travis, também poderá usar a imagem dedicada, como a python .
Zaccharie Ramzi
162

O Travis-ci oferece uma nova infraestrutura baseada em contêiner que usa docker. Isso pode ser muito útil se você estiver tentando solucionar um problema do travis-ci, reproduzindo-o localmente. Isso é retirado da documentação do Travis CI .

Solução de problemas localmente em uma imagem do Docker

Se você está tendo problemas para rastrear o problema exato em uma compilação, geralmente ajuda a executá-la localmente. Para fazer isso, você precisa usar nossa infraestrutura baseada em contêiner (ou seja, possui sudo: falsena sua .travis.yml) e saber qual imagem do Docker você está usando no Travis CI.

Executando uma imagem do Docker com base em contêiner localmente

  1. Baixe e instale o mecanismo do Docker .
  2. Selecione uma imagem no Docker Hub . Se você não estiver usando uma seleção de imagem específica do idioma ci-ruby. Abra um terminal e inicie uma sessão interativa do Docker usando o URL da imagem:

    docker run -it travisci/ubuntu-ruby:18.04 /bin/bash
    
  3. Mude para o travisusuário:

    su - travis
    
  4. Clone seu repositório git na /pasta da imagem.
  5. Instale manualmente quaisquer dependências.
  6. Execute manualmente o comando de construção do Travis CI.
Scott McLeod
fonte
6
@DustinGraham, isso depende de como o projeto que está sendo construído pelo Travis CI foi configurado para compilar. No projeto em que eu estava trabalhando, o comando build foi configurado no arquivo .travis.yml sob o script: subsection and was make test.
21416 Scott McLeod
102
> Manually install any dependencies Parece uma boa maneira de obter resultados que não correspondem às compilações regulares do Travis.
Gerry
6
@Gerry Ao instalar dependências manualmente, presumo que ele significa executar manualmente os comandos que você possui no seu arquivo de configuração do travis que lida com a instalação de dependências. Portanto, são os mesmos comandos que o travis CI estaria executando, mas não automatizado.
Chathan Driehuys
8
Eu sinto que esta é a resposta para a minha pergunta de alguma forma, mas a Manually tun your Travis CI build command... Como, o que? Quão? O que é isso? Eu tenho um .travis.ymlarquivo Eu tentei travis-build, mas é um beco sem saída.
Brandon
2
@Brandon Dentro do seu .travis.yml, geralmente há uma subseção de script que é invocada pelo travis para criar sua fonte. O objetivo desta resposta é configurar um ambiente local idêntico àquele em que o travis estaria operando. Em seguida, você mesmo chamará esses comandos em vez de confiar no travis para executá-los para você. Dessa forma, você pode ver os efeitos de executar cada comando por conta própria nesse ambiente - isso pode fornecer informações sobre um problema de construção que pode haver na travis que, de outra forma, não estaria acessível.
Scott McLeod
86

ATUALIZAÇÃO: Agora tenho uma resposta completa, tudo em um, chave na mão, consulte https://stackoverflow.com/a/49019950/300224 . Levou apenas 3 anos para descobrir!

De acordo com a documentação do Travis: https://github.com/travis-ci/travis-ci, há uma mistura de projetos que conspiram para fornecer o serviço da web do Travis CI que conhecemos e amamos. O seguinte subconjunto de projetos parece permitir a make testfuncionalidade local usando o .travis.ymlem seu projeto:

travis-build

O travis-build cria o script de construção para cada trabalho. Ele pega a configuração do .travis.ymlarquivo e cria um bashscript que é executado no ambiente de construção pelo travis-worker.

travis-cookbooks

O travis-cookbooks contém os livros de receitas do Chef que são usados ​​para provisionar os ambientes de construção.

travis-worker

O travis-worker é responsável por executar os scripts de construção em um ambiente limpo. Ele transmite a saída do log para travis-logs e envia atualizações de estado (início / término da construção) para o travis-hub.

(Os outros subprojetos são responsáveis ​​pela comunicação com o GitHub, a interface da web, o email e a API.)

William Entriken
fonte
4
Acredito que um projeto para usar apenas esses três componentes e executar a make testfunção seria ótimo. Comente se você gostaria de trabalhar nisso comigo.
William Entriken
4
Há um tópico sobre isso no travis repo .
hurrymaplelad
5
GitHub é para baixo hoje por causa de DDOS github.com/blog/1981-large-scale-ddos-attack-on-github-com É por isso que precisamos de testes locais
William Entriken
20
Como eu realmente instalo e executo travis-build? Não há instruções no repositório.
precisa
1
@sindhus Não, desculpe. A única solução que encontrei é bifurcar o repositório, continuar fazendo minhas alterações até o Travis funcionar, copiar o arquivo de configuração no repositório principal e fazer um commit. Edit: pense bem, você pode usar uma ramificação temporária para isso, excluir a ramificação remota depois de concluída e rebase / squash se comprometer em uma.
usar o seguinte
23

Semelhante ao de Scott McLeod, mas isso também gera um script bash para executar as etapas do .travis.yml.

Solução de problemas localmente no Docker com um script Bash gerado

# 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
fonte
Eu era capaz de seguir os passos abaixo travis # to create ~/.travis. Travis precisa de um comando para executar.
Eivind Gussiås Løkseth
3
sudo - travisdeveria ser su - travis.
Berend de Boer
1
Ao executar a etapa de compilação, recebo:/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 você ainda não descobri esse problema: aqui está a solução para livrar-se da questão 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 compilar nem mais válido? Vejo comando desconhecido compilar: / travis -h não mostra: ////
Dawid Drozd
16

Use wwtd (o que o travis faria) ruby gem para executar testes em sua máquina local aproximadamente como eles executariam no travis.

Ele recriará a matriz de compilação e executará cada configuração, excelente para verificar a configuração antes de enviar.

gem i wwtd
wwtd
mais grosseiro
fonte
nota importante: somente rubysuporte
msangel 20/12/19
deve ser possível adicionar suporte para outras línguas também, uma vez que conchas para etapas de execução
Grosser
Isso é doentio. Funciona bem! Obrigado!
precisa saber é o seguinte
14

tl; dr Use a imagem especificada em https://docs.travis-ci.com/user/common-build-problems/#trou Troubleshooting-locally-in-a-docker- image em combinação com https://github.com/ travis-ci / travis-build # use-como-addon-para-travis-cli .


EDIT 2019-12-06

#troubleshooting-locally-in-a-docker-imageA seção foi substituída pela #running-builds-in-debug-modeque também descreve como fazer o SSH para o trabalho em execução no modo de depuração .

EDIT 2019-07-26

#troubleshooting-locally-in-a-docker-imageA seção não faz mais parte dos documentos. aqui está o porquê


No entanto, ainda está na história do git: https://github.com/travis-ci/docs-travis-ci-com/pull/2193 .

Procure por versões da imagem (bastante antigas, que não puderam encontrar mais recentes) em: https://travis-ci.org/travis-ci/docs-travis-ci-com/builds/230889063#L661 .



Eu queria inspecionar por que um dos testes do meu build falhou com um erro que não recebi localmente.

Trabalhou.

O que realmente funcionou foi usar a imagem especificada em Solucionando problemas localmente em uma página de documentos da Imagem do Docker . No meu caso, foi travisci/ci-garnet:packer-1512502276-986baf0.

Consegui adicionar as travise compileseguintes etapas descritas em 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

Tudo .travis.ymlfoi executado conforme o esperado (dependências instaladas, testes executados, ...).

Observe que antes de executar bash ci.sh, tive que mudar --branch\=\'\'\para --branch\=master\(consulte o penúltimo sed -i ...comando) em ci.sh.

Se isso não funcionar, o comando abaixo ajudará a identificar o número da linha de destino e você poderá editar a linha 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$

Não funcionou.

Seguiu a resposta aceita para esta pergunta, mas não encontrou a imagem ( travis-ci-garnet-trusty-1512502259-986baf0) mencionada instanceem https://hub.docker.com/u/travisci/ .

Construção trabalhadores versão aponta para Travis-ci / trabalhador cometer e sua Travis-trabalhador de instalar referências quay.io/travisci/como registro de imagem. Então eu tentei.

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 não é confiável (Ubuntu 14.04) e também não é pequeno.

Dušan Maďar
fonte
1
A abordagem trabalhada fez isso por mim. Mas, além disso, eu tive que definir o http_proxyambiente por causa disso git clone. No padrão git clonelança gnutls_handshakeexceção. Então, eu devo aplicar a instalação de uma bundlerversão específica gem install bundler -v 1.16.6porque bundler binstubs travisfalhou anteriormente. Melhore a bundlerversão exigida executando `bundle info travis`
palik
1
Esta é a melhor resposta aqui, porque explica como compilar travis.ymlem um script de shell executável. Bem feito! A única melhoria para isso seria um mecanismo pelo qual evitar a substituição manual de cadeias ao especificar a ramificação a partir da qual construir.
21919 Ben Johnson
1
@ BenJohnson Adicionei um sedcomando que aborda o ponto que você fez. Veja o comando antes de executar bash ci.sh.
Dušan Maďar 30/04/19
O link * Solução de problemas localmente em uma imagem Docker * não funciona mais
juliangonzalez
1
@juliangonzalez editado com as melhores informações que consegui cavar.
Dušan Maďar 26/07/19
7

Você pode experimentar o Trevor , que usa o Docker para executar sua compilação do Travis.

De sua descrição:

Muitas vezes, preciso executar testes para várias versões do Node.js. Mas não quero alternar versões manualmente usando n / nvm ou enviar o código para o Travis CI apenas para executar os testes.

Por isso eu criei Trevor. Ele lê .travis.yml e executa testes em todas as versões solicitadas, assim como o Travis CI. Agora, você pode testar antes do push e manter seu histórico do git limpo.

Travis
fonte
2
FYI para aqueles que procuram para experimentar este ... não suporta PHP
Craig Wayne
2
parece ser exclusivamente para node.js. seria bom estendê-lo
João Neto
6

Não tenho certeza de qual era o motivo original para executar o Travis localmente, se você apenas queria brincar com ele, pare de ler aqui, pois isso é irrelevante para você.

Se você já possui experiência com o Travis hospedado e deseja obter a mesma experiência em seu próprio datacenter, continue lendo.

Desde dezembro de 2014, o Travis CI oferece uma versão Enterprise no local.

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

O preço também faz parte do artigo:

O licenciamento é feito por assentos, onde cada licença inclui 20 usuários. O preço começa em US $ 6.000 por licença, o que inclui 20 usuários e 5 versões simultâneas. Há uma opção premium com versões ilimitadas por US $ 8.500.

Radek Simko
fonte
3
Na verdade, eu também estava interessado nisso. Estou tentando configurar um trabalho travis para um projeto realmente estranho. Todos os commits em 26 de abril estavam mexendo no arquivo .travis.yml ( github.com/gregturn/issue-aggregator/commits/master ). Eu gostaria que houvesse uma maneira mais fácil de mexer com a configuração sem ter que enviar todas as edições.
precisa saber é o seguinte
4
@gregturn Uma solução feia, mas que reduz o estresse, que eu criei foi clonar meu repo para um segundo repo do GitHub. Portanto, o repositório whackamoleé uma cópia do projeto no qual realmente quero trabalhar, e posso configurar um trabalho temporário de criação do Travis para esse projeto enquanto resolvo os problemas da automação de criação. Depois que eu tiver acertado, refaça as dezenas de "oops" confirmados e avance para o verdadeiro repositório do GitHub. (E provavelmente remova o whackamolerepositório do GitHub e o trabalho correspondente do Travis.) #
Tripleee 27/05
3
Pergunto-me se a taxa de licença de US $ 6000 é única ou anual.
24515 Erik
0

É possível fazer o SSH no ambiente Travis CI por meio de um host de rejeição. O recurso não foi criado no Travis CI, mas pode ser alcançado com as seguintes etapas.

  1. No host de devolução, crie um travisusuário e garanta que você possa fazer o SSH para ele.
  2. Coloque estas linhas na script:seção do seu .travis.yml(por exemplo, no 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
    

    Onde $bouncehostipestá o IP / host do seu host de rejeição e $sshpasswordsua senha SSH definida. Essas variáveis ​​podem ser adicionadas como variáveis ​​criptografadas .

  3. Empurre as alterações. Você deve conseguir fazer uma conexão SSH com seu host de rejeição.

Fonte: Shell no Travis CI Build Environment .


Aqui está o exemplo 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

Veja: c-mart/travis-shellno GitHub .


Consulte também: Como reproduzir um ambiente de construção travis-ci para depuração

kenorb
fonte