如何在本地运行travis-ci

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

注意:我已经看到了travis-ci cli并下载了它,但它似乎都是 要做的就是调用他们的API,然后连接到我的GitHub回购,所以如果 我不推,重新启动上次构建也没关系。

184698 次浏览

更新:我现在有一个完整的交钥匙,一体化的答案,见https://stackoverflow.com/a/49019950/300224。只花了3年时间就弄明白了!

根据Travis文档:https://github.com/travis-ci/travis-ci,有一个混合的项目,共同交付我们所知道和喜爱的Travis CI web服务。下面的项目子集似乎允许在项目中使用.travis.yml来实现本地make test功能:

travis-build

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

travis-cookbooks

travis-cookbooks保存 厨师烹饪书,用于提供构建环境

travis-worker

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

(其他子项目负责与GitHub、他们的web界面、电子邮件和他们的API通信。)

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

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

自从2014年12月 Travis CI提供了一个企业内部版本。

http://blog.travis-ci.com/2014-12-19-introducing-travis-ci-enterprise/ < a href = " http://blog.travis-ci.com/2014-12-19-introducing-travis-ci-enterprise/ " > < / >

定价也是文章的一部分:

授权是按座位进行的,每个授权包括20个用户。每个许可证的定价为6,000美元起,包括20个用户和5个并发构建。这里有一个8500美元的无限版本的高级选项。

Travis-ci提供了一个新的基于容器的基础设施,它使用docker。如果您试图通过在本地复制travis-ci构建来排除故障,这可能非常有用。这是从Travis CI的文档中截取的。

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

如果在跟踪构建中的确切问题时遇到困难,在本地运行构建通常会有所帮助。要做到这一点,你需要使用我们基于容器的基础设施(例如,在你的.travis.yml中有sudo: false),并知道你在Travis CI上使用的是哪个Docker映像。

本地运行基于容器的Docker镜像

  1. 下载并安装码头工人引擎
  2. 码头工人中心中选择一张图片。如果您不使用特定于语言的映像,则选择ci-ruby。打开终端,使用镜像URL启动交互式Docker会话:

    docker run -it travisci/ubuntu-ruby:18.04 /bin/bash
    
  3. Switch to the travis user:

    su - travis
    
  4. Clone your git repository into the / folder of the image.
  5. Manually install any dependencies.
  6. Manually run your Travis CI build command.

类似于Scott McLeod的,但它也生成一个bash脚本来运行.travis.yml中的步骤。

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

# 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

使用WWTD (Travis会怎么做) ruby gem在本地机器上运行测试,大致就像在travis上运行一样。

它将重新创建构建矩阵并运行每个配置,在推送之前检查设置。

gem i wwtd
wwtd

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

从它的描述来看:

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

所以我创造了特雷弗上面写着。travis。yml并在您请求的所有版本中运行测试,就像Travis CI一样。现在,您可以在推送前进行测试,并保持git历史记录干净。

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

先决条件

设置构建环境

参考:# EYZ0

  1. 创建自己的临时构建ID

    BUILDID="build-$RANDOM"
    
  2. View the build log, open the show more button for WORKER INFORMATION and find the INSTANCE line, paste it in here and run (replace the tag after the colon with the newest available one):

    INSTANCE="travisci/ci-garnet:packer-1512502276-986baf0"
    
  3. Run the headless server

    docker run --name $BUILDID -dit $INSTANCE /sbin/init
    
  4. Run the attached client

    docker exec -it $BUILDID bash -l
    

Run the job

Now you are now inside your Travis environment. Run su - travis to begin.

This step is well defined but it is more tedious and manual. You will find every command that Travis runs in the environment. To do this, look for for everything in the right column which has a tag like 0.03s.

On the left side you will see the actual commands. Run those commands, in order.

Result

