企业级Jenkins pipeline持续化整合(1)Devops的前世今生
本系列文章共计3篇,这是第一篇!

什么持续整合?
持续整合是一种软件开发实践,即团队开发成员经常整合他们的工作,通常
每个成员每天至少整合一次,也就意味着每天可能会发生多次整合。每次集
成都通过自动化的构建(包括编译,释出,自动化测试)来验证,从而尽早
地发现整合错误。
总的来说,尽快测试释出你的业务。
也许你会有这样的担心:
光是为数不多的几次释出都让我自顾不日强 ,哪敢频繁的释出?
之所以每次上线提心吊胆就是因为没有信心!但是如果每次或大或小的功能都做足了测试,也释出了足够的次数 ,你还会没有信心么?关于这些,你可能需要仔细权衡一下。
Jenkins
当下持续整合的工贝非常多, jenkins的可玩性非常丰富,因为在你下载安装后有完全的
控制权限,并且Jenkins有足够多的外挂支援各式各样的工作。
Jenkins作为公司内部使用非常普遍。

Jenkins pipeline
Jenkinspipeline是Jenkins用来在实施以及整合持续释出"流水线"的外挂套装。 更重要的是它可以通过类似写程式码的方式来编写,即使你不熟悉编写程式码,也可以很简单的学会pipeline的编写。
通过文字而不是网页上个一个的出季框储存通,可以有助子审计,更便于控制pipeline的版本控制。
注意:如果专案里已经有历史遗留的Jenkins非pipeline专案,需要做一定的测
试、调研才能迁移到pipeline模式,因为pipeline并不是完全相容现有的Je
nkins外挂。
后文pipeline指Jenkins pipeline
Pipeline的两种格式
Pipeline有以下两种编写格式。
宣告式Pipeline(Declarative Pipeline)
Jenkins官方提供Pipeline的各种指令要手册:以及外挂的参考手册,需要什么功能去查询即可,按照约定的语法就能拼新自己的Pipeline。
属子入门常用型别
指令码式Pipeline(Scripted Pipeline)
如名字所示:指令码式Plpeline可以在Pipeline在编写过程中可以呼叫指令码或者说使用程式设计
语言l那建样的Pipeline的可应用性就很强大了。
使用Groovy语言,一门很强大的语言。
属于高阶进阶型别。
总结:按需使用,使用适合自己Pipeline格式。pipeline的两种格式后面都会介绍到。
怎么使用
下面是一个Jenkins官方关于Python程式码可持续化整合的例子。
环境说明
推荐使用docker做环境。
操作系统: ubuntu14.04 x86_64
lP地址: 192.168.139.99

安装docker
1、解除安装旧版本docker(如果你有的话)
sudo apt-get remove docker docker-engine docker.io
2、安装linux-image-extra-*
#安装软件之前更新索引
$ sudo apt-get update
#安装依赖
$ sudo apt-get install
linux-image-extra-$(uname -r)
linux-image-extra-virtual
3、设定软件源
#安装软件之前更新索引号
$ sudo apt-get update
#安装依赖
$ sudo apt-get install
apt-transport-https
ca-certificates
curl
software-properties-common
#新增docker官方GPG key
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#验证
$ sudo apt-key fingerprint OEBFCD88
pub 4e96R/aEBFCD88 2e17-e2-22
Key fingerprint = 9DC9 5822 9FC7 DD38 954A E2D8 8D81 803C 0EBF CD88
Docker Release (CE deb)
uid
sub 4e96R/F273FCD8 2e17-02-22
#新增软件源
$ sudo add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release-cs)
stable"
4、安装docker
#安装软件之前更新索引
$ sudo apt-get update
安装docker
$ sudo apt-get install docke-ce
小结
现在docker有两种版本:商业版本(EE)与社群版本(EE),docke-ce。
映象准备
因为国内网络环境的问题,所以这里将映象的拉取做成独立的一节,在启动环境之前统一拉取好映象可以减少安装过程中的挫折感
#拉取 jenkinsci/blueocean映象
docker pull jenkinsci/blueocean
#拉取 python2环境映象
docker pull python: 2-alpine
#拉取安装了 pytest依赖的映象
docker pull gnib/pytest
#拉取安装了 pyinstallery依赖的映象
docker pull cdrx/pyinstaller-linux: python
小结
建议大家安装有 alpine字尾的映象(如果有的话),这样的映象体积要相较于没有后缀的映象要小的多之所以拉取 jenkinsci/blueocean映象而不是 jenkins,是因为 blueocean配合 pipeline使用更加完美,原生的自然也是可以的,基本就是好看与不好的区别而已
下面是拉取 docke映象可能会遇到的问题
1)、取映象慢,稍等一会,总会下载下来的
2)、拉取映象时常断开,多尝试几次
部署实验环境
实验环境的部署主要是 Jenkins的配置以及示例程式码的配置。
配置 Jenkins
启动 Jenkins
#建立一个工作目录用于共享 docker环境里面的目录
mkdir ~/workspace
#启动Jenkins
sudo docker run -itd
--rm
-u root
-p 8080:8080
-v /workspace: /var/jenkins_home
-v /var/run/docker.sock:/var/run/docker.sock
-v "$HOME":/home
jenkinsci/blueocean
配置Jenkins Web界面
访问http://:8080,本文为http://192.168.139.99:8080访问界面如下:

