基于 Jenkins 快速搭建自动化部署框架

一、背景简介

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

         

这样我们的自动化部署环境就搭建好了,系统每天会自动进行部署,后续我们可以根据需要再配置一下邮件发送功能

 

转载于:https://my.oschina.net/hellotest/blog/820048

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值