如何在本地运行travis-ci

时间:2014-01-10 20:18:52

标签: travis-ci

我刚加入了一个项目,我是travis-ci的新手。我宁愿不必将每一个小改动都推到.travis.yml以及我为源代码运行构建所做的每一点改变。使用jenkins,您可以下载jenkins并在本地运行。特拉维斯是否提供这样的东西?

注意:我已经看过travis-ci cli并下载了它,但它似乎只是调用它们的API,然后连接到我的github repo,所以如果我不推,那就无所谓了我重新开始上一次构建。

10 个答案:

答案 0 :(得分:149)

Travis-ci提供了一个使用docker的基于容器的新基础架构。如果您尝试通过在本地再现它来解决travis-ci构建问题,这可能非常有用。这取自Travis CI的documentation

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构建命令。

答案 1 :(得分:133)

此过程允许您在计算机上完全复制任何Travis构建作业。此外,您可以随时中断该过程并进行调试。下面是一个我完全重现job #191.1 on php-school/cli-menu 的结果的例子。

的先决条件

  • 您在GitHub上有公开回购
  • 您在Travis上至少运行了一次构建
  • You have Docker已在您的计算机上设置

设置构建环境

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

  1. 制作您自己的临时构建ID

    BUILDID="build-$RANDOM"
    
  2. 查看the build log,打开工作信息的显示更多按钮,找到INSTANCE行,将其粘贴到此处并运行(在冒号with the newest available one)后替换标记:

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

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

    docker exec -it $BUILDID bash -l
    
  5. 运行作业

    现在您已进入Travis环境。运行su - travis开始。

    此步骤定义明确,但更繁琐且手动。您将找到Travis在环境中运行的所有命令。要执行此操作,请在右列中查找包含 0.03s 标记的所有内容。

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

    结果

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

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

答案 2 :(得分:81)

更新:我现在有一个完整的交钥匙,一体化答案,请参阅https://stackoverflow.com/a/49019950/300224。只花了3年时间搞清楚了!

根据特拉维斯的文件:https://github.com/travis-ci/travis-ci,有一个项目的混合物串起来提供我们熟悉和喜爱的Travis CI网络服务。以下项目子集似乎允许使用项目中的make test来实现本地.travis.yml功能:

特拉维斯-构建

travis-build创建构建 每个工作的脚本。它采用.travis.yml文件中的配置 创建一个bash脚本,然后在构建环境中运行 特拉维斯工人。

特拉维斯-食谱

travis-cookbooks持有 Chef烹饪书,用于配置构建环境。

特拉维斯工

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

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

答案 3 :(得分:19)

与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

答案 4 :(得分:14)

使用wwtd (what would travis do) ruby​​ gem在本地计算机上运行测试,就像在travis上运行一样。

它将重新创建构建矩阵并运行每个配置,在推送之前很好地进行完整性检查设置。

gem i wwtd
wwtd

答案 5 :(得分:6)

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

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

2014年12月以来,Travis CI提供企业内部部署版本。

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

定价也是文章的一部分:

  

许可是按席位完成的,每个许可证包含20个用户。每个许可证的起价为6,000美元,其中包括20个用户和5个并发版本。这是一个高级选项,无限制,价格为8,500美元。

答案 6 :(得分:6)

tl; dr 结合使用https://docs.travis-ci.com/user/common-build-problems/#troubleshooting-locally-in-a-docker-imagehttps://github.com/travis-ci/travis-build#use-as-addon-for-travis-cli中指定的图像。


我想检查为什么one of the tests in my build失败并出现我在本地找不到的错误。

工作。

实际有效的方法是使用Troubleshooting Locally in a Docker Image文档页面上指定的图像。在我的情况下是travisci/ci-garnet:packer-1512502276-986baf0

我能够按照https://github.com/travis-ci/travis-build#use-as-addon-for-travis-cli中所述的步骤添加travise compile

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 ...命令) 1}}。

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

ci.sh

没有用。

按照已接受的答案回答,但没有 在travis-ci-garnet-trusty-1512502259-986baf0处找到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/)。

内部版本worker version指向travis-ci/worker commit,其travis-worker-install引用instance作为映像注册表。所以我尝试了。

quay.io/travisci/

绝对不可靠(Ubuntu 14.04),也不小。

答案 7 :(得分:3)

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

从描述中:

  

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

     

这就是我创造特雷弗的原因。它读取.travis.yml并在您请求的所有版本中运行测试,就像Travis CI一样。现在,您可以在推送之前进行测试并保持您的git历史记录清洁。

答案 8 :(得分:0)

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

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

    .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 是您的退回主机的IP /主机,而$bouncehostip是您定义的SSH密码。这些变量可以作为encrypted variables添加。

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

来源:Shell into Travis CI Build Environment


这是完整的示例:

$sshpassword

请参阅:c-mart/travis-shell at GitHub


另请参阅:How to reproduce a travis-ci build environment for debugging

答案 9 :(得分:0)

我无法按原样使用答案。对于初学者as noted,有关本地运行作业的Travis帮助文档已被删除。我发现的所有博客条目和文章​​均基于此。新的“调试”模式对我来说并不吸引人,因为我想避免排队时间和Travis基础结构,直到我对自己的更改有所了解为止。

就我而言,我正在更新Puppet模块,我不是Puppet的专家,也不是Ruby,Travis或其生态系统的特别经验。但是我通过本文和其他地方的技巧和想法,并通过仔细检查Travis CI的构建日志,成功地构建了一个可行的测试图像。

我无法在CI日志中找到与名称匹配的最新图像(例如,我可以找到travisci / ci-sardonyx,但找不到带有“ xenial”或相同内部名称的任何图像)。从日志看来,图像现在是通过AMQP传输的,而不是我更熟悉的机制。

我能够找到与我针对特定情况的目标操作系统匹配的图像travsci/ubuntu-ruby:16.04。它没有Travis CI中使用的所有组件,因此我基于此构建了一个新组件,其中一些组件根据需要在运行时添加到图像中,而其他组件在运行时添加到容器中。

抱歉,我无法提供明确的程序。但是我所做的基本上归结为:

  1. 尽可能紧密地找到与目标操作系统匹配的Travis CI image in Docker Hub

  2. 将存储库克隆到构建目录,然后启动容器,将构建目录作为卷安装,并将工作目录设置为目标卷

  3. 现在辛苦工作:遍历Travis构建日志并设置环境。就我而言,这意味着要设置RVM,然后使用bundle安装项目的依赖项。 Travis环境中似乎已经存在RVM,但我必须安装它。其他一切都来自在构建日志中复制命令。

  4. 运行测试。

  5. 如果结果与您在Travis CI日志中看到的结果不匹配,请返回(3)并查看要去的地方。

  6. (可选)创建可重复使用的图像。

  7. 在本地进行开发和测试,然后推送,并希望您的Travis结果能够按预期进行。

我知道这并不具体,可能很明显,您的里程肯定会有所不同,但希望这对某些人有用。我的映像的Dockerfile和自述文件为on GitHub for reference