git在CICD实践中的应用1:GitHub与Travis CI

本文介绍GitHub与Travis CI的CI功能。GitHub仓库地址:https://github.com/latelee/ci,Travis CI项目地址:https://travis-ci.org/latelee/ci/

一、介绍

GitHub的官网是https://github.com/,在官网右上角点击Sign Up进入注册页面,输入用户名、邮箱地址、密码,创建账户之后,GitHub会发邮件到注册邮箱,点击验证即可完成注册。一般地,我们使用https://github.com/<用户账号>的形式访问某人或某团队的GitHub主页,如笔者的主页为:https://github.com/latelee。在主页可看到公开的信息和仓库。

与GitHub配套使用比较多的CI系统是Travis CI,其官网是https://travis-ci.org/,在首页点击Sign Up进入注册页面,如果没有登陆过GitHub账号,则会提示登陆,如果已登陆GitHub,会直接提示授权登陆。授权之后即可登陆,后面无须授权即可直接登陆。从这里可以看到,Travis CI只支持GitHub。但是,GitHub还有其它的CI系统的支持,后续文章将会介绍。图1是授权登陆的示例(笔者使用小号来演示)。

图1 授权登陆

GitHub现在访问相对比较稳定,但Travis CI有时访问比较慢,要有一定耐心。
GitHub与Travis CI的配合使用需要在两者进行一些必要的设置,功能确定的前提下,一旦配置完成,后续都不需要再改动。只需要将文件提交到GitHub仓库即可。

二、私有仓库的CI

今年年初(2019年1月),GitHub的私有仓库免费开放,虽然最多只能添加三个协同开发者,但对于小型开发团队或个人而言,已经足够了。
自然地,我们会将部分不便公开的项目使用私有仓库存储。与此相应的,Travis CI也有相应的版本。
Travis CI有社区版,即前文介绍的版本,地址是:https://travis-ci.org/,面向的公开的仓库。也有企业版,地址是:https://travis-ci.com/,是收费的,针对私有仓库。两者的使用没有差异,只是关联的仓库性质不同而已。官网的收费计划中有一段话:

Your first 100 builds are free! No credit card required.

前100个构建(即100个私有仓库)是免费的,大家可以尝试一下。(注:笔者使用一个私有仓库构建了100多次,依然能正常,故而猜测不是100次构建操作,而是100个仓库,但此未经证实)
更新:笔者使用多个仓库进行构建实验,一个构建了156次,另外分别有构建27次、18次、17次的仓库,此时无法继续构建,提示You have 0 trial builds left。需要购买方可继续。

三、GitHub仓库

GitHub仓库一级目录下必须存在名为.travis.yml的脚本文件,该名称固定。脚本内容自定义,大体模板如下:

1
2
3
4
5
6
7
8
9
10
11
// 1. 配置项,如指定服务、指定编译语言等,因功能不同而不同
// 2. 执行脚本,一般有:
before_script:
-
script:
-
after_script:
-
// 3. 环境变量
env:
-

下文将使用几个小实例演示.travis.yml的用法。本文以笔者的GitHub账号latelee为例进行说明。

四、Travis CI

登陆Travis CI后,界面如图2所示。
图2 Travis CI主界面
左上方可点击Sync account手动同步GitHub仓库,右侧的Repositories是仓库列表,以字母排序。Settings是设置页面,默认已经开启电子邮件通知,会将构建的结果发送GitHub注册邮箱中。

4.1 关联GitHub项目

如果GitHub项目较多,可以输入关键字查找。如图3所示。
图3
点击灰色椭圆形按钮开启关联。开启后效果如图4所示。
图4

4.2 设置

点击Setting可进行设置页面。在初始阶段,保留默认设置即可。如图5所示。
图5
其中Current表示当前(或最近一次)构建的情况,Branches是构建的分支,Build History是构建历史,Pull Requests是由Pull Requests触发的构建记录。
图5中右上方More options中点击Setting再次进入设置页面,Trigger build可进行一次手动构建。

4.3 环境变量

.travis.yml脚本是跟随源码的,实际应用中,可能会出现类似账号、密钥等敏感信息,而这些信息不希望他人看到——特别是在开源项目中,此时,就可以使用环境变量来解决,图5中Environment Variables就是环境变量的设置,其中,NAME为环境变量名,VALUE为其真实内容,点击Add即可添加,注意,不能点击DISPLAY VALUE IN BUILD LOG,否则环境变量的值会显示出来,失去其意义。环境变量的内容就不会再显示出来,所以要牢记,环境可以任意添加、删除。注意,环境变量如果有特殊字符(如!&等),需要用\反转义,否则不生效。设置好后,可以直接在.travis.yml脚本中使用变量名称,而无须使用明文。图6是添加环境变量name及添加后的图示。
图6

五、几个实例

Travis CI在某个程度上可以认为是一个Linux系统,上面已经安装了许多工具供我们使用,如果遇到一些没有的工具,则可以自行安装。 本小节通过几个小实例来演示一下,注意,这里假设已经创建好GitHub仓库,并在Travis CI上关联了仓库。详细请参考https://github.com/latelee/ci

5.1 Travis CI系统信息

