要实现Jenkins端的持续集成,其实在CI服务配置端很容易,难点呢?就是如何实现自动化的部署。我的脚本设计就是为了解决以下难题:

难点一、如何使得自动化部署脚本更通用

我用的脚本,依赖依赖一个配置文件的模块化,让每一个应用业务模块更加通用。自动化所执行的命令呢?
我也是设计想法本着更加通用平台的原则,至少对于tomcat+java or java+socket这种模式通用。

难点二、如何使得自动化的部署简单有效

本脚本,更加切合实际,例:自动化部署关闭tomcat,我们常常会选择catalina.sh stop去关闭,然而这里我选择了kill的方式,如果检测中没有顺利关闭,我将调用kill -9 去直接关闭。(没办法,选择了通用,你是没遇到过tomcat 一直有线程卡住,关闭不了的情况吧。)
难点三、需要让我们自动化的部署实现高的可靠性
体现在:
1、每一次的部署,配置选项中都会进行备份。(备份只一次)
2、服务自动备份完毕后,需要实现检测(这里我在配置模块中有加入日志终端输出)

当然,这个脚本中还有未完成的地方:
1、服务启动后,自动化的检测机制还是太薄弱。
2、暂时此脚本还无法通用到php,python等环境的更多平台
3、代码备份方式上,应该更加具更多灵活性。


一、自动化部署原理图示
1、2、3、4 表示执行的4个部署基础步骤

二、实现

  • 1、Tomcat 进程设置唯一标记

用于识别出一个服务器中唯一的Tomcat进程
java -Dmyapp.name=“project_name”
如果用的tomcat我们可以,直接修改启动控制文件catalina.sh。
JAVA_OPTS="-Dmyapp.name:"project_name" -server -Xms1024M -Xmx4096M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=1024M"

  • 2、实现自动化登录

一般有两种方式:
方式一、模拟用户密码交互方式,大家可以学习家py中依赖pexcept模块。
方式二、用ssh + Key方式,这个是ssh的一种公钥认证机制。本脚本中用的这种,大家自行学习。

3、CI服务器需要在服务端配置rsync服务端
实现中,主要用于客户端服务拖取代码。

4、配置文件解释
[imoocc.com-server] //服务的模块名称,这里需要注意,需要具有唯一性,且服务的进程标示命名一致
CI_IP=ci.iaskjob.com //CI服务器地址
Login_ISA_Key=/back/key/jeson_iaskjob_rsa //登录ISA的key
Project_IP=192.168.10.99 //工程IP
Project_Login_User=root //对应工程机器登录用户
Project_Login_Port=22 //对应工程机器登录端口
Project_Code_File=/tmp/imoocc //对应工程在CI服务器构建后的执行代码目录
Project_Exclude_File="/var/cache","/var/tmp","jdbc.profile" //不需要向线上同步的文件,如配置文件等等
Project_Backup_Dir=/opt/Jenkins_Backup_Dir //工程备份目录
Project_Deploy_Path=/opt/imoocc //工程部署目录
Project_Start_Command=tomcat/bin/catalina.sh start //工程启动方式
Project_Log_Path=/tmp/imoocc.log //启动后日志的查看方式


分享代码如下:

