热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Jenkins持续化部署实例

开始本篇章之前介绍一个写笔记的方法:康奈尔笔记法(新学的,很实用)在此之前老大让它们弄一个web端更新的界面系统,本来我也打算用django+bootstrap+python实现,

开始本篇章之前介绍一个写笔记的方法:康奈尔笔记法(新学的,很实用)

在此之前老大让它们弄一个web端更新的界面系统,本来我也打算用django+bootstrap+python实现,但是此时python和bootstrap还没有特别熟悉,目前技术不达标。不过期间碰到了jenkins,一个现成的实现持续交付部署的开源项目(但他的作用可不止如此),赞叹开源界的庞大。

----------------------------------------------------------------------------------------------

一:简介 
官网:https://jenkins.io/ 
用于:监控外部调用的执行工作
用于:持续的软件版本/项目的发布(功能很多需要探索)
Jenkins 是一个开源软件项目,基于 java 开发的 持续集成 工具,旨在提供一个开放易用的软件平台;
二:流程架构  
1、研发集成后上传 svn/git
2、创建项目 center --- 将svn上的对应版本 上传到分发服务器
3、创建项目 check --- 检查查看目前使用的版本是哪个,避免下面更新把现有的更新
4、创建项目 online ---   更改 onlinever 文件中的版本号,供客户端python检索更新
5、python.py --- 编写脚本,写到cron,实现检测md5、修改软链、删除老的版本

Jenkins 在日常使用中的架构如下,连接 svn/git,下载到分发服务器上(中控/vps中心),然后客户端 poll 分发服务器内容。

技术分享


三:安装 jenkins  

1、安装启动

目前版本为2.7.4,下面实验环境在 centos7 上,具体安装环境步骤,官网有明确说明

技术分享

方式一:

wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo

rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

yum install jenkins

systemctl  start  jenkins

方式二:

wget https://pkg.jenkins.io/redhat-stable/jenkins-2.7.4-1.1.noarch.rpm

rpm -ivh jenkins-2.7.4-1.1.noarch.rpm

systemctl  start  jenkins

方式三:

wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

java -jar jenkins.war(war文件路径) --port=8080(端口)

或者安装 tomcat 并放到 webapps 下启动(会自动解压)

2、web端访问

web访问ip:8080 > 将该路径下的密码粘贴到这 > 自定义或者默认安装插件 > 填写资料(用户名密码用于后期登陆) 

项目目录(即家目录)默认在 /var/lib/jenkins

技术分享

技术分享


三:持续化集成发布 wordpress  

线上环境我们应用的话,我们要有自己的 svn 或者 git 等版本管理服务,因为我们实验就暂时借用 wordpress 的svn;wordpress 是一个有 GUN 协议的开源项目,php 写的非常主流的博客系统,很美观并支持中文。

官网:https://cn.wordpress.org/

svn :http://core.svn.wordpress.org/tags/

1、新建项目 wordpress_center_last

目的:作为分发服务器

指定svn,拉取指定的版本(最新)

将下载的版本打包为 tar.gz,利于传输

记录此版本压缩包的 md5 值,用于比对

记录此版本号到文件 lastver,用于客户端检索自动更新

准备:

mkdir -p /data/web/wordpress/download

chown -R /data/web/wordpress/

/var/lib/jenkins/workspace/wordpress_center_last/wordpress-3.1  //poll过来的路径

接下来就是点点点 .........

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享


2、检查项目 wordpress_check

目的:检查客户端在线的版本

检查现在客户端对应的版本,如果都已经是最新的版本,就不用更新了,节约资源

并且可以根据需求查看目前对应的版本

可以用的工具有很多 python的fabric、ansible、shell 等都可以

方式一:fabric

vim /data/web/wordpress/fabfile.py

#!/usr/bin/env python

from fabric.api import *

env.user=‘test‘    #新建用户,也可以用root用户,但要在客户端上传公钥

env.password=‘123‘

env.hosts = [‘localhost‘,‘192.168.1.104‘,‘192.168.1.107‘,] #设置客户端的ip


def host_type():

    run(‘uname -s;echo $USER‘)


def check_ver():

        run("""ONLINE_VER=`curl -s http://center_ip:8080/deploy/onlinever`;

               ONLINE_WP=/var/www/releases/wordpress-$ONLINE_VER;

               test -d $ONLINE_WP && echo "$ONLINE_WP is exists" || echo "$ONLINE_WP is not exists"

            """)

技术分享


方式二:ansible(推荐:集合了fabric、saltstack等众多自动化工具的优点)

vim /etc/ansible/host  //编写ip列表模块,比如 test

技术分享


3、创建项目 wordpress_online

目的:更新版本

新建文本 onlinever,记录版本号,供客户端python脚本检索其内容进行更新

首先随便执行一个版本,初始化一下(顺便测试)

技术分享

技术分享


四:编写客户端更新脚本 (python为例)

#!/usr/bin/env python
#coding=utf-8

import urllib,urllib2
import os,sys
import hashlib,tarfile
import shutil

#定义分发服务器上用的到变量,最好配个dns服务器,供内部使用
URL_LASTVER = "http://192.168.1.107/wordpress/lastver"
URL_ONLINEVER = "http://192.168.1.107/wordpress/onlinever"
URL_PKG = "
 
#定义本地路径变量
LOCAL_DOWNLOAD = "/data/web/wordpress/local/download/" #客户端系下载的tar包
LOCAL_DEPLOY = "/data/web/wordpress/local/deploy/" #客户端解压使用版本目录
DOC_WWW = "/data/web/wordpress/local/www" #软链 至 worpress 版本
TOBE_KEEP = 2 #要保留的版本数量
WHITE_LST = []  #禁止删除版本的白名单

#定义用到的文件名字
APP_NAME = "wordpress"
LASTVER = urllib2.urlopen(URL_LASTVER).read().strip() #读取最新版本号
URL_LAST_PKG = URL_PKG + "%s-%s.tar.gz" % (APP_NAME,LASTVER) #服务端tar包
LOCAL_LAST_PKG = os.path.join(LOCAL_DOWNLOAD + "%s-%s.tar.gz" % (APP_NAME,LASTVER)) #客户端tar包
ONLINEVER = urllib2.urlopen(URL_ONLINEVER).read().strip() #读取在线版本号
LOCAL_ONLINE_PKG = os.path.join(LOCAL_DEPLOY + "%s-%s" % (APP_NAME,ONLINEVER)) #在线使用的版本

#初始化本地目录
def init():
    if not os.path.exists(LOCAL_DOWNLOAD):
        os.makedirs(LOCAL_DOWNLOAD)
    if not os.path.exists(LOCAL_DEPLOY):
        os.makedirs(LOCAL_DEPLOY)
        
#检查最新的版本并下载
def checkMd5file(f):  #由md5判断下载是否正确
    URL_LAST_PKG_MD5 = f + ".md5file"
    URL_MD5 = urllib2.urlopen(URL_LAST_PKG_MD5).read().strip()
    with open(LOCAL_LAST_PKG) as fd:
        m = hashlib.md5(fd.read()).hexdigest()
        if m == URL_MD5:
            return True
        return False
def downLoad(f):
#    req = urllib2.urlopen(f)
#    data = req.read()
#    with open(LOCAL_LAST_PKG,‘wb‘) as fd: 
#        fd.write(data)  # 一次性读完,有点占内存
    req = urllib2.urlopen(f)
    n = 1
    while True:
        data = req.read(4096) #以4096为单位下载,节省内存
        if not data:
            break
        if n == 1:
            with open(LOCAL_LAST_PKG,‘wb‘) as fd:
                fd.write(data)
                n += 1
        elif n > 1:
            with open(LOCAL_LAST_PKG,‘a‘) as fd:
                fd.write(data)
                n += 1
    if checkMd5file(URL_LAST_PKG):
        return True
    return False
def checkLastVersion():
    WHITE_LST.append(LASTVER)  #加入白名单,禁止删除
    if not os.path.exists(LOCAL_LAST_PKG):
        downLoad(URL_LAST_PKG)
    extract_dir = os.path.join(LOCAL_DEPLOY + "%s-%s" % (APP_NAME,LASTVER))
    if not os.path.exists(extract_dir): #解压本地download下的包
        tar = tarfile.open(LOCAL_LAST_PKG)
        tar.extractall(LOCAL_DEPLOY)
        #tarFile(LOCAL_LAST,LOCAL_DEPLOY)
        
#解压下载的tar包
#def tarFile(fn,d):
#    tar = tarfile.open(fn)
#    tar.extracall(‘d‘)

#检查在线的版本,替换软链
def checkOnlineVersion():
    WHITE_LST.append(ONLINEVER)  #加入白名单,禁止删除
    if os.path.exists(LOCAL_ONLINE_PKG):
        if not os.path.exists(DOC_WWW): #此路径是指源目录
            os.symlink(LOCAL_ONLINE_PKG,DOC_WWW)
        else:
            target = os.readlink(DOC_WWW)
            if target != LOCAL_ONLINE_PKG:
                os.unlink(DOC_WWW)
                os.symlink(LOCAL_ONLINE_PKG,DOC_WWW) 
                
#对版本号进行排序,删除多余不用的版本
def versionSort(l):
    from distutils.version import LooseVersion
    vs = [LooseVersion(i) for i in l]
    vs.sort()
    return [o.vstring for o in vs]
def clear():
    DOWNLOAD_LST = [i.split(‘-‘)[1][:-7] for i in os.listdir(LOCAL_DOWNLOAD)] #取download下的版本号
    DEPLOY_LST = [i.split(‘-‘)[1] for i in os.listdir(LOCAL_DEPLOY)]
    tobe_del_download = versionSort(DOWNLOAD_LST)[:-TOBE_KEEP]
    tobe_del_deploy = versionSort(DEPLOY_LST)[:-TOBE_KEEP]
    for d in tobe_del_download:
        fn = os.path.join(LOCAL_DOWNLOAD + "%s-%s.tar.gz" % (APP_NAME,d))
        if d not in WHITE_LST: #不删除使用的和最新的版本
            os.remove(fn)
    for d in tobe_del_deploy:
        fn = os.path.join(LOCAL_DEPLOY + "%s-%s" % (APP_NAME,d))
        if d not in WHITE_LST: #不删除使用的和最新的版本
            #os.remove(fn)     #这只能删除空目录
            shutil.rmtree(fn)
            
#执行时加个文件锁,避免重复执行
def lockFile(f):
    if os.path.exists(f):
        print "%s is runing......" % __file__
        sys.exit()
    with open(f,‘w‘) as fd:
        fd.write(str(os.getpid()))
def unlockFile(f): #解锁文件
    if os.path.exists(f):
        os.remove(f)
        
#主程序
if __name__==‘__main__‘:
    lockFile(‘/tmp/.deploy.lock‘)
    init()
    checkLastVersion()
    print "checkLastVersion"
    checkOnlineVersion()
    print "checkOnlineVersion"
    clear()
    print "clear"
    #time.sleep(10)
    unlockFile(‘/tmp/.deploy.lock‘)


crontab -e  #按时执行,可用ansible管理

*/5 * * * *  python /data/web/wordpress/update.py


-----------------------------------------------------------------------------------------------



本文出自 “北冰--Q” 博客,请务必保留此出处http://beibing.blog.51cto.com/10693373/1920557

Jenkins 持续化部署实例


推荐阅读
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
author-avatar
我是你的特效
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有