Skip to content

Latest commit

 

History

History
417 lines (408 loc) · 34.3 KB

travisci.md

File metadata and controls

417 lines (408 loc) · 34.3 KB


travis CI 体验

快速使用(for github)

  1. 使用github账号在travis-ci.com进行注册

  2. 接受TravisCI授权。

  3. 单击Travis仪表板右上方的个人资料图片,单击“设置”,然后单击绿色的“激活”按钮,然后选择要用于Travis CI的存储库。

  4. 在你的代码仓库中添加 .travis.yml文件以告知travis要做什么,以下示例指定了应使用Ruby 2.2和最新版本的JRuby构建的Ruby项目:

    # .travis.yml
    language: ruby
    rvm:
      - 2.2
      - jruby
    
  5. 添加该文件到git,提交并push到你的远程仓库触发travis构建

  6. 通过访问Travis CI并选择您的存储库,检查构建状态页面,以根据构建命令的返回状态查看您的构建是否通过或失败。

使用docker构建

此示例存储库运行从同一映像构建的两个Docker容器:

#.travis.yml
language: ruby

services: - docker

before_install: - docker pull carlad/sinatra - docker run -d -p 127.0.0.1:80:4567 carlad/sinatra /bin/sh -c "cd /root/sinatra; bundle exec foreman start;" - docker ps -a - docker run carlad/sinatra /bin/sh -c "cd /root/sinatra; bundle exec rake test"

script: - bundle exec rake test

通过dockerfile构建docker image
#.travis.yml
language: ruby
services:
  - docker

before_install: - docker build -t carlad/sinatra . - docker run -d -p 127.0.0.1:80:4567 carlad/sinatra /bin/sh -c "cd /root/sinatra; bundle exec foreman start;" - docker ps -a - docker run carlad/sinatra /bin/sh -c "cd /root/sinatra; bundle exec rake test"

script: - bundle exec rake test

推送docker image 到镜像仓

推送到镜像仓首先要通过 docker login 进行身份验证,用于登录的电子邮件,用户名和密码应存储在存储库设置环境变量中,该变量可以通过存储库设置网页设置,也可以通过Travis CLI在本地设置,例如:

travis env set DOCKER_USERNAME myusername
travis env set DOCKER_PASSWORD secretsecret

确保您已经使用 travis gem 加密环境变量。

要将存储库的特定分支推送到远程注册表,请使用.travis.yml的定制部署部分:

#.travis.yaml
deploy:
  provider: script
  script: bash docker_push
  on:
    branch: master

其中docker_push是存储库中的脚本:

#!/bin/bash
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
docker push USER/REPO

当推送到私有注册表时,请确保在docker login命令中指定主机名,例如:

echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin registry.example.com

构建PullRequest

PR构建是Travis CI的重要组成部分。每当在GitHub上打开PR时,Travis CI都会构建该请求并更新拉取请求页面上的状态图标。

travis ci 收到PR通知并运行构建。在构建期间会更新PR状态为以下状态之一:

  • 构建正在运行的警告
  • 构建失败PR不应该被合并的通知
  • 构建成功PR可以被合入

首次打开Travis CI时,只要将提交添加到该PR中,它就会构建一个PR。我们构建源分支和上游分支之间的合并,而不是构建已被推送到PR所来自的分支的提交。

要仅在推送事件上构建而不在拉取请求上构建,请在存储库设置中禁用“在PR上构建”。

要仅在特定分支上构建PR可以使用 branchs: only: 键来指定

PR 构建的安全限制

因一个从上游仓库fork的仓库提交的PR可以操纵暴露环境变量,而上游仓库维护者无法抵御这种攻击。travis CI 设定为外部PR(fork 仓提交的PR)无法访问环境变量和加密数据。即使这些已在派生源项目中定义。

要解决此问题,请将这些测试仅限制在环境变量可用的情况下:

script:
   - 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then bash ./travis/run_on_pull_requests; fi'
   - 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then bash ./travis/run_on_non_pull_requests; fi'

Cron Job

Travis CI cron作业的工作方式与cron实用程序相似,它们以固定的预定时间间隔运行构建,而与是否将任何提交推送到存储库无关。Cron作业始终获取特定分支上的最新提交,并在该状态下构建项目。Cron作业可以每天,每周或每月运行,这实际上意味着在选定的时间跨度后最多一个小时,您不能将其设置为在特定时间运行。

请通过Travis CI网页上的“ Cron Jobs”设置选项卡配置cron作业。

Job 的生命周期

Travis CI为每种编程语言提供了默认的构建环境和默认的阶段集。将使用您的工作的构建环境创建一个虚拟机,将您的存储库克隆到其中,安装可选的附加组件,然后运行构建阶段。

每个作业都是一个阶段序列。主要阶段是:

  1. install 安装所需的任何依赖项
  2. script 运行构建脚本

Travis CI可以在以下阶段中运行自定义命令:

  1. befor_install 在安装阶段之前
  2. befor_script 在运行脚本之前
  3. after_script 在运行脚本之后
  4. after_success 当构建成功时(比如: 构建文档)结果在TRAVIS_TEST_RESULT环境变量中
  5. after_failure 当构建失败时 (比如:更新log文件) 结果在TRAVIS_TEST_RESULT环境变量中