Now is a good time to run the history command. You can restart the process and replay those commands to run the same test against an updated code base.

  • If your repo is private: ssh-keygen -t rsa -b 4096 -C "YOUR EMAIL REGISTERED IN GITHUB" then cat ~/.ssh/id_rsa.pub and click here to add a key
  • FYI: you can git pull from inside docker to load commits from your dev box before you push them to GitHub
  • If you want to change the commands Travis runs then it is YOUR responsibility to figure out how that translates back into a working .travis.yml.
  • I don't know how to clean up the Docker environment, it looks complicated, maybe this leaks memory

使用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指定的图像。

人力资源> < p > < 编辑2019-12-06 < / >强

#troubleshooting-locally-in-a-docker-image部分被#running-builds-in-debug-mode取代,其中还描述了如何SSH到以调试模式运行的作业 . b0 SSH到以调试模式运行的作业

编辑2019-07-26

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

  • https://github.com/travis-ci/docs-travis-ci-com/issues/2342 < p > < br > 但是,它仍然在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上寻找(相当旧的,找不到更新的)图像版本。


    < p > < br > 我想检查为什么这是我构造中的一个测试失败了,我没有在本地得到一个错误

    工作。

    真正起作用的是使用在Docker映像中进行本地故障排除文档页面中指定的图像。在我的例子中是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之前,我必须在ci.sh中将--branch\=\'\'\更改为--branch\=master\(参见倒数第二个sed -i ...命令)。

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

    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/找到instance提到的图像(travis-ci-garnet-trusty-1512502259-986baf0)

    构建工人的版本指向travis-ci /工人承诺,它的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
    

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

可以通过一个bounce主机SSH到Travis CI环境。该特性不是在Travis CI中构建的,但是可以通过以下步骤实现。

  1. 在bounce主机上,创建travis用户,并确保可以SSH到该用户。
  2. 把这些行放在.travis.ymlscript:部分(例如在结尾)。

    - 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
    

    # EYZ2 < / p >

  3. 推动改变。您应该能够建立到bounce主机的SSH连接。

来源:# EYZ0。


下面是完整的例子:

# 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

看到:# EYZ1。


参见:如何为调试重现一个travis-ci构建环境

我不能用这里的答案。对于初学者来说,如上所述, Travis本地运行作业的帮助文档已经被删除。我找到的所有博客和文章都是基于这个。新的&;debug&;模式对我没有吸引力,因为我想避免排队时间和Travis基础设施,直到我有一些信心,我已经得到了我的改变。

在我的情况下,我正在更新一个Puppet模块,我不是一个Puppet专家,也不是特别有经验的Ruby, Travis,或他们的生态系统。但是,通过仔细检查Travis CI构建日志,我根据本文和其他地方介绍的技巧和想法构建了一个可行的测试映像。

我无法在CI日志中找到与名称匹配的近期图像(例如,我可以找到travisci/ CI -sardonyx,但找不到任何带有"xenial"的图像;或者使用相同的构建名称)。从日志中显示,图像现在通过AMQP传输,而不是我更熟悉的机制。

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

所以我不能提供一个明确的程序,抱歉。但我所做的,基本上可以归结为:

  1. 找到一个最近的特拉维斯CI图像在Docker中心与你的目标操作系统尽可能接近。

  2. 将存储库克隆到一个构建目录,并启动容器,将构建目录挂载为卷,工作目录设置为目标卷

  3. 现在是最困难的工作:浏览Travis构建日志并设置环境。在我的例子中,这意味着设置RVM,然后使用bundle安装项目的依赖项。RVM似乎已经存在于Travis环境中,但我必须安装它;其他一切都来自于在构建日志中重新生成命令。

  4. 运行测试。

  5. 如果结果与你在Travis CI日志中看到的不匹配,回到(3),看看该去哪里。

  6. 可选,创建可重用映像。

  7. 开发和本地测试,然后推动,希望你的Travis结果将如预期的那样。

我知道这是不具体的,可能是显而易见的,你的里程肯定会有所不同,但希望这对某些人有用。镜像的Dockerfile和README是,以供参考