如何在本地运行travis-ci


523

我刚刚加入一个项目,对travis-ci还是陌生的。我宁可不必将.travis.yml的每一个小改动以及我对源代码所做的每一个小改动都推送到运行构建中。使用jenkins,您可以下载jenkins并在本地运行。特拉维斯提供这样的服务吗?

注意:我已经看过travis-ci cli并下载了它,但是似乎要做的就是调用他们的API,然后将其连接到我的github存储库,因此,如果我不推送,则重新启动也没关系最后一个版本。


3
您应该能够在本地运行测试,而不必运行Travis CI。签出.travis.yml的“脚本”部分,以查看要运行的命令。
Konstantin Haase 2014年

69
但是仅仅运行测试并不是问题所在– Travis构建通常由于本install:节中的设置和安装步骤而失败,而问题可能更与这些有关。
布兰登·罗兹

4
我要补充一点,在复杂的项目中,各种原因(例如,不同的点发布或运行时的系统交互,本质上是时间敏感的测试,例如超时测试等),测试本身有时在本地环境和Travis CI上的行为可能会有所不同。 。
circlepainter

Answers:


200

此过程使您可以在计算机上完全复制任何Travis构建作业。另外,您可以随时中断该过程并进行调试。以下是我在php-school / cli-menu上完美再现作业#191.1 的结果的示例。

先决条件

  • 您在GitHub上有公共仓库
  • 您在Travis上至少运行了一个版本
  • 您已经在计算机上设置了Docker