它会提示输入Administrator password,而这个密码就在
/var/jenkins home/secrets/initialAdminPassword
在之前的命令中,我们将/var/jenkins home目录对映到了Ubuntu server的~/workspace目录,所以可以通过以下命令检视
sudo cat /workspace/secrets/initialAdminPas sword
f8c57a840e5b495faaf4bc928574104
输入密码之后就可以点选 Continue,就会来到 Jenkins的以下界面

选择" Install suggested plugins"即可在这里会等待会,因为需要安装一些外挂。
再之后就是使用者建立界面,根据提示输入密码,点选" Save and Continue"即可
后面的页面预设即可。至此 Jenkins的配置已经就绪
界面如下:

配置实验程式码
在配置 pipeline之前,我们还需要克隆一下实验程式码。
通过以下命令将示例程式码克隆到本地
sudo git clone https://github.com/jenkins-docs/simple-python-pyinstaller-app.git ~ /workspace/GitHub/simple-python-pyinstaller-app
上面的程式码将程式码克隆到了~ /workspace/GitHub/simple-python-pyinstaller-app目录。
至此配置 pipeline之前的准备工作都已就绪。
配置 pipeline
点选 Jenkins的首页的"New任务"(New Item)

根据上图依次填入任务的名称,选择流水线(pipeline),点选"OK"。
点选"OK"之后会跳转到pipeline的设定页面,在这个页面我们可以配置pipeline相关配置。

在上图,我们依次将"Definition"的下拉框选择"Pipeline script from SCM而SCM的下拉框选择"GIT",最后 Repositories里面的Repository URL的文字框中我们填入 /var/jenkins_home/GitHub/simple-python-pyinstaller-app
其他设定预设即可。
最后点选"Save"。
至此我们的pipeline的配置部分的准备工作已经全部完成。
接下来就是编写pipeline
编写pipeline
通过以下命令在本地的git仓库(即我们克隆的那个git仓库)中建立Jenkinsfile
#建立 enkinsfile
sudo cat ~/workspace/GitHub/simple-python-pyinstaller-app/Jenkinsfile
pipeline {
agent none
stages("Build") {
agent {
docker {
image 'python:2-alpine'
}
}
steps {
sh 'python -m py_compile sources/add2vals.py sources/calc.py'
}
}
stage('Test')
agent {
docker {
image 'qnib/pytest'
}
}
steps {
sh 'py.test --verbose --junit-xml test-reports/results.xml sources/test_calc.py'
}
post {
always {
junit 'test-reports/results. xml'
}
}
}
stage('Deliver') {
agent {
docker {
image 'cdrx/pyinstaller-linux: python2'
}
}
steps {
sh 'pyinstaller--onefile sources/add2vals.py'
}
post {
success {
archiveartifacts 'dist/add2vals'
}
}
}
}
}
EOF
然后进入克隆的本地仓库提交刚好建立的档案
#进入示例程式码仓库
cd ~/workspace/GitHub/simple-python-pyinstaller-app
#新增的资讯
git add
glt commit -m "init"
注意:如果提示需要配置emai,按照提示配置即可,比如随便配置一个 git config-global user.email "[email protected]"
现在我们可以点选"立即构建"(Build now)开始构建。点选之后会花一段时间跑我们在pipeline里面定义的任务。
结果如下:

我们也可以通过Blue Ocean检视刚好执行的pipeline执行结果。依次点选"开启Blue Ocean",选择其中一个任务,选择相应的build。Blue Ocean会有更好的展示界面。
效果如下:
