概要
本文配置基于 jenkins2.103 + svn + maven
远程发布基于 SSH
安装 jenkins 和 远程发布的机器都为windows sever 且在同一局域网(不在同一个局域网的没试过,有可能可以/不可以,检测下能不能访问ssh先就知道了)
1.下载安装
jenkins2.103 安装工具包CSDN下载地址:
SSH安装调试工具包 //download.csdn.net/download/qq_35532963/11983008
Jenkins2.103安装包 //download.csdn.net/download/qq_35532963/11983016
双击install 修改/不修改 安装路径—>完成安装
自动跳转到如下页面
输入密码,点“继续”
等待插件安装完毕
2.全局配置
2.1 全局安全配置
登陆jenkins http://localhost:8080
左侧主菜单
系统管理->全局工具配置
填写jdk的安装路径(环境变量中JAVA_HOME的值)
填写maven的安装路径(环境变量中MAVEN_HOME的值)
3 新建、配置任务
为自己的任务起名称(一般都是项目名称),选择任务类型,确认。
为任务配置各项参数,进入到任务配置界面,跳转到配置页面,如下图
3.1 源码管理
源码管理工具选的Subversion
填写SVN代码地址
点击“Add”添加有这个地址的访问权限的用户名和密码(或者在用户列表菜单中添加有访问代码权限的用户(用户名/密码为svn用户名/密码))
添加完成后点击小三角选择刚刚添加的用户名和密码
其他项默认
3.2 构建触发器
3.3 构建环境
可不做选择
3.4 Pre Steps
构建之前的预处理,这里配置成构建之前关闭tomcat
说明:因为配置了构建war包后自动发布,自动启动tomcat,如果不关闭tomcat,开启的tomcat导致上一个解压的war包无法删除,二次构建后发布war包时会报错
将上图批处理文件放在目标机器(你要发布war包的机器)上图配置中的路径下(路径可以自己定)
@echo off setlocal enabledelayedexpansion for /f "delims= tokens=1" %%i in ('netstat -aon ^| findstr "8089"') do ( set a=%%i goto haha ) :haha taskkill /f /pid "!a!"
如果目标服务器没有tomcat在开启状态,报如下错误,但是可以看到后续构建动作仍在进行,所以不用管这个报错
如果目标服务器有正在开启状态的tomcat,预处理脚本会先kill掉此PID,然后再开始构建
疑问:为什么不直接调用shutdown.bat关闭tomcat?
经过很多次心酸的试验,通过SSH调用shutdown.bat只能关闭手动开启(手动执行startup.bat)的应用进程,不能关闭通过SSH调用startup.bat启动的后台进程(配置时设置了构建后自动执行startup.bat)。虽然可以使tomcat服务不能访问,但是不能kill后台进程。
PS:预处理脚本里是通过端口找到正在运行的tomcat,我配的是8089,这个参数需要跟自己tomcat-sever.xml里面配置的端口保持一致
3.5 Build、Post Steps
填写存放pom文件的路径(此路径与刚才填写的SVN路径为相对路径),如果只填pom.xml,可能会构建失败。所以要填写完整的路径。
Post Steps最好选第一个,构建失败不运行
3.6 构建设置
是一个邮件通知功能,先不设置
3.7 构建后操作(自动部署到本地tomcat)
使用插件发布项目,需要使用的插件是(Deploy to container),发布到本地tomcat中,要用到tomcat的用户名和密码,tomcat用户可以自己在tomcat中的conf/tomcat-users.xml文件中配置,加上以下几行,用户名和密码可以自己设置
如果配完上面的能deploy成功可不修改下面这项
如果报权限不足还需要修改如下内容 加上 |d+.d+.d+.d+
或者改成这样
设置好tomcat就可以去任务里面配置了
点击“Add Container”添加tomcat容器
点击“Add”按钮添加刚才配置的Tomcat的用户名和密码
点击小三角选择,设置完如图二
tomcat想配几个配几个,但是要选择对自己的tomcat的版本
设置完以上信息点击保存,现在可以开始构建war包了
构建完成后,war包会出现在tomcat-webapps文件夹下和jenkins安装目录下(..jenkins/workspace/...),输入访问地址可访问系统
3.8 构建后操作(自动部署到远程tomcat)
安装插件Publish over SSH
windows server安装测试SSH 服务
http://blog.sina.com.cn/s/blog_4a0a8b5d01015ao5.html
用上述工具测试通SSH后就可以去jenkins里面配置了
jenkins配置SSH,先去往全局配置界面
拉到最下面找到Publish over SSH
我采用的是密码方式访问SSH服务,windows系统远程路径前一点要加 /cygdrive,不然访问不到(还有一种是通过认证的方式,感兴趣的小伙伴可以自行研究,不感兴趣的同学可以不研究)
配置完可点击 Test Configuration 测试下,出现SUCCESS表示SSH服务可用
回到任务配置页面
Source files—构建后war包的存放目录
即F: /tools/Jenkins/workspace/xRPl/EE/target
Remove prefix—上述目录需要去的前缀
这里因为jenkins war包构建后的目录是
F: /tools/Jenkins/workspace/xRPl/EE/target,Remove prefix 填EE/target/
Remote directoty—发布的目录(全局配置的tomcat目录的相对目录,因为全局配置里已经配到了D:/apache-tomcat-8.5.41/,所以只写webapps即可)
Exec command—发布完执行的命令
这里配置的是war包传输过来之后,自动启动tomcat服务的命令
配置完上述步骤后,就可以开始构建了
完成之后war包拷贝到目标服务器webapps下,tomcat服务已经开启(后台运行,没有启动界面),输入访问地址可直接访问系统
3.9 构建
可在下图两处开始构建
查看控制台输出信息,SUCCESS表示构建成功。
打好的war包在之前设置好的target路径下,目标服务器tomcat-webapps下面也有
构建状态
≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]-----我是分割线-----≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]
Jenkins定时构建
1. 定时构建语法:
* * * * * 1 2
第一个*表示分钟,取值0~59
第二个*表示小时,取值0~23
第三个*表示一个月的第几天,取值1~31
第四个*表示第几月,取值1~12
第五个*表示一周中的第几天,取值0~7,其中0和7代表的都是周日
2. 常用定时构建举例:
由于项目的代码一般存在放SVN中,而一个SVN往往是有多个项目组在提交代码,而每个项目组又有多人组成,其中每个人也都在对自己的那块代码不停地在进行维护,所以说对于一个公司而言,SVN的提交记录往往是很频繁的,正因为如此,Jenkins在执行自动化构建时往往是以天为单位来执行的,下面举的例子就是在一天中常用的定时构建示例。
每隔5分钟构建一次 H/5 * * * *
每两小时构建一次 H H/2 * * *
每天中午下班前定时构建一次 0 12 * * *
每天下午下班前定时构建一次 0 18 * * *
3. 定时构建设置
本文是接前面章节中的构建项目的基础上写的,如果不清楚,请看前面的章节 在Jenkins中新建项目(Job)
在Jenkins的主页面中,点击构建的项目
在【配置】页面中,下拉到【构建触发器】,在这里有两个可选选项,分别是“Build periodically”和“Poll SCM”,它们的特点如下:
- Build periodically
无论SVN中数据有无变化,均执行定时化的构建任务
- Poll SCM
定时轮询SVN,查看SVN中是否有数据变化,如果有变化,则执行构建任务
* * * * *
每个部分代表的含义以及取值范围
分钟,取值范围(0~59):若其他值不做设定,则表示每个设定的分钟都会构建 如:5 * * * * ,表示每个小时的第5分钟都会构建一次
小时,取值范围(0~23):若其他值不做设定,则表示每个设定小时的每分钟都会构建 如:* 5 * * * ,表示在每天5点的时候,一小时内每一分钟都会构建一次
日期,取值范围(1~31):若其他值不做设定,则表示每个月的那一天每分钟都会构建一次 如:* * 5 * *,表示在每个月5号的时候,0点开始每分钟构建一次 月份,取值范围(1~12):若其他值不做设定,则表示每年的那个月每分钟都会构建一次 如:* * * 5 *,表示在每年的5月份,1号0点开始每分钟构建一次
星期,取值范围(0 ~ 7):若其他值不做设定,则表示每周的那一天几每分钟都会构建一次 如:* * * * 5,表示每周五0点开始每分钟构建一次
每一部分的表达方式
*:表示任意合理的数 a-b:表示一个范围,比如:5-8 * * * * OR * 5-8 * * *。具体表达的意思参考上面的含义
a-b/c OR */c:表示一个范围内每个c构建一次,比如:5-10/2 * * * * OR * */3 * * * 具体表达的意思参考上面的含义
a,b,c:表示为a、b、c时构建一次,比如:7,8,9 * * * * OR * * 13,5 * * 具体表达的意思参考上面的含义
忘记jenkins管理员密码
如果忘记管理员密码了请:
首页到目录里/Users/ucsapp/.jenkins 先备份 config.xml 为 config.xml.bak,
而后打开 config.xml 配置文件,修改“<useSecurity>true</useSecurity>”为“<useSecurity>false</useSecurity>”;
同时把“<authorizationStrategy ...>...</authorizationStrategy>”配置删除。
重启之后我们会发现 Jenkins 已经无需登录了。然后,直接找到“系统管理”的“管理用户”菜单,把管理员的密码改回来!
然后,用之前备份的 config.xml.bak 文件覆盖 config.xml 配置文件。
再次重启 Jenkins,终于发现管理员又可以正常登录了。
≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]-----我是分割线-----≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]
番外
for /f 的用法
【a.txt的内容】
【第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列】
1 for /f %%i in (a.txt) do echo %%i //这个会显示a.txt里面的内容,因为/f的作用,会读出a.txt中的内容。 2 for %%i in (a.txt) do echo %%i //而这个只会显示a.txt这个名字,并不会读取其中的内容。
我们发现for /f会默认以每一行来作为一个元素,但是如果我们还想把每一行再分解更小的内容,该怎么办呢?不用担心,for命令还为我们提供了更详细的参数,使我们将每一行分为更小的元素成为可能。
它们就是:delims和tokens
1 for /f "delims= " %%i in (a.txt) do echo %%i
显示的结果是:
第1行第1列
第2行第1列
第3行第1列
for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i
执行结果:
第1行第2列
第2行第2列
第3行第2列
所以我配的远程kill tomcat进程的脚本里的 "delims= tokens=" 应该可以删掉(我没试,感兴趣的小伙伴可以去调试一下)
那为什么我的脚本里有呢?
故事发生在很久很久以前。。。
当时查这个关闭tomcat的问题查急了眼,刚开始还调用的自带的shutdown.bat,任务管理器里面的进程就是杀不掉,直到一个很神奇的举动的发生,局面才有所缓解
这个划时代意义的举动就是:点到任务管理器的详细信息这一栏,之前很傻,一直对着进程看
纳尼!?这里怎么有两个java.exe,很可疑鸭!
经过几次试验,确认了这个pid非1344的java.exe 是导致进程杀不掉的罪魁祸首
手动结束这个任务后,进程一栏的tomcat进程也就自动消失了
那么问题来了
我要怎么知道正在运行的tomcat是哪个pid呢?
emmm
最后就查到了这个脚本,直接ctrl c ,ctrl v
还真能确认pid 并kill !后面还要配别的,也就没细究脚本
≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]-----我是分割线-----≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]≡•ิ.•≡[。。]
此次配置jenkins远程发布总结的小技巧
官方文档最为致命
遇到问题可能一直百一直百,百不着,所有人都去百度,那第一次配这个的人该怎么知道怎么用啊 ?
就是官方文档
配远程脚本的时候,我只想要脚本执行,不想要构建war包这个动作
每试一次都要构建一次,很费时间,而且点了构建之后,看着那个闪动的进度条,心跳很是加速,呼吸很是急促啊,特别不利于身体健康
所以就想单独建一个测试脚本的任务
那一直百,又百不到别人的经验,这时候,又一个具有划时代意义的举动出现了
让我们来点击一下这个可爱的小问号
出现了!!!你没有看错!!
反正之前填参数都是百别人的经验,哪会看这个啊,抄别人的不行就试着改改看,这个问题的配置改了好多次,这里的每个参数改了很多次,都不能让脚本运行(其实当时脚本运行了,只是shutdown.bat不能远程关闭tomcat后台运行的进程,所以就不能确定是配置的问题还是脚本的问题)
反正现在又百不到,就到处点点看看
鉴于英语水平还行,重点就是最后两句嘛
如果你想在文件传输(搬运构建好的包到目标服务器嘛)之前执行脚本,就将执行命令设置移到文件传输设置之前
这下就很确定了
如果只想执行命令,前面的那几个都不用填,只填Exec commond这一项就好了(反正之前一直在试各种排列组合试这四项怎么填,我也很无奈呀。最搞笑的是百到别人的配置cmd 后面跟了个/c,又看了人家后面路径写的C盘,还自以为是地把/c 改成了/d!!??我自己的路径是D嘛!哈哈哈 好搞笑一女的。现在看看,感觉是没有常识啊,cmd命令需要学习https://blog.csdn.net/icanlove/article/details/37567253)
这个脚本的调用方式确定了之后,后面才确认脚本不是没调用,是调用了没起作用
反正就是一步一步,化解问题为另外一个问题,解决问题,达到目的
可能你跟着我的配置方法来配,并不能出现跟我一样的结果,不会遇到同样问题,反正就是根据现象提炼问题,到处参考嘛,试着试着就好了
第二个小技巧就是单独新建一个调试脚本的任务,这样就不用每次调试脚本都花时间构建一次了,看图,节省不少时间,最下面的是构建war包的任务
只需要配 构建 这一项就好了。需要注意的是选构建任务的类型时,选的是构建一个自由风格的项目