zoukankan      html  css  js  c++  java
  • 用持续集成工具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来做持续集成,缺省情况下所有项目都是不做持续集成的。如下图所示,

    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的文档。

    附录. 参考资料

    1. Travis CI Documentation
      http://docs.travis-ci.com/
    2. Have Travis-CI test your Sphinx docs
      https://coderwall.com/p/wws2uq/have-travis-ci-test-your-sphinx-docs
    3. how to deploy to own server using ftp
      http://docs.travis-ci.com/user/deployment/custom/
    4. curl: (1) Protocol sftp not supported or disabled in libcurl
      https://github.com/travis-ci/travis-ci/issues/2556
    5. 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
    6. 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
    7. Ubuntu 12.04 » Ubuntu Server Guide » File Servers » FTP Server
      https://help.ubuntu.com/12.04/serverguide/ftp-server.html
    8. vsftpd
      https://help.ubuntu.com/community/vsftpd
     
     
  • 相关阅读:
    ftp卡死问题
    Windows 10 安装FileZilla Server
    The last packet successfully received from the server was 39,900 milliseconds ago问题解决
    java.sql.SQLException: Could not retrieve transaction read-only status from server 问题解决
    三主机配置 keepalived VIP高可用
    subprocess.Popen在win10下会有异常
    python 使用内置方法读取注册表
    过年有感
    java.security.InvalidKeyException: Illegal key size 解决办法
    Android Studio 检查Top Activity
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4132084.html
Copyright © 2011-2022 走看看