# -*- coding: utf-8 -*-
#!/usr/bin/python
#########################################################################
# File Name: Jenkins_Project_Deploy.py
# Program function: ueed for deployment code in CI server.
# Author:Jeson
# mail:jeson@imoocc.com
# Created Time: 一 6/20 19:24:33 2016
#========================================================================
import ConfigParser
import sys
from sys import argv
import paramiko def Gennerate_cmd(Project_Name,CI_IP,Project_Code_File,Project_Exclude_File,Project_Backup_Dir,Project_Deploy_Path,Project_Start_Command,Project_Log_Path):
cmd = []
#生成备份命令
if Project_Backup_Dir:
#生成备份原有文件
cmd.append("mkdir -p /opt/")
cmd.append("rsync -avzP %s %s && touch /tmp/CI_%s_backuptrue"%(Project_Deploy_Path,Project_Backup_Dir,Project_Name))
#生成关闭原有进程命令
cmd.append('test -e /tmp/CI_%s_backuptrue && ps -auxgrep "name:%s"grep -v grepawk \'{print $2}\'xargs kill'%(Project_Name,Project_Name))
#生成命令-确认原来服务已经顺利关闭
cmd.append('ps -auxgrep "name:%s"grep -v grepawk \'{print $2}\'&& touch /tmp/CI_killSucc ps -auxgrep "name:%s"grep -v grepawk \'{print $2}\'xargs kill -9'%(Project_Name,Project_Name))
#生成命令-用于同步新的代码文件
if Project_Code_File == "":
cmd.append('test -e "/tmp/CI_%s_killSucc" && rsync -avzP --delete-after --exclude "{%s}" %s::%s %s'%(Project_Name,Project_Exclude_File,CI_IP,Project_Name,Project_Deploy_Path))
else:
cmd.append('test -e "/tmp/CI_%s_killSucc" && rsync -avzP --delete-after --exclude "{%s}" %s::%s/%s %s'%(Project_Name,Project_Exclude_File,CI_IP,Project_Name,Project_Code_File,Project_Deploy_Path))
#生成命令-用于启动服务
cmd.append(Project_Start_Command)
#生成命令-查看服务启动后的日志
cmd.append('tail -n 200 -f %s'%Project_Log_Path)
#生成命令-清理此次生成的临时文件
# cmd.append('rm -f /tmp/\*%s\*'%Project_Name)
return cmd def Login_Execute_Command(Project_IP,Project_Login_Port,Project_Login_User,Login_ISA_Key,cmds):
Project_Port = int(Project_Login_Port) if Project_Login_Port else 22
if Project_IP and Project_Login_User and Login_ISA_Key:
key = paramiko.RSAKey.from_private_key_file(Login_ISA_Key)
s = paramiko.SSHClient()
s.load_system_host_keys()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(hostname=Project_IP,port=Project_Port,username=Project_Login_User,pkey=key)
for cmd_item in cmds:
stdin,stdout,stderr=s.exec_command(cmd_item)
print stdout.read()
return True
else:
return false def main():
if len(argv) > 2:
Config_File = argv[1] if argv[1] else "./Jenkins_Project_Deploy.conf "
Project_Name = argv[2] if argv[2] else ""
else:
print "Error 0:Input argv format error! ./Jenkins_Project_Deploy.py ./test.conf testname"
sys.exit()
try:
cf = ConfigParser.ConfigParser()
cf.read(Config_File)
CI_IP = cf.get(Project_Name, "CI_IP")
Project_Code_File = cf.get(Project_Name, "Project_Code_File")
Project_Exclude_File = cf.get(Project_Name, "Project_Exclude_File")
Project_Backup_Dir = cf.get(Project_Name, "Project_Backup_Dir")
Project_Deploy_Path = cf.get(Project_Name, "Project_Deploy_Path")
Project_Start_Command = cf.get(Project_Name, "Project_Start_Command")
Project_Log_Path = cf.get(Project_Name, "Project_Log_Path") execute_command = Gennerate_cmd(Project_Name,CI_IP,Project_Code_File,Project_Exclude_File,Project_Backup_Dir,Project_Deploy_Path,Project_Start_Command,Project_Log_Path)
print "{Step 1: Command collected over!}",execute_command
Project_IP = cf.get(Project_Name, "Project_IP")Project_Login_Port= cf.get(Project_Name,"Project_Login_Port")Project_Login_User= cf.get(Project_Name,"Project_Login_User")Login_ISA_Key= cf.get(Project_Name,"Login_ISA_Key")exceptExceptionas e:print"Error 1: %s file open or read error!"%Config_File
sys.exit()print"{Step 2:Prepare to loging...}",Project_IP
result =Login_Execute_Command(Project_IP,Project_Login_Port,Project_Login_User,Login_ISA_Key,cmds=execute_command)if result isFalse:print"Error 3:Execute command failed!"if __name__ =='__main__':
main()

