CI/CD概述

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值