侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

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

2023-11-30 星期四 / 0 评论 / 0 点赞 / 71 阅读 / 19814 字

一、背景简介 1、项目环境简介 1.1 使用JAVA语言开发的MAVEN工程 1.2 系统是Linux,服务器是TOMCAT,测试环境分别有两台服务器,测试环境62和验收测试环境72 2、手动部署步骤

一、背景简介

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 jsonimport refrom 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 eamcd eamjar -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/jdkkill -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/jdksleep 3sh /usr/local/tomcat7/bin/startup.shecho "start tomcat!"

 

4.5          生成打包文件

运行构建,点击左侧的立即构建按钮,点击Build History中的数字就可以看到本次构建的详细。,

         

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

 

广告 广告

评论区