.travis.yml脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sudo: required

install:
- echo "install sth here"
- sudo apt-get install wget #安装软件示例
## 一些基础环境、条件可在此进行
before_script:
- echo "before script"
## 正式脚本,这里执行一些常见的linux命令
script:
- echo "hello world"
- pwd
- ls -l
- uname -a
- gcc -v
## 脚本完成后的操作,如将服务部署远程主机
after_script:
- echo "after script"
- echo "my env " $PASSWD
- echo "ci env " $name

## 环境变量,注意,这是脚本内的环境变量
env:
global:
- PASSWD: pw123456

用git客户端提交到GitHub后,稍等片刻,Travis CI将会进行构建,构建成功如图7所示。
图7

同时会收到邮件通知,如图8所示。
图8

如果构建失败,会出现error提示,同时发邮件通知失败,如图9所示(从构建编号看出,是图7构建成功之前的)。
图9

构建日志如图10所示。
图10

下面简单分析一下,具体可参考Travis CI的构建结果页面。
1、准备好构建的系统环境,在Worker information查看主机名称、版本。可以理解为Travis CI为此次构建分配了一台主机。详情不需要研究太深。
2、在Build system information可查看各种版本信息。如果仔细查阅,可以发现安装了大量工具,也配置了大量环境变量。
3、克隆GitHub关联的仓库到目录/home/travis/build/<用户名>git clone --depth=50 --branch=master https://github.com/[secure]/ci.git [secure]/ci。注意,用户名被[secure]保护起来了。
4、导出Travis CI的环境变量:export name=[secure],导出.travis.yml脚本的环境变量:export PASSWD=pw123456。注意,前者是Travis CI页面设置的环境变量,内容不可见,后者是.travis.yml设置的,内容可见。
5、从uname -a结果看到,使用的系统是ubuntu 14.04,64位。
6、脚本最后输入设置的环境变量:

1
2
3
4
$ echo "my env " $PASSWD
my env pw123456
$ echo "ci env " $name
ci env [secure]

这里再次验证这两者的可见性。所以,Travis CI页面设置的环境变量十分安全,在页面上不会显示出来。当然,这里显示的环境变量并没有实际的意义,后续文章中,我们将真正使用。

5.2 C语言编译

下面是C语言编译的.travis.yml脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
language: c

install:
echo "install sth here"
before_script:
echo "before script"
script:
echo "building"
gcc main.c

after_script:
echo "after script"

如果将编译行为改由脚本build.sh,则.travis.yml内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
git:
quiet: true

# 指定语言
language: c

sudo: required

install:
- echo "install sth here"

## 一些基础环境、条件可在此进行
before_script:
- echo "before script"
## 正式脚本,这里编译c语言文件
script:
- echo "hello world"
- pwd
- ls -l
- chmod +x build.sh
- ./build.sh
## 脚本完成后的操作,如将服务部署远程主机
after_script:
- echo "after script"
- echo "my env " $PASSWD
- echo "ci env " $name
- echo "ci nonexist" $nopath

## 环境变量,注意,这是脚本内的环境变量
env:
global:
- PASSWD: pw123456

注意,Travis CI系统下载的git仓库,可能因为各种原因,脚本文件、可执行文件没有了可执行属性(x),因此需要显式加上,否则会提示权限不足。这里的build.sh脚本里可以使用Makefile来编译。

5.3 docker镜像构建

下面是构建一个docker镜像的.travis.yml脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
git:
quiet: true

# 指定语言
language: c

sudo: required

install:
- echo "install sth here"

## 一些基础环境、条件可在此进行
before_script:
- echo "before script"
## 正式脚本,这里执行一些常见的linux命令
script:
- echo "hello world"
- pwd
- ls -l
- docker build -t k8s_tar 1.8.15
- docker images
## 脚本完成后的操作,如将服务部署远程主机
after_script:
- echo "after script"
- echo "my env " $PASSWD
- echo "ci env " $name
- echo "ci nonexist" $nopath

## 环境变量,注意,这是脚本内的环境变量
env:
global:
- PASSWD: pw123456

功能比较简单,就是调用docker命令构建Docker镜像。关于镜像的功能和内容,此时不需要了解太多,只需知道:我们可以在CI系统调用docker build来构建Docker镜像。在后面会介绍如何利用Docker Hub自动构建镜像,方式比CI系统构建方便很多。

六、小结

本文较详细介绍了Travis CI的使用,并给出几个小实例,通过本文,我们了解到,Travis CI能完美与GitHub结合,为达各种各样的目的,需要编写不同的.travis.yml脚本,这个脚本内容是千变万化的,可以参考GitHub优秀的项目,也可以参考附录的资源列表。

七、附录

资源列表:
本文产生的代码仓库在这里,标签为cicd_travis
.travis.yml配置官方说明
Travis CI收费计划
说明1:.travis.yml文件以点号.开头,Windows系统可能无法创建,建议在git bash命令行用touch创建。笔者在Win10系统中可以正常创建。
说明2:yml文件对缩进有严格要求,层次必须排序整齐,如顶格与顶格是同一层,缩进2格与缩进2格是同一层,等等。请使用空格键,不建议用Tab键。