用持续集成工具Travis进行构建和部署
用持续集成工具Travis进行构建和部署
用持续集成工具Travis进行构建和部署
摘要:本文简单说明了如何使用持续集成工具Travis进行构建和部署的过程。
1. 概述
持续集成(Continuous Integration)是软件开发过程中的重要环节,不论是在开发环境,还是生产环境,其好处都是可以让团队尽快得到反馈,从而尽早发现和解决问题,不要等到用户来报告问题,影响产品和团队的声誉。越早越快地发现和解决问题,成本越低,这也是敏捷开发的基本目的之一。
持续集成的工具有不少,著名的有CruiseControl、JetBrains的TeamCity、微软的Team Foundation Server。本文讲的是另外一个相对轻巧的持续集成工具Travis。这个工具的不同之处是,它已经搭建好了,有自己的环境,省去了你用自己的服务器安装、配置的麻烦。如果你的项目是开源的,只需要在https://travis-ci.org/上用Github的账号注册就可以免费使用了;如果不是开源的项目,就要收费了,要用https://travis-ci.com/,具体的收费标准可以参考https://travis-ci.com/plans。下面只讲述https://travis-ci.org/的使用和配置,因为https://travis-ci.com/我也没用过,不过估计收费的功能应该更多更好一些。
2. 选择项目
在https://travis-ci.org/注册了账号之后,在Github账号下的项目会自动出现在这里,可以选择哪个项目要用Travis来做持续集成,缺省情况下所有项目都是不做持续集成的。如下图所示,
aaarticlea/png;base64,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" alt="" />
3个项目中,只有最后一个项目是要做持续集成的,其它都不做持续集成。你还可以进一步配置,一个项目中的哪个或哪几个分支要做持续集成,这在后面会讲到。
3. 配置
持续集成的配置,必须通过位于项目根目录下的.travis.yml文件来进行,完整的文档可以见附录中的参考资料[1]。
首先,要选择项目的语言。写此文时Travis支持15种编程语言,象常用的Java、C、C++、JavasScript (with Node.js)、Objective-C、PHP、Python和Ruby都在支持之列。我的docs项目是个文档项目,使用Sphinx,所以语言就选择了Python 2.7,和我的开发环境保持一致。所以,我的.travis.yml文件开始的部分是这样的:
language: python
python:
- "2.7"
其次,要安装一些相关的软件包,可以在install命令中进行安装,在安装之前必要的依赖包可以在before_install中进行,所以.travis.yml文件中相应的部分为:
# Use this to prepare the system to install prerequisites or dependencies
before_install: "sudo apt-get update" # command to install dependencies
install: "pip install -q -r requirements.txt --use-mirrors"
而要安装的包是在requirements.txt中指定的,其内容如下:
Sphinx==1.2
sphinxcontrib-phpdomain
安装的Sphinx版本为1.2,最新的Sphinx 1.3在构建的时候会碰到错误,所以用旧一些的版本。sphinxcontrib-phpdomain是用来扩展Sphinx的。
4. 构建
构建在script命令中指定。在我的这个项目中,这是最简单的,我参考的资料也是最简单的,见[2]。.travis.yml文件中相应的部分为:
# command to build
script: make html
这里执行的命令,如果返回值是0就算成功,否则就算失败,这是Unix返回值的标准。
前面提到限制项目的分支,可以作如下配置:
# whitelist
branches:
only:
- mybranch
这就是,只有mybranch这个分支要做持续集成,也可以用多行指定多个分支。
这时,就可以提交.travis.yml,并推送到Github服务器,Travis就会自动检查到这个项目的变化,自动启动一个虚拟机,来进行持续集成。
可以看到,这是一种按需、即时的方式,和自己安装、配置服务器进行持续集成的方式相比,更为节省资源,更能实现更好的效果。
5. 部署
部署稍微麻烦一些,因为要涉及到具体的服务器配置。相关的文档见参考资料[3]。
首先,Travis不支持sftp,详见考资料[4],这比较遗憾。为保证安全,我打算用ftps。
5.1 安装、配置服务器上的ftp
先要在服务器(Ubuntu 12.04)上安装、配置vsftpd,请看参考资料[7]和[8]。
但使用的是普通用户,不是超级管理员,也没有sudo的权限。要赋予该用户sudo的权限,可以把该用户加入sudo用户组。见参考资料[5]和[6],使用超级管理员root,执行如下命令:
# sudo usermod -a -G sudo myusername
这就把用户myusername加入了sudo用户组,就可以使用sudo来执行超级管理员才能的一些管理任务了,以下命令都是该普通用户执行的。
下面安装vsftpd,执行如下命令:
$ sudo apt-get install vsftpd
安装完毕后,配置vsftpd,这都是通过修改/etc/vsftpd.conf完成的。先禁止匿名用户:
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO
再允许服务器的本地用户(即myusername等)使用ftp:
# Uncomment this to allow local users to log in.
local_enable=YES
因为是要上传构建得到的文件到服务器,所以还要开启写入操作:
# Uncomment this to enable any form of FTP write command.
write_enable=YES
ftp使用端口21作为控制通道,供用户接入、登录、登出等交换控制信息使用。另外,还需要数据通道,传输上载、下载的数据。在主动模式下,数据通道缺省为端口20,这个我没有改。在被动模式下,需要自行设置一组端口:
# These two options set the ports for passive mode.
pasv_min_port=6789
pasv_max_port=6890
最后,需要在防火墙的设置中开启这些涉及的端口,20、21、6789-6890,这是朋友帮助做的,我也不知道具体如何操作的。
最后,可用浏览器访问ftp服务器,并上传、下载文件,验证以上配置正确。
5.2 配置Travis使用ftp部署
Travis的各个执行环节中,还有一个环节after_success,这是在script命令执行成功之后执行的。部署就是在这个环节进行的,添加如下配置到.travis.yml文件中:
after_success:
"find ./make/output -type f -exec curl --ftp-create-dirs -u $FTP_USER:$FTP_PASSWORD -T {} ftp://123.45.67.89/myproject/{} \\;"
这个命令由find找出要部署的文件,然后交给curl,上传到服务器上。其中,./make/output为构建的输出目录,123.45.67.89是服务器的IP地址,/myproject/为服务器上要部署的目录。$FTP_USER和$FTP_PASSWORD是Travis持续集成的环境变量,需要在.travis.yml文件中单独设置:
env:
global:
- "FTP_USER=myusername"
- "FTP_PASSWORD=mypassword"
到此,一个基本的包括构建和部署的Travis持续集成环境就算是配置好了。每次这个项目推送到Github库的指定分支,Travis就是自动检测到,自动进行构建,构建成功后就会自动部署到指定的服务器上。
完整的.travis.yml文件如下:
language: python
python:
- "2.7" env:
global:
- "FTP_USER=myusername"
- "FTP_PASSWORD=mypassword" # whitelist
branches:
only:
- mybranch # Use this to prepare the system to install prerequisites or dependencies
before_install: "sudo apt-get update" # command to install dependencies
install: "pip install -q -r requirements.txt --use-mirrors" # command to build
script: make html after_success:
"find ./make/output -type f -exec curl --ftp-create-dirs -u $FTP_USER:$FTP_PASSWORD -T {} ftp://123.45.67.89/myproject/{} \\;"
6. 结语
本文只是介绍了利用Travis进行持续集成的简单配置,还有一些问题没有说明或解决,比如:
- ftp不够安全,是否可以使用ftps来加强安全性?
- Travis的配置文件中,ftp的用户名和密码是明文,是可以加密的。
有兴趣的朋友,可以自己研究Travis的文档。
附录. 参考资料
- Travis CI Documentation
http://docs.travis-ci.com/ - Have Travis-CI test your Sphinx docs
https://coderwall.com/p/wws2uq/have-travis-ci-test-your-sphinx-docs - how to deploy to own server using ftp
http://docs.travis-ci.com/user/deployment/custom/ - curl: (1) Protocol sftp not supported or disabled in libcurl
https://github.com/travis-ci/travis-ci/issues/2556 - How do I grant sudo privileges to an existing user? [duplicate]
http://askubuntu.com/questions/168280/how-do-i-grant-sudo-privileges-to-an-existing-user - How can I add a new user as sudoer using the command line?
http://askubuntu.com/questions/7477/how-can-i-add-a-new-user-as-sudoer-using-the-command-line - Ubuntu 12.04 » Ubuntu Server Guide » File Servers » FTP Server
https://help.ubuntu.com/12.04/serverguide/ftp-server.html - vsftpd
https://help.ubuntu.com/community/vsftpd
用持续集成工具Travis进行构建和部署的更多相关文章
- 使用Docker搭建Jenkins+Docker持续集成环境(自动化构建发布部署)
本文介绍如何通过Jenkins的docker镜像从零开始构建一个基于docker镜像的持续集成环境,包含自动化构建.发布到仓库\并部署上线. 0. 前置条件 服务器安装docker,并启动docker ...
- 持续集成工具Jenkins学习总结
概述 持续集成(Continuous Integration,简称CI)是一种软件开发实践,团队开发人员每次都通过自动化的构建(编译.发布.自动化测试)来验证,从而尽早的发现集成错误.持续集成最大的优 ...
- HUDSON(Java开发的一种持续集成工具)
Hudson是Jenkins的前身,是基于Java开发的一种持续集成工具,用于监控程序重复的工作,包括: 1.持续的软件版本发布/测试项目. 2.监控外部调用执行的工作. Hudson的特性 1.易于 ...
- 【转载】soapui基于持续集成工具自动化运行的调研姿势
soapui中的testrunner.bat调研姿势,用于自动化测试副标题:soapui基于持续集成工具自动化运行的调研姿势 各位亲爱的同仁们,大家好吗?最近项目在搞持续集成工具,我们的测试用例都是基 ...
- 持续集成工具之Jenkins
Jenkins是一个很好的持续集成工具,不光可以帮助开发进行自动打包,自动验证升级和安装,也可以帮助测试人员定时执行测试任务,或者在开自动打包安装之后自动执行测试任务,实现打包-安装-测试一条线服务, ...
- 使用Visual Studio Team Services持续集成(一)——构建ASP.NET Core
使用Visual Studio Team Services持续集成(一)--构建ASP.NET Core 概述 持续集成(CI)是将代码尽可能频繁地集成到共享仓库中的过程.在代码集成期间,构建中断或测 ...
- 持续集成工具jenkins的使用
jenkins类似于Hadson,是一款持续集成工具.使用jenkins完成自动化部署的表现为:当开发人员向版本库提交新的代码后,应用服务器上自动部署,用户或测试人员使用的马上就是最新的应用程序.搭建 ...
- 持续集成工具Jenkins安装、部署、使用
本文介绍jenkins,利用其做项目发布与持续集成交付工具. 一.Jenkins是什么? Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布 ...
- 轻松搭建持续集成工具jenkins
1.Jenkins介绍1)什么是持续集成随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软 ...
随机推荐
- SPOJ 15. The Shortest Path 堆优化Dijsktra
You are given a list of cities. Each direct connection between two cities has its transportation cos ...
- Linux以下银行乱码
更改 /etc/sysconfig/i18n 档,例如 LANG="en_US.UTF-8",xwindow它会显示英文界面. LANG="zh_CN.GB18030&q ...
- 【C疯狂的教材】(四)C语言分支语句
1.程序的结构 程序默认从上到下顺序运行(顺序结构) 程序的结构:顺序结构.分支结构.循环结构 2.if分支语句 程序运行的过程中能够有多个选择 格式: if(表达式){ 语句块; } ...... ...
- quick-cocos2d-x游戏开发【5】——创建菜单
一个菜单是游戏中的一个基本要素,quick在里面menuItem有两个包.一个是图片菜单.一个文本菜单. 一个.图片菜单ui.newImageMenuItem(params) 參数: image: 正 ...
- Hadoop Java Hdfs API
1. 在本地文件系统生成一个文本文件,,读入文件,将其第101-120字节的内容写入HDFS成为一个新文件2. 在HDFS中生成文本文件,读入这个文件,将其第101-120字节的内容写入本地文件系统成 ...
- 问题(bug)确实不在代码逻辑上面,往往是配置、权限或者业务逻辑之外的地方(转)
不能说所有的bug都是纸老虎,但往往那种看似很奇葩的bug,导致的原因确实很简单,烦了你一段时间,找到真相又让你忍不住一笑.什么是奇葩的bug呢.我的定义是:代码逻辑都一样,但在A处是好的,到了B处就 ...
- 用python3.x与mysql数据库构建简单的爬虫系统(转)
这是在博客园的第一篇文章,由于本人还是一个编程菜鸟,也写不出那些高大上的牛逼文章,这篇文章就是对自己这段时间学习python的一个总结吧. 众所周知python是一门对初学编程的人相当友好的编程语言, ...
- 动态传递参数到DevExpress.XtraReports的小结
原文:动态传递参数到DevExpress.XtraReports的小结 前两种方法和WinForm一样,可以传递参数.数组.实体对象.DataTable等1. 采用构造函数具体用法:在Report中p ...
- Android而一个超级漂亮的日历控件
※效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluZ2xvbmd4aW4yNA==/font/5a6L5L2T/fontsize/400/fil ...
- DirectSound应用
只是使用的假设PlaySound()这个API函数来显示的声音效果,然后,然后,它不会出现在混合声音,因为PlaySound还有播放期间声音,这将不可避免地导致现有声音停止. 因此,使用 PlaySo ...