使用 Travis CI 为开源项目 kails 构建自动化 CI 系统

Kails 开源后得到许多的朋友的关注,也就希望把 kails 做成比较标准的开源项目。想到的首先是给项目加测试代码,然后就是利用 CI 工具来自动跑测试,实现 自动化测试每一个新功能。由于是开源项目所以可以直接使用 travis ci, 它对开源项目是免费的,而由于它是基于 docker 来配置测试环境,非常的简单省心。

个人原创,版权所有,转载请注明出处,并保留原文链接: 使用 travis ci 为开源项目 kails 构建 CI 系统
https://www.embbnux.com/2016/11/21/use_travis_ci_for_open_source_nodejs_project/

一、travis ci 使用

在 travis-ci.org 网站上使用 github 登陆,后在右上角的用户名的下拉菜单中点击 account 进入,你会发现你的 github 账户的 repo 在这边被展示出来了,选择你要添加测试的项目,把开关打开,变成绿色即可。

这样在你的 github repo 的配置里会发现 Service Hooks 多了 travis-ci, 这个项目就和travis 连上了, 以后只要你的分支中有 commit 提交到 github, 就会自动通知到 travis 那边构建。

不过单这样还不行,你还得告诉 travis 你要他做什么事。所以就需要 .travis.yml 的出场了

二、使用 travis.yml 描述你的 ci 系统和任务

travis 是基于 docker, 每次的任务都是重新起一个 docker 容器,用来跑 CI 任务。所以我们写的 travis.yml 就是用来生成这个容器需要跑的命令的配置文件,可以理解成和 dockerfile 一样的东西。

下面是 kails 的例子:

language: node_js
node_js:
  - "7"
addons:
  apt:
    sources:
      - ubuntu-toolchain-r-test
    packages:
      - gcc-4.8
      - g++-4.8
env:
  - CXX=g++-4.8 NODE_ENV=test DATABASE_USERNAME_TEST=postgres DATABASE_PASSWORD_TEST='' DATABASE_NAME_TEST=kails_test DATABASE_HOST_TEST=localhost
services:
  - postgresql
  - redis-server
install:
  - npm install
before_script:
  - psql -c 'create database kails_test;' -U postgres
script:
  - npm run lint
  - npm test

1、首先是指定基本语言环境,比如我这边是 node_js, 如果是 ruby 就写 ruby, 然后就是制定 nodejs 的版本了,这里的版本控制使用 nvm 实现的,所以 nvm 支持的版本号都可以,如果是 ruby 的话就是 rvm.

2、然后是系统需要的一些包,这里的 docker 镜像是基于 ubuntu 的,所以可以看到 apt 的身影,像 kails 在 npm install 阶段需要原生编译一些包,所以就需要提前安装 gcc 了。

3、然后就是指定运行时的一些环境变量了,多个环境变量写在同一行,如果是多行的话就会变成分开跑,在不同的环境变量下跑。

4、由于 kails 运行中,依赖于 postgres 和 redis, 所以也就需要 postgres 和 redis 服务。 install 里用于提前安装需要依赖的一些包,比如 npm install. script 就是指定要跑的命令了,这里就是 npm lint 和 npm test。

把 travis.yml  放在项目的根目录下提交到仓库里就会触发 travis 按我们写的规则跑了。跑起来的情况可以看下 kails 的 ci: travis-ci.org/embbnux/kails

最后在项目的 README.md 增加 travis 提供的图片链接,就可以直接在 github 项目首页看到 CI 的状态:

[![Build Status](https://travis-ci.org/embbnux/kails.svg?branch=master)](https://travis-ci.org/embbnux/kails)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Time limit is exhausted. Please reload the CAPTCHA.