jenkins简介
持续集成(ci)是当下最为流行的应用程序开发实践方式
程序员在代码仓库中集成了修复bug,新特性开发或是功能更新
ci工具通过自动构建和自动测试来验证结果,这可以检查程序代码的问题,迅速提供反馈
程序员提交代码更新到软件仓库svn/git ,ci服务器基于计划任务查询仓库,并下载代码,ci服务器
运行构建过程并生成软件包,ci服务器进行单元和集成测试存储测试结果,向开发团队发送构建通
知。
特点:简单,可扩展,用户界面友好
支持各种scm软件配置管理工具,如svn,git,cvs等
能够构建各种风格的项目
可以选择安装多种插件
跨平台,几乎可以支持所有的平台
安装jenkins
rpm -qa | grep java-* //安装java-*jdk
http://jenkins:io //下载国外镜像速度慢
Index of /jenkins/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror //国内镜像下载快
rpm -ivh jenkins-2.204.5-1.1.noarch.rpm
yum -y install wget
wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/epel-release-7-11.noarch.rpm //下载依赖
yum -y install epel-release-7-11.noarch.rpm
yum -y install daemonize
systemctl start jenkins
systemctl enable jenkins //注意旧版本
curl http://192.168.1.100:8080 //访问
cat /var/lib/jenkins/secrets/initalAdminpassword //复制密码
自定义jenkins
选择插件来安装(无)
选择admin登录找到账户下configure更改密码
jenkins配置
插件管理
点击jenkins左上角找到manage jenkins菜单manage plugins
sed -i 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /var/lib/jenkins/updates/default.json
&&
sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' /var/lib/jenkins/updates/default.json
grep -o tsinghua /var/lib/jenkins/updates/default.json
systemctl restart jenkins
修改配置国内站点更快部署插件
Git Parameter
Localization Chinese(simplified)
Dingtalk
钉钉机器人网址:https://im.dingtalk.com/
登录进入钉钉群里点击右上机器人管理
设置:
webhook:复制网址
安全设置:自定义关键字
登录jenkins进入configsystem找到钉钉配置新增添加名称和webhook,关键字
安装git
yum -y install git
提交代码到远程仓库
jenkins新建一个任务:输入一个名称
选择This project is parameterized
添加参数git parameter:
name:xxxx(变量)
parameter type:branch or tag
default value:origin/master
//选上可以选择不同版本
源码管理
Git
repositories url:https://gitee.com/...
指定分支:$namexxxx
additional behaviours : check out to sub-directory
仓库本地子目录: mysite-$myweb
构建:选择Execte shell
pkgs_dir=/var/www/html/deploy/pkgs
cp -r mysite-$myweb $pkgs_dir
cd $pkgs_dir
rm -rf mysite-$myweb/.git
tar czf mysite-$myweb.tar.gz mysite-$myweb
rm -rf mysite-$myweb
md5sum mysiet-$myweb.tar.gz | awk '{print $1}' > mysite-$myweb.tar.gz.md5
cd ../
[ -f live_ver ] && cat live_ver > last_ver
echo -n $myweb > live_ver
自动化部署框架
为了方便版本切换,可以规划如下目录
/var/www/download用于存储下载的应用
/var/www/deploy用于存储解压的应用
创建/var/www/html/current软链接,指向需要部署对应用版本
编写下载应用的功能代码
通过位置参数指定要下载的版本
位置参数是live下载当前版本
位置参数是last下载前一个版本
如果已经下载则不要重复下载
编写校验文件代码
计算机指定文件的md5值
将md5值发布服务器提供的md5值进行比较。确认无误
编写自动部署功能python程序,判断服务器上是否有新版本,在deploy_web.py上操作
import os #导入os模块,用于对系统文件的管理
import requests #导入requests模块
import wget #导入wget模块,下载软件包到目标目录下
import hashlib #计算文件的md5值
import tarfile
#声明函数has_new_ver(),功能:当服务器上有新版本时返回True, 否则返回False
def has_new_ver(ver_fname, ver_url):
#ver_fname 为应用服务器pycharm主机的当前版本文件路径
#如果文件不存在,返回True, 提示没有新版本
if not os.path.exists(ver_fname):
return True
#当ver_fname存在时,先获取当前应用的版本号
with open(ver_fname) as fobj:
local_ver = fobj.read()
#r 通过requests获取jenkins服务器上的最新版本号
r = requests.get(ver_url)
#当应用服务器上的版本号和Jenkins服务器上的版本号不相等时,返回True, 即有新的版本,可以校验文件完整性和下载更新了
if local_ver != r.text:
return True
else:
return False
#声明函数file_ok(), 功能:如果下载的包文件未损坏,则返回True,否则返回False
def file_ok(fname, md5url):
#先声明一个空的md5值对象m
m = hashlib.md5()
#每次从文件中取出4096(4k),更新对象m的md5值,最后计算出整个文件的md5值
with open(fname, 'rb') as fobj:
while 1:
data = fobj.read(4096)
if not data:
break
m.update(data) #更新文件md5值
#md5rul 为jenkins服务器上的压缩包的md5值文件链接地址
#r 通过requests获取jenkins服务器上,代码压缩包的md5值文件内容
r = requests.get(md5url)
#将m转换为16进制m.hexdigest();
#r.text.strp() jenkins服务器上,代码压缩包的md5值文件的内容,strip()去做文件最后的‘\n’
if m.hexdigest() == r.text.strip():
return True #相等,代表文件未损坏,返回True
else:
return False
#声明函数deploy(), 功能:用于部署软件到 web 服务器
def deploy(app_fname, deploy_dir, dest):
tar = tarfile.open(app_fname) #打开压缩包app_fname
tar.extractall(path=deploy_dir) #解压到deploy_dir目录下
tar.close() #关闭tar
#拼接出解压后目录的绝对路径
#获取app_dir变量中,最后一个'/',右边的内容
app_dir = os.path.basename(app_fname)
#将app_dir的后缀'.tar.gz',替换为空,赋值给变量app_dir
app_dir = app_dir.replace('.tar.gz', '')
#将变量deploy_dir和变量app_dir拼接在一起
app_dir = os.path.join(deploy_dir, app_dir)
#创建链接,如果软链接dest存在,删除软连接,然后为app_dir创建新的软链接
if os.path.exists(dest):
os.remove(dest)
os.symlink(app_dir, dest) #为app_dir创建软链接
#路径拼接的演示
if __name__ == '__main__':
###判断jenkins服务器上是否有新版本
#ver_url 为jenkins服务器的当前版本文件路径
#ver_fname 为应用服务器pycharm主机的当前版本文件路径
ver_url = 'http://192.168.1.137/deploy/live_ver'
ver_fname = '/var/www/deploy/live_ver'
if not has_new_ver(ver_fname, ver_url):
print('未发现新版本')
exit(1)
#如果服务器上有新版本,则下载新版本
#r 为jenkins服务器的当前版本内容
#app_url 为jenkins服务器上的压缩包链接地址
#app_fname 为应用服务器pycharm主机的压缩包路径
#wget.download 将jenkins服务器上的压缩包,下载到pycharm主机上
r = requests.get(ver_url)
app_url = 'http://192.168.1.137/deploy/pkgs/mysite-%s.tar.gz' % r.text
app_fname = '/var/www/download/mysite-%s.tar.gz' % r.text
wget.download(app_url, app_fname)
#校验下载的软件包是否损坏,如果损坏则删除 os.remove()
#md5rul 为jenkins服务器上的压缩包的md5值文件链接地址
md5url = app_url + '.md5'
if not file_ok(app_fname, md5url):
print('文件已损坏')
os.remove(app_fname)
exit(2)
#如果软件包没有损坏,则继续部署软件deploy()
#deploy_dir 为应用服务器pycharm主机上的代码路径
#dest 为最终被普通用户所访问的代码路径
deploy_dir = '/var/www/deploy'
dest = '/var/www/html/current'
deploy(app_fname, deploy_dir, dest)
#更新本地的版本文件
if os.path.exists(ver_fname):
os.remove(ver_fname)
wget.download(ver_url, ver_fname)