基于 Jenkins 快速搭建自动化部署框架
2017-01-06 16:21
691 查看
一、背景简介
1、项目环境简介
1.1 使用JAVA语言开发的MAVEN工程1.2 系统是Linux,服务器是TOMCAT,测试环境分别有两台服务器,测试环境62和验收测试环境72
2、手动部署步骤
进行构建,生成部署包war包停止掉测试环境进程
下载war包,在本地进行解压
替换成测试环境对应的配置文件(例:config.properties)
将本地文件上传到测试环境
重启测试服务
查看日志
3、改善分析
1) 替换测试文件,能否在打包的时候进行替换?2) 在Jenkins上生成部署包后能否自动解压并上传?
3) 停止掉进程和启动进程能否在Jenkins构建成功后自动完成?
改善思路
带着这样的思路我们就开始我们的自动化部署之旅,为了让课程完整一点,我们先简单介绍一下Maven的多环境打包配置、Linux系统开启FTP上传、PythonFTP上传脚本的编写,已经知道的童鞋可以直接跳过看后面的第5章
二、Maven多环境打包配置
“打包“这个词听起来比较土,比较正式的说法应该是”构建项目软件包“项目配置文件目录;
Pom.xml配置如下:
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!--.....其他略.......--> <profiles> <profile> <id>local</id> <properties> <package.environment>local</package.environment> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>product62</id> <properties> <package.environment>product62</package.environment> </properties> </profile> <profile> <id>product72</id> <properties> <package.environment>product72</package.environment> </properties> </profile> </profiles> <build> <plugins> <!--.....其他略.......--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <archive> <addMavenDescriptor>false</addMavenDescriptor> </archive> <warName>aim-web</warName> <webResources> <resource> <directory>src/main/resources/deploy_config/${package.environment}</directory> <targetPath>WEB-INF/classes</targetPath> <filtering>true</filtering> </resource> <resource> <directory>src/main/resources</directory> <targetPath>WEB-INF/classes</targetPath> <filtering>true</filtering> </resource> </webResources> </configuration> </plugin> </plugins> </build> </project>
其中, 我们注意的地方: 我解释一下:
这里就是不同的resources文件夹, 我这里只区分本地 62,72; 设置为true的就是默认被激活的. 所以后面打包默认就是本地
${package.environment} 就是动态指定文件夹了.
<filtering>true</filtering> 这里一定需要设置为true才行
运行是执行命令clean -Pproduct62 package,就可以将62环境的配置文件打入包
这里resource就是我的资源文件, src/main/resources里面存放我的公用的, 比如Spring的配置文件,
运行是执行命令clean -Pproduct62 package,就可以将62环境的配置文件打入包
三、Linux开启FTP上传配置
1. 先用rpm -qa| grep vsftpd命令检查是否已经安装,如果ftp没有安装,使用yum -y install vsftpd 安装,(ubuntu 下使用apt-get install vsftpd)2. service vsftpd start
启动要让FTP每次开机自动启动,运行命令: chkconfig --level 35 vsftpd on
3. 设置ftp权限
vi /etc/vsftpd/vsftpd.conf
将anonymous_enable=YES 改为 anonymous_enable=NO
ESC返回,输入“:wq”保存并推出
4. 添加ftp帐号和目录
useradd -d /var/www/webapps/eam -s /sbin/nologin test passwd test chmod -R 755 /var/www/webapps/eam chown -R test /var/www/webapps/eam /etc/rc.d/init.d/vsftpd restart
然后用帐号test密码test
测试下就可以登陆ftp了。目录是/var/www/webapps/eam
四、Python FTP 上传编写
import sys import os import json import re from ftplib import FTP _XFER_FILE = 'FILE' _XFER_DIR = 'DIR' class Xfer(object): ''''' @note: upload local file or dirs recursively to ftp server ''' def __init__(self): self.ftp = None def __del__(self): pass def setFtpParams(self, ip, uname, pwd, port = 21, timeout = 60): self.ip = ip self.uname = uname self.pwd = pwd self.port = port self.timeout = timeout def initEnv(self): if self.ftp is None: self.ftp = FTP() print ('### connect ftp server: %s ...'%self.ip ) self.ftp.connect(self.ip, self.port, self.timeout) self.ftp.login(self.uname, self.pwd) print (self.ftp.getwelcome()) def clearEnv(self): if self.ftp: self.ftp.close() print ('### disconnect ftp server: %s!'%self.ip ) self.ftp = None def uploadDir(self, localdir='./', remotedir='./'): if not os.path.isdir(localdir): return self.ftp.cwd(remotedir) for file in os.listdir(localdir): src = os.path.join(localdir, file) if os.path.isfile(src): self.uploadFile(src, file) elif os.path.isdir(src): try: self.ftp.mkd(file) except: sys.stderr.write('the dir is exists %s'%file) self.uploadDir(src, file) self.ftp.cwd('..') def uploadFile(self, localpath, remotepath='./'): if not os.path.isfile(localpath): return print ('+++ upload %s to %s:%s'%(localpath, self.ip, remotepath)) self.ftp.storbinary('STOR ' + remotepath, open(localpath, 'rb')) def __filetype(self, src): if os.path.isfile(src): index = src.rfind('\\') if index == -1: index = src.rfind('/') return _XFER_FILE, src[index+1:] elif os.path.isdir(src): return _XFER_DIR, '' def upload(self, src): filetype, filename = self.__filetype(src) self.initEnv() if filetype == _XFER_DIR: self.srcDir = src self.uploadDir(self.srcDir) elif filetype == _XFER_FILE: self.uploadFile(src, filename) self.clearEnv() def deployEnvi(self,params): if params== 'Pproduct62': ip='172.18.100.62' return ip elif params== 'Pproduct72': ip='172.18.100.72' return ip def getparam(self): for i in range(1, len(sys.argv)): print(sys.argv[1]) return re.search(r'\"([^"]+)\"',sys.argv[1]).groups()[0] if __name__ == '__main__': srcDir = "/var/lib/jenkins/jobs/eam62/workspace/aim-web/target/eam" xfer = Xfer() ip='172.18.100.62' print(ip) xfer.setFtpParams(ip, 'test', 'test') xfer.upload(srcDir)
五、Jenkins安装与配置
Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。1、安装Jenkins
地址https://jenkins.io/下载适合的Jenkins版本2、插件安装
系统管理->管理插件可选插件->过滤
2.1 SVN插件
在过滤搜索框处输入Subversion Plug-in,选择后点击直接安装
2.2 Maven插件
在过滤搜索框处输入Maven Integration plugin,选择后点击直接安装
2.3 Python插件
在过滤搜索框处输入Python Wrapper Plugin,选择后点击直接安装
在过滤搜索框处输入Python Plugin,选择后点击直接安装
2.4 SSH插件
在过滤搜索框处输入SSH plugin,选择后点击直接安装
配置好这里后保存,这里即可以输入用户名密码,也可以使用key文件来免密码登录
3、Jenkins配置
新安装的Jenkins需要配置一些环境,例如JAVA_HOME,MAVEN_HOME等系统管理—>系统设置
3.1 SSH配置
配置好这里后保存,这里即可以输入用户名密码,也可以使用key文件来免密码登录
3.2 JDK配置
3.3 Maven配置
4、创建Maven任务
新建任务Item名称->test-ci,ci指代commit阶段,说明这个job是用来不断集成我们的代码的。
我们的项目是用maven来管理的,所以我们选择构建一个maven项目
4.1 源码管理配置
首先我们配置SVN,选择Subversion,填上项目的Repository URL,然后可以指定从这个地址签出的代码保存的位置。其他默认选择
4.2 构建触发器
该选项是用来配置自动构建的,比如我们想让项目每天中午一点和晚上一点自动构建,只需要在日程表中写出0 13,1 * * *.在这里我们使用Poll SCM,"Poll SCM"用来定期检查版本库是否有更新,如果有更新,触发构建。我们就让它每2小时检查一次,输入H 8-19/2 * * *。
4.3 配置Maven
pom.xml文件,jenkins会去寻找需要执行的maven pom文件,需要给定。
我们需要运行maven 的 clean -Pproduct62 package 命令,在Goals and options中指定
注:如果过要部署在72环境上的,需要执行clean –Pproduct72 package 命令,并将python脚本修改为72环境的地址
4.4 增加构建步骤
构建成功后执行shell命令,此步骤是为了将war包进行解压
注:在Build配置那里有一个Add buld step, 有这样两个选项:
1. Execute Windows batch command
2. Execute shell
第1个是执行windows命令,第2个是执行shell脚本,这里部署Jenkins是linux服务器,所以使用的是Execute shell
cd /var/lib/jenkins/jobs/test-ci/workspace/aim-web/target/ mkdir eam cd eam jar -xvf /var/lib/jenkins/jobs/ test-ci /workspace/aim-web/target/aim-web.war
Shell命令执行完成后执行远程的shell命令,此步骤是为了将远程服务器的进程停掉,并将原部署文件清除掉
这里还碰到了一个问题,我用Xshell远程登录到服务器,直接可以执行我的一个脚本,这个脚本里有一些命令是在PATH路径下的。
但是在Jenkins里面直接执行脚本却报错了,说是找不到这些命令,最后我在执行脚本前先export JAVA_HOME=/usr/jdk
把PATH设置了一下,结果就执行成功了,不知道为什么 jenkins远程登录默认读不到PATH
export JAVA_HOME=/usr/jdk kill -9 `ps x|grep tomcat | grep -v "grep"|awk '{print $1}'` echo "kill tomcat!" cd /var/www/webapps/eam/ rm -rf * echo "clean OK"
远程的shell命令执行完后执行Python脚本,此步骤是为了将最新解压的文件上传到服务器上
执行远程的shell命令,此步骤是为了将远程服务器的进程启动
export JAVA_HOME=/usr/jdk sleep 3 sh /usr/local/tomcat7/bin/startup.sh echo "start tomcat!"
4.5 生成打包文件
运行构建,点击左侧的立即构建按钮,点击Build History中的数字就可以看到本次构建的详细。,
这样我们的自动化部署环境就搭建好了,系统每天会自动进行部署,后续我们可以根据需要再配置一下邮件发送功能
相关文章推荐
- 运维入门
- 运维提升
- 关于Jenkins在Linux快速搭建持续集成环境
- jenkins------结合maven将svn项目自动部署到tomcat下
- jenkins------部署项目到jboss eap下
- 解决Centos编译安装jdk后,JPS不能使用
- 【DevOps】为什么我们永远疲于奔命?
- Node服务一键离线部署
- Lua在各个操作系统中的开发环境配置教程
- 在Windows XP下安装Apache+MySQL+PHP环境
- 基于Vue2的移动端开发环境搭建详解
- Vue.js开发环境搭建
- ASP.NET MVC5+EF6+EasyUI后台管理系统 微信公众平台开发之资源环境准备
- Docker 自动部署tomcat详解
- jdk环境变量配置
- Windows7下的php环境配置教程
- PHP环境搭建的详细步骤
- 很实用的Linux 系统运维常用命令及常识(超实用)
- linux 自动化运维工具ansible的使用详细教程
- 利用docker搭建LAMP运行环境教程详解