您的位置:首页 > 运维架构

基于 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中的数字就可以看到本次构建的详细。,



这样我们的自动化部署环境就搭建好了,系统每天会自动进行部署,后续我们可以根据需要再配置一下邮件发送功能
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息