有三个可选的部署阶段。

其完整的构建阶段(生命周期):

  1. 可选安装 apt addons
  2. 可选安装 cache components
  3. befor install
  4. install
  5. before_script
  6. script
  7. 可选 befor_cache(当且仅当缓存有效时)
  8. after_success or after_failure
  9. 可选 before_depoly
  10. 可选depoly
  11. 可选after_depoly
  12. after_script

NOTE: 一个构建可以包含许多工作。

构建矩阵

一个构建矩阵由几个并行运行的多个作业组成。

在许多情况下这可能很有用,但是使用构建矩阵的两个主要原因是:

  • 减少整体的构建时间
  • 针对不同版本的运行时或依赖项运行测试

此页面上的示例着重于后一种用例。

有两种方法可以在.travis.yml文件中定义矩阵,这两个功能可以组合使用:

  • 使用矩阵扩展功能
  • 列出单个作业配置
扩展矩阵

某些键定义为采用值数组的矩阵扩展键,从而为每个值创建一个额外的作业。如果提供了几个矩阵扩展键,则它将乘以创建的作业数量。

例如,以下配置生成一个构建矩阵,该矩阵扩展为8个单独的(2 * 2 * 2)作业,将来自三个矩阵扩展键rvm,gemfile和env的每个值组合在一起。

rvm:
- 2.5
- 2.2
gemfile:
- gemfiles/Gemfile.rails-3.2.x
- gemfiles/Gemfile.rails-3.0.x
env:
- ISOLATED=true
- ISOLATED=false
列出单个作业配置

另外,可以通过将条目添加到关键作业.include中来指定作业。例如,如果上面矩阵扩展的所有组合都不是全部相关,则可以像下面这样单独指定作业:

jobs:
  include:
  - rvm: 2.5
    gemfile: gemfiles/Gemfile.rails-3.2.x
    env: ISOLATED=false
  - rvm: 2.2
    gemfile: gemfiles/Gemfile.rails-3.0.x
    env: ISOLATED=true

NOTE: 对于私有和公共存储库,当前构建矩阵的最大限制为200个JOBS。如果您采用开源计划,请记住Travis CI向社区免费提供此服务。因此,请仅指定您实际需要的矩阵。

排除JOB

构建矩阵扩展有时会产生不需要的组合。在这种情况下,使用键jobs.exclude排除某些组合会比较方便,而不是单独列出所有作业。例如,这将从构建矩阵中排除两个作业:

jobs:
  exclude:
  - rvm: 1.9.3
    gemfile: gemfiles/Gemfile.rails-2.3.x
    env: ISOLATED=true
  - rvm: jruby
    gemfile: gemfiles/Gemfile.rails-2.3.x
    env: ISOLATED=true

如果要从构建矩阵中排除的作业共享相同的矩阵参数,则可以仅指定那些参数,并忽略不同的部分。假设您有:

language: ruby
rvm:
- 1.9.3
- 2.0.0
- 2.1.0
env:
- DB=mongodb
- DB=redis
- DB=mysql
gemfile:
- Gemfile
- gemfiles/rails4.gemfile
- gemfiles/rails31.gemfile
- gemfiles/rails32.gemfile

这产生了一个3×3×4的构建矩阵。要排除所有具有rvm值2.0.0和gemfile值Gemfile的作业,您可以编写:

jobs:
  exclude:
  - rvm: 2.0.0
    gemfile: Gemfile

等价于:

jobs:
  exclude:
  - rvm: 2.0.0
    gemfile: Gemfile
    env: DB=mongodb
  - rvm: 2.0.0
    gemfile: Gemfile
    env: DB=redis
  - rvm: 2.0.0
    gemfile: Gemfile
    env: DB=mysql

构建阶段

构建阶段是一种对作业进行分组的方法,可以在每个阶段并行运行作业,但是依次运行一个阶段,并且只有在上一个阶段的所有作业都成功通过后才能继续进行。

这是在.travis.yml文件中为此设置构建配置的方式:

jobs:
  include:
    - stage: test
      script: ./test 1
    - # stage name not required, will continue to use `test`
      script: ./test 2
    - stage: deploy
      script: ./deploy

您还可以在构建阶段中命名特定作业。我们建议使用唯一的工作名称,但不要强制使用(尽管将来可能会更改)。可以为Jobs.include节中定义的作业指定名称属性,如下所示:

jobs:
  include:
    - stage: "Tests"                # naming the Tests stage
      name: "Unit Tests"            # names the first Tests stage job
      script: ./unit-tests
    - script: ./integration-tests
      name: "Integration Tests"     # names the second Tests stage job
    - stage: deploy
      name: "Deploy to GCP"
      script: ./deploy

有条件 构建、Stage以及作业

条件构建

您可以将Travis CI配置为仅在满足某些条件时运行构建

例如,这允许构建仅在master分支上运行:

# require the branch name to be master (note for PRs this is the base branch name)
if: branch = master
conditional Stage