设置构建环境

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

  1. 组成您自己的临时内部版本ID

    BUILDID="build-$RANDOM"
    
  2. 查看构建日志,打开显示更多信息以获取WORKER INFORMATION并找到INSTANCE行,将其粘贴在此处并运行(将冒号后的标签替换为最新的可用标签

    INSTANCE="travisci/ci-garnet:packer-1512502276-986baf0"
    
  3. 运行无头服务器

    docker run --name $BUILDID -dit $INSTANCE /sbin/init
    
  4. 运行附加的客户端

    docker exec -it $BUILDID bash -l
    

运行工作

现在,您现在处于Travis环境中。运行su - travis开始。

此步骤定义明确,但较为繁琐且手动。您将找到Travis在环境中运行的每个命令。为此,请在右侧栏中查找带有标记的所有内容0.03s

在左侧,您将看到实际的命令。按顺序运行这些命令。

结果

现在是运行history命令的好时机。您可以重新启动该过程并重播这些命令,以针对更新的代码库运行相同的测试。

  • 如果您的仓库是私人仓库:ssh-keygen -t rsa -b 4096 -C "YOUR EMAIL REGISTERED IN GITHUB"那么cat ~/.ssh/id_rsa.pub然后单击此处添加密钥
  • 仅供参考:您可以git pull从Docker内部从开发框中加载提交,然后再将其推送到GitHub
  • 如果您想更改Travis运行的命令,那么您有责任弄清楚如何将其转换回工作状态.travis.yml
  • 我不知道如何清理Docker环境,它看起来很复杂,也许这会泄漏内存

22
在下面的日志中,instance:我看不到有效的docker映像路径,就像一样travis-ci-garnet-trusty-1512502259-986baf0。尝试travisci/ci-garnet:$INSTANCEtravisci/$INSTANCE-不工作,找不到图像。同样,仅使用后缀(即travisci/ci-garnet:packer-1512502259-986baf0)也无效。
罗伊·希克罗

4
我遇到了同样的问题-实例信息中提到的图像无法下载。此外,我已经尝试过Travis docs中travisci/ci-garnet:packer-1512502276-986baf0建议的图像。这是可用的,但已过时。例如,CMake比Travis中的可用版本老得多。在过去的六个月中,没有新版本的Docker Hub上载,而更早之前,每月都有很多更新。ci-garnet
skalee

7
您的参考链接不再起作用-即从该页面上删除了“在本地运行基于容器的Docker映像”部分。也许实例输出的差异是由于没有sudo: required设置?在我的当前版本中,我看到travis-ci-sardonyx-xenial-1547455603-2c98a19可以映射到travisci / ci-sardonyx:packer-1547455648-2c98a19
maxschlepzig

4
对我来说,在docker hub上使用最新版本的travisci / ci-garnet(travisci / ci-garnet:packer-1515445631-7dfb2e1)达到了目的
taleb

3
如果您正在使用特定语言的travis实例,则还可以使用专用图像,例如python one
Zaccharie Ramzi

162

Travis-ci提供了使用Docker的基于容器的新基础架构。如果您试图通过本地复制travis-ci构建来对其进行故障排除,则这将非常有用。这取自Travis CI的文档

在Docker映像中本地进行故障排除

如果您在跟踪构建中的确切问题时遇到困难,则通常有助于在本地运行该构建。为此,您需要使用我们基于容器的基础架构(即sudo: false您的中具有.travis.yml),并知道您在Travis CI上使用的是哪个Docker映像。

在本地运行基于容器的Docker映像

  1. 下载并安装Docker Engine
  2. Docker Hub中选择一个映像。如果您没有使用特定语言的图片,请选择ci-ruby。打开一个终端,并使用图像URL启动交互式Docker会话:

    docker run -it travisci/ubuntu-ruby:18.04 /bin/bash
    
  3. 切换到travis用户:

    su - travis
    
  4. 将您的git存储库克隆到/映像的文件夹中。
  5. 手动安装任何依赖项。
  6. 手动运行Travis CI构建命令。

6
@DustinGraham,这取决于Travis CI所构建项目的配置方式。在我正在从事的项目中,build命令是在.travis.yml文件中的脚本:小节下配置的,并且是make test
Scott McLeod

102
> Manually install any dependencies 听起来这是一种获得与常规Travis版本不匹配的结果的好方法。
格里

6
@Gerry通过手动安装依赖项,我认为他的意思是手动运行travis配置文件中具有的命令来处理依赖项的安装。因此,Travis CI会执行相同的命令,只是不会自动执行。
Chathan Driehuys's

8
我觉得这以某种方式是我的问题的答案,但是Manually tun your Travis CI build command...喜欢什么?怎么样?它是什么?我有一个.travis.yml文件。我尝试了travis-build,但这是死路一条。
布兰登

2
@Brandon在.travis.yml中,通常有一个脚本小节,由travis调用以构建源代码。这个答案的重点是建立一个与travis所使用的环境相同的本地环境。接下来,您将自己调用这些命令,而不是依靠travis为您运行它们。这样,您可以看到在此环境中自己运行每个命令的效果-可以深入了解一个人可能在travis上遇到的构建问题,否则这些问题将无法访问。
Scott McLeod

86

更新:我现在有一个完整的交钥匙,多合一答案,请参阅https://stackoverflow.com/a/49019950/300224。只花了3年时间就知道了!

根据Travis文档:https : //github.com/travis-ci/travis-ci,有多个项目合谋提供了我们所熟悉和喜爱的Travis CI Web服务。以下项目子集似乎允许在项目中make test使用本地功能.travis.yml

travis构建

travis-build为每个作业创建构建脚本。它从.travis.yml文件中获取配置,并创建一个bash脚本,然后由travis-worker在构建环境中运行。

特拉维斯食谱

travis-cookbooks拥有用于提供构建环境的 Chef食谱。

特拉维斯工人

travis-worker负责在干净的环境中运行构建脚本。它将日志输出流式传输到travis-logs,并将状态更新(构建开始/完成)推送到travis-hub。

(其他子项目负责与GitHub,其Web界面,电子邮件及其API进行通信。)


4
我相信仅使用这三个组件并执行make test功能的项目将是很棒的。如果您想与我合作,请发表评论。
William Entriken 2014年

4
travis repo上有一个与此相关的话题
hurrymaplelad 2014年

5
由于DDOS,GitHub今日关闭github.com/blog/1981-large-scale-ddos-attack-on-github-com这就是我们需要本地测试的原因
William Entriken 2015年

20
我如何实际安装和运行travis-build?回购中没有说明。
DisgruntledGoat 2015年

1
@sindhus不,对不起。我发现的唯一解决方案是分叉存储库,继续进行更改直到Travis工作,然后将配置文件复制到主存储库并进行一次提交。编辑:考虑一下,您可以为此使用一个临时分支,完成后删除远程分支,并将rebase / squash提交合并为一个。
DisgruntledGoat

23

与Scott McLeod的相似,但是这也会生成一个bash脚本来运行.travis.yml中的步骤。

使用生成的Bash脚本在Docker中进行本地故障排除

# 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

我能够按照步骤进行操作travis # to create ~/.travis。Travis需要执行命令。
EivindGussiåsLøkseth,18年

3
sudo - travis应该是su - travis
Berend de Boer '18

1
当执行编译步骤时,我得到:/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 '18

2
@BerenddeBoer:如果您仍然没有弄清楚这个问题:这是摆脱该问题的解决方案 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编译不再有效吗?我看到未知的命令编译器:/ travis -h没有显示它:////
Dawid Drozd

16

使用wwtd(travis会做些什么) ruby gem在本地计算机上运行测试,就像在travis上运行测试一样。

它将重新创建构建矩阵并运行每个配置,这对于在推送之前进行健全性检查设置非常有用。

gem i wwtd
wwtd

重要说明:仅ruby支持
msangel

也应该有可能增加对其他语言的支持,因为它可以运行步骤
较重

那真是不正常。很棒!谢谢!
ppetraki

14

tl; drhttps://docs.travis-ci.com/user/common-build-problems/#troubleshooting-locally-in-a-docker-image中指定的图像与https://github.com/结合使用travis-ci / travis-build#use-as-on-travis-cli


编辑2019-12-06

#troubleshooting-locally-in-a-docker-image本节替换为本节,#running-builds-in-debug-mode该节还描述了如何SSH到以调试模式运行的作业

编辑2019-07-26

#troubleshooting-locally-in-a-docker-image本节不再是文档的一部分;这就是为什么


但是,它仍然在git历史中:https : //github.com/travis-ci/docs-travis-ci-com/pull/2193

在以下位置查找(相当旧的,找不到较新的)映像版本:https : //travis-ci.org/travis-ci/docs-travis-ci-com/builds/230889063#L661



我想检查一下为什么我的构建中的一个测试失败并显示了错误,而该错误不是我在本地得到的。

工作了。

实际可行的方法是使用Docker Image docs页面中的本地故障排除中指定的图像。就我而言travisci/ci-garnet:packer-1512502276-986baf0

我能够添加travise compilehttps://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

一切都.travis.yml按预期执行(安装了依赖项,运行了测试,...)。

请注意,在运行之前,bash ci.sh我必须在中更改--branch\=\'\'\--branch\=master\(请参阅倒数第二个sed -i ...命令)ci.sh

如果这样不起作用,则下面的命令将有助于识别目标行号,您可以手动编辑该行。

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$

没用

遵循了该问题的可接受答案,但在https://hub.docker.com/u/travisci/上未找到travis-ci-garnet-trusty-1512502259-986baf0提及的图像()。instance

生成工作程序版本指向travis-ci / worker提交及其作为映像注册表的travis-worker-install引用quay.io/travisci/。所以我尝试了。

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

绝对不是Trusty(Ubuntu 14.04),也不小。


1
努力的方法为我做到了。但是另外我还得为了自己设置http_proxy环境git clone。默认情况下git clone引发 gnutls_handshake异常。因此,我不得不执行特定bundler版本的安装,gem install bundler -v 1.16.6因为bundler binstubs travis先前失败了。bundler通过运行“ bundle info travis”来改进所需的版本
palik

1
这是最好的答案,因为它说明了如何编译travis.yml为可执行的Shell脚本。做得很好!对此的唯一改进将是一种机制,通过该机制可以避免在指定要从其构建的分支时手动替换字符串。
本·约翰逊

1
@BenJohnson我添加了一个sed命令来解决您提出的问题。在运行之前,请参阅命令bash ci.sh
杜尚MADAR

链接*在Docker映像中进行本地故障排除*不再起作用
juliangonzalez

1
@juliangonzalez编辑了我能够挖掘的最佳信息。
杜尚MADAR

7

您可以尝试Trevor,它使用Docker运行您的Travis构建。

从其描述:

我经常需要针对多个版本的Node.js运行测试。但是我不想使用n / nvm手动切换版本或将代码推送到Travis CI只是为了运行测试。

这就是为什么我创建了Trevor。它读取.travis.yml并在您请求的所有版本中运行测试,就像Travis CI一样。现在,您可以在推送之前进行测试,并保持git历史记录干净。


2
仅供参考,以供您尝试...不支持PHP
Craig Wayne

2
似乎专门用于node.js。会是不错的扩展它
若奥·内托

6

我不确定您在本地运行Travis的最初原因是什么,如果您只是想玩它,那么就不要在这里阅读,因为这与您无关。

如果您已经拥有托管Travis的经验,并且希望在自己的数据中心获得相同的经验,请继续阅读。

201412月以来,Travis CI提供企业内部版本。

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

定价也是文章的一部分:

许可按座位数进行,每个许可包括20个用户。起价为每个许可证6,000美元,其中包括20个用户和5个并发版本。有一个高级选项,无限构建,价格为$ 8,500。


3
我实际上也对此感兴趣。我正在尝试为一个非常尴尬的项目配置travis作业。4月26日的所有提交都摆弄了.travis.yml文件(github.com/gregturn/issue-aggregator/commits/master)。我希望有一种更轻松的方法来修改配置,而不必执行每个单独的编辑。
gregturn 2015年

4
@gregturn我想到的一个丑陋但可以减轻压力的解决方法是将我的存储库克隆到第二个GitHub存储库。因此,回购whackamole是我真正想要从事的项目的副本,在我制定构建自动化的方式时,我可以为该项目设置一个临时的Travis构建工作。一旦确定了这些内容,就重新整理数十个“ oops”提交,并推送到真正的GitHub存储库。(并可能删除whackamoleGitHub存储库和相应的Travis作业。)
2015年

3
不知道这6000美元的许可费是一次性还是每年。
Erik

0

可以通过退回主机SSH到Travis CI环境。该功能不是Travis CI内置的功能,但可以通过以下步骤实现。

  1. 在退回主机上,创建travis用户并确保可以对其进行SSH。
  2. 将这些行放在script:您的部分中.travis.yml(例如,末尾)。

    - 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
    

    $bouncehostip您的退回主机的IP /主机在哪里,并且$sshpassword是您定义的SSH密码。这些变量可以作为加密变量添加。

  3. 推送更改。您应该能够与退回主机建立SSH连接。

来源:Shell到Travis CI构建环境中


这是完整的示例:

# 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

请参阅:c-mart/travis-shell在GitHub上


另请参阅:如何重现travis-ci构建环境以进行调试

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.