Jenkins持续集成-自动化部署脚本的实现的更多相关文章

  1. Linux-GitLab+Jenkins持续集成+自动化部署

    GitLab+Jenkins持续集成+自动化部署 什么是持续集成? (1)Continuous integration (CI) 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个 ...

  2. CentOS 7 Gitlab+Jenkins持续集成+自动化部署

    基于上次的环境<部署Gitlab+Jenkins持续集成环境> 来实现自动化部署 系统管理–>插件管理–>安装以下插件: Credentials Plugin(默认已经安装) ...

  3. [转载]Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试 -2

    自己的代码 import unittest # import HTMLTestRunner_cn as HTMLTestRunner import xmlrunner import sys sys.p ...

  4. 持续集成+自动化部署[代码流水线管理及Jenkins和gitlab集成]

    转载:https://www.abcdocker.com/abcdocker/2065 一.代码流水线管理 Pipeline名词顾名思义就是流水线的意思,因为公司可能会有很多项目.如果使用jenkin ...

  5. Jenkins持续集成与部署

    一.Jenkins简介 在阅读此文章之前,你需要对Linux.Docker.Git有一定的了解和使用,如果还未学习,请阅读我前面发布的相关文章进行学习. 1.概念了解:CI/CD模型 CI全名Cont ...

  6. Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)

    Jenkins简介 Jenkins是Java编写的非常流行的持续集成(CI)服务,起源于Hudson项目.所以Jenkins和Hudson功能相似. Jenkins支持各种版本的控制工具,如CVS.S ...

  7. Jenkins持续集成环境部署

    一.下载Jenkins Jenkins下载地址:https://jenkins.io/download/ 这里我们下载的是jenkins.war 二.启动Jenkins 在Linux下启动Jenkin ...

  8. 《转载》Jenkins持续集成-自动化部署脚本的实现《python》

    本文转载自慕课网 读者须知:1.本手记本着记续接前面的两张手记内容整理2.本手记针对tomcat部署测试环境实现 最近工作比较繁忙,导致这章一直拖延,没有太抽出时间来总结.要实现Jenkins端的持续 ...

  9. .NET持续集成与自动化部署之路第一篇——半天搭建你的Jenkins持续集成与自动化部署系统

    .NET持续集成与自动化部署之路第一篇(半天搭建你的Jenkins持续集成与自动化部署系统) 前言     相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛 ...

随机推荐

  1. Jfinal——实践出真知

    什么是Jfinal? JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所 ...

  2. 久未更 ~ 四之 —— Vsftpd出现 Failed to start Vsftpd ftp daemon错误

    > > > > > 久未更 系列一:Failed to start Vsftpd ftp daemon错误 配置 vsftpd.conf文件后 重启ftp服务 出现 Fa ...

  3. ACTION_NAME等常量 不能在模板里直接取值?

    在控制器里可以取得,显示模板之前需要向模板传递. condition 下用$Think.const.MODULE_NAME 在模板里要用{$Think.ACTION_NAME}

  4. 网站地图怎么做?dedecms网站地图制作方法听语音

    网站地图怎么生成?下面分享织梦dedecms系统网站地图的生成方式,怎么制作网站地图,方法很简单.下面介绍一下网站地图优化方法及制作方法. 工具/原料 一个网站 方法/步骤 第一步 登录网站后台 第二 ...

  5. xen虚拟机(Centos6.6)的创建和扩容

    好久没来更博了,从这篇开始,我准备好好梳理一下Hadoop的那些"事".本人技术渣一枚,只是本着知识共享的原则,希望将我所掌握的知识分享出来.若文中有错误的地方,欢迎大家告知我,我 ...

  6. ZooKeeper对比Eureka

    刚开始看到Eureka这个单词的时候真心不会念,查了后发现他有一个好听的名字,来,大家一起念 [ jʊ'rikə ] 简介 Eureka本身是Netflix开源的一款提供服务注册和发现的产品,并且提供 ...

  7. Django_xadmin后台全局设置

    如何使用xadmin主题功能? 在ursersa app下的adminx.py文件下,注册一个基础设置类BaseSetting,并注册 import xadminfrom xadmin import ...

  8. junit4X系列--Assert与Hamcrest

    原文出处:http://www.blogjava.net/DLevin/archive/2012/05/12/377960.html.感谢作者无私分享 到目前,JUnit4所有的核心源码都已经讲解过了 ...

  9. EL表达式和JSTL核心标签库

    1 EL表达式 1.1 EL的概述 EL,全名为Expression Language. 主要作用: ①EL表达式主要用于替换jsp页面中的脚本表达式,以便于从各种类型的web域中检索java对象(某 ...

  10. linux(centos)下安装git并上传代码

    cat /etc/redhat-release   查看系统版本信息 >>CentOS Linux release 7.4.1708 (Core) 背景:我已经注册了github账号,之前 ...