您可以将Travis CI配置为仅包含满足特定条件的阶段。不符合给定条件的阶段将被静默跳过。例如,这允许部署阶段仅在master分支上运行:

stages:
  - name: deploy
    # require the branch name to be master (note for PRs this is the base branch name)
    if: branch = master
Conditional Jobs

例如,这仅包括列出的作业以建立在master分支上:

jobs:
  include:
    - # require the branch name to be master (note for PRs this is the base branch name)
      if: branch = master
      env: FOO=foo

安装依赖

在基础设施上安装软件包

在Ubuntu上使用apt 安装软件包:

before_install:
  - sudo apt-get -y install libxml2-dev

默认情况下,apt-get更新不会自动运行。如果要在每个版本上自动更新apt-get update,则有两种方法可以执行此操作。首先是通过在before_install步骤中显式运行apt-get update:

before_install:
  - sudo apt-get update
  - sudo apt-get -y install libxml2-dev

第二种方法是使用APT插件:

before_install:
  - sudo apt-get -y install libxml2-dev
addons:
  apt:
    update: true

NOTE:不要在构建中运行apt-get升级,因为它会下载多达500MB的软件包,并且会大大延长构建时间。此外,某些软件包可能无法更新,这将导致构建失败。

从自定义APT存储库安装软件包
before_install:
  - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
  - sudo apt-get -q update
  - sudo apt-get -y install gcc-4.8

对于不在Launchpad上托管的存储库,您还需要添加一个GnuPG密钥。如果您是以这种方式安装软件包,请确保下载适合您环境的正确版本。

本示例将适用于Ubuntu 12.04的Varnish 3.0的APT存储库添加到APT源的本地可用列表中,然后安装varnish软件包。

before_script:
  - curl http://repo.varnish-cache.org/debian/GPG-key.txt | sudo apt-key add -
  - echo "deb http://repo.varnish-cache.org/ubuntu/ precise varnish-3.0" | sudo tee -a /etc/apt/sources.list
  - sudo apt-get -qq update
  - sudo apt-get -y install varnish
在没有APT存储库的情况下安装软件包
before_install:
  - wget http://pngquant.org/pngquant_1.7.1-1_i386.deb
  - sudo dpkg -i pngquant_1.7.1-1_i386.deb
使用APT插件安装软件包

您也可以使用APT插件安装软件包和源,而无需在before_install脚本中运行apt-get命令。

要添加APT源,可以使用以下三种类型之一:

  1. aliases defined in source safelist
  2. sourceline key-value pairs which will be added to /etc/apt/sources.list
  3. when APT sources require GPG keys, you can specify this with key_url pairs in addition to sourceline.

以下代码片段显示了这三种类型的APT来源

addons:
  apt:
    sources:
    - deadsnakes
    - sourceline: 'ppa:ubuntu-toolchain-r/test'
    - sourceline: 'deb https://packagecloud.io/chef/stable/ubuntu/precise main'
      key_url: 'https://packagecloud.io/gpg.key'

添加APT软件包

addons:
  apt:
    packages:
    - cmake
    - time

Note: When using APT sources and packages together, you need to make sure they are under the same key space in the YAML file. e.g.

addons:
  apt:
    sources:
    - ubuntu-toolchain-r-test
    packages:
    - gcc-4.8
    - g++-4.8

略…

缓存依赖项和目录

Travis CI可以缓存不经常更改的内容,以加快构建过程。要使用缓存功能,请在存储库设置中将“构建推送的分支”设置为“开”。

Enabling Bundler caching 点击查看更多

To enable Bundler caching in your .travis.yml:

language: ruby
cache: bundler

添加ssh到已知主机

点击查看更多

编程语言

点击查看更多

部署上传

点击查看更多

CI构建环境

虚拟构建环境

每个构建都在以下虚拟环境之一中运行。

linux

Travis CI支持两种用于Linux构建的虚拟化类型:“完整VM”和“ LXD”。最重要的是,Linux构建可以在多种CPU架构上运行。

  • full VM

    This is sudo enabled, full virtual machine per build, that runs Linux

  • LXD 容器

    这是启用了sudo的LXD容器构建环境,您可以在容器世界中尽可能接近虚拟机。 Linux环境在无特权的LXD容器中运行。

macOS

适用于Objective-C和其他macOS特定项目的macOS环境

windows

运行Windows Server版本1803的Windows环境。

虚拟化环境与操作系统 点击查看更多
  • 使用 ubutun Xenial (可供选择的版本请点击查看更多)

    dist: xenial
    
  • 使用macos

    os: osx
    
  • 使用windows

    os: windows
    
  • 多操作系统使用(支持 linux和macos)

    os:
      - linux
      - osx
    

    要忽略一个操作系统上作业的结果,请将以下内容添加到您的.travis.yml中:

    jobs:
      allow_failures:
        - os: osx
    
  • 在不同的CPU架构上构建

    arch:
      - amd64
      - ppc64le
      - s390x
      - arm64  # please note arm64-graviton2 requires explicit virt: [lxd|vm] tag so it's recommended for jobs.include, see below
    os: linux  # different CPU architectures are only supported on Linux
    

Travis CI构建配置参考